Self-Hosting
Docker Compose
Full Docker Compose configuration, profiles, and service architecture.
Docker Compose
Kaiten uses Docker Compose with profiles to let you run exactly the services you need.
Profiles
| Command | Profile | Services |
|---|---|---|
make up | backend | Traefik, PostgreSQL, API, Seeder |
make up-frontend | frontend | Adds React dashboard dev server |
make up-full | full | Adds MCP server + Jaeger tracing |
make up-rabbit | rabbit | Adds RabbitMQ for the event pipeline |
Services
Core (always running)
| Service | Image | Purpose |
|---|---|---|
traefik | traefik:v3 | API gateway, JWT validation, routing |
kaiten-db | postgres:17 | Primary database with WAL logical replication |
kaiten-api | Custom Go build | REST + GraphQL + OFREP server |
kaiten-seeder | Custom Go build | One-shot database seeding |
Optional Add-ons
| Service | Profile | Purpose |
|---|---|---|
kaiten-app | frontend | React dashboard (Vite dev server) |
kaiten-mcp | full | MCP server (FastMCP, Python) |
jaeger | observe / full | Distributed tracing UI |
rabbitmq | rabbit | Event message broker |
debezium | rabbit | CDC connector for outbox events |
dapr-sidecar | rabbit | Pub/sub sidecar for event delivery |
Traefik Routing
Traefik routes requests based on path prefixes:
| Path | Middleware | Target |
|---|---|---|
/api/* (except OFREP) | clerk-jwt | kaiten-api |
/api/ofrep/* | api-token-auth | kaiten-api |
/api/webhooks/clerk | None (public) | kaiten-api |
/mcp/* | api-token-auth | kaiten-mcp |
/* | None | kaiten-app |
Data Persistence
PostgreSQL data is stored in a Docker volume (kaiten-db-data). To reset:
make down # Stop all services
docker volume rm kaiten_kaiten-db-data # Delete data
make up # Fresh startOr use the seeder's --clean flag:
KAITEN_SEED_PROFILE=kaiten-sushi-shop make up # Seeds with --clean
