version: "3.8" services: backend: build: context: ./backend args: APP_VERSION: ${APP_VERSION:-dev} container_name: lotto-backend restart: unless-stopped ports: - "18000:8000" environment: - TZ=${TZ:-Asia/Seoul} - LOTTO_ALL_URL=${LOTTO_ALL_URL:-https://smok95.github.io/lotto/results/all.json} - LOTTO_LATEST_URL=${LOTTO_LATEST_URL:-https://smok95.github.io/lotto/results/latest.json} volumes: - ${RUNTIME_PATH}/data:/app/data healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 5s retries: 3 stock-lab: build: context: ./stock-lab args: APP_VERSION: ${APP_VERSION:-dev} container_name: stock-lab restart: unless-stopped ports: - "18500:8000" environment: - TZ=${TZ:-Asia/Seoul} - WINDOWS_AI_SERVER_URL=${WINDOWS_AI_SERVER_URL:-http://192.168.0.5:8000} - GEMINI_API_KEY=${GEMINI_API_KEY:-} - GEMINI_MODEL=${GEMINI_MODEL:-gemini-1.5-flash} - ADMIN_API_KEY=${ADMIN_API_KEY:-} - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} - CORS_ALLOW_ORIGINS=${CORS_ALLOW_ORIGINS:-http://localhost:3007,http://localhost:8080} volumes: - ${STOCK_DATA_PATH:-./data/stock}:/app/data healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 5s retries: 3 music-lab: build: context: ./music-lab container_name: music-lab restart: unless-stopped ports: - "18600:8000" environment: - TZ=${TZ:-Asia/Seoul} - MUSIC_AI_SERVER_URL=${MUSIC_AI_SERVER_URL:-} - SUNO_API_KEY=${SUNO_API_KEY:-} - MUSIC_MEDIA_BASE=${MUSIC_MEDIA_BASE:-/media/music} - CORS_ALLOW_ORIGINS=${CORS_ALLOW_ORIGINS:-http://localhost:3007,http://localhost:8080} volumes: - ${MUSIC_DATA_PATH:-./data/music}:/app/data healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 5s retries: 3 travel-proxy: build: ./travel-proxy container_name: travel-proxy restart: unless-stopped user: "${PUID}:${PGID}" ports: - "19000:8000" environment: - TZ=${TZ:-Asia/Seoul} - TRAVEL_ROOT=${TRAVEL_ROOT:-/data/travel} - TRAVEL_THUMB_ROOT=${TRAVEL_THUMB_ROOT:-/data/thumbs} - TRAVEL_MEDIA_BASE=${TRAVEL_MEDIA_BASE:-/media/travel} - TRAVEL_CACHE_TTL=${TRAVEL_CACHE_TTL:-300} - CORS_ALLOW_ORIGINS=${CORS_ALLOW_ORIGINS:-*} volumes: - ${PHOTO_PATH}:/data/travel:ro - ${RUNTIME_PATH}/travel-thumbs:/data/thumbs:rw healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"] interval: 30s timeout: 5s retries: 3 frontend: image: nginx:alpine container_name: lotto-frontend restart: unless-stopped depends_on: - music-lab ports: - "8080:80" volumes: - ${FRONTEND_PATH}:/usr/share/nginx/html:ro - ${RUNTIME_PATH}/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - ${PHOTO_PATH}:/data/travel:ro - ${RUNTIME_PATH}/travel-thumbs:/data/thumbs:ro - ${MUSIC_DATA_PATH:-./data/music}:/data/music:ro extra_hosts: - "host.docker.internal:host-gateway" healthcheck: test: ["CMD", "wget", "-q", "--spider", "http://localhost:80/"] interval: 30s timeout: 5s retries: 3 deployer: build: ./deployer container_name: webpage-deployer restart: unless-stopped ports: - "127.0.0.1:19010:9000" environment: - WEBHOOK_SECRET=${WEBHOOK_SECRET} volumes: - ${REPO_PATH}:/repo:rw - ${RUNTIME_PATH}:/runtime:rw - ${RUNTIME_PATH}/scripts:/scripts:ro - /var/run/docker.sock:/var/run/docker.sock