Migrate from Vercel
On Zenavo a Next.js app runs as one long-running server (next start) instead of serverless functions, and a static site is served by Caddy. Most apps move without code changes.
How Vercel maps to Zenavo
| Vercel | Zenavo |
|---|---|
| Project | A service in a project |
| Git deployments of the production branch | Deploy on push |
| Preview deployments | No equivalent: add a service that tracks another branch, or clone the project |
| Serverless and Edge Functions | Part of the one Next.js server |
| Environment variables | Variables; NEXT_PUBLIC_* as build arguments |
vercel.json redirects, rewrites and headers | next.config.js, or your static server's config |
| Vercel Postgres, KV, Blob | Keep the provider, or move to database services |
| Cron Jobs | No scheduled jobs yet: run a worker service with a scheduler |
1. Deploy the app
- Add a server and create a project.
- Add Service → GitHub, pick the repository, and set the root directory if the app is in a monorepo.
- Follow the Next.js or Static Sites guide: Next.js builds with
next buildand starts withnext start; Vite and other static builds are served from their output folder.
Things that behave differently from Vercel:
- Incremental Static Regeneration and the image cache work with
next start, but their cache lives in the container and starts empty after each deploy. - Middleware runs in the Node.js server, not at an edge location.
- Redirects, rewrites and headers in
vercel.jsonare not read. Move them toredirects(),rewrites()andheaders()innext.config.js.
2. Copy the variables
vercel env pull .env.production --environment=productionPaste the lines under the service's Variable tab → Edit Raw Variables, leaving out the VERCEL_* ones. Move every NEXT_PUBLIC_* variable (and VITE_* for static sites) to Settings → Build → Build arguments, because they are needed while building. Delete the file afterwards.
3. Data
Databases from the Vercel Marketplace (Neon, Upstash, Supabase and others) keep working from Zenavo through their connection strings. To bring PostgreSQL onto your server instead, dump it as plain SQL with pg_dump --no-owner --no-acl "$POSTGRES_URL" | gzip > vercel.sql.gz, then upload and restore it under a new PostgreSQL service's Backup & Restore tab (Uploading a backup).
4. Switch the domain
Bind the domain under Networking, then point it at the server with an A record. If the domain uses Vercel's nameservers, change the record at Vercel DNS or move the nameservers first (Domains & HTTPS).