● Ship · Run, back up, update
Deployment
run it, back it up, update it.
One Node.js process and one SQLite file. This page covers hosting choices, health checks, backups, restore and updates.
01Where it can run
- Any VPS or Node host with a persistent disk: Ubuntu with systemd and Caddy is described step by step in Installation.
- Not on serverless platforms without a persistent disk: the record is a file and the bot is a long-running process.
- One process per bot token. Do not run two copies against the same bot.
02Health and logs
GET /api/v1/healthanswers JSON withok, the number of calls, the latest seal and whether exit-liquidity checks are on. Use it for uptime monitoring.- Console → Monitor → Status shows each subsystem: bot, a chat recording, prices, seals, RPC, public address and every earning option.
- Logs are one JSON line per event on standard output:
journalctl -u verified-calls -f. Secrets are redacted.
curl -s https://calls.example.com/api/v1/health
Tested on a local copy: {"ok":true,…,"calls":0,…,"latestSeal":null,…} on a new install.
03Backups
The whole record is the file at DATABASE_PATH. The console's settings and encrypted secrets are admin.sqlite in the same folder, readable only with ADMIN_SECRET_KEY. Back up all three.
# safe while the service runs
sqlite3 data/verified-calls.db ".backup 'backup/verified-calls-$(date +%F).db'"
sqlite3 data/admin.sqlite ".backup 'backup/admin-$(date +%F).sqlite'"
- Or download a snapshot in the console under System → Backup (owner only; the download is logged).
- Copy backups to another machine daily and keep old ones. The seals make a restored database checkable against what you already published.
- Store
ADMIN_SECRET_KEYin a password manager, never in git.
04Restore
- Stop
sudo systemctl stop verified-calls - Replace the filesCopy the backup over
data/verified-calls.db(anddata/admin.sqlite), owned by the service user. - Start
sudo systemctl start verified-calls, then check the record:node scripts/verify-export.mjs --site https://calls.example.com.
Calls after the backup
Calls recorded after the backup and already sealed and posted will be missing from the restored file. Later seals will not chain onto what you published, and anyone checking can see it. Restore only when you must, and say so publicly.
05Updating
- Read the changelogFor your target version: Changelog.
- Back upDatabase,
admin.sqliteand.env(above). - Replace the codeStop the service, copy the new files over the old ones. Keep
.envanddata/. - Install and start
pnpm install --frozen-lockfile, then start. The database schema upgrades itself. - Recompute if askedWhen a release changes the scoring method, run
scripts/recompute.ts(how).
sudo systemctl stop verified-calls
cd /opt/verified-calls
# copy the new release over, keeping .env and data/
sudo -u verified-calls pnpm install --frozen-lockfile
sudo systemctl start verified-calls
06Behind a proxy or CDN
- Set
HOST=127.0.0.1so only the proxy reaches the app. - Switch on Product → API keys → "The site runs behind a reverse proxy" only when your own proxy sets
X-Forwarded-For; otherwise anyone can pick their own address. With it on, the visitor is the rightmostX-Forwarded-Forentry. The switch is used by the API limits, the per-visitor limit on payment requests and click counting. Without it, behind a proxy every visitor arrives from the proxy's address: payment requests from a private or loopback address are then not limited per visitor (only the site-wide caps apply) and trading-link clicks are not deduplicated. - The site sends its own security headers (Content Security Policy, HSTS when the public address is
https://,X-Frame-Options). Do not strip them.
07Before you announce it
- Status all green.
- A test call recorded, priced and sealed; the seal posted to Telegram and anchored on Solana.
verify-export.mjsexits 0 against your site.- Backups copied off the server.
- Method fixed and visible on
/methodology.