All configuration is done through environment variables.
These must be set for the platform to function:
| Variable | Description | Example |
|---|
DATABASE_URL | PostgreSQL connection string | postgresql+asyncpg://user:pass@host:5432/db |
JWT_SECRET_KEY | Secret for JWT signing (256-bit) | openssl rand -hex 32 |
ENCRYPTION_KEY | Fernet key for config encryption | See below |
from cryptography.fernet import Fernet
print(Fernet.generate_key().decode())
| Variable | Default | Description |
|---|
HOST | 0.0.0.0 | Server bind address |
PORT | 8000 | Server port |
DEBUG | false | Enable debug mode |
CORS_ALLOWED_ORIGINS | ["http://localhost:5173"] | Allowed CORS origins (JSON array) |
| Variable | Default | Description |
|---|
JWT_SECRET_KEY | Required | Secret for JWT signing |
JWT_ALGORITHM | HS256 | JWT algorithm |
JWT_ACCESS_TOKEN_EXPIRE_MINUTES | 1440 | Access token lifetime (24h) |
JWT_REFRESH_TOKEN_EXPIRE_DAYS | 7 | Refresh token lifetime |
| Variable | Default | Description |
|---|
GOOGLE_CLIENT_ID | None | Google OAuth client ID |
GOOGLE_CLIENT_SECRET | None | Google OAuth secret |
GOOGLE_REDIRECT_URI | http://localhost:8000/api/auth/google/callback | OAuth callback URL |
FRONTEND_URL | http://localhost:5173 | Frontend URL for redirects |
| Variable | Default | Description |
|---|
WORKER_POLL_INTERVAL | 2 | Seconds between job polls |
| Variable | Default | Description |
|---|
STORAGE_BACKEND | local | Storage backend: local or gcs |
| Variable | Default | Description |
|---|
STORAGE_LOCAL_PATH | /tmp/bizon-outputs | Local storage directory |
| Variable | Default | Description |
|---|
STORAGE_GCS_BUCKET | None | GCS bucket name |
STORAGE_GCS_PREFIX | pipeline-outputs | Object prefix |
STORAGE_GCS_CREDENTIALS_JSON | None | Base64-encoded service account JSON |
| Variable | Default | Description |
|---|
CUSTOM_SOURCES_PREFIX | custom-sources | Storage prefix for custom sources |
| Variable | Default | Description |
|---|
LLM_PROVIDER | openai | LLM provider: openai or anthropic |
LLM_MODEL | gpt-4o-mini | Model name |
OPENAI_API_KEY | None | OpenAI API key |
ANTHROPIC_API_KEY | None | Anthropic API key |
| Variable | Default | Description |
|---|
DATABASE_URL | Required | PostgreSQL connection string |
postgresql+asyncpg://username:password@host:port/database
For production, configure in SQLAlchemy:
DATABASE_URL=postgresql+asyncpg://bizon:bizon@localhost:5432/bizon
JWT_SECRET_KEY=dev-secret-change-in-production
ENCRYPTION_KEY=dev-key-change-in-production
DATABASE_URL=postgresql+asyncpg://bizon:${DB_PASSWORD}@db.internal:5432/bizon
JWT_SECRET_KEY=${JWT_SECRET}
ENCRYPTION_KEY=${ENCRYPTION_KEY}
CORS_ALLOWED_ORIGINS=["https://bizon.example.com"]
FRONTEND_URL=https://bizon.example.com
STORAGE_GCS_BUCKET=bizon-prod-outputs
STORAGE_GCS_CREDENTIALS_JSON=${GCS_CREDENTIALS_B64}
GOOGLE_CLIENT_ID=123456789.apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-xxx
GOOGLE_REDIRECT_URI=https://api.bizon.example.com/api/auth/google/callback
FRONTEND_URL=https://bizon.example.com
LLM_MODEL=claude-3-sonnet
ANTHROPIC_API_KEY=sk-ant-xxx
Create a .env file in the project root:
DATABASE_URL=postgresql+asyncpg://bizon:password@localhost:5432/bizon
JWT_SECRET_KEY=your-secret-key
ENCRYPTION_KEY=your-encryption-key
Pass variables to Docker:
- DATABASE_URL=${DATABASE_URL}
- JWT_SECRET_KEY=${JWT_SECRET_KEY}
DATABASE_URL: postgresql+asyncpg://...
JWT_SECRET_KEY: your-secret
Reference in deployment: