Skip to main content

Tenant Service — Local Dev Setup

Status: populated Owner: TBD Last updated: 2026-04-18 Companion: DEPLOYMENT_TOPOLOGY

1. Prerequisites

ToolVersion
Node.js22 LTS
pnpm9.x
Docker Desktop4.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

CommandPurpose
pnpm devStart with hot reload
pnpm testUnit tests
pnpm test:integrationIntegration tests (requires docker stack)
pnpm test:covCoverage report
pnpm drizzle-kit generate:pgGenerate migration
pnpm drizzle-kit push:pgApply migrations

6. Seed data

pnpm run seed:dev-tenant creates:

  • Tenant ten_DEV00000000001 (kabul-central-hospital, status active)
  • Root node nod_DEV00000000001 (organization)
  • Tenant Admin user profile (linked to identity-service dev user)
  • Built-in roles seeded