Quick Start
The fastest way to run VeilProxy in production:
Open http://localhost:8000 and register your first user.
1. Docker Compose (Recommended)
Prerequisites: Docker and Docker Compose
With Ollama (Air-Gapped)
If running Ollama on the host machine, VeilProxy in Docker can reach it via host.docker.internal:
--add-host=host.docker.internal:host-gateway to Docker run, or use the host network.2. Docker Standalone
Build without NER (smaller image)
3. Direct Install (No Docker)
4. Kubernetes
Basic deployment manifest:
Create the secrets:
Reverse Proxy Setup
Caddy (Recommended)
Automatic TLS. A Caddyfile is included in the repository:
Nginx
Database Configuration
SQLite (Default)
No configuration needed. Database created automatically at data/veilchat.db. For production single-instance deployments, SQLite with WAL mode is sufficient for most workloads.
PostgreSQL
Recommended when running multiple instances, needing database-level backups/replication, or exceeding ~100 concurrent users.
Environment Variables
Only two variables are needed to get started. Everything else has sensible defaults and can be configured later.
Required
| Variable | Description |
|---|---|
VEILCHAT_SECRET_KEY | JWT signing key — set to a random string (e.g. openssl rand -base64 32) |
LLM Provider (at least one)
Configure at least one provider. Users can also add their own keys in the Settings page after login.
| Variable | Description |
|---|---|
VEILCHAT_OPENAI_API_KEY | OpenAI API key (GPT-4o, o3-mini, etc.) |
VEILCHAT_ANTHROPIC_API_KEY | Anthropic API key (Claude) |
VEILCHAT_OLLAMA_BASE_URL | Ollama endpoint — defaults to http://localhost:11434/v1, no key needed |
docker compose up -d. Everything below is optional.Optional: Google OAuth
Enable "Continue with Google" on the login page. Get credentials at Google Cloud Console → APIs & Services → Credentials.
| Variable | Description |
|---|---|
VEILCHAT_GOOGLE_CLIENT_ID | OAuth client ID |
VEILCHAT_GOOGLE_CLIENT_SECRET | OAuth client secret |
Optional: Email (Password Reset)
Enable password reset emails. Without this, users can still log in — they just can't reset a forgotten password.
| Variable | Default | Description |
|---|---|---|
VEILCHAT_SMTP_HOST | SMTP server (e.g. smtp.gmail.com) | |
VEILCHAT_SMTP_PORT | 587 | SMTP port |
VEILCHAT_SMTP_USER | SMTP username | |
VEILCHAT_SMTP_PASSWORD | SMTP password (use App Password for Gmail) | |
VEILCHAT_SMTP_FROM_EMAIL | From address for emails |
Optional: Advanced
Defaults work for most deployments. Only change these if you need to.
| Variable | Default | Description |
|---|---|---|
VEILCHAT_DATABASE_URL | SQLite | Use postgresql+asyncpg://... for scale |
VEILCHAT_REDIS_URL | Redis for distributed rate limiting (multi-worker) | |
VEILCHAT_CORS_ORIGINS | ["http://localhost:5173"] | Allowed origins (set to your domain) |
VEILCHAT_APP_BASE_URL | http://localhost:5173 | Public URL (for OAuth callbacks, reset links) |
VEILCHAT_LICENSE_PUBLIC_KEY_PATH | License key for paid tiers | |
VEILCHAT_OPENAI_BASE_URL | https://api.openai.com/v1 | Custom endpoint (Azure OpenAI, etc.) |
VEILCHAT_ANTHROPIC_BASE_URL | https://api.anthropic.com/v1 | Custom Anthropic endpoint |
Health Checks
| Endpoint | Purpose | Expected |
|---|---|---|
GET /api/health | Basic status | {"status": "ok"} |
GET /api/health/live | Liveness probe | Always 200 |
GET /api/health/ready | Readiness probe | 200 if DB healthy |
Upgrading
Database migrations run automatically on startup. Data is persisted in the Docker volume.