관리자 작업 공간 관리
원천 · 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 을 쓴다.
1. 켜는 조건
섹션 제목: “1. 켜는 조건”| 조건 | 설명 |
|---|---|
WORKSPACE_ENABLED=true |
작업 공간 기능. 꺼져 있으면 관리 화면에 항목이 나오지 않고 계정 삭제도 기존과 같다. |
WORKSPACE_RUNNER_URL·WORKSPACE_RUNNER_TOKEN |
실행기 주소와 서비스 토큰. 없으면 기능이 꺼진 것으로 본다(503 / 삭제 단계 건너뜀). |
| 관리 권한 | 사용량 조회는 admin.users.read, 초기화는 admin.users.manage. admin 그룹 구성원 대상은 admin 만(기존 보호 규칙). |
2. 관리자 API (evo-api)
섹션 제목: “2. 관리자 API (evo-api)”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 다. 실패하면 아무것도 지우지 않았다.
3. 관리 화면
섹션 제목: “3. 관리 화면”- 사용자 관리의 각 행에 작업 공간 버튼이 생기고, 펼치면 상한 대비 사용량과 파일·폴더·링크 수를 보여 준다. 상한을 넘으면 경고를, 항목이 너무 많아 일부만 셌으면 그 사실을 함께 보여 준다.
- 작업 공간 초기화는 확인 대화상자를 거친다. 확인 문구에는 현재 사용량과 “저장하지 않았거나 push 하지 않은 변경이 모두 사라진다”는 경고, 계정·GitLab 토큰·에이전트 ID 등록은 남는다는 설명이 들어간다.
admin.users.read만 있으면 사용량만 보고 초기화 버튼 대신 권한 안내를 본다. 실행 중이면 409 사유를 보여 준다.- 새 문구는 한국어·영어 i18n 키(
admin.workspace.*)로 넣었고, 버튼은 키보드로 열고 대화상자는 기존 포커스 규칙을 따른다.
4. 계정 삭제와의 순서
섹션 제목: “4. 계정 삭제와의 순서”UserDeletionService 는 같은 502 규칙을 쓴다.
- 비활성·자기 자신·admin 보호 검사를 마친다.
- 작업 공간을 지운다. 기능이 꺼져 있거나 번호가 없으면(공간을 만든 적이 없으면) 건너뛴다. 실패하면 502 로 끝나고 대화·키·사용자 행은 그대로 남는다 — 관리자가 다시 시도할 수 있다.
- 기존처럼 evo-lite 키를 지우고(
guardedRun) 대화·API 키·사용자 행을 지운다.
비활성화는 작업 공간을 지우지 않는다. 비활성 계정의 공간은 삭제할 때까지 남는다.
5. 감사
섹션 제목: “5. 감사”| 이벤트 | 남기는 것 |
|---|---|
workspace.reset |
행위자·대상 username·bytes·files·limitBytes(초기화 전). 경로·파일 이름은 넣지 않는다. |
user.delete |
기존 건수에 workspaceReset(했는지)·workspaceBytes(초기화 전)를 더한다. |
6. 시험
섹션 제목: “6. 시험”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)이 새 관리 경로 두 개의 권한표 등록을 확인한다.
Evo에게 묻기문서 근거 안에서만 답합니다
답변은 문서를 근거로 만들지만 틀릴 수 있습니다. 출처 문서를 함께 확인하세요.