Railway and Render
Both platforms build the repository’s Dockerfile. HyperLevel needs one instance with a persistent disk
mounted at /data (SQLite) – don’t scale it horizontally.
Railway
Section titled “Railway”- New project → Deploy from GitHub repo (your fork of HyperLevel).
railway.jsonselects the Dockerfile build, the health check (/healthz) and a single replica. - Volume: service → Volumes → mount path
/data. - Variables:
PGHL_BASE_URL(your Railway domain or custom domain, withhttps://),PGHL_SECRET(${{secret(64)}}), and for the first startPGHL_ADMIN_EMAIL/PGHL_ADMIN_PASSWORD. Railway setsPORT; HyperLevel listens on it. - Networking: generate a domain or add your own.
Render
Section titled “Render”- New → Blueprint with your fork –
render.yamldefines a Docker web service with a 5 GB disk at/data, the health check and a generatedPGHL_SECRET(a disk requires a paid instance type). - Fill in
PGHL_BASE_URL(theonrender.comURL or your domain),PGHL_ADMIN_EMAIL,PGHL_ADMIN_PASSWORD. - Deploy. Custom domain: service → Settings → Custom Domains.
Notes for both
Section titled “Notes for both”- Platform disks are often owned by root; the image hands
/datato its unprivileged user on start. - Webhooks from Twilio, Meta and Stripe need the exact public address in
PGHL_BASE_URL. - Custom funnel domains: add them as custom domains on the platform (each one) – automatic on-demand certificates like with Caddy are not available there.
- Background jobs (workflow waits, reminders, syncs) run inside the web process – keep the service always on (no sleep/scale-to-zero).