playreel/backend/README.md
2026-09-15 16:00:54 +09:00

109 lines
3.6 KiB
Markdown

# poster-alive
## Requirements
### Python
Python 3.14와 uv를 쓴다.
```bash
uv python install 3.14 # 없을 때만
cd backend
uv sync
```
`uv sync`가 `pyproject.toml`·`uv.lock` 기준으로 `.venv`를 만들고 패키지를 깐다.
`uv run`은 실행 전에 알아서 sync 한다.
### .env
`backend/.env`에 둔다. `CHATGPT_API_KEY`만 없으면 기동이 안 되고, 나머지는 해당 단계를
쓸 때 필요하다.
| 키 | 쓰는 곳 |
|---|---|
| `CHATGPT_API_KEY` | detect · narration · motion · split 태깅 · 캐스트 · 제목 게이트 |
| `TYPECAST_API_KEY` | 롱컷 tts (축제는 OpenAI를 써서 필요 없다) |
| `SUNO_API_KEY` · `SUNO_CALLBACK_URL` | bgm |
| `HIGGSFIELD_ACCOUNT` | upscale · i2v 계정 가드 |
| `MYSQL_HOST` · `MYSQL_PORT` · `MYSQL_USER` · `MYSQL_PASSWORD` · `MYSQL_DB` | DB 세션 |
| `AZURE_BLOB_BASE_URL` · `AZURE_BLOB_SAS_TOKEN` | blob 업로드 |
| `GOOGLE_CLIENT_ID` | 구글 로그인. 비면 로그인만 꺼지고 서버는 뜬다 |
| `JWT_SECRET` | 세션 쿠키 서명. 바뀌면 로그인된 사람이 전부 풀린다 |
### 구글 로그인
구글 클라우드 콘솔에서 **웹 애플리케이션** OAuth 클라이언트를 만들고 승인된 자바스크립트
원본에 서비스 주소를 넣는다. 발급된 client id를 `GOOGLE_CLIENT_ID`에 넣는다.
`client_secret`은 쓰지 않는다 — 코드 교환 없이 ID 토큰만 검증한다.
`JWT_SECRET`은 아무 긴 임의 문자열이면 된다.
```bash
python3 -c "import secrets; print(secrets.token_urlsafe(48))"
```
사용자는 처음 로그인할 때 만들어지고 잡을 `job_limit`(기본 3)개까지 만들 수 있다.
무제한으로 둘 계정은 `user` 테이블의 그 값을 올린다.
```sql
UPDATE user SET job_limit = 100000 WHERE email = 'jhyeu@o2o.kr';
```
### Docker
```bash
cd backend
docker build -t poster-alive-backend .
docker run --rm -p 30101:30101 \
--env-file .env \
-v ~/.config/higgsfield:/root/.config/higgsfield \
poster-alive-backend
```
Higgsfield CLI 토큰은 컨테이너가 켜질 때 호스트의 것을 참조한다.
### Higgsfield CLI
③ upscale과 ⑨ i2v가 Higgsfield CLI를 서브프로세스로 부른다. 인증이 API 키가 아니라
`~/.config/higgsfield/credentials.json`의 CLI 토큰이라 머신마다 한 번씩 로그인해야 한다.
```bash
npm i -g @higgsfield/cli
higgsfield auth login
higgsfield workspace set <workspace-id>
```
로그인 후 `higgsfield account status --json`이 돌려주는 이메일을 `.env`의
`HIGGSFIELD_ACCOUNT`에 넣는다. 계정 가드가 이 값과 대조해, 다른 계정 토큰으로
남의 크레딧이 빠지는 것을 막는다.
## 실행
파이프라인 둘은 게이트에서 끊어 돌린다. 게이트에서 사람이 확인하고 다음 스크립트를 부른다.
### 축제 숏폼 — 포스터 1장
```bash
tests/run_poster_alive.sh test_image/<poster>.jpg # detect · narration · motion
tests/run_poster_alive_after_gate.sh test_image/<poster>.jpg # tts · bgm · i2v · render
```
### Playreel 롱컷 — NOL 상품 id
```bash
tests/run_playreel.sh 26007416 # fetch · split · 캐스트
tests/run_playreel_after_gate1.sh 26007416 # upscale · analyze
tests/run_playreel_after_gate2.sh 26007416 # motion · narration
tests/run_playreel_after_gate3.sh 26007416 # tts · bgm · i2v
tests/run_playreel_after_gate4.sh 26007416 # hybrid · compose
```
단계 하나만 돌리려면 모듈로 부른다. `backend/`에서 실행해야 한다.
```bash
uv run python -m tests.playreel.test_tts 26007416
```
산출물은 `tests/test_result/<플로우>/` 아래에 쌓인다.