Migrating from Render
Render and Vessl share a Git-based deploy model and automatic SSL, but Render manages the servers while Vessl uses servers you own. This guide covers the key differences and how to migrate.
Concept mapping
| Render | Vessl equivalent |
|---|---|
| Web service | Application |
| Background worker | Daemon (Daemons tab) |
| Cron job | Server cron job or daemon with a loop |
| Static site | Application with static stack detection |
| Render Postgres | PostgreSQL add-on |
| Render Redis | Redis add-on |
| Environment variables | Variables tab |
| Custom domain | Network tab → Custom domains |
| Shell (Render Shell) | Console tab → Shell |
| Logs | Logs tab |
| Deploy history | Deployments tab |
| Rollback | Deployments tab → Rollback |
| Auto-deploy on push | Auto-deploy toggle in app settings |
| Health check path | Settings → Runtime & Release → Health Check Path |
| Disk (persistent storage) | Persistent volume |
Step 1 — Add a server
Provision a Ubuntu VPS and add it to Vessl. See Add your server. Any major provider (Hetzner, DigitalOcean, Vultr, etc.) works fine.
Step 2 — Migrate environment variables
Go to your Render service → Environment and copy all variables. Paste them into Vessl's Variables tab.
Skip database connection variables (DATABASE_URL, REDIS_URL) — Vessl injects those automatically when you attach an add-on.
Step 3 — Migrate the database
Render managed databases allow you to export via pg_dump:
pg_dump "<render-postgres-connection-string>" -Fc -f backup.dump
Get the connection string from your Render database dashboard → Connection.
After creating a PostgreSQL add-on in Vessl and deploying once, set up an SSH tunnel and restore:
ssh -L 15432:127.0.0.1:5432 <ssh-user>@<server-ip> -N
pg_restore --host 127.0.0.1 --port 15432 \
--username <DB_USERNAME> --dbname <DB_DATABASE> \
--no-owner --no-privileges backup.dump
Step 4 — Background workers and cron jobs
Background workers in Render → add a Daemon in the Daemons tab with the same start command.
Cron jobs in Render → use Server cron jobs (Servers → your server → Cron Jobs) or a daemon with a loop:
/bin/sh -c "while true; do <your-command>; sleep <interval-in-seconds>; done"
Step 5 — Persistent disk
If your Render service uses a persistent disk, add a volume in the Vessl app wizard. Set the mount path to the same path your app writes to (e.g. /data, /app/storage).
See Persistent storage for details.
Step 6 — Health check
Render lets you configure a health check path per service. In Vessl, set this in Settings → Runtime & Release → Health Check Path. If you're using /healthz or /health on Render, use the same value in Vessl.
Common differences
Build minutes Render charges for build minutes on paid plans. Vessl builds run on the build server you provision — there's no per-minute billing for builds.
Spin-down on inactivity (free tier) Render's free tier spins down services after 15 minutes of inactivity. Vessl doesn't do this — your app stays running as long as the server is up.
Static sites Render serves static sites from their CDN. Vessl builds and serves static sites from an nginx container on your server, routed through Traefik. There's no built-in CDN — use Cloudflare in front of your Vessl domain if you need CDN caching for a static site.
Multiple regions Render lets you choose a deploy region per service. Vessl deploys to the server you provisioned — you choose the region when you pick your VPS provider.