Spaces:
Running
title: CD
sdk: docker
app_port: 7860
Tranimal Run Workspace
MSA ๊ธฐ๋ฐ ๋ก์ปฌ ๊ฐ๋ฐ์ฉ ์ํฌ์คํ์ด์ค์ ๋๋ค.
๊ตฌ์กฐ
main/ # Next.js frontend
api/
api-gateway/ # ๋จ์ผ ์ง์
API
auth-service/ # ์ธ์ฆ/ํ์/๋ฐ ์ธ์
์ ์ฅ
ai-service/ # ๊ฒฝ๋ก ์์ฑ/CLIP ์ ์ํ
router/ai/ # OSM + CLIP ํ์ดํ๋ผ์ธ ์คํฌ๋ฆฝํธ
docker-compose.yml
.env
๋น ๋ฅธ ์์
- ๋ฃจํธ
.env์ค๋น - ์ปจํ ์ด๋ ์คํ
docker compose up -d --build
- ๋ง์ด๊ทธ๋ ์ด์ (์ต์ด 1ํ ๋๋ ์คํค๋ง ๋ณ๊ฒฝ ์)
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_URLPROTOTYPE_PGVECTOR_URLTEXT_PROTOTYPE_PGVECTOR_URLJWT_SECRET_KEYGOOGLE_OAUTH_CLIENT_ID(Google ๋ก๊ทธ์ธ์ ์ฐ๋ ๊ฒฝ์ฐ)SMTP_USERNAME,SMTP_PASSWORD,SMTP_FROM_EMAIL(๋ฉ์ผ ๋ฐ์ก์ ์ฐ๋ ๊ฒฝ์ฐ)
Variables:
NEXT_PUBLIC_API_BASE_URL=https://<account>-<space>.hf.spaceNEXT_INTERNAL_API_PROXY_TARGET=http://127.0.0.1:8000CORS_ORIGINS=https://<account>-<space>.hf.spacePASSWORD_RESET_FRONTEND_URL=https://<account>-<space>.hf.space/password-resetAUTH_SERVICE_URL=http://127.0.0.1:8001AI_SERVICE_URL=http://127.0.0.1:8002AI_WORKSPACE_DIR=/app/router/aiTTS_DEVICE=cpuTTS_SPEED=1.0TTS_CACHE_DIR=/tmp/runnimal-tts-cache
GitHub ์ ์ฅ์์ DemoService ๋ธ๋์น๊ฐ Hugging Face Space์ ๋๊ธฐํ๋ฉ๋๋ค. GitHub ์ ์ฅ์ ์ค์ ์์ HUGGINGFACE_TOKEN secret์ ๋จผ์ ๋ฑ๋กํฉ๋๋ค.
GitHub repository > Settings > Secrets and variables > Actions > New repository secret
Name: HUGGINGFACE_TOKEN
Value: Hugging Face write token
๊ทธ ๋ค์ DemoService ๋ธ๋์น๋ฅผ GitHub์ pushํฉ๋๋ค.
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_URLPROTOTYPE_PGVECTOR_TABLE(๊ธฐ๋ณธ:quickdraw_prototypes)PROTOTYPE_PGVECTOR_SOURCE(๊ธฐ๋ณธ:quickdraw_avg_v1)TEXT_PROTOTYPE_PGVECTOR_URLTEXT_PROTOTYPE_PGVECTOR_TABLE(๊ธฐ๋ณธ:quickdraw_text_prototypes)TEXT_PROTOTYPE_PGVECTOR_SOURCE(๊ธฐ๋ณธ:clip_text_prompt_avg_v1)EMBEDDING_PGVECTOR_URLEMBEDDING_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_HOSTSMTP_PORTSMTP_USERNAMESMTP_PASSWORDSMTP_USE_TLS(true/false)SMTP_FROM_EMAILSMTP_FROM_NAME
SMTP๋ฅผ ์ค์ ํ์ง ์์ผ๋ฉด, ๋น๋ฐ๋ฒํธ ์ฌ์ค์ ๋งํฌ๋ ๋ฉ์ผ ๋์ auth-service ๋ก๊ทธ์ ์ถ๋ ฅ๋ฉ๋๋ค.
AI ๊ฒฝ๋ก ์์ฑ API
ํ๋ก ํธ๋ ์๋ ๊ฒฝ๋ก๋ฅผ ํธ์ถํฉ๋๋ค.
POST http://localhost:8000/api/v1/ai/routes/generate
์ฃผ์ ํ๋ผ๋ฏธํฐ:
source:place|currentplace๋๋latitude/longituderouteCounttargetDistanceKmlabelsselectedLabelselectedTopK
์ฑ๋ฅ ๋ฉ๋ชจ
ํ์ฌ ai-service๋ ์์ ์ CLIP ํ์ดํ๋ผ์ธ์ prewarm ํฉ๋๋ค.
- ์ฒซ ์์ฒญ๋ณด๋ค ๋ ๋ฒ์งธ ์์ฒญ๋ถํฐ ๋น ๋ฆ ๋๋ค.
- ์ด์ : ๋ชจ๋ธ/ํ๋กํ ํ์ ๋ฉ๋ชจ๋ฆฌ ์บ์ ์ฌ์ฌ์ฉ
์ฃผ์
.env์ ์ค์ ๋น๋ฐ๋ฒํธ/ํ ํฐ์ ์ปค๋ฐํ์ง ๋ง์ธ์.generated_routes,cache,*.tsbuildinfo๊ฐ์ ์คํ ์ฐ์ถ๋ฌผ์ ๋ณดํต ๋ฒ์ ๊ด๋ฆฌ ์ ์ธ๋ฅผ ๊ถ์ฅํฉ๋๋ค.