services: app: build: context: . restart: unless-stopped logging: driver: json-file options: max-size: "10m" max-file: "3" init: true read_only: true security_opt: - no-new-privileges:true cap_drop: - ALL tmpfs: - /tmp:size=64m,mode=1777 environment: NODE_ENV: production HOST: 0.0.0.0 PORT: 3000 PUBLIC_ORIGIN: https://${FEEDBACK_DOMAIN:?FEEDBACK_DOMAIN is required} DATA_DIRECTORY: /app/data APP_SECRET: ${APP_SECRET:?APP_SECRET is required} SESSION_TTL_HOURS: ${SESSION_TTL_HOURS:-12} TRUST_PROXY: "true" PUBLIC_RATE_LIMIT_PER_HOUR: ${PUBLIC_RATE_LIMIT_PER_HOUR:-20} PUBLIC_INSTALLATION_LIMIT_PER_HOUR: ${PUBLIC_INSTALLATION_LIMIT_PER_HOUR:-8} MAX_SCREENSHOT_BYTES: ${MAX_SCREENSHOT_BYTES:-5242880} volumes: - feedback-data:/app/data expose: - "3000" healthcheck: test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:3000/health').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))" ] interval: 30s timeout: 5s retries: 3 start_period: 15s caddy: image: caddy:2.10.2-alpine restart: unless-stopped logging: driver: json-file options: max-size: "10m" max-file: "3" depends_on: app: condition: service_healthy environment: FEEDBACK_DOMAIN: ${FEEDBACK_DOMAIN:?FEEDBACK_DOMAIN is required} ports: - "80:80" - "443:443" - "443:443/udp" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy-data:/data - caddy-config:/config volumes: feedback-data: caddy-data: caddy-config: