Deploying WebSensor on MacLustr
WebSensor runs as three PM2 processes on one node (M4M64b), behind ngrok (www.websensor.io), orchestrated by
mld from the M1M32 gateway.
text
Internet → www.websensor.io → ngrok → websensor-api (:8260, Fastify)
├── /api/v1/* REST + WebSocket /api/v1/live
└── /* reverse proxy → websensor-web (Next.js :8261, loopback)
websensor-engine (scheduler + pipeline, Prometheus :8262) → PostgreSQL 17 `websensor` + Redis (loopback)
Blob store: ~/websensor-data/blobs (content-addressed, zstd) — never synced by mld (excluded `data/`).First deployment
- Copy
deploy/websensor.mld.json.exampletoM1M32:~/dispatch/apps/websensor.jsonand fill the two secrets (ANTHROPIC_API_KEY,SCRAPFLY_API_KEY). The manifest is0600on the gateway; a gitignored local copy may live indeploy/websensor.mld.json. ~/Desktop/cluster-skill/mld stage ~/Desktop/Projets/apps-web/websensor websensor~/Desktop/cluster-skill/mld deploy websensor --node M4M64bPost-sync hooks:pnpm install,createdb+ migrations, registry sync,next build. Health:/api/ready(database + engine activity in the last 15 minutes), publichttps://www.websensor.io/api/ready.- Verify:
mld status --live,curl https://www.websensor.io/api/v1/stats, and a WebSocket handshake (npx wscat -c wss://www.websensor.io/api/v1/live).
DNS / ngrok
www.websensor.iois a reserved ngrok domain; the CNAME at GoDaddy points to the ngrok*.ngrok-cname.comtarget. The apexwebsensor.ioshould redirect towww(GoDaddy forwarding, or an A record to ngrok + the gateway's 301 on the apex host).- WebSocket upgrades traverse ngrok without configuration; the API sends a heartbeat every 25 s so idle connections survive ngrok's timeouts.
Operations
- Logs:
mld logs websensororssh M4M64b pm2 logs websensor-engine. - Registry edits: change
config/sources.yaml, redeploy (sync runs in post-sync) orssh M4M64b "cd ~/apps/websensor && node node_modules/tsx/dist/cli.mjs apps/engine/src/cli.ts sync". Seed sensors removed from the YAML are disabled automatically; discovery-created sensors are kept. - Discovery:
cli.ts discover [sourceId…];cli.ts probe <domain>for a dry run. - Metrics: engine
http://127.0.0.1:8262/metrics, API/api/metrics(Prometheus text). Public health dashboard:/healthon the site,/api/v1/health/connectors. - Budgets:
WS_LLM_DAILY_CALL_BUDGET(Claude calls/day),WS_SCRAPFLY_DAILY_BUDGET(Scrapfly calls/day, ~30 credits each with anti-bot). Both counters reset at UTC midnight and are visible inmetrics_daily. - Backups:
pg_dump websensor+~/websensor-data/blobs(content-addressed; safe to rsync incrementally). - Retention:
sensor_runsunchanged/304 rows are pruned after 14 days, all runs after 60 days; snapshots, changes and events are kept.