services: app: build: . restart: unless-stopped volumes: # Mount media directory for book covers - media:/app/media # Mount instance directory for config and database persistence - instance:/app/instance # Mount shared directory for static files that Caddy can access - static:/shared/static # Mount caddy_file for Caddy configuration - caddy_file:/app/caddy expose: - "5000" environment: - FLASK_ENV=production - GOOGLE_BOOKS_API_KEY=${GOOGLE_BOOKS_API_KEY} networks: - hxbooks # Health check to ensure app is ready healthcheck: test: [ "CMD-SHELL", "wget --no-verbose --tries=1 --spider http://127.0.0.1:5000/ || exit 1", ] interval: 30s timeout: 10s retries: 3 start_period: 30s caddy: image: caddy:2-alpine restart: unless-stopped ports: - "5123:443" volumes: # Caddyfile configuration - caddy_file:/etc/caddy # Media files served directly by Caddy - media:/var/www/media:ro # Static files served directly by Caddy (populated by app container) - static:/var/www/static:ro # Caddy data for TLS certificates - caddy_data:/data - caddy_config:/config networks: - hxbooks depends_on: app: condition: service_healthy networks: hxbooks: driver: bridge volumes: media: driver: local instance: driver: local static: driver: local caddy_data: driver: local caddy_config: driver: local caddy_file: driver: local