Self-hostingEnvironment reference

Environment reference

Every environment variable, explained.

How config loads#

There is no DATABASE_URL — the URI is computed from the POSTGRES_* parts, and the Celery broker/result URLs from REDIS_HOST/REDIS_PORT. In production the app refuses to boot if SECRET_KEY or ENCRYPTION_KEY are missing or default.

Required secrets#

SECRET_KEY=      # JWT signing — openssl rand -hex 32
ENCRYPTION_KEY=  # Fernet key for credential encryption
ENVIRONMENT=production

Core & URLs#

BASE_URL=https://api.yourdomain.com
PUBLIC_BASE_URL=https://api.yourdomain.com
FRONTEND_URL=https://app.yourdomain.com
PUBLIC_APP_BASE_URL=https://app.yourdomain.com
BACKEND_CORS_ORIGINS=https://app.yourdomain.com
ACCESS_TOKEN_EXPIRE_MINUTES=10080

Database & Redis#

POSTGRES_SERVER=db
POSTGRES_USER=runmycrew
POSTGRES_PASSWORD=<strong>
POSTGRES_DB=runmycrew
REDIS_HOST=redis
REDIS_PORT=6379

Email#

Optional. Without it, invites and password resets are logged to stdout instead of sent. Prefer Resend (HTTP, avoids blocked SMTP ports); SMTP is the fallback.

RESEND_API_KEY=re_...
# or SMTP:
SMTP_HOST= SMTP_PORT=587 SMTP_USER= SMTP_PASSWORD= SMTP_TLS=true
SMTP_FROM=hello@yourdomain.com
SMTP_FROM_NAME=RunMyCrew

Integration OAuth#

Each connectable app needs a client id + secret from that provider’s developer console (only set the ones you use):

GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET
SLACK_CLIENT_ID / SLACK_CLIENT_SECRET
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET
NOTION_CLIENT_ID / NOTION_CLIENT_SECRET
LINEAR_CLIENT_ID / LINEAR_CLIENT_SECRET
MICROSOFT_CLIENT_ID / MICROSOFT_CLIENT_SECRET
DISCORD_CLIENT_ID / DISCORD_CLIENT_SECRET / DISCORD_BOT_TOKEN
META_APP_ID / META_APP_SECRET / META_WEBHOOK_VERIFY_TOKEN
# + Asana, HubSpot, Calendly, Zoom, Box, Dropbox, DocuSign, LinkedIn

Model keys#

Bring your own LLM keys — set whichever providers you route to:

ANTHROPIC_API_KEY=   OPENAI_API_KEY=   GEMINI_API_KEY=   GROQ_API_KEY=
# also supported: OpenRouter, DeepSeek, Mistral, xAI, Together, Fireworks, Perplexity