version: '3.8' services: # --- Backend Service (Gunicorn + WhiteNoise) --- backend: build: context: ./backend container_name: holy-backend restart: unless-stopped networks: - narl - internal env_file: - ./.env volumes: - ./backend:/app - ./legacy:/app/legacy environment: - PYTHONUNBUFFERED=1 labels: - "traefik.enable=true" - "traefik.docker.network=narl" # High priority for the backend specific paths - "traefik.http.routers.holy-backend.priority=20" - "traefik.http.routers.holy-backend.rule=Host(`holy.narl.io`) && PathPrefix(`/api`, `/admin`, `/static`, `/media`)" - "traefik.http.routers.holy-backend.entrypoints=websecure" - "traefik.http.routers.holy-backend.tls.certresolver=https_resolver" - "traefik.http.services.holy-backend.loadbalancer.server.port=8000" # --- Frontend Service (Nginx serving built React app) --- frontend: build: context: ./frontend args: - VITE_API_URL=https://holy.narl.io/api/ container_name: holy-frontend restart: unless-stopped networks: - narl depends_on: - backend labels: - "traefik.enable=true" - "traefik.docker.network=narl" # Low priority acts as the fallback catch-all - "traefik.http.routers.holy-frontend.priority=10" - "traefik.http.routers.holy-frontend.rule=Host(`holy.narl.io`)" - "traefik.http.routers.holy-frontend.entrypoints=websecure" - "traefik.http.routers.holy-frontend.tls.certresolver=https_resolver" - "traefik.http.services.holy-frontend.loadbalancer.server.port=80" networks: narl: external: true internal: internal: true volumes: db_data: