Operator Management Service — Local Dev Setup
Status: populated Owner: Platform Engineering Last updated: 2026-04-18
1. docker-compose
From repo root: docker compose -f docker-compose.dev.yml up -d postgres redis nats vault kong.
Relevant services:
postgres:16withopsschema auto-createdredis:7-alpinenats:2.10-alpineJetStream enabledvault:1.17-dev(dev mode, root tokendev-root-token)kong:3.7DB-less
2. Environment
Copy .env.example → .env:
PORT=3020
DATABASE_URL=postgresql://ops:ops@localhost:5432/ghasi_sms?schema=ops
REDIS_URL=redis://localhost:6379/2
NATS_URL=nats://localhost:4222
VAULT_ADDR=http://localhost:8200
VAULT_TOKEN=dev-root-token
VAULT_PATH_PREFIX=secret/ops/operators
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
LOG_LEVEL=debug
3. Install + Migrate
pnpm install
pnpm --filter @ghasi/service-operator-management prisma migrate dev
pnpm --filter @ghasi/service-operator-management prisma db seed
pnpm --filter @ghasi/service-operator-management dev
4. Seed Data
prisma/seed.ts creates:
- 2 test operators (
op-dev-001,op-dev-002) in ACTIVE state - Vault secrets for both operators (dev Vault root token)
- Sample routing rules for
+44and+1 - Redis health cache pre-populated to HEALTHY
5. Smoke Tests
# Create operator (via Kong local)
curl -X POST http://localhost:8000/v1/admin/operators \
-H "Authorization: Bearer $(./scripts/dev/mint-admin-jwt.sh)" \
-H "Content-Type: application/json" \
-d '{
"name": "Test Carrier",
"host": "smpp.test.local",
"port": 2775,
"systemId": "test_sys",
"bindType": "TRANSCEIVER",
"password": "test123",
"tpsLimit": { "maxTps": 100, "burstMultiplier": 1.5, "enforcementMode": "HARD_REJECT" }
}'
# Internal credentials (direct, bypass Kong)
curl http://localhost:3020/v1/internal/operators/{operatorId}/credentials \
--cert certs/dev-client.crt --key certs/dev-client.key
6. Common Commands
pnpm lint
pnpm typecheck
pnpm test # unit
pnpm test:int # testcontainers (requires Docker)
pnpm prisma studio