# PicPeak Environment Configuration # Copy this file to .env and update with your values # Environment NODE_ENV=production # JWT Secret (generate with: openssl rand -base64 64) JWT_SECRET=your_very_long_random_jwt_secret_here # Auth cookie Secure flag # unset - default: follows NODE_ENV (production=true, dev=false) # true - always set Secure (HTTPS-only cookies; breaks plain-HTTP access) # false - never set Secure (allows HTTP; cookies not protected on HTTPS) # auto - decide per request: Secure on HTTPS, not on HTTP # # Use COOKIE_SECURE=auto if your deployment is reachable over both HTTPS # (via reverse proxy like Nginx Proxy Manager, Traefik, Caddy) AND plain # HTTP (e.g. LAN access at http://192.168.x.x:3010). The backend reads # req.secure from Express, which respects the X-Forwarded-Proto header # when the proxy is in the trust list. # # Requirements for auto mode: # 1. Your reverse proxy MUST send X-Forwarded-Proto: https on HTTPS # requests. Standard configs for NPM/Traefik/Caddy do this by default. # 2. The proxy must be on a trusted IP range. By default PicPeak trusts # loopback and private networks (127.0.0.1, 10.x, 172.16-31.x, # 192.168.x, link-local). Proxies outside those ranges need custom # trust proxy configuration. # COOKIE_SECURE=auto # Cookie SameSite attribute (Lax | Strict | None). Default: Lax # COOKIE_SAMESITE=Lax # Cookie Domain — set this if serving auth cookies across subdomains. # Leave unset for same-origin setups. # COOKIE_DOMAIN=.example.com # Database Configuration (PostgreSQL) DATABASE_CLIENT=pg DB_USER=picpeak # IMPORTANT: Avoid $ character in passwords - Docker Compose interprets it as variable substitution # If you must use $, escape it as $$ (e.g., Pass$$word instead of Pass$word) DB_PASSWORD=your_secure_postgres_password_here DB_NAME=picpeak_prod # Redis Configuration # IMPORTANT: Same warning applies - avoid $ or escape as $$ REDIS_PASSWORD=your_secure_redis_password_here # Admin Account (initial setup) ADMIN_USERNAME=admin ADMIN_EMAIL=admin@yourdomain.com ADMIN_PASSWORD=your_secure_admin_password_here # Email Configuration # For Gmail: use app-specific password # For SendGrid: SMTP_USER=apikey, SMTP_PASS=your-api-key SMTP_HOST=smtp.gmail.com SMTP_PORT=587 SMTP_SECURE=false SMTP_USER=your-email@gmail.com SMTP_PASS=your-app-specific-password EMAIL_FROM=noreply@yourdomain.com # Application URLs # Use full origin with scheme, no trailing slash. # Admin UI is served by the frontend at /admin. FRONTEND_URL=https://yourdomain.com ADMIN_URL=https://yourdomain.com # API URL for email assets (logos, images in notification emails) # This must be the publicly accessible URL where email recipients can load images. # If not set, defaults to http://localhost:3001 which will show broken images in emails. API_URL=https://yourdomain.com/api # Frontend API base # For pre-built images and production behind a reverse proxy, keep '/api'. # If you rebuild the frontend yourself, you may set a full URL at build time. VITE_API_URL=/api # Port Configuration (optional) # BACKEND_PORT=3001 # FRONTEND_PORT=3000 # DB_PORT=5432 # REDIS_PORT=6379 # Release Channel # Options: 'stable' (default), 'beta', or specific version like 'v2.3.0' # 'stable' uses the :stable tag (same as :latest on main) # 'beta' uses the :beta tag for pre-release versions PICPEAK_CHANNEL=stable # Update Check Configuration # Set to 'false' to disable update notifications in admin UI UPDATE_CHECK_ENABLED=true # Timezone TZ=UTC # Runtime user mapping for Docker (optional) # Set these to your host user's UID/GID to avoid permission issues on bind mounts. # Run `id -u` and `id -g` on host to get values. Defaults to 1001. PUID=1001 PGID=1001 # Analytics (Optional - Umami) VITE_UMAMI_URL= VITE_UMAMI_WEBSITE_ID= VITE_UMAMI_SHARE_URL= # Storage variables (host paths) # These control where data is stored on the host. Defaults are local folders. APP_STORAGE=./storage APP_DATA=./data LOGS=./logs # Note on FRONTEND_API_URL (documentation only): # When using pre-built frontend images, runtime env vars cannot override the built JS. # Do NOT rely on FRONTEND_API_URL in Compose. Instead, keep VITE_API_URL=/api and # let the frontend Nginx proxy /api to the backend. Only if you rebuild the frontend # should you change VITE_API_URL at build time.