services: traefik: image: traefik:v3.3 command: - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" # Uncomment the lines below to enable Let's Encrypt HTTPS with your domain: # - "--certificatesresolvers.letsencrypt.acme.email=you@example.com" # - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json" # - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web" ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - letsencrypt:/letsencrypt restart: unless-stopped db: image: postgres:17-alpine environment: POSTGRES_USER: botbattle POSTGRES_PASSWORD: botbattle POSTGRES_DB: botbattle volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U botbattle"] interval: 5s timeout: 3s retries: 5 server: build: ./server environment: DATABASE_URL: postgresql://botbattle:botbattle@db:5432/botbattle # Uncomment to expose the Express server directly (bypasses Traefik): # ports: # - "24002:3000" labels: - "traefik.enable=true" # HTTP - "traefik.http.routers.botbattle.rule=PathPrefix(`/`)" - "traefik.http.routers.botbattle.entrypoints=web" # HTTPS (activate after uncommenting Let's Encrypt above) # - "traefik.http.routers.botbattle-secure.rule=PathPrefix(`/`)" # - "traefik.http.routers.botbattle-secure.entrypoints=websecure" # - "traefik.http.routers.botbattle-secure.tls.certresolver=letsencrypt" - "traefik.http.services.botbattle.loadbalancer.server.port=3000" depends_on: db: condition: service_healthy restart: unless-stopped client: build: ./client depends_on: - server restart: unless-stopped volumes: pgdata: letsencrypt: