Skip to main content

SMS Orchestrator — Local Dev Setup

Status: populated Owner: Platform Engineering Last updated: 2026-04-18

1. docker-compose

From repo root (application monorepo): docker compose -f docker-compose.dev.yml up -d postgres redis nats kong.

Relevant services:

  • postgres:16 with orch schema auto-created
  • redis:7-alpine
  • nats:2.10-alpine JetStream enabled
  • kong:3.7 DB-less, mounts ops/kong/kong.yaml

2. Environment

Copy .env.example.env:

PORT=3010
DATABASE_URL=postgresql://orch:orch@localhost:5432/ghasi_sms?schema=orch
REDIS_URL=redis://localhost:6379/1
NATS_URL=nats://localhost:4222
ROUTING_ENGINE_GRPC=localhost:50051
IDEMPOTENCY_TTL_SECONDS=172800
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
LOG_LEVEL=debug

3. Install + migrate

pnpm install
pnpm --filter @ghasi/service-sms-orchestrator prisma migrate dev
pnpm --filter @ghasi/service-sms-orchestrator prisma db seed
pnpm --filter @ghasi/service-sms-orchestrator dev

4. Smoke test

Via Kong (local):

curl -X POST http://localhost:8000/v1/sms/send \
-H "Authorization: Bearer $(./scripts/dev/mint-jwt.sh)" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"to": "+447700900123",
"from": "+447700900999",
"body": "hello from local",
"messageType": "SMS"
}'

Direct (bypass Kong):

curl -X POST http://localhost:3010/v1/sms/send -H "X-Tenant-Id: 550e8400-..." -H "X-Account-Id: ..." ...

5. Seed data

prisma/seed.ts creates:

  • 1 tenant, 1 account, 1 API key (for Kong)
  • Routing-engine stub returns operator op-dev-001
  • NATS streams: SMS_OUTBOUND, SMPP_OUTBOUND, SMS_EVENTS, SMS_RETRY, SMS_DLQ

6. Common commands

pnpm lint
pnpm typecheck
pnpm test # unit
pnpm test:int # testcontainers
pnpm test:e2e # requires Kong up
pnpm prisma studio