Skip to main content

1. Quick Start (Dev)

Use Node.js 24 LTS for source installs, builds and tests, and npm ci with the committed lockfiles. Vitest 5 requires Node.js 22.12 or newer. The auth-service Dockerfile supplies its own pinned Node 26 runtime. These development-tooling requirements do not change the versions already published to SDK registries.
This starts PostgreSQL, Redis, and the auth service. Two developer accounts are seeded automatically: Verify it’s running:
The dev compose exposes database and Redis ports and uses hardcoded credentials. Never use it in production.

2. Generating a Production RSA Key

Grantex signs grant tokens with RSA-256. Generate a 2048-bit private key:
Collapse to a single line for environment variables:
Copy the output and use it as RSA_PRIVATE_KEY.
Keep private.pem out of source control. The JWKS endpoint exposes only the public key.

3. Production Docker Compose

Prerequisites

  • Docker 24+ with Compose v2
  • A domain name with DNS pointing to your server
  • TLS certificate (Let’s Encrypt for production)

Step 1 — Fill in the env file

Edit .env.prod and replace every change-me-* placeholder. Set RSA_PRIVATE_KEY to the collapsed PEM and JWT_ISSUER to your public base URL.

Step 2 — Provide TLS certificates

Step 3 — Start the stack

Architecture:

4. Kubernetes / Helm

Prerequisites

  • Kubernetes 1.26+, Helm 3.x
  • Managed PostgreSQL and Redis
  • An RSA private key (Section 2)

Install

Enable Ingress

Use an existing Secret

5. Environment Variable Reference

This table is a quick-start subset, not an exhaustive schema. Consult apps/auth-service/src/config.ts and apps/auth-service/.env.example from the exact release you deploy for all feature-specific settings and validation rules.

6. Database Migrations

Migrations run automatically on every startup. The auth service reads all *.sql files from the migrations/ directory and executes each one using idempotent DDL (CREATE TABLE IF NOT EXISTS, etc.). The repository currently contains ordered migrations through 092, including 091_agent_prepaid_wallets.sql for wallet balances, assignments, reservations, reloads, controls, and append-only ledger evidence, and 092_layered_wallet_spend_controls.sql for safe assignment defaults, layered policy, exact payment approval, reload velocity controls, and policy-decision evidence. Inspect the migration directory in the exact release you deploy rather than relying on a copied file count. To upgrade, just restart the service — new migration files are applied automatically.

7. Key Rotation

The JWK Set publishes every platform signing key with its thumbprint kid, alg and use: "sig", plus the RSA key under the pre-0.6 grantex-YYYY-MM kids, so tokens issued before 0.6 keep verifying. No rotation step invalidates an outstanding token.
  • Postgres key store (SIGNING_KEY_STORE=postgres): the first start imports the env keys. Run node dist/cli/rotate-signing-key.js [--alg ES256]; the new key is published first and signs after SIGNING_KEY_ACTIVATION_DELAY_SECONDS. The old key stays published for SIGNING_KEY_RETIRED_GRACE_SECONDS.
  • Env key store: publish the new public key in JWT_VERIFICATION_PUBLIC_KEYS, wait, switch the private key while keeping the old public key there (and JWT_LEGACY_KID_KEY for the old RSA key), then remove the old key after its tokens expire. See docs/self-hosting.md Section 7.

8. Health Checks & Monitoring

All logs are emitted as JSON to stdout, compatible with Datadog, Loki, and CloudWatch Logs.

9. Backup & Recovery

PostgreSQL

Redis

Redis holds ephemeral token metadata and rate-limiting state. If Redis data is lost, in-flight auth requests will fail temporarily, but no permanent data is lost. PostgreSQL is the source of truth.

10. Production Readiness Checklist

  • RSA_PRIVATE_KEY is a real 2048-bit RSA key
  • POSTGRES_PASSWORD and REDIS_PASSWORD are strong random values
  • SEED_API_KEY and SEED_SANDBOX_KEY are not set
  • TLS is enabled end-to-end
  • Database and Redis ports are not exposed publicly
  • JWT_ISSUER matches your public base URL exactly
  • Automated database backups are configured
  • Health checks are wired into your load balancer
  • CPU and memory limits are set
  • Log forwarding is configured

Prepaid wallets and x402

Prepaid-wallet hosting adds external dependencies that Docker, Helm, and the auth-service cannot provision automatically. Before enabling the feature:
  • route the exact public /v1/prepaid-wallets audience and wildcard path to the auth service over TLS;
  • keep external custody disabled until a provider adapter verifies funding, reservation, settlement, reconciliation, duplicate events, and recovery;
  • operate an SSE/WebSocket bridge if reload events must reach a human through email, SMS, or messaging;
  • require merchants to persist side-effect results under HTTP Idempotency-Key after successful settlement;
  • verify the exact SDK and x402 versions on npm rather than inferring publication from repository manifests.
Follow Prepaid Wallet Production Readiness for the complete route list, dependency matrix, failure boundaries, deployment probes, and PowerShell package-release procedure.

Ownership

Grantex is owned by Orchestrum Technologies LLP. Inventor and owner: Sanjeev Kumar. Ownership contact: sanjeev@orchestrum.in or mishra.sanjeev@gmail.com.
Last modified on September 15, 2026