Services
The docker-compose.yml runs seven services:
| Service | Image | Port | Purpose |
|---|---|---|---|
| postgres | postgres:16-alpine | 5432 | Relational data (orgs, users, teams, integrations) |
| clickhouse | clickhouse/clickhouse-server:24-alpine | 8123 | Telemetry analytics (traces, metrics, logs) |
| redis | redis:7-alpine | 6379 | Caching |
| otel-collector | otel/opentelemetry-collector-contrib | 4317/4318 | Telemetry ingestion and routing |
| backend | Built from Dockerfile | 3001 | NestJS API server |
| frontend | Built from Dockerfile | 3000 | Next.js dashboard |
| openmemory | mem0/openmemory-mcp | 8765 | MCP memory server (persistent AI memory per developer) |
Production Mode
cd ~/.tandemu # or wherever you cloned the repo
docker compose up --build -dThis builds the backend and frontend into optimized Docker images and runs everything.
Development Mode
For hot-reload during development:
docker compose -f docker-compose.yml -f docker-compose.dev.yml upThis:
- Starts infrastructure services (Postgres, ClickHouse, Redis, OTel Collector) normally
- Runs the backend with
tsc --watch+node --watch— restarts on TypeScript changes - Runs the frontend with
next dev— instant hot module replacement - Mounts source code as volumes so edits are picked up immediately
Persistent Data
Three named volumes store persistent data:
| Volume | Path in Container | Data |
|---|---|---|
postgres_data | /var/lib/postgresql/data | Organizations, users, teams, integrations |
clickhouse_data | /var/lib/clickhouse | All telemetry data |
redis_data | /data | Cache (ephemeral, safe to lose) |
openmemory_data | /app/data | Developer memories (personality, coding preferences) |
To reset all data:
docker compose down -vThis removes all volumes. Next up starts fresh.
Updating
cd ~/.tandemu
git pull
docker compose up --build -dDatabase migrations are applied automatically by the install script, or manually:
for f in packages/database/src/migrations/*.sql; do
docker exec -i tandemu-postgres-1 psql -U tandemu -d tandemu < "$f"
doneHealth Checks
Postgres, ClickHouse, and Redis have built-in health checks. The backend and frontend wait for Postgres and Redis to be healthy before starting.
Check status:
docker compose psAll services should show Up or Up (healthy).
Last updated on