CD / README.md
tkadkghdlf's picture
Sync from GitHub via hub-sync
f711f7f verified
|
Raw
History Blame Contribute Delete
5.14 kB
---
title: CD
sdk: docker
app_port: 7860
---
# Tranimal Run Workspace
MSA ๊ธฐ๋ฐ˜ ๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ ์›Œํฌ์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
## ๊ตฌ์กฐ
```text
main/ # Next.js frontend
api/
api-gateway/ # ๋‹จ์ผ ์ง„์ž… API
auth-service/ # ์ธ์ฆ/ํšŒ์›/๋Ÿฐ ์„ธ์…˜ ์ €์žฅ
ai-service/ # ๊ฒฝ๋กœ ์ƒ์„ฑ/CLIP ์ ์ˆ˜ํ™”
router/ai/ # OSM + CLIP ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ
docker-compose.yml
.env
```
<!-- ์š”์ฒญํ•˜์‹  ์ •์ฑ…์— ๋งž์ถฐ ๋ชจ๋“  ์„œ๋น„์Šค๋Š” ๋กœ์ปฌ DB๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์™ธ๋ถ€ DB(RDS)๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. AI ๊ธฐ๋Šฅ์€ api-gateway -> ai-service -> ai/ ์ˆœ์„œ๋กœ๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. -->
## ๋น ๋ฅธ ์‹œ์ž‘
1. ๋ฃจํŠธ `.env` ์ค€๋น„
2. ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
```bash
docker compose up -d --build
```
3. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ (์ตœ์ดˆ 1ํšŒ ๋˜๋Š” ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์‹œ)
```bash
docker compose exec auth-service alembic upgrade head
```
์ ‘์†:
- Frontend: `http://localhost:3000`
- API Gateway: `http://localhost:8000`
- Auth Service: `http://localhost:8001`
- AI Service: `http://localhost:8002`
## Hugging Face Spaces ๋ฐฐํฌ
๋ฌด๋ฃŒ ์ž„์‹œ ์‹œ์—ฐ์šฉ Docker Space ๋ฐฐํฌ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.
Space ์„ค์ •:
- SDK: `Docker`
- Template: `Blank`
- Hardware: `CPU Basic (Free)`
- Storage Bucket: `Off`
- Dev Mode: `Off`
- App port: `7860`
Space์˜ `Settings > Variables and secrets`์— ๊ฐ’์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. DB URL, SMTP ๋น„๋ฐ€๋ฒˆํ˜ธ, JWT ํ‚ค๋Š” ๋ฐ˜๋“œ์‹œ `Secret`์œผ๋กœ ๋„ฃ๊ณ  ์ €์žฅ์†Œ์— ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Secrets:
- `AUTH_DATABASE_URL`
- `PROTOTYPE_PGVECTOR_URL`
- `TEXT_PROTOTYPE_PGVECTOR_URL`
- `JWT_SECRET_KEY`
- `GOOGLE_OAUTH_CLIENT_ID` (Google ๋กœ๊ทธ์ธ์„ ์“ฐ๋Š” ๊ฒฝ์šฐ)
- `SMTP_USERNAME`, `SMTP_PASSWORD`, `SMTP_FROM_EMAIL` (๋ฉ”์ผ ๋ฐœ์†ก์„ ์“ฐ๋Š” ๊ฒฝ์šฐ)
Variables:
- `NEXT_PUBLIC_API_BASE_URL=https://<account>-<space>.hf.space`
- `NEXT_INTERNAL_API_PROXY_TARGET=http://127.0.0.1:8000`
- `CORS_ORIGINS=https://<account>-<space>.hf.space`
- `PASSWORD_RESET_FRONTEND_URL=https://<account>-<space>.hf.space/password-reset`
- `AUTH_SERVICE_URL=http://127.0.0.1:8001`
- `AI_SERVICE_URL=http://127.0.0.1:8002`
- `AI_WORKSPACE_DIR=/app/router/ai`
- `TTS_DEVICE=cpu`
- `TTS_SPEED=1.0`
- `TTS_CACHE_DIR=/tmp/runnimal-tts-cache`
GitHub ์ €์žฅ์†Œ์˜ `DemoService` ๋ธŒ๋žœ์น˜๊ฐ€ Hugging Face Space์™€ ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. GitHub ์ €์žฅ์†Œ ์„ค์ •์—์„œ `HUGGINGFACE_TOKEN` secret์„ ๋จผ์ € ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
```text
GitHub repository > Settings > Secrets and variables > Actions > New repository secret
Name: HUGGINGFACE_TOKEN
Value: Hugging Face write token
```
๊ทธ ๋‹ค์Œ `DemoService` ๋ธŒ๋žœ์น˜๋ฅผ GitHub์— pushํ•ฉ๋‹ˆ๋‹ค.
```bash
git switch DemoService
git push -u origin DemoService
```
์ด ๋ธŒ๋žœ์น˜์— ํฌํ•จ๋œ `.github/workflows/sync-huggingface-space.yml`๊ฐ€ `tkadkghdlf/CD` Space๋กœ ํŒŒ์ผ์„ ๋™๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. Hugging Face ์ชฝ ํ•˜๋“œ์›จ์–ด๋Š” ๊ณ„์† `CPU Basic (Free)`๋กœ ์œ ์ง€ํ•˜๊ณ , Storage Bucket/Dev Mode/Custom Hardware๋Š” ์ผœ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
RDS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, Hugging Face ์ปจํ…Œ์ด๋„ˆ๊ฐ€ DB์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก RDS ๋ณด์•ˆ ๊ทธ๋ฃน์˜ PostgreSQL `5432` ํฌํŠธ๋ฅผ ํ—ˆ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž„์‹œ ์‹œ์—ฐ์„ ์œ„ํ•ด `0.0.0.0/0`์„ ์—ด์—ˆ๋‹ค๋ฉด ์‹œ์—ฐ์ด ๋๋‚œ ๋’ค ๋ฐ”๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค.
## ํ™˜๊ฒฝ๋ณ€์ˆ˜ (.env)
๋ฃจํŠธ `.env`์— ์•„๋ž˜ ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
### ํ•„์ˆ˜
- `AUTH_DATABASE_URL`
- auth-service๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” PostgreSQL URL
- ์˜ˆ: `postgresql+psycopg://USER:PASS@HOST:5432/DB?sslmode=require`
### AI ๋ผ์šฐํŠธ/pgvector ์‚ฌ์šฉ ์‹œ ๊ถŒ์žฅ
- `PROTOTYPE_PGVECTOR_URL`
- `PROTOTYPE_PGVECTOR_TABLE` (๊ธฐ๋ณธ: `quickdraw_prototypes`)
- `PROTOTYPE_PGVECTOR_SOURCE` (๊ธฐ๋ณธ: `quickdraw_avg_v1`)
- `TEXT_PROTOTYPE_PGVECTOR_URL`
- `TEXT_PROTOTYPE_PGVECTOR_TABLE` (๊ธฐ๋ณธ: `quickdraw_text_prototypes`)
- `TEXT_PROTOTYPE_PGVECTOR_SOURCE` (๊ธฐ๋ณธ: `clip_text_prompt_avg_v1`)
- `EMBEDDING_PGVECTOR_URL`
- `EMBEDDING_PGVECTOR_TABLE` (๊ธฐ๋ณธ: `quickdraw_embeddings`)
- `EMBEDDING_PGVECTOR_SOURCE` (๊ธฐ๋ณธ: `quickdraw_train_v1`)
- `IMAGE_PROTO_WEIGHT` (์˜ˆ: `0.8`)
- `TEXT_PROTO_WEIGHT` (์˜ˆ: `0.2`)
### ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋ฉ”์ผ ์‚ฌ์šฉ ์‹œ
- `PASSWORD_RESET_FRONTEND_URL` (์˜ˆ: `http://localhost:3000/password-reset`)
- `SMTP_HOST`
- `SMTP_PORT`
- `SMTP_USERNAME`
- `SMTP_PASSWORD`
- `SMTP_USE_TLS` (`true`/`false`)
- `SMTP_FROM_EMAIL`
- `SMTP_FROM_NAME`
> SMTP๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด, ๋น„๋ฐ€๋ฒˆํ˜ธ ์žฌ์„ค์ • ๋งํฌ๋Š” ๋ฉ”์ผ ๋Œ€์‹  auth-service ๋กœ๊ทธ์— ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
## AI ๊ฒฝ๋กœ ์ƒ์„ฑ API
ํ”„๋ก ํŠธ๋Š” ์•„๋ž˜ ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.
```text
POST http://localhost:8000/api/v1/ai/routes/generate
```
์ฃผ์š” ํŒŒ๋ผ๋ฏธํ„ฐ:
- `source`: `place` | `current`
- `place` ๋˜๋Š” `latitude`/`longitude`
- `routeCount`
- `targetDistanceKm`
- `labels`
- `selectedLabel`
- `selectedTopK`
## ์„ฑ๋Šฅ ๋ฉ”๋ชจ
ํ˜„์žฌ ai-service๋Š” ์‹œ์ž‘ ์‹œ CLIP ํŒŒ์ดํ”„๋ผ์ธ์„ prewarm ํ•ฉ๋‹ˆ๋‹ค.
- ์ฒซ ์š”์ฒญ๋ณด๋‹ค ๋‘ ๋ฒˆ์งธ ์š”์ฒญ๋ถ€ํ„ฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.
- ์ด์œ : ๋ชจ๋ธ/ํ”„๋กœํ† ํƒ€์ž… ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ ์žฌ์‚ฌ์šฉ
## ์ฃผ์˜
- `.env`์˜ ์‹ค์ œ ๋น„๋ฐ€๋ฒˆํ˜ธ/ํ† ํฐ์€ ์ปค๋ฐ‹ํ•˜์ง€ ๋งˆ์„ธ์š”.
- `generated_routes`, `cache`, `*.tsbuildinfo` ๊ฐ™์€ ์‹คํ–‰ ์‚ฐ์ถœ๋ฌผ์€ ๋ณดํ†ต ๋ฒ„์ „๊ด€๋ฆฌ ์ œ์™ธ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.