# ── Immich Server Connection (required) ────────────────────────── # Validated by Zod at startup — missing or invalid values produce clear errors. # Base URL of your Immich instance (must be a valid URL) IMMICH_API_URL=http://your-immich-server:2283 # Immich API key (from Admin → API Keys) IMMICH_API_KEY=your-api-key-here # ── Optional Settings ──────────────────────────────────────────── # All have sensible defaults and are type-checked by Zod. # Site title shown in the header (string, default: "Gallery") SITE_TITLE=My Photography # Subtitle displayed below the title (string, default: "") SITE_SUBTITLE=A visual journal # Cache TTL in seconds (integer >= 0, default: 300 = 5 minutes) CACHE_TTL=300 # Cache-buster for image and video URLs (any string, default: empty = off). # Images are served with a one-year immutable cache, so browsers never # revalidate them. If you regenerate thumbnails in Immich, or rotate/edit a # photo, the asset ID stays the same and visitors keep seeing the old version. # Bump this value (e.g. 1 → 2) to change every image URL at once and force a # refetch. Leave it unset in normal operation. # IMAGE_CACHE_VERSION=1 # How long to wait for a response from Immich, in milliseconds # (integer, minimum 1000, default: 15000 = 15 seconds). # Bounds the wait for a *response* only — downloading a large photo or a long # video is not capped by this. Raise it if metadata search on very large albums # times out; lower it to fail faster when Immich is unreachable. # IMMICH_TIMEOUT_MS=15000 # Rate limit for image proxy (integer >= 1, requests per minute per IP, default: 120) # RATE_LIMIT_RPM=120 # Number of reverse proxies in front of the app (nginx/Traefik/Caddy = 1, # Cloudflare in front of nginx = 2). Required for correct rate limiting behind # a proxy — without it the client IP is read from a spoofable header. # The app must be reachable ONLY through the proxy (bind to 127.0.0.1). # TRUSTED_PROXY_HOPS=1 # Secret for signing auth cookies and encrypting asset tokens (string, min 16 chars). # If not provided, IMMICH_API_KEY will be used as a fallback (not recommended). # AUTH_SECRET=your-super-long-random-secret-here # Webhook secret for cache invalidation (optional, string). # Set this to a long random string and configure Immich to send webhooks to # POST /api/webhook with an x-immich-signature header (HMAC-SHA256 of the body). # If not set, the webhook endpoint returns 501 and is effectively disabled. # WEBHOOK_SECRET=your-long-random-webhook-secret # ── Admin Panel ────────────────────────────────────────────────── # Set a password to enable the visual admin panel at /admin. # Leave unset or empty to disable the admin UI entirely. # ADMIN_PASSWORD=your-secure-admin-password # ── Album configuration ────────────────────────────────────────── # Albums, subpages, hero image, and passwords are defined in content/gallery.yaml # See content/gallery.yaml.example for the full reference.