services: art-curator: build: . container_name: art-curator ports: - "8000:8000" volumes: # Map the local artwork library for persistence - ./Artwork:/app/Artwork # Map the data directory for SQLite database persistence - ./data:/app/data # The container clock must be the HOUSE clock: Night & Quiet Hours and the CEC panel power # resolve "now" inside the container, which is otherwise UTC regardless of the host's timezone # (found 2026-09-20 — the schedule would have fired hours off). A bind of the host's zone file # is the standard fix and needs no config. Note: it is resolved at container start, so after # `timedatectl set-timezone` restart the stack (or reboot). - /etc/localtime:/etc/localtime:ro env_file: # Optional: pre-seed env vars (e.g. a default GEMINI_API_KEY). The app runs fine # without it — configure the AI model in-app via Admin → Settings → AI Engine. # required:false lets a fresh clone `docker compose up` with no .env (Compose >= v2.24). - path: .env required: false restart: unless-stopped # Optional HTTPS reverse proxy. Off by default; enable with: # docker compose --profile tls up -d # The app keeps serving plain http://:8000 for kiosks/displays; Caddy adds https on 443. caddy: image: caddy:2 container_name: sd-caddy profiles: ["tls"] restart: unless-stopped ports: - "80:80" - "443:443" environment: # The hostname you'll open in a browser. Default localhost; set a real domain for # auto Let's Encrypt (and remove `tls internal` in deploy/tls/Caddyfile). - SD_TLS_HOST=${SD_TLS_HOST:-localhost} volumes: - ./deploy/tls/Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config depends_on: - art-curator volumes: caddy_data: caddy_config: