services: web: &id001 restart: unless-stopped environment: TRUST_ALL_PROXIES: 'true' MULTI_ORG_ENABLED: 'true' # SSO: the "GitLab" login button is really Authentik. NPM on the VPS maps GitLab's # /oauth/* and /api/v4/user paths on auth.gbrown.org to Authentik, the same shim # Infisical uses. GitLab login needs no license here; only Google is gated. SOCIAL_AUTH_GITLAB_API_URL: https://auth.gbrown.org SOCIAL_AUTH_GITLAB_KEY: ${POSTHOG_GITLAB_LOGIN_KEY:?set POSTHOG_GITLAB_LOGIN_KEY in .env} SOCIAL_AUTH_GITLAB_SECRET: ${POSTHOG_GITLAB_LOGIN_SECRET:?set POSTHOG_GITLAB_LOGIN_SECRET in .env} PERSONHOG_ADDR: personhog-router:50052 PERSISTED_FEATURE_FLAGS: sql-editor-vim-mode,cdp-hog-sources,customer-analytics-roadmap,marketing-analytics,web-experiments,dashboard-widgets,twig,tracing,metrics EMAIL_ENABLED: 'true' EMAIL_HOST: smtp.usesend.gbrown.org EMAIL_PORT: '587' EMAIL_HOST_USER: usesend EMAIL_HOST_PASSWORD: ${USESEND_API_KEY:?set USESEND_API_KEY in .env} EMAIL_USE_TLS: 'true' EMAIL_USE_SSL: 'false' EMAIL_DEFAULT_FROM: PostHog EMAIL_REPLY_TO: analytics@analytics.gbrown.org worker: <<: *id001 # compose/worker applies compose/local-patches.py, then runs upstream's # command. `command` is replaced on merge (not appended), so it is safe here. command: /compose/worker volumes: - ./compose:/compose temporal-django-worker: *id001 # Every long-running service restarts regardless of exit code. Upstream ships # `on-failure` (or `no`), which never retries a clean exit, and these services # exit 0 on purpose: capture shuts down gracefully when it loses Kafka # (2026-09-27, down 3 days), hypercache-server exits 0 when it beats redis7 at # boot. web/worker/temporal-django-worker get this via the anchor above. # kafka-init and asyncmigrationscheck are one-shots and must stay `no`. browserless: restart: unless-stopped capture: restart: unless-stopped capture-logs: restart: unless-stopped clickhouse: restart: unless-stopped cymbal: restart: unless-stopped cymbal-resolution: restart: unless-stopped db: restart: unless-stopped elasticsearch: restart: unless-stopped feature-flags: restart: unless-stopped hypercache-server: restart: unless-stopped ingestion-error-tracking: restart: unless-stopped ingestion-general: restart: unless-stopped ingestion-logs: restart: unless-stopped ingestion-sessionreplay: restart: unless-stopped ingestion-traces: restart: unless-stopped kafka: restart: unless-stopped livestream: restart: unless-stopped objectstorage: restart: unless-stopped personhog-replica: restart: unless-stopped personhog-router: restart: unless-stopped plugins: restart: unless-stopped property-defs-rs: restart: unless-stopped recording-api: restart: unless-stopped redis7: restart: unless-stopped replay-capture: restart: unless-stopped seaweedfs: restart: unless-stopped temporal: restart: unless-stopped temporal-admin-tools: restart: unless-stopped temporal-ui: restart: unless-stopped valkey: restart: unless-stopped zookeeper: restart: unless-stopped