services: web: image: aibook-fun-marketing:v1 pull_policy: never restart: unless-stopped ports: # Loopback-only: lets caddy proxy and health probes reach the app. # Not internet-exposed; caddy handles :80/:443 → web:3000. - "127.0.0.1:3000:3000" networks: - aibooknet healthcheck: test: ["CMD-SHELL", "curl -f -o /dev/null -w '%{http_code}' http://localhost:3000/ | grep -q '^200$' || exit 1"] start_period: 30s interval: 30s timeout: 10s retries: 5 deploy: resources: limits: memory: 512M reservations: memory: 128M caddy: image: caddy:2 restart: unless-stopped depends_on: - web environment: DOMAIN: aibook.fun ports: - "80:80" - "443:443" - "443:443/udp" volumes: - ./Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config - /var/log/caddy:/var/log/caddy networks: - aibooknet deploy: resources: limits: memory: 256M reservations: memory: 128M volumes: caddy_data: name: aibook_fun_caddy_data caddy_config: name: aibook_fun_caddy_config networks: aibooknet: name: aibook_fun_net driver: bridge