Skip to content

7. Deployment view

Last reviewed: 2026-11-03

Where the software runs and how it gets there.

The infrastructure map is the interactive version (traffic, accounts and keys, data and backups, changes and deploys). It lives in the repository as generated HTML and is the one exception to "no generated HTML is committed": open it.

Node What runs there Defined in
App VM (beta.sailever.com, api.sailever.com) Rails (Puma and Thruster) behind kamal-proxy, fallback job worker for the realtime queue config/deploy.yml
Worker VM Solid Queue: every queue by priority, tile and depth builds, link preview images ADR 011, infra/worker
DB VM PostgreSQL 16 with PostGIS and TLS, reachable from the app subnet only DEPLOYMENT.md
Oracle Object Storage Private buckets for track files, uploads and encrypted backups DEPLOYMENT.md
Cloudflare DNS, tunnels for SSH, Access, R2 for tiles and assets, the tiles Worker infra/oci, infra/tiles
GitHub Source, Actions (deploy job), container registry .github/workflows
This documentation Built by Cloudflare Pages from docs/, visible to the owner only tools/docs

www.sailever.com is still the old Hetzner site and is never a deploy target (DEPLOYMENT.md).

Building blocks on nodes

Building block Runs on
Watch apps, DataField The user's watch (Garmin, Wear OS)
Website, logbook, device API, admin App VM, Kamal role web
Background jobs (all queues, recurring schedule) Worker VM, Kamal role jobs; realtime also on the app VM as a fallback
Tile and depth builds Worker VM, a separate service at the lowest priority
Database DB VM
Track files, uploads, backups Oracle Object Storage
Map tiles Cloudflare R2 behind the tiles Worker

Deploys: only the GitHub deploy job on main (DEPLOYMENT.md). Secrets: credentials.