콘텐츠로 이동

관리자 작업 공간 관리

원천 · framework/evomind/web/workflow-project-evo-service기준 · 릴리스 v0.12.0커밋 · 2e32c6cc파일 · docs/operations/workspace-admin.md기준선 · 2026-11-12

관리자 사용자 관리에서 사용자별 작업 공간 사용량을 보고 초기화하며, 계정을 삭제할 때 그 사용자의 작업 공간도 지운다. 실행기는 workspace-runner.md 의 /v1/usage·/v1/workspace/reset 을 쓴다.

조건 설명
WORKSPACE_ENABLED=true 작업 공간 기능. 꺼져 있으면 관리 화면에 항목이 나오지 않고 계정 삭제도 기존과 같다.
WORKSPACE_RUNNER_URL·WORKSPACE_RUNNER_TOKEN 실행기 주소와 서비스 토큰. 없으면 기능이 꺼진 것으로 본다(503 / 삭제 단계 건너뜀).
관리 권한 사용량 조회는 admin.users.read, 초기화는 admin.users.manage. admin 그룹 구성원 대상은 admin 만(기존 보호 규칙).

GET /api/admin/users/{username}/workspace — 사용량

섹션 제목: “GET /api/admin/users/{username}/workspace — 사용량”
{"bytes":3221225472,"files":120,"dirs":14,"links":0,"truncated":false,
"limitBytes":10737418240,"over":false,"top":[{"name":"home","bytes":3221225472,"files":118}]}
  • 실행기 사용량을 그대로 옮긴다. 경로·파일 이름·토큰은 응답에 넣지 않는다.
  • 그 사용자의 번호가 아직 없으면 발급하고(번호는 재사용하지 않는다) 실행기의 사용량을 읽는다. 공간을 만든 적이 없으면 0 이다.
  • 기능이 꺼져 있으면 503, 실행기 호출이 실패하면 502, 없는 사용자는 404.

POST /api/admin/users/{username}/workspace/reset — 초기화

섹션 제목: “POST /api/admin/users/{username}/workspace/reset — 초기화”
  • 사용자 공간 루트의 내용을 모두 지우고 기본 폴더(tmp·home·home/repos·home/work)만 다시 만든다. 계정(uid)·GitLab 토큰·에이전트 ID 등록은 그대로다.
  • 응답은 초기화 전 사용량이다(확인 창·감사와 같은 값). 실행기가 busy(그 사용자의 실행 진행 중)이면 409, 그 밖의 실패는 502 다. 실패하면 아무것도 지우지 않았다.
  • 사용자 관리의 각 행에 작업 공간 버튼이 생기고, 펼치면 상한 대비 사용량과 파일·폴더·링크 수를 보여 준다. 상한을 넘으면 경고를, 항목이 너무 많아 일부만 셌으면 그 사실을 함께 보여 준다.
  • 작업 공간 초기화는 확인 대화상자를 거친다. 확인 문구에는 현재 사용량과 “저장하지 않았거나 push 하지 않은 변경이 모두 사라진다”는 경고, 계정·GitLab 토큰·에이전트 ID 등록은 남는다는 설명이 들어간다.
  • admin.users.read 만 있으면 사용량만 보고 초기화 버튼 대신 권한 안내를 본다. 실행 중이면 409 사유를 보여 준다.
  • 새 문구는 한국어·영어 i18n 키(admin.workspace.*)로 넣었고, 버튼은 키보드로 열고 대화상자는 기존 포커스 규칙을 따른다.

UserDeletionService 는 같은 502 규칙을 쓴다.

  1. 비활성·자기 자신·admin 보호 검사를 마친다.
  2. 작업 공간을 지운다. 기능이 꺼져 있거나 번호가 없으면(공간을 만든 적이 없으면) 건너뛴다. 실패하면 502 로 끝나고 대화·키·사용자 행은 그대로 남는다 — 관리자가 다시 시도할 수 있다.
  3. 기존처럼 evo-lite 키를 지우고(guardedRun) 대화·API 키·사용자 행을 지운다.

비활성화는 작업 공간을 지우지 않는다. 비활성 계정의 공간은 삭제할 때까지 남는다.

이벤트 남기는 것
workspace.reset 행위자·대상 username·bytes·files·limitBytes(초기화 전). 경로·파일 이름은 넣지 않는다.
user.delete 기존 건수에 workspaceReset(했는지)·workspaceBytes(초기화 전)를 더한다.
터미널 창
cd backend && ./gradlew :app:test --tests '*WorkspaceAdminServiceTest' \
--tests '*UserDeletionServiceTest' --tests '*AdminUserControllerTest' \
--tests '*AdminSecurityRulesTest'
cd frontend && npm run build && npm run check:a11y
  • 서비스 시험: 기능 꺼짐 503, 사용량 매핑, 실행 중 409·감사 없음, 실패 502, 삭제용 정리(기능 꺼짐/번호 없음이면 실행기 호출 없음), 감사에 숫자만.
  • 삭제 시험: 작업 공간 → evo-lite → DB 순서, 작업 공간 실패 시 502·아무것도 안 지움, 감사 메타데이터.
  • 경로 규칙 시험(AdminSecurityRulesTest)이 새 관리 경로 두 개의 권한표 등록을 확인한다.