Skip to content

Choosing a host ​

What you'll learn

Which kind of host fits your site, what every host needs from you, and a checklist before going live.

Before this page: Migrations & deployment.

Easy CMS runs wherever Node.js 22.12 or newer runs a server. It needs two things a host may or may not give you: a place for the database and a place for uploaded files. Edge runtimes (Cloudflare Workers, Vercel Edge Functions) are not supported.

Which host ​

DatabaseUploadsScheduled jobsGood for
VercelHosted Postgres (Neon) or TursoVercel Blob or S3A cron calling jobs/runNext.js sites, preview deployments
NetlifyNetlify Database or hosted PostgresNetlify Blobs or S3A scheduled function calling jobs/runNext.js sites on Netlify
DockerPostgres in a container, or SQLite on a volumeA volume, or S3Run by the server every minuteAny server or platform that runs containers
VPSSQLite on the disk, or PostgresThe diskRun by the server every minuteOne server you control, the lowest cost
Other hostsDepends on the hostDepends on the hostDepends on the hostRailway, Render, Fly.io, Coolify…

Two kinds of host behave differently:

  • Serverless (Vercel, Netlify): no disk that survives and no process that keeps running. Use a hosted database and file storage, and call the jobs endpoint from a cron.
  • Long-running (Docker, a VPS, most platforms): one server that keeps running. SQLite and uploads can stay on a persistent disk, and the server runs scheduled jobs every minute by itself.

What every host needs ​

EASY_CMS_SECRETAt least 32 random characters (openssl rand -hex 32). Without it the API answers 500.
NODE_ENV=productionProduction refuses to start while migrations are pending, and never changes the schema by itself.
MigrationsCreated with easy-cms migrate:create, committed, and applied with easy-cms migrate before the new version starts. See Migrations & deployment.
EASY_CMS_SETUP_CODEUntil the first admin exists, so nobody else can claim a fresh site.
serverURLThe public address, for absolute media URLs and email links. See Health checks.
Trust the proxyBehind a proxy or platform you trust: trustProxy (Next.js, Nuxt) or --trust-proxy (standalone), so login limits see each visitor's IP and the CSRF origin check accepts X-Forwarded-Host. Vercel and Netlify are recognized automatically.
Scheduled jobsOn serverless, a cron calling <api>/jobs/run with CRON_SECRET. They publish scheduled posts, retry webhooks, send queued emails and run backups.

Before going live ​

  • [ ] The secret, setup code and database URL are set in the host's environment, not committed
  • [ ] easy-cms migrate runs before each new version starts
  • [ ] Uploads go to a persistent disk or to file storage (Uploads & media)
  • [ ] Scheduled jobs run: every minute on a long-running server, or from a cron
  • [ ] email is configured, so password resets and invitations work (Email)
  • [ ] The site is on HTTPS, with serverURL set to its address
  • [ ] Backups run, and you have tried a restore
  • [ ] The security checklist is done

Next steps ​

Released under the MIT License.