# mcqemu docs site — two profiles. # # Default (no --profile flag): # production — Caddy serves the built dist/. This is what runs at # mcqemu.warehack.ing. # # --profile dev: # Astro dev server with HMR, src/ bind-mounted for live reload. The Vite # HMR WebSocket is configured in astro.config.mjs to survive the # TLS-terminating proxy; the caddy.reverse_proxy.* labels below keep the # connection from being closed as idle. # # Both services join the external `caddy` network and advertise themselves # to caddy-docker-proxy through labels. DOMAIN in .env switches between the # production and local-dev tiers. services: docs: profiles: ["prod", ""] build: context: . target: prod image: mcqemu-docs:prod container_name: mcqemu-docs restart: unless-stopped networks: - caddy labels: caddy: ${DOMAIN:-mcqemu.warehack.ing} caddy.reverse_proxy: "{{upstreams 80}}" docs-dev: profiles: ["dev"] build: context: . target: dev image: mcqemu-docs:dev container_name: mcqemu-docs-dev restart: unless-stopped environment: - DOMAIN=${DOMAIN:-mcqemu.l.warehack.ing} - ASTRO_TELEMETRY_DISABLED=1 volumes: # node_modules stays inside the container so host/platform mismatches # cannot break native deps. - ./astro.config.mjs:/app/astro.config.mjs:ro - ./tsconfig.json:/app/tsconfig.json:ro - ./src:/app/src - ./public:/app/public networks: - caddy labels: caddy: ${DOMAIN:-mcqemu.l.warehack.ing} caddy.reverse_proxy: "{{upstreams 4321}}" # Vite HMR sends no application-level pings, so Caddy's default idle # timeouts would close the socket every 10-15s. Needs Caddy 2.10+. caddy.reverse_proxy.flush_interval: "-1" caddy.reverse_proxy.transport: "http" caddy.reverse_proxy.transport.read_timeout: "0" caddy.reverse_proxy.transport.write_timeout: "0" caddy.reverse_proxy.transport.keepalive: "5m" caddy.reverse_proxy.transport.keepalive_idle_conns: "10" caddy.reverse_proxy.stream_timeout: "24h" caddy.reverse_proxy.stream_close_delay: "5s" networks: caddy: external: true