feat(run-agent): send X-Admin-Token so backend AuthGate accepts CI calls

The backend now has a global AuthGateMiddleware: every data route
(workspaces/lookup, upload-agent, sse/...) requires auth, returning
401 {"detail":"authentication required"} otherwise. CI authenticates with
the service token via the X-Admin-Token header (proxies any user_id).

- run_agent_api.py: read ADMIN_API_TOKEN from env, attach X-Admin-Token to
  both httpx clients (all lookup/upload/sse/action/cancel calls); warn if unset
- run-agent.yml: inject ADMIN_API_TOKEN from Gitea repo secret
- Gitea repo secret ADMIN_API_TOKEN registered
- TEST_WORKFLOW.md / .env.example: document ADMIN_API_TOKEN (.env local, secret in CI)

Verified end-to-end: workspaces/lookup for user_id=jhogyu now resolves
(401 -> 200), e.g. Aug_2026_Test -> 3523fa2b-...

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-20 17:02:12 +09:00
co-authored by Claude Opus 4.8
parent 9d86372325
commit 8dfda00c12
4 changed files with 38 additions and 17 deletions
+13 -5
View File
@@ -19,14 +19,21 @@
프로젝트 루트에 `.env` 파일을 만들고 아래 형식으로 채운다 (값은 실제 토큰):
```dotenv
GITEA_TOKEN=<Gitea Personal Access Token>
GITEA_TOKEN=<Gitea Personal Access Token> # 워크플로우 dispatch / API 용
ADMIN_API_TOKEN=<백엔드 AuthGate 서비스 토큰> # 백엔드 데이터 라우트 인증용
```
- 토큰 발급: Gitea → Settings → Applications → Generate New Token
- 필요한 스코프: **`write:repository`**
- 사용 후에는 **폐기(revoke)** 권장. 만료를 짧게 설정할 것.
- `GITEA_TOKEN` 발급: Gitea → Settings → Applications → Generate New Token, 스코프 **`write:repository`**
- `ADMIN_API_TOKEN`: 백엔드 컨테이너 env `ADMIN_API_TOKEN` 값 (전역 AuthGate 통과용
서비스 토큰). 스크립트가 이 값을 읽어 모든 백엔드 요청에 `X-Admin-Token` 헤더로 보낸다.
없으면 `workspaces/lookup`·`upload-agent`·`sse` 전부 `401 authentication required`.
- 사용 후에는 **폐기(revoke)** 권장.
- 템플릿: [.env.example](.env.example) 참고 (빈 값, 커밋되어도 안전).
> **CI(워크플로우)** 는 `.env` 를 쓰지 않는다. `ADMIN_API_TOKEN` 을 **Gitea repo
> secret** 으로 등록해야 하며(이미 등록됨), 워크플로우가 `${{ secrets.ADMIN_API_TOKEN }}`
> 로 주입한다. `GITEA_TOKEN` 은 dispatch(방법 A)에서만 필요.
---
## 방법 A — Gitea API 로 트리거 (설계 의도: 러너가 실행)
@@ -116,7 +123,8 @@ python scripts/run_agent_api.py \
작업실 이름↔UUID 목록 확인:
```bash
curl -s "http://100.93.221.71:8800/workspaces/lookup?user_id=<user_id>" | python3 -m json.tool
curl -s -H "X-Admin-Token: $ADMIN_API_TOKEN" \
"http://100.93.221.71:8800/workspaces/lookup?user_id=<user_id>" | python3 -m json.tool
```
---