Skip to content

Move an app from cPanel to Eza Cloud

Move your app, database and domain in a short maintenance window. Test on the Eza temporary URL before changing DNS.

This guide covers common cPanel migrations for PHP, Laravel and WordPress. It does not promise zero downtime. Plan a short maintenance window for the final database export and DNS switch.

  • Self-service
  • PHP
  • Laravel
  • WordPress

Migration support

Self-service migration

Eza support can answer questions about Eza tools through support@eza.co.ke.

Eza staff do not access your cPanel account, VPS, foreign host or domain registrar.

  • Migration questions receive a first reply within 1 business day.
  • If a production app migrated to Eza is broken, Eza aims to respond within 4 business hours during support hours.
  • Support hours are Monday to Saturday, 08:00 to 18:00 EAT.
  • Self-service migration is free.

Pending founder decision: decide whether Eza will offer paid hands-on migration help later. Do not publish pricing for a service that does not exist. Confirm support staffing and ticket routing can meet the 1-business-day and 4-business-hour targets before publishing.

Support response targets

Before you start

Check these before changing anything

You need:

  • Access to your Eza Cloud account.
  • Access to the cPanel account.
  • Access to your domain registrar or DNS host.
  • A local computer with Git, the Eza CLI and database client tools.
  • A copy of your app code and uploaded files.
  • Database credentials for the old host.
  • A rollback plan.

You should also:

  • Record your current domain DNS records.
  • List environment variables, email settings and third-party API keys.
  • Check current PHP version, extensions and cron jobs.
  • Check how your app stores uploads.
  • Identify background jobs and scheduled tasks.
  • Reduce DNS TTL at your registrar or DNS host 24 to 48 hours before cutover.

Eza does not host DNS. Lowering TTL happens at your existing registrar or DNS host.

Migration plan

Use a rehearsal, then make the final switch

Use this order:

  1. Create and deploy the Eza app.
  2. Create the Eza database.
  3. Import a trial copy of the old database.
  4. Copy app files and uploads.
  5. Test the app using the Eza temporary URL.
  6. Fix configuration and application errors.
  7. Schedule a short maintenance window.
  8. Stop writes on the old app.
  9. Export the final database copy.
  10. Import the final database copy into Eza.
  11. Switch DNS to Eza.
  12. Check the live app.
  13. Keep the old host available until the new app is confirmed.

The old host can remain live during a trial import.

For the final import, stop writes on the old app. Use your application’s maintenance mode or read-only mode. Any records written after the final database dump will not exist in the Eza database.

Temporary URL

Test before you move the domain

Every Eza app gets a default HTTPS URL before you add a custom domain. The format is:

Default URL
https://{app}-{org}.{apps-domain}

Example:

Example
https://shop-acme-juma-shop.{apps-domain}

Pending fact: confirm the final Eza apps domain and replace {apps-domain} before publishing. It must be the separate apps domain, never app.eza.co.ke or another subdomain of eza.co.ke.

Customer apps do not use an eza.co.ke subdomain.

Use the default URL to test the Eza deployment before you change public DNS. Do not use the temporary URL as your permanent production domain.

1. Create the app

Create an Eza organisation and app

Create an Organisation for the app you are moving. If you are an agency, create one Organisation per client.

Choose a hosting plan:

Eza hosting plans
PlanMonthly priceAppsDatabase storage
HobbyKES 1,50055 GB
StarterKES 5,0001525 GB
ProKES 15,00050100 GB

Prices include VAT at 16% and are paid by M-Pesa.

Create the app in Eza and choose the production environment.

Create an Eza app

2. Get the code

Get the application code out of cPanel

Do not rely on a cPanel full-account backup as your deployment source. Get the application code into a Git repository where possible.

PHP or Laravel

  1. Download the app files from cPanel File Manager.
  2. Exclude runtime files, logs and secrets.
  3. Add a .gitignore file.
  4. Add environment variables to Eza instead of committing .env.
  5. Commit the code to GitHub, GitLab or Bitbucket.

WordPress

  • Copy the files needed by your deployment workflow.
  • Do not place database credentials in version control.
  • Treat uploaded media separately from application code.
  • Review persistent-volume or object-storage setup before copying uploads.

Without Git

If you cannot use Git, deploy the local folder with the Eza CLI.

Terminal
cd your-appeza linkeza deploy --local

The Eza CLI respects .gitignore and .ezaignore during local uploads.

Read local deployment docs

3. Create the database

Create the target database

Create a managed database in Eza before importing data. Use the database engine that matches your app.

  • PostgreSQL
  • MySQLBeta
  • MongoDB-compatibleBeta
  • Redis-compatible
  • PostgreSQL is generally available.
  • MySQL is Beta.
  • MongoDB-compatible is Beta and runs on FerretDB.
  • Redis-compatible uses Valkey.

WordPress normally needs a MySQL-compatible database.

Pending product confirmation: publish the tested WordPress and MySQL setup before using this guide for production WordPress migrations.

Eza injects connection details into your app environment. Do not copy the old database password into your app if Eza provides new connection values.

Create a database

4. Export the database

Export the database from cPanel

MySQL and MariaDB

Use cPanel database backup tools or phpMyAdmin.

  1. Open the database backup area or phpMyAdmin.
  2. Select the database used by your app.
  3. Export it as SQL.
  4. Save the dump file on your local computer.

For WordPress, confirm you export the database shown in wp-config.php. Example values to find:

wp-config.php
define('DB_NAME', 'example_database');define('DB_USER', 'example_user');define('DB_HOST', 'localhost');

PostgreSQL

If your cPanel account provides PostgreSQL access, export the database using the database tools available in cPanel or your local PostgreSQL client. Use pg_dump for a PostgreSQL export.

Terminal
pg_dump \  --format=custom \  --file=old-app.dump \  "postgresql://OLD_USER:OLD_PASSWORD@OLD_HOST:5432/OLD_DATABASE"

A custom-format pg_dump archive is restored with pg_restore.

Keep the export file private. It can contain customer data and credentials. Encrypt dump files on your computer where possible, and delete them after a successful migration.

5. Open a tunnel

Open a database tunnel to Eza

Use eza db tunnel to expose a managed database through a local TCP port.

Terminal
eza db tunnel production-db

The tunnel works with psql, pg_restore, mysql, mongosh and redis-cli. Keep the terminal open while you import the database.

Pending product confirmation: publish exact tunnel output, local port selection and connection instructions before this guide ships.

6. Import the database

Import the database into Eza

MySQL or MariaDB dump

MySQL is Beta on Eza. Use the MySQL client through the Eza database tunnel.

Terminal
mysql \  --host=127.0.0.1 \  --port=[LOCAL_PORT] \  --user=[EZA_DATABASE_USER] \  --password \  [EZA_DATABASE_NAME] \  < old-app.sql

PostgreSQL plain SQL dump

Terminal
psql \  "postgresql://[EZA_DATABASE_USER]:[EZA_DATABASE_PASSWORD]@127.0.0.1:[LOCAL_PORT]/[EZA_DATABASE_NAME]" \  < old-app.sql

PostgreSQL custom dump

Terminal
pg_restore \  --host=127.0.0.1 \  --port=[LOCAL_PORT] \  --username=[EZA_DATABASE_USER] \  --dbname=[EZA_DATABASE_NAME] \  old-app.dump

pg_restore restores PostgreSQL archive formats created by pg_dump.

Do a trial import before the maintenance window. Do not delete the old database until the Eza app has been tested after cutover.

7. Set variables

Set environment variables

Move configuration from your cPanel .env, PHP config files or application settings into Eza environment variables. Do not commit secrets into Git.

Common values include:

Environment variables
APP_ENV=productionAPP_URL=https://your-domain.co.keDATABASE_URL=[EZA PROVIDED VALUE]DB_HOST=[EZA PROVIDED VALUE]DB_DATABASE=[EZA PROVIDED VALUE]DB_USERNAME=[EZA PROVIDED VALUE]DB_PASSWORD=[EZA PROVIDED VALUE]
  • Use only the variables your app expects.
  • Runtime variables are injected when the app starts.
  • Build-time variables enter the build only when you mark them as build-time.
  • Secret values are encrypted at rest and hidden until revealed.

Pending product confirmation: publish eza env set and eza env pull syntax before adding CLI examples.

Read environment variable docs

8. Move uploads

Handle uploads and persistent files

Do not assume files inside a cPanel app directory will survive a new deployment.

  • For WordPress, uploads commonly live in wp-content/uploads.
  • For Laravel, uploads may live under storage/app.

Use a persistent volume for app files that must remain after deployments. A volume can grow. It cannot shrink.

For a multi-replica app, use Eza Object Storage for shared uploads. A persistent volume ties an app to one replica.

At launch, Eza has no SFTP access and no SSH access to app containers.

Pending product confirmation: eza volumes cp <local path> <app>:<mount path> is proposed. Do not publish it until it exists and is tested.

For media stored in object storage, use S3-compatible tools such as rclone or aws s3 sync, then configure the app or a media-offload plugin to use that storage.

Read object storage docs

9. Test

Test on the Eza temporary URL

Test the app before touching your custom domain. Check:

  • Home page loads.
  • Sign-in works.
  • Forms write to the new database.
  • File uploads work.
  • Email settings work, if used.
  • Background workers run, if used.
  • Scheduled jobs use the right schedule.
  • Payment integrations use the correct keys.
  • HTTPS works.
  • Build and runtime logs show no unexpected errors.

For Laravel, check the health path and application configuration. For WordPress, check pages, permalinks, uploads and administrator sign-in.

For any app, test creating and editing data. Then remove the test data before final cutover if needed.

Read deployment troubleshooting

10. Add the domain

Add the custom domain before cutover

  • Add the domain in Eza before changing DNS.
  • Eza shows the DNS records you need to add.
  • Eza can verify domain ownership before you switch traffic.
  • The SSL certificate issues after DNS points to Eza.

Eza checks DNS every minute. After DNS resolves to Eza, SSL usually issues within 5 minutes. DNS propagation time depends on the old TTL, resolver caching and your DNS provider.

Add a custom domain

11. Cut over

Run the final cutover

  1. Plan a short maintenance window.
  2. Put the old app into maintenance mode or stop writes.
  3. Export a final database dump from cPanel.
  4. Import the final dump through the Eza database tunnel.
  5. Check the app on the Eza temporary URL.
  6. Update DNS records at your registrar or DNS host.
  7. Wait for DNS to resolve to Eza.
  8. Confirm that the SSL certificate is active.
  9. Test the live domain.
  10. Keep the old host available until you confirm that the new app works.

For Laravel, use the app’s own maintenance mode if your app supports it. For WordPress, use a maintenance plugin or another WordPress-level maintenance method.

Eza does not provide platform maintenance mode or redirect rules at launch. Use application code, application configuration or your existing web-server rules for redirects.

Do not write new data to both the old and new databases during the cutover. That creates records you must reconcile later.

After cutover

Check the live app and keep the rollback path

After DNS resolves to Eza:

  • Check the home page.
  • Check sign-in and core user actions.
  • Check the database writes.
  • Check uploads.
  • Check email and third-party integrations.
  • Check workers and scheduled jobs.
  • Check billing or payment flows.
  • Read the runtime logs.
  • Confirm SSL is active.

Keep the old host and backup files until you are confident in the migration.

  • Failed health check

    If a deployment fails health checks, the previous Eza deployment stays live.

  • Rollback

    You can roll back to an earlier Eza deployment in about 30 seconds.

If the Eza app has a deployment problem, use build logs and runtime logs.

FAQ

Moving from cPanel

Can Eza migrate my cPanel app for me?

No. Migrations are self-service at launch. Eza support can explain Eza tools, but Eza staff do not log in to your cPanel, VPS, foreign host or domain registrar.

Can I test my app before changing DNS?

Yes. Every app gets a default Eza HTTPS URL before you add a custom domain. Test the app there before you change DNS.

Will my site move with no downtime?

No. Eza does not promise zero downtime. Plan a short maintenance window for the final database export, import and DNS switch.

Can I import a MySQL database from cPanel?

Yes. Export an SQL dump from cPanel, then import it with the MySQL client through eza db tunnel. MySQL is Beta on Eza.

Can I import a PostgreSQL database from cPanel?

Yes. Export with pg_dump, then import with psql or pg_restore through eza db tunnel. PostgreSQL is generally available.

Can I use SFTP or SSH to copy my files?

No. Eza does not provide SFTP or SSH access at launch. Deploy code from Git or with eza deploy --local.

How do I move WordPress uploads?

Use a persistent volume for uploads that must remain after a deploy, or use Eza Object Storage for shared media. File-copy commands for volumes are not public until they are built and tested.

Can I leave the old cPanel site online during testing?

Yes. Keep the old site online during a trial import. During the final cutover, stop writes on the old site before making the final database export.

How long does SSL take after DNS changes?

Eza checks DNS every minute. After DNS resolves to Eza, SSL usually issues within 5 minutes. DNS propagation depends on your previous TTL and DNS provider.

What if my migrated app is broken?

Check build and runtime logs first. For migration questions, email support@eza.co.ke. Eza aims to reply within 1 business day. For a migrated production app that is broken, Eza aims to respond within 4 business hours during Monday to Saturday, 08:00 to 18:00 EAT.