version: '3.8' services: # Nginx Reverse Proxy + Frontend Static Files # Routes /api and /ws to backend, serves frontend WASM directly proxy: image: registry.gitlab.com/mytheclipse-group/gmw/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", "wget", "-qO-", "http://127.0.0.1/"] interval: 30s timeout: 5s retries: 3 deploy: resources: limits: memory: 64M networks: - app-shared-net # Backend Service (REST API + WebSocket) backend: image: registry.gitlab.com/mytheclipse-group/gmw/bete-backend:latest container_name: imphenbot-backend restart: unless-stopped env_file: - .env environment: NODE_ENV: production WEBSERVER_PORT: 3000 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: registry.gitlab.com/mytheclipse-group/gmw/bete-discord-gateway:latest container_name: imphenbot-discord-gateway restart: unless-stopped env_file: - .env environment: NODE_ENV: production volumes: - ./recordings:/app/recordings 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 networks: app-shared-net: name: app-shared-net external: true