name: tranimal services: main: build: context: ./main dockerfile: Dockerfile ports: - "3000:3000" volumes: - ./main:/app - /app/node_modules - /app/.next environment: - NODE_ENV=development - NEXT_PUBLIC_API_BASE_URL=http://localhost:8000 - NEXT_PUBLIC_GOOGLE_CLIENT_ID=${NEXT_PUBLIC_GOOGLE_CLIENT_ID:-} - WATCHPACK_POLLING=true - CHOKIDAR_USEPOLLING=true command: npm run dev -- -H 0.0.0.0 -p 3000 depends_on: - api-gateway api-gateway: build: context: ./api/api-gateway dockerfile: Dockerfile ports: - "8000:8000" environment: - AUTH_SERVICE_URL=http://auth-service:8001 - AI_SERVICE_URL=http://ai-service:8002 - AI_PROXY_TIMEOUT_SECONDS=900 - CORS_ORIGINS=http://localhost:3000 volumes: - ./api/api-gateway:/app depends_on: - auth-service - ai-service command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload ai-service: build: context: ./api/ai-service dockerfile: Dockerfile ports: - "8002:8002" environment: - CORS_ORIGINS=http://localhost:3000 - AI_WORKSPACE_DIR=/workspace/router/ai - PYTHON_COMMAND=python - SCRIPT_TIMEOUT_SECONDS=900 - DEFAULT_LABELS=cup,face,cloud,ice_cream,t_shirt,fish,apple,candle - DEFAULT_PROTOTYPE_PATH=${DEFAULT_PROTOTYPE_PATH:-data/quickdraw/quickdraw_clip_prototypes_8labels.pt} - DEFAULT_REPRESENTATIVE_PATH=${DEFAULT_REPRESENTATIVE_PATH:-data/quickdraw/quickdraw_clip_representatives_8labels_top100.pt} - REPRESENTATIVE_TOP_K=${REPRESENTATIVE_TOP_K:-5} - GATV2_SCORER_PATH=${GATV2_SCORER_PATH:-data/models/gatv2_edge_scorer_current.pt} - GATV2_WEIGHT=${GATV2_WEIGHT:-0.25} - PROTOTYPE_PGVECTOR_URL=${PROTOTYPE_PGVECTOR_URL:-} - PROTOTYPE_PGVECTOR_TABLE=${PROTOTYPE_PGVECTOR_TABLE:-quickdraw_prototypes} - PROTOTYPE_PGVECTOR_SOURCE=${PROTOTYPE_PGVECTOR_SOURCE:-quickdraw_avg_v1} - TEXT_PROTOTYPE_PGVECTOR_URL=${TEXT_PROTOTYPE_PGVECTOR_URL:-} - TEXT_PROTOTYPE_PGVECTOR_TABLE=${TEXT_PROTOTYPE_PGVECTOR_TABLE:-quickdraw_text_prototypes} - TEXT_PROTOTYPE_PGVECTOR_SOURCE=${TEXT_PROTOTYPE_PGVECTOR_SOURCE:-clip_text_prompt_avg_v1} - IMAGE_PROTO_WEIGHT=${IMAGE_PROTO_WEIGHT:-1.0} - TEXT_PROTO_WEIGHT=${TEXT_PROTO_WEIGHT:-0.0} - EMBEDDING_PGVECTOR_URL=${EMBEDDING_PGVECTOR_URL:-} - EMBEDDING_PGVECTOR_TABLE=${EMBEDDING_PGVECTOR_TABLE:-quickdraw_embeddings} - EMBEDDING_PGVECTOR_SOURCE=${EMBEDDING_PGVECTOR_SOURCE:-quickdraw_train_v1} - PSEUDO_LABEL_MIN_CLIP_SCORE=${PSEUDO_LABEL_MIN_CLIP_SCORE:-0.7} - PSEUDO_LABEL_SAVE_ALL_LABELS=${PSEUDO_LABEL_SAVE_ALL_LABELS:-false} - TTS_MODEL_NAME=myshell-ai/MeloTTS-Korean - TTS_DEVICE=${TTS_DEVICE:-cpu} - TTS_SPEED=${TTS_SPEED:-1.0} - TTS_CACHE_DIR=/workspace/ai/tts_cache volumes: - ./api/ai-service:/app - ./router:/workspace/router - ./ai:/workspace/ai - ai_hf_cache:/workspace/.cache/huggingface command: uvicorn app.main:app --host 0.0.0.0 --port 8002 --reload auth-service: build: context: ./api/auth-service dockerfile: Dockerfile ports: - "8001:8001" environment: - DATABASE_URL=${AUTH_DATABASE_URL:?AUTH_DATABASE_URL is required} - JWT_SECRET_KEY=change-me - JWT_ALGORITHM=HS256 - ACCESS_TOKEN_EXPIRE_MINUTES=60 - PASSWORD_RESET_TOKEN_EXPIRE_MINUTES=${PASSWORD_RESET_TOKEN_EXPIRE_MINUTES:-30} - EMAIL_VERIFICATION_CODE_EXPIRE_MINUTES=${EMAIL_VERIFICATION_CODE_EXPIRE_MINUTES:-10} - EMAIL_VERIFICATION_VERIFIED_TTL_MINUTES=${EMAIL_VERIFICATION_VERIFIED_TTL_MINUTES:-30} - PASSWORD_RESET_FRONTEND_URL=${PASSWORD_RESET_FRONTEND_URL:-http://localhost:3000/password-reset} - SMTP_HOST=${SMTP_HOST:-} - SMTP_PORT=${SMTP_PORT:-587} - SMTP_USERNAME=${SMTP_USERNAME:-} - SMTP_PASSWORD=${SMTP_PASSWORD:-} - SMTP_USE_TLS=${SMTP_USE_TLS:-true} - SMTP_FROM_EMAIL=${SMTP_FROM_EMAIL:-} - SMTP_FROM_NAME=${SMTP_FROM_NAME:-Runnimal} - GOOGLE_OAUTH_CLIENT_ID=${GOOGLE_OAUTH_CLIENT_ID:-} - CORS_ORIGINS=http://localhost:3000 volumes: - ./api/auth-service:/app command: uvicorn app.main:app --host 0.0.0.0 --port 8001 --reload volumes: ai_hf_cache: