Files
product-issue/compose.yaml
T
2026-08-24 17:59:49 +08:00

77 lines
1.9 KiB
YAML

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:-}
INITIAL_ADMIN_EMAIL: ${INITIAL_ADMIN_EMAIL:-}
INITIAL_ADMIN_PASSWORD: ${INITIAL_ADMIN_PASSWORD:-}
INITIAL_ADMIN_NAME: ${INITIAL_ADMIN_NAME:-Administrator}
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: