Prerequisites
- Docker and Docker Compose v2+
- At least 1 GB RAM available
- Ports 8080 (API) and 5432 (Postgres) available
Quick Start
Configure environment
.env with your settings. At minimum, change:UNISAVE_JWT_HMAC_KEY— at least 32 bytes, randomUNISAVE_REFRESH_TOKEN_PEPPER— at least 16 bytes, random
Start the stack
- PostgreSQL 16 with pgvector extension
- Migrate — runs database migrations automatically
- API server — HTTP on port 8080
- Worker — background enrichment processor
Docker Compose Services
| Service | Image | Purpose | Port |
|---|---|---|---|
postgres | pgvector/pgvector:pg16 | Database | 5432 |
migrate | Built from cmd/migrate/ | Schema migrations | — |
api | Built from cmd/api/ | HTTP API server | 8080 |
worker | Built from cmd/worker/ | Enrichment background jobs | — |
migrate service runs once at startup, applies pending migrations, then exits. The api and worker services depend on successful migration.
Data Persistence
PostgreSQL data is stored in a Docker volume (postgres-data). To reset:
Running Smoke Tests
With the stack running:Production Considerations
- Use strong secrets — generate random
JWT_HMAC_KEYandREFRESH_TOKEN_PEPPER - Enable TLS — put a reverse proxy (nginx, Caddy, Traefik) in front of the API
- Backup Postgres — set up
pg_dumpor continuous archiving - Monitor — the API exports OpenTelemetry traces; connect to Jaeger, Datadog, etc.
- Resource limits — set CPU/memory limits in
docker-compose.yml - External Postgres — for HA, use a managed Postgres (RDS, Cloud SQL) instead of the containerized one