# gr-sarsat-modern Documentation Site # Usage: # Dev: docker compose --profile dev up # Prod: docker compose --profile prod up -d services: # ───────────────────────────────────────────────────────────── # Development - hot reload with volume mounts # ───────────────────────────────────────────────────────────── docs-dev: profiles: ["dev"] build: context: . target: dev restart: unless-stopped networks: - caddy volumes: - ./src:/app/src:ro - ./public:/app/public:ro - ./astro.config.mjs:/app/astro.config.mjs:ro - ./tsconfig.json:/app/tsconfig.json:ro environment: - ASTRO_TELEMETRY_DISABLED=1 - VITE_HMR_HOST=${DOMAIN} labels: caddy: ${DOMAIN} caddy.reverse_proxy: "{{upstreams 4321}}" # WebSocket support for HMR 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" # ───────────────────────────────────────────────────────────── # Production - static site served by embedded Caddy # ───────────────────────────────────────────────────────────── docs-prod: profiles: ["prod"] build: context: . target: prod restart: unless-stopped networks: - caddy labels: caddy: ${DOMAIN} caddy.reverse_proxy: "{{upstreams 80}}" # Security headers caddy.header.X-Content-Type-Options: "nosniff" caddy.header.X-Frame-Options: "DENY" caddy.header.Referrer-Policy: "strict-origin-when-cross-origin" networks: caddy: external: true