Deploy TraceLLM To tracellm.in
This guide deploys the first production TraceLLM stack:
tracellm.inandwww.tracellm.in: Vercel frontendapi.tracellm.in: TraceLLM backend on a Hostinger VPSsignoz.tracellm.in: private SigNoz UI on the same VPS- Caddy handles HTTPS
- Docker Compose runs the backend and reverse proxy
- SQLite persists in a Docker volume
DNS
Create these records before starting Caddy:
For the frontend, add the Vercel records for:
VPS Base Setup
Assume Ubuntu on Hostinger VPS.
sudo apt update
sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg git ufw
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
Log out and back in, then verify:
Use a current Docker Compose v2 release. The SigNoz production override uses Compose's !override merge tag so public ports are replaced with localhost-only bindings.
Firewall:
Do not publicly open ports 4319, 4318, or 8080.
Clone The Repo
Prepare Production Env Files
Copy examples:
cp infra/production/server.env.example infra/production/server.env
cp infra/production/caddy.env.example infra/production/caddy.env
Edit infra/production/server.env:
NODE_ENV=production
TRACELLM_PUBLIC_API_URL=https://api.tracellm.in
TRACELLM_DB_PATH=/app/data/tracellm.sqlite
TRACELLM_AUTH_REQUIRED=true
TRACELLM_AUTH_COOKIE_SECURE=true
TRACELLM_OTEL_EXPORTER_OTLP_ENDPOINT=http://signoz-ingester:4318
TRACELLM_EXPORT_SECRET_KEY=<strong-stable-secret>
Generate a stable export secret:
Keep TRACELLM_EXPORT_SECRET_KEY stable. If it changes, saved external export headers must be re-entered.
Generate the Caddy basic-auth hash:
Put the result in infra/production/caddy.env:
Do not commit server.env or caddy.env.
Start SigNoz
The generated SigNoz compose stack is committed under:
Start SigNoz with the production override. The override binds SigNoz host ports to 127.0.0.1 so Caddy is the only public entry point.
docker compose \
-f infra/signoz/pours/deployment/compose.yaml \
-f infra/production/signoz-production.override.yml \
up -d
Confirm the shared Docker network exists:
Start TraceLLM Backend And Caddy
Build and run:
If you install Node and pnpm on the VPS, the equivalent helper commands are:
Check containers:
docker compose -f infra/production/docker-compose.yml ps
docker compose -f infra/production/docker-compose.yml logs -f tracellm-server
Verify public endpoints:
Open:
SigNoz should ask for the Caddy basic-auth credentials.
Vercel Frontend
Vercel project settings:
Framework: Vite
Install command: pnpm install --frozen-lockfile
Build command: pnpm --filter @tracellm/web build
Output directory: apps/web/dist
Set Vercel env:
VITE_API_BASE_URL=https://api.tracellm.in
VITE_DOCS_BASE_URL=https://docs.tracellm.in
VITE_OPENAPI_URL=https://api.tracellm.in/api-docs
VITE_DEFAULT_OTLP_ENDPOINT=http://localhost:4318
Smoke Test
- Open
https://tracellm.in. - Create an account.
- Create a project API key.
- Run a real app locally:
- Confirm traces appear in TraceLLM UI.
- Confirm backend platform telemetry appears in private SigNoz.
- Create an external OTLP destination from the
Exportspage and useTest trace.
Backup And Restore
The backend SQLite database lives in the tracellm-data Docker volume at:
Create a backup:
mkdir -p ~/tracellm-backups
docker run --rm \
-v tracellm-production_tracellm-data:/data:ro \
-v ~/tracellm-backups:/backup \
alpine sh -c 'cp /data/tracellm.sqlite /backup/tracellm-$(date +%Y%m%d-%H%M%S).sqlite'
Restore from a backup:
docker compose -f infra/production/docker-compose.yml down
docker run --rm \
-v tracellm-production_tracellm-data:/data \
-v ~/tracellm-backups:/backup \
alpine sh -c 'cp /backup/<backup-file>.sqlite /data/tracellm.sqlite'
docker compose -f infra/production/docker-compose.yml up -d
Back up before changing production env, rotating secrets, or upgrading the backend.
Useful Commands
docker compose -f infra/production/docker-compose.yml logs -f
docker compose -f infra/production/docker-compose.yml restart tracellm-server
docker compose -f infra/production/docker-compose.yml pull
docker compose -f infra/production/docker-compose.yml up -d --build
docker compose -f infra/production/docker-compose.yml down