Deploy#
Run the FastAPI runtime and Next.js dashboard as separate supervised services behind an HTTPS reverse proxy. Keep SQLite on durable local storage and allow only one runtime instance to write to it.
Before you start#
- A Linux or Windows host sized for both services and provider traffic.
- A DNS name and valid HTTPS certificate.
- A durable data directory and off-host backup destination.
- Production Telnyx and voice-provider credentials.
- Unique, randomly generated authentication and session secrets.
Production sequence#
- Build and test a pinned source revision.
- Install production dependencies and create a private
.envowned by the service account. - Place the SQLite database on persistent storage.
- Run database seeding only for a new installation; migrations run at startup.
- Build the dashboard with its final public and runtime URLs.
- Start one runtime process and the dashboard under a service manager.
- Proxy the public origin over HTTPS and restrict direct service ports.
- Route Telnyx callbacks only after readiness is healthy.
The runtime rejects oversized HTTP requests according to
MAX_REQUEST_BODY_BYTES; keep an equivalent or stricter proxy limit. Never
expose development password bypasses or fake providers in production.
Verify#
Check /api/health, then /api/ready. Sign in through the public dashboard,
place a controlled inbound call, and confirm webhook, media, transcript and
notification completion. Finally, create and restore a backup in a disposable
environment before declaring the service operational.
If it does not work#
| Symptom | Check | Recovery |
|---|---|---|
| Health passes but readiness does not | /api/ready names the blocker |
Do not put the line into service on a failing readiness check |
| The public dashboard is unreachable while health passes locally | The HTTPS termination and the public hostname | The service being up is not the same as it being reachable |
| The controlled inbound call fails | Whether webhooks reach the public address | See Telnyx setup |
| Restore fails in the disposable environment | Whether the application revision matches the backup | Do not declare the service operational — an unrestorable backup is a production blocker, not a test defect |