ruflo/docs/DOCKER.md
# 1. Configure
cp .env.example .env
# Edit .env with your API keys
# 2. Generate config (for Cloud Run builds)
cp config/config.example.json config/config.json
# Edit config/config.json with your brand/model settings
node scripts/generate-config.js
# 3. Start
docker compose up -d
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Chat UI │────▶│ MCP Bridge │────▶│ MongoDB │
│ :3000 │ │ :3001 │ │ :27017 │
│ │ │ │ │ │
│ SvelteKit │ │ Express.js │ │ mongo:7 │
│ HF Chat UI │ │ Proxy + MCP │ │ Persistence │
└──────────────┘ └──────────────┘ └──────────────┘
│ │
│ ├──▶ OpenAI API
│ ├──▶ Google Gemini API
│ └──▶ OpenRouter API
│
└── OPENAI_BASE_URL=http://mcp-bridge:3001
All model requests from Chat UI go through the MCP Bridge, which:
mongodb)mongo:7mongo-data (persistent)mcp-bridge)./mcp-bridge/Dockerfile/health/chat/completions — OpenAI-compatible proxy (routes to Gemini/OpenAI/OpenRouter)/mcp — MCP JSON-RPC endpoint for tool calls/health — Health checkchat-ui)./chat-ui/Dockerfile (extends ghcr.io/huggingface/chat-ui-db:latest)dotenv-local.txt → .env.local| Variable | Description |
|---|---|
GOOGLE_API_KEY | Google Gemini API key |
OPENAI_API_KEY | OpenAI API key |
OPENROUTER_API_KEY | OpenRouter API key |
| Variable | Default | Description |
|---|---|---|
BRAND_NAME | AI Assistant | App title |
BRAND_DESCRIPTION | AI-powered assistant | App subtitle |
PUBLIC_ORIGIN | http://localhost:3000 | Public URL |
MONGODB_DB_NAME | chat-db | MongoDB database name |
| Variable | Description |
|---|---|
OPENID_PROVIDER_URL | e.g., https://accounts.google.com |
OPENID_CLIENT_ID | OAuth client ID |
OPENID_CLIENT_SECRET | OAuth client secret |
OPENID_SCOPES | Default: openid profile email |
OPENID_NAME_CLAIM | Default: name |
COOKIE_SECURE | true for HTTPS |
COOKIE_SAMESITE | Default: lax |
| Variable | Description |
|---|---|
SEARCH_API_URL | Your search/knowledge base endpoint |
RESEARCH_API_URL | Your research/grounding endpoint |
# Start all services
docker compose up -d
# View logs
docker compose logs -f
docker compose logs -f mcp-bridge # specific service
# Restart after .env changes
docker compose up -d --force-recreate
# Rebuild after code changes
docker compose build --no-cache
docker compose up -d
# Stop
docker compose down
# Stop and remove data
docker compose down -v
Edit config/config.example.json → models array:
{
"name": "gemini-2.5-pro",
"displayName": "Gemini 2.5 Pro",
"description": "Google's most capable model",
"provider": "gemini",
"supportsTools": true
}
Provider is resolved from the model name prefix:
gemini-* → Google Generative Language APIgpt-* → OpenAI APIThen regenerate and rebuild:
node scripts/generate-config.js
docker compose build chat-ui
docker compose up -d
Edit mcp-bridge/index.js:
tools arraytools/call switchdocker compose build mcp-bridge && docker compose up -dFor production, put a reverse proxy (nginx, Caddy, Traefik) in front:
# Add to docker-compose.yml
services:
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy-data:/data
depends_on:
- chat-ui
volumes:
caddy-data:
# Caddyfile
yourdomain.com {
reverse_proxy chat-ui:3000
}
Set PUBLIC_ORIGIN=https://yourdomain.com and COOKIE_SECURE=true in .env.