Spaces:
Running
Running
| 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` ๊ฐ์ ์คํ ์ฐ์ถ๋ฌผ์ ๋ณดํต ๋ฒ์ ๊ด๋ฆฌ ์ ์ธ๋ฅผ ๊ถ์ฅํฉ๋๋ค. | |