# Compose reads variable defaults from a `.env` file in this directory. # Copy `.env.example` to `.env` and fill in your values, then `docker compose up -d`. # # Variables consumed at BUILD time (changes need `docker compose up --build`): # NEXT_PUBLIC_ROOM_WS_URL # NEXT_PUBLIC_PROVIDER_{ALPHA,BETA,GAMMA,DELTA}_{NAME,ORIGIN,MOVIE,TV} # # Variables consumed at RUNTIME (just `docker compose up -d`): # TMDB_API_KEY (required) # GIPHY_API_KEY (optional — enables the chat GIF picker) # ROOM_ALLOWED_ORIGINS # WEB_PORT, ROOM_PORT (host ports) # # Optional Caddy reverse proxy (TLS + single-origin routing for /ws): # docker compose --profile proxy up -d --build # Default is HTTP-only on :80 (good for local docker/ngrok). For production # with auto-HTTPS, set SITE_ADDRESS=yourdomain.com in .env. services: web: build: context: . args: NEXT_PUBLIC_ROOM_WS_URL: ${NEXT_PUBLIC_ROOM_WS_URL:-ws://localhost:3001} NEXT_PUBLIC_PROVIDER_ALPHA_NAME: ${NEXT_PUBLIC_PROVIDER_ALPHA_NAME:-} NEXT_PUBLIC_PROVIDER_ALPHA_ORIGIN: ${NEXT_PUBLIC_PROVIDER_ALPHA_ORIGIN:-} NEXT_PUBLIC_PROVIDER_ALPHA_MOVIE: ${NEXT_PUBLIC_PROVIDER_ALPHA_MOVIE:-} NEXT_PUBLIC_PROVIDER_ALPHA_TV: ${NEXT_PUBLIC_PROVIDER_ALPHA_TV:-} NEXT_PUBLIC_PROVIDER_BETA_NAME: ${NEXT_PUBLIC_PROVIDER_BETA_NAME:-} NEXT_PUBLIC_PROVIDER_BETA_ORIGIN: ${NEXT_PUBLIC_PROVIDER_BETA_ORIGIN:-} NEXT_PUBLIC_PROVIDER_BETA_MOVIE: ${NEXT_PUBLIC_PROVIDER_BETA_MOVIE:-} NEXT_PUBLIC_PROVIDER_BETA_TV: ${NEXT_PUBLIC_PROVIDER_BETA_TV:-} NEXT_PUBLIC_PROVIDER_GAMMA_NAME: ${NEXT_PUBLIC_PROVIDER_GAMMA_NAME:-} NEXT_PUBLIC_PROVIDER_GAMMA_ORIGIN: ${NEXT_PUBLIC_PROVIDER_GAMMA_ORIGIN:-} NEXT_PUBLIC_PROVIDER_GAMMA_MOVIE: ${NEXT_PUBLIC_PROVIDER_GAMMA_MOVIE:-} NEXT_PUBLIC_PROVIDER_GAMMA_TV: ${NEXT_PUBLIC_PROVIDER_GAMMA_TV:-} NEXT_PUBLIC_PROVIDER_DELTA_NAME: ${NEXT_PUBLIC_PROVIDER_DELTA_NAME:-} NEXT_PUBLIC_PROVIDER_DELTA_ORIGIN: ${NEXT_PUBLIC_PROVIDER_DELTA_ORIGIN:-} NEXT_PUBLIC_PROVIDER_DELTA_MOVIE: ${NEXT_PUBLIC_PROVIDER_DELTA_MOVIE:-} NEXT_PUBLIC_PROVIDER_DELTA_TV: ${NEXT_PUBLIC_PROVIDER_DELTA_TV:-} image: cinemux:latest command: ["npx", "next", "start", "-p", "3000"] ports: - "${WEB_PORT:-3000}:3000" environment: TMDB_API_KEY: ${TMDB_API_KEY:?TMDB_API_KEY is required} GIPHY_API_KEY: ${GIPHY_API_KEY:-} NODE_ENV: production restart: unless-stopped healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000"] interval: 30s timeout: 5s retries: 3 start_period: 20s # Reuses the image built by `web`. No `build:` here so we don't race # to tag the same image from two services in parallel. room: image: cinemux:latest command: ["node", "server/room-server.mjs"] ports: - "${ROOM_PORT:-3001}:3001" environment: ROOM_PORT: 3001 ROOM_ALLOWED_ORIGINS: ${ROOM_ALLOWED_ORIGINS:-*} NODE_ENV: production restart: unless-stopped depends_on: web: condition: service_started # Optional reverse proxy. Only starts with `--profile proxy`. # With Caddy in front, the browser hits a single origin and you get TLS for free. caddy: profiles: ["proxy"] image: caddy:2-alpine ports: - "${HTTP_PORT:-80}:80" - "${HTTPS_PORT:-443}:443" environment: # Caddy site address. Leave unset (or ":80") for HTTP-only local dev. # Set to a real domain (e.g. "cinemux.example.com") for auto-HTTPS in prod. SITE_ADDRESS: ${SITE_ADDRESS:-:80} volumes: - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config restart: unless-stopped depends_on: - web - room volumes: caddy_data: caddy_config: