Configuration
Configure Docker Compose, environment variables, and connector secrets for self-hosted ctx|.
Configuration is environment-driven. Set only the values your deployment needs, but treat the required auth, database, model, and public-origin values as production secrets.
Runtime requirements
- A supported deployment path: Docker Compose, the repository Terraform stack (Railway + Neon), or AWS CDK
- PostgreSQL 17; the reference Compose image is pgvector on Postgres 17
- A graph database; FalkorDB is included in the reference Compose stack
- An SMTP provider for transactional email
- An OpenRouter, Azure, Bedrock, or OpenAI-compatible model provider
- A public HTTPS origin for production auth callbacks, webhooks, MCP, and Forge remotes
Docker Compose
Clone the repository and copy the example environment file:
git clone https://github.com/ctxpipe-ai/ctxpipe.git
cd ctxpipe
cp docker-compose.env.example .envEdit .env with your values. The full production-style stack is the Compose
deploy profile:
pnpm startThe deploy profile starts Postgres, FalkorDB, OTEL collector, migrator,
backend, worker, UI, and codesearch. The backend listens on the public app port
and proxies the UI.
Required variables
| Variable | Description |
|---|---|
DATABASE_URL | PostgreSQL connection string, for example postgresql://user:pass@host:5432/db |
AUTH_SECRET | Random 32+ character string for session signing. Generate with openssl rand -hex 32. |
AUTH_BASE_URL | Public URL of your ctx| instance, for example https://ctx.example.com |
CTXPIPE_PUBLIC_APP_URL | Public backend URL baked into the UI image. Usually the same value as AUTH_BASE_URL. |
MODEL_PROVIDER_API_KEY | API key for your configured model provider |
| Variable | Description |
|---|---|
SMTP_CONNECTION_URL | SMTP connection URL, for example smtps://user:[email protected]:465 |
EMAIL_FROM_ADDRESS | From address for transactional email, for example [email protected] |
Social sign-in
All social providers are optional. Omit the variables to disable that provider.
| Variable | Description |
|---|---|
GITHUB_CLIENT_ID | GitHub OAuth app client ID |
GITHUB_CLIENT_SECRET | GitHub OAuth app client secret |
GOOGLE_CLIENT_ID | Google OAuth client ID |
GOOGLE_CLIENT_SECRET | Google OAuth client secret |
MICROSOFT_CLIENT_ID | Microsoft Entra application client ID |
MICROSOFT_CLIENT_SECRET | Microsoft Entra client secret |
See Authentication for OAuth and session behavior.
Models and embeddings
| Variable | Description |
|---|---|
MODEL_PROVIDER | Optional. openai-like default, openrouter, azure, or bedrock. |
MODEL_PROVIDER_API_KEY | API key for OpenAI-compatible providers. Omit for native Bedrock IAM. |
MODEL_PROVIDER_URL | Optional for openai-like and openrouter; required for Azure; not used by native Bedrock. |
MODEL_BEDROCK_AWS_REGION | Optional explicit region for native Bedrock; otherwise use the AWS runtime region. |
MODEL_FAST_NAME, MODEL_MEDIUM_NAME, MODEL_HIGH_NAME | Optional model names per tier. |
MODEL_EMBEDDING_NAME | Optional embedding model ID. |
See Model configuration for provider-specific examples and embedding requirements.
Graph database
| Variable | Description |
|---|---|
GRAPH_DB_PROVIDER | Optional. Selects graph provider strategy. |
GRAPH_DB_URI | FalkorDB Redis URI or Bolt URI for another supported graph database. |
GRAPH_DB_USER, GRAPH_DB_PASSWORD | Optional credentials for providers that require them. |
See Graph databases for provider support and tenancy behavior.
GitHub App connector
Repository connectors use a deployment-owned GitHub App. The in-product wizard stores its ID, PEM private key, and webhook secret encrypted for the connection.
| Variable | Description |
|---|---|
GITHUB_APP_ID | Optional after migrations. GitHub App numeric ID. |
GITHUB_PRIVATE_KEY | Optional after migrations. PEM private key for the App. |
GITHUB_WEBHOOK_SECRET | Optional after migrations. Also used for the legacy webhook route. |
GITHUB_APP_SLUG | Optional. Public app slug used for default install URLs. |
CONNECTION_SECRETS_ENCRYPTION_KEY | Optional 64-character hex key. When unset, encryption derives from AUTH_SECRET. |
The wizard reserves the connection-specific webhook URL and provides the exact value to paste into GitHub.
OAuth sign-in is separate
GITHUB_CLIENT_ID and GITHUB_CLIENT_SECRET are for signing in with GitHub.
GitHub App credentials are for repository installation and webhook access.
See GitHub for App registration, permissions, events, credentials, installation, and end-to-end verification.
Atlassian and Confluence
Self-hosted Confluence uses the same product wizard as fully managed ctx|, but your deployment or organization must provide Atlassian and Forge settings first.
| Variable | Description |
|---|---|
ATLASSIAN_CLIENT_ID, ATLASSIAN_CLIENT_SECRET | Optional global Atlassian 3LO app for account linking. If unset, each Forge connection can store its own 3LO credentials through the wizard. |
CONFLUENCE_FORGE_INSTALL_URL | Optional deployment-wide Forge install URL fallback when a Forge connection has no install URL in connections.config. |
See Confluence & Atlassian for the full operator flow.
Slack
Self-hosted Slack uses one deployment-owned Slack app. Organizations authorize that app; they do not create per-tenant Slack apps or Event Subscription URLs.
| Variable | Description |
|---|---|
SLACK_CLIENT_ID, SLACK_CLIENT_SECRET | Slack app OAuth credentials. Required to enable the Slack connector. |
SLACK_SIGNING_SECRET | Verifies Event Subscription requests (X-Slack-Signature). |
SLACK_REDIRECT_URI | Optional. Override when the public OAuth callback differs from {AUTH_BASE_URL}/api/v1/connectors/slack/oauth/callback. |
Set the client ID, client secret, and signing secret together, then restart or
redeploy backend. Backend and worker must share the same AUTH_SECRET and, when
configured, CONNECTION_SECRETS_ENCRYPTION_KEY so encrypted Slack bot tokens
remain usable by background capture jobs.
Set the Slack Event Subscriptions Request URL to:
https://<public-origin>/api/v1/webhook/slackSee Slack for scopes, app_mention Events, and
intent-based thread capture.
Linear
Linear uses a deployment-owned OAuth application and signed application webhooks. Put the credentials on both backend and worker services.
| Variable | Description |
|---|---|
LINEAR_CLIENT_ID, LINEAR_CLIENT_SECRET | Linear OAuth application credentials. Both are required to enable the connector. |
LINEAR_REDIRECT_URI | Optional exact callback override. Defaults to {AUTH_BASE_URL}/api/v1/integrations/linear/callback. |
LINEAR_WEBHOOK_SECRET | Signing secret for requests delivered to /api/v1/webhook/linear. Required for incremental updates. |
See Linear for application registration, webhook subscriptions, preview limitations, and troubleshooting.
Notion
Notion uses one deployment-owned public integration and one deployment webhook subscription.
| Variable | Description |
|---|---|
NOTION_CLIENT_ID, NOTION_CLIENT_SECRET | Public integration OAuth credentials. Both are required to enable the connector. |
NOTION_REDIRECT_URI | Optional exact callback override. Defaults to {AUTH_BASE_URL}/api/v1/connectors/notion/oauth/callback. |
NOTION_WEBHOOK_SECRET | Verification token shown by Notion after the first webhook delivery. Required for signed updates. |
Put the OAuth credentials on every service that performs token refresh or connector work, then register the single deployment webhook. See Notion for provisioning and verification.
Observability
ctx| can export OpenTelemetry data when endpoints are configured.
| Variable | Description |
|---|---|
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT | OTLP traces endpoint, for example http://collector:4318/v1/traces. |
OTEL_EXPORTER_OTLP_LOGS_ENDPOINT | OTLP logs endpoint for evlog drain. If unset, logs go to stdout only. |
OTEL_EXPORTER_OTLP_METRICS_ENDPOINT | OTLP metrics endpoint. |
OTEL_EXPORTER_OTLP_HEADERS | Optional headers, for example Authorization=Bearer xxx. |
OTEL_SERVICE_NAME | Service name for resource attributes. |
The repo includes a reference OpenTelemetry Collector in apps/otel-collector
that can fan out to APM and Langfuse-style trace backends.
Advanced
| Variable | Description |
|---|---|
AUTH_ISSUER | Override the OAuth issuer claim. Defaults to AUTH_BASE_URL. |
AUTH_ALLOWED_ORIGINS | Comma-separated list of allowed CORS origins for auth endpoints. |
CODESEARCH_URL | URL of the codesearch service when running separately. |
AMPLITUDE_API_KEY, AMPLITUDE_REGION | Optional runtime product analytics configuration (us default or eu). Use the same values on backend and UI. |
Amplitude configuration is read by the UI at runtime. Changing it does not
require rebuilding the UI image. Leave AMPLITUDE_API_KEY unset to disable
product analytics.
Railway
ctx| can be deployed on Railway with prebuilt images from GitHub Container Registry. A typical flow is:
- Build and push service images from CI:
ghcr.io/ctxpipe-ai/backend:<sha>ghcr.io/ctxpipe-ai/worker:<sha>ghcr.io/ctxpipe-ai/ui:<sha>ghcr.io/ctxpipe-ai/codesearch:<sha>
- Configure Railway services to use image sources.
- Set environment variables and secrets in Railway.
- Roll production by changing service image tags to the intended commit SHA.