Tenant Service — Local Dev Setup
Status: populated Owner: TBD Last updated: 2026-04-18 Companion: DEPLOYMENT_TOPOLOGY
1. Prerequisites
| Tool | Version |
|---|---|
| Node.js | 22 LTS |
| pnpm | 9.x |
| Docker Desktop | 4.x |
2. docker compose stack
Start shared infrastructure:
docker compose -f infra/local/docker-compose.tenant.yml up -d
services:
tenant-postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: tenant
POSTGRES_PASSWORD: tenant_dev
POSTGRES_DB: tenant_db
ports: ["5433:5432"]
tenant-redis:
image: redis:7-alpine
ports: ["6380:6379"]
nats:
image: nats:2.10-alpine
args: ["-js"]
ports: ["4222:4222"]
3. Environment (.env.local)
DATABASE_URL=postgresql://tenant:tenant_dev@localhost:5433/tenant_db
REDIS_URL=redis://localhost:6380
NATS_URL=nats://localhost:4222
TENANT_IDENTITY_SERVICE_URL=http://localhost:3001/internal/identity
TENANT_FACILITY_SERVICE_URL=http://localhost:3003/internal/hierarchy
TENANT_SUBSCRIPTION_EXPIRY_CRON="0 5 0 * * *"
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
OTEL_SERVICE_NAME=tenant-service
For integration tests, use Wiremock stubs for identity-service and facility-service calls.
4. Run the service
cd services/tenant-service
pnpm install
pnpm drizzle-kit push:pg
pnpm run seed:roles # Seeds built-in roles: TENANT_ADMIN, CLINICIAN, NURSE, PATIENT
pnpm dev
Service on http://localhost:3002.
5. Common commands
| Command | Purpose |
|---|---|
pnpm dev | Start with hot reload |
pnpm test | Unit tests |
pnpm test:integration | Integration tests (requires docker stack) |
pnpm test:cov | Coverage report |
pnpm drizzle-kit generate:pg | Generate migration |
pnpm drizzle-kit push:pg | Apply migrations |
6. Seed data
pnpm run seed:dev-tenant creates:
- Tenant
ten_DEV00000000001(kabul-central-hospital, statusactive) - Root node
nod_DEV00000000001(organization) - Tenant Admin user profile (linked to identity-service dev user)
- Built-in roles seeded