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 - frontend 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 depends_on: - discord-gateway 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 networks: - app-shared-net # Frontend Service (React Dashboard) frontend: image: ghcr.io/${OWNER:-mytheclipse}/bete-frontend:latest container_name: imphenbot-frontend restart: unless-stopped networks: - app-shared-net networks: app-shared-net: name: app-shared-net external: true