Environment Variables
All runtime configuration is environment-driven. The .env.example file in the repository is the authoritative template. This page explains every variable and its operational impact.
Release Pinning
Host Ports
The default compose.yml only exposes the web UI. Postgres and Redis stay internal.
Core URLs
Postgres
Redis
Authentication & Sessions
Generate all signing keys with ./scripts/keygen.sh. Each key is 32 random bytes in base64.
Argon2 (Password Hashing)
Rate Limiting
note Proxy-aware rate limiting
The global throttler keys on req.user.id for authenticated requests. For unauthenticated requests, it falls back to the real client IP. The API trusts one X-Forwarded-For hop (set by the Next.js web tier or an upstream proxy). If you run behind two reverse proxies (e.g. Cloudflare → Nginx → api), bump the trust-proxy hop count in apps/api/src/main.ts.
Password Vault Encryption
HaveIBeenPwned
File Storage
Uploaded files (attachments, thumbnails, logos, export PDFs) live on the local filesystem under a single host-bind-mounted directory, isolated per tenant by directory:
${FILE_STORAGE_DIR}/<companyId>/uploads/<uploadId>/<filename>
${FILE_STORAGE_DIR}/<companyId>/thumbs/<uploadId>.webp
${FILE_STORAGE_DIR}/<companyId>/exports/<exportId>.pdf
Uploads
Data Directory
Logging
Integrations
Settings for the integration sync engine and provider drivers. Generate encryption keys with ./scripts/keygen.sh.
Credential Encryption
Integration credential bundles (API tokens, secrets) are encrypted with the same kid-tagged envelope scheme as the password vault, but under a separate key so each can be rotated independently.
Sync Scheduling
Concurrency
HTTP Behaviour
These settings apply to every outbound HTTP call made by integration drivers (e.g. Action1 API requests). Retries use exponential backoff on 429 and 5xx responses.