version: '3.8' services: # Nginx Reverse Proxy — handles /api and /ws routing behind Traefik proxy: image: ghcr.io/${OWNER:-mytheclipse}/bete-proxy:latest container_name: imphenbot-proxy restart: unless-stopped labels: - "traefik.enable=true" - "traefik.http.routers.imphenbot.rule=Host(`imphnen.asepharyana.my.id`)" - "traefik.http.routers.imphenbot.entrypoints=websecure" - "traefik.http.routers.imphenbot.tls=true" - "traefik.http.services.imphenbot.loadbalancer.server.port=80" depends_on: - backend healthcheck: test: ["CMD", "nginx", "-t"] interval: 30s timeout: 5s retries: 3 deploy: resources: limits: memory: 64M networks: - app-shared-net # Backend Service (REST API + WebSocket) backend: image: ghcr.io/${OWNER:-mytheclipse}/bete-backend:latest container_name: imphenbot-backend restart: unless-stopped env_file: - .env environment: NODE_ENV: production WEBSERVER_PORT: 3000 # Backend talks to gateway via Redis+Postgres, not directly — no depends_on needed healthcheck: test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/health"] interval: 30s timeout: 10s start_period: 15s retries: 3 deploy: resources: limits: memory: 256M networks: - app-shared-net # Discord Gateway Service (Event capture and processing — no HTTP) discord-gateway: image: ghcr.io/${OWNER:-mytheclipse}/bete-discord-gateway:latest container_name: imphenbot-discord-gateway restart: unless-stopped env_file: - .env environment: NODE_ENV: production volumes: - ./recordings:/app/recordings # Gateway has no HTTP server — check if PID 1 (node) is alive healthcheck: test: ["CMD-SHELL", "kill -0 1 || exit 1"] interval: 30s timeout: 5s start_period: 30s retries: 3 deploy: resources: limits: memory: 512M networks: - app-shared-net # Frontend Service (React Dashboard) — Nginx serving static files frontend: image: ghcr.io/${OWNER:-mytheclipse}/bete-frontend:latest container_name: imphenbot-frontend restart: unless-stopped # Use 127.0.0.1 instead of localhost — Alpine's BusyBox wget tries IPv6 first # for 'localhost' which fails since nginx only listens on IPv4 healthcheck: test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/"] interval: 30s timeout: 5s start_period: 5s retries: 3 deploy: resources: limits: memory: 32M networks: - app-shared-net networks: app-shared-net: name: app-shared-net external: true