Migrate to Zenifra

Migrate from Render to Zenifra

This guide shows, field by field, where to find each setting of a service in the Render dashboard and where to enter the same value in the Zenifra console. For the general migration plan, with data copy and DNS switch, see Migrate to Zenifra.

Keep the Render service running while you deploy and validate the application on Zenifra. Only turn Render off after switching DNS.

1. Copy the settings from Render

In the Render dashboard, open the service you are migrating and click Settings in the service sidebar.

Build & Deploy

In the Build & Deploy section, write down:

Render fieldWhat it does
RepositoryThe service's Git repository
BranchThe deployed branch
Root DirectoryThe application folder inside the repository (monorepo). Empty means the root
Build CommandInstalls dependencies and builds, such as npm install && npm run build
Pre-Deploy CommandRuns before each deploy, usually database migrations
Start CommandStarts the application, such as npm start or gunicorn app:app
Auto-DeployWhether each commit publishes a new version

Also note the service language (Node, Python, Go, Docker, and so on), because it defines the Runtime on Zenifra.

Health Checks and domains

Still in Settings:

  • in the Health Checks section, copy the checked path, such as /health
  • in the custom domains list, note each domain that points to the service

Environment

Click Environment in the service sidebar and copy the name and value of each variable under Environment Variables. Also check:

  • Linked Environment Groups: variables from linked groups also reach the application; copy them from the group
  • Secret Files: files the application reads from /etc/secrets/<file>; see Secret Files

If the repository has a render.yaml, the same values are there: buildCommand, preDeployCommand, startCommand, rootDir, healthCheckPath, and envVars.

2. Create the project on Zenifra

In the console, click + Create project, choose HTTP Application and the plan. Then fill in the fields with what you copied:

In RenderIn the Zenifra console
RepositoryProject Source: Git repository, with Git provider GitHub (or Forgejo) and the same repository
BranchThe project branch
Service languageRuntime and Version (Node.js, Python, Bun, Go, Java, or PHP)
Root DirectoryRoot directory. Keep . if the field was empty in Render
Build CommandBuild Command
Pre-Deploy CommandBeginning of the Start Command, such as npm run migrate && npm start
Start CommandStart Command
Auto-Deploy onAutomatic by branch deployment mode
Auto-Deploy offManual deployment mode
Server portPort, under Advanced Settings. See Port
Environment VariablesEnvironment Variables
Health Check PathCheck path, under Edit › Application healthcheck (from the Premium plan up)

Render's Build Command usually starts with dependency installation, such as npm install && npm run build or pip install -r requirements.txt. On Zenifra, installation already runs during the build: copy into the Build Command only the part after the installation, such as npm run build. If nothing is left, leave the field empty. In Go and Java, keep the Build Command filled in, because it produces the binary or jar that the Start Command runs.

In Node.js, installation uses npm ci and needs a committed package-lock.json. If the Render service uses Yarn or pnpm, generate and commit a package-lock.json before migrating, or deploy as a Docker Image. See Node.js dependencies.

For details on each creation field, see How to create an HTTP project via console.

3. Adjust what differs between the platforms

Port

On Render, the application listens on the port from the PORT variable, which defaults to 10000. On Zenifra, the port is the project's Port field. If your code reads PORT, set both to the same value, for example Port 3000 and the variable PORT=3000. The application must listen on 0.0.0.0.

Render variables

Variables created by Render itself, such as RENDER_EXTERNAL_URL and RENDER_GIT_COMMIT, do not exist on Zenifra. If your code uses any of them, create a variable with the equivalent value, such as the project's Zenifra URL.

Variables during the build

In projects whose source is GitHub, the project variables are also available to the Pre-build Command and the Build Command, as on Render. See Variables during the build.

Secret Files

Zenifra has no secret files. If the file is small, such as a credentials JSON, store its content in an environment variable and read the variable in your code. Large files can live in persistent storage.

Docker services

If the Render service uses the Docker language, deploy the application as a Docker Image: build the image from your Dockerfile, push it to a registry, and enter the image in the project. The Dockerfile guide and the GitHub Action show how to automate this. If the service uses a Docker Command, put that command in the Dockerfile CMD.

Persistent Disk

If the service has a disk, enable persistent storage when you create the project and use the same mount path in Directory to Persist. This path cannot be changed after creation.

4. Other Render services

RenderZenifra
Background WorkerHTTP project with Exposure set to Private and the worker's Start Command
Cron JobScheduled job
Static SiteStatic site
Render PostgresManaged PostgreSQL. Copy the data with pg_dump and pg_restore
Render Key ValueManaged cache or Key-Value
Preview EnvironmentsPreview Environments

Create the databases before the application, so you can enter the new connection URLs in the variables right away.

5. Validate and switch DNS

  1. Open the project's *.clients.zenifra.com URL and test login, main flows, e-mails, and webhooks.
  2. Check Build logs and the application logs for errors.
  3. Follow the switch-day checklist: lower the DNS TTL, run the final data copy, add the domain on Zenifra, and update DNS.
  4. Keep the Render service running for a few days for rollback, and only then remove it.

Need help?

Write to [email protected] with the fields you copied from Render, or reach us on WhatsApp at +55 (11) 5199-3013.

Last updated on

On this page