CyberPanel and CloudPanel alternative: one AGPL hosting panel with a migration path from both
CyberPanel's OpenLiteSpeed lock-in and CloudPanel's web-only scope mean growth eventually hurts. Jabali Panel is an AGPL panel with SSH-pull migration pipelines for CyberPanel (reads its MySQL config DB) and CloudPanel (reads its SQLite DB). Debian 13 or Ubuntu 24.04.
Two of the most active open-source hosting panels — CyberPanel and CloudPanel — each solve a different slice of the hosting problem and each impose a different kind of lock-in. CyberPanel bets on OpenLiteSpeed; CloudPanel skips mail entirely. Both are fine choices, but growth exposes the ceiling.
This post explains the case for consolidating both onto one AGPL-licenced panel, and walks through the SSH-pull migration pipelines Jabali Panel ships for each.
Two different lock-ins
CyberPanel’s lock-in is the web server. OpenLiteSpeed is fast and its LSCache extension is great for WordPress — but it’s a stack choice that touches every site config, .htaccess handling, and cache layer. Moving off OLS means re-testing every site’s rewrite rules. And CyberPanel’s Enterprise tier gates the features most production shops actually reach for (Docker at scale, SLA, remote backups) behind a licence bill.
CloudPanel’s lock-in is the scope. The panel is deliberately web-only: no mail server, no DNS-authoritative option, no first-class Docker. That’s a virtue for shops that only host static sites + PHP apps and outsource mail. But if you ever want to consolidate mail hosting — or run a Nextcloud instance next to a WordPress site — you’re stuck. The migration path is “install a second panel”, not “add a feature”.
Jabali Panel is the both/and. AGPL, nginx + PHP-FPM (no proprietary web server), Stalwart for mail, PowerDNS for DNS, a 64-app Docker marketplace. And the CyberPanel + CloudPanel migration pipelines are built in.
Same platform surface, no lock-in
| Feature | CyberPanel | CloudPanel | Jabali Panel |
|---|---|---|---|
| Licence | Open-core | MIT | AGPL |
| Web server | OpenLiteSpeed | nginx | nginx + PHP-FPM |
| Postfix + Dovecot | — | Stalwart (SMTP/IMAP/JMAP) | |
| DNS | PowerDNS | — | PowerDNS |
| Databases | MariaDB | MariaDB | MariaDB + PostgreSQL |
| WP Toolkit | LSCache | FastCGI cache | Jabali Cache |
| Docker apps | Limited | — | 64+ curated stacks |
| WAF | ModSecurity | Cloudflare-only | AppSec + CrowdSec |
| Node.js | Add-on | First-class | First-class |
| Migration in | cPanel only | cPanel only | cPanel + DirectAdmin + HestiaCP + Plesk + CyberPanel + CloudPanel + WHM + IMAP |
How the SSH-pull migrations work
Neither migration needs an archive produced on the source. Both work by SSHing in and reading the source’s config database directly:
CyberPanel keeps its entire inventory in a MySQL database called cyberpanel. From internal/migrate/cyberpanel/discover.go:
CyberPanel keeps its whole inventory in the
cyberpanelMySQL database. Enumeration is plain read-only SELECTs via themysqlCLI over SSH (the SSH user is root; CyberPanel’s mysqld grants root passwordless local access). We NEVER run a mutating statement against the source.
Concretely: websiteFunctions_websites for site metadata, databases_databases for MySQL databases, e_users for mailboxes, e_forwardings for mail forwarders, e_domains for mail-domain-to-website mapping, packages_package for hosting packages.
CloudPanel keeps its inventory in SQLite. From internal/migrate/cloudpanel/discover.go:
CloudPanel stores its entire inventory in a single SQLite database at /home/clp/htdocs/app/data/db.sq3 (tables: site, php_settings, database, user). Enumeration is therefore plain read-only SELECTs via the
sqlite3CLI over SSH.
clpctl is used only for DB credentials + mysqldump. Never mutating.
Both pipelines share the read-only contract: no create, no delete, no modify against the source. Discovery days ahead is fine — the source stays operational.
Walk-through: CyberPanel migration
- Register the source in
/jabali-admin/migrations— kindcyberpanel, host, SSH port, root credentials. - Discover —
SELECT domain FROM websiteFunctions_websitesruns; site list appears. - Select sites — pick one, several, or all. Assign a target Hosting Package.
- Analyze — pipeline reads websites, databases, mailboxes, forwarders, cron. Report shows exactly what will land.
- Restore — files streamed over SSH,
mysqldumpproduces DB content, DNS zones translated to PowerDNS, mailboxes rebuilt in Stalwart with generated passwords. - Communicate mail passwords to users (Dovecot hashes don’t port to Argon2id).
- Repoint DNS.
- Issue SSL — certbot HTTP-01 via the per-domain toggle.
Full technical reference: CyberPanel migration docs.
Walk-through: CloudPanel migration
- Register the source — kind
cloudpanel. - Discover —
sqlite3 /home/clp/htdocs/app/data/db.sq3 "SELECT domain_name FROM site"runs. - Select sites.
- Analyze — pipeline reads site config,
php_settings, databases, site users. - Restore — no mail phase. Node.js / Python / Static sites all translate.
- Repoint DNS.
- Issue SSL.
Full technical reference: CloudPanel migration docs.
What breaks (and what to do)
CyberPanel: OpenLiteSpeed to nginx. Straightforward .htaccess mod_rewrite rules translate; LSAPI-specific directives don’t. Review each site’s .htaccess after Restore. LSCache is replaced by Jabali Cache for WordPress — object cache + full-page cache wired to Redis, no configuration.
CyberPanel: mailbox passwords are not portable. Dovecot’s hash format doesn’t port to Stalwart’s Argon2id store. Generated passwords land in the migration report. Deliver out of band or set force-first-login reset in Server Settings. Mailbox contents (INBOX + folders + flags) migrate intact via IMAP.
CloudPanel: no mail to consolidate. The source has no mailboxes. If you want first-class mail hosting after the migration, provision mailboxes on the destination in Stalwart, MX-repoint the domain at the registrar, and use IMAP move to copy content from your external provider. See self-hosted mail server for the full walkthrough.
Both: WAF rules don’t translate. CyberPanel ModSecurity rules and CloudPanel’s Cloudflare-only WAF are replaced by AppSec + CrowdSec at the server level — no per-site config.
Both: Docker features don’t translate 1:1. Reinstall from the Jabali Docker marketplace for the same one-click experience with harder tenant isolation.
Try it before you cut over
The Analyze step of both pipelines is strictly read-only. You can point Jabali Panel at a live CyberPanel or CloudPanel host, run Analyze, and review the report without touching production DNS or the source. Verify what would be migrated, spot-check a database restore on the destination, then decide whether to run Restore.
Full docs:
- CyberPanel migration →
- CloudPanel migration →
- Plesk migration — same SSH-pull model,
plesk bin-based - Migration overview — every supported source, the four-phase pipeline
Frequently Asked Questions
- Why leave CyberPanel or CloudPanel?
- CyberPanel: OpenLiteSpeed lock-in makes future stack changes painful, and the free tier lacks features (Docker, remote backups, SLA) that the Enterprise tier gates. CloudPanel: web-only. If you need mail hosting, you're paying an external provider forever. Jabali Panel is AGPL, ships with Stalwart Mail (SMTP/IMAP/JMAP/DKIM), uses nginx + PHP-FPM (no proprietary web server), and includes both migration pipelines out of the box.
- How do the CyberPanel and CloudPanel migrations work?
- Both are SSH pull-based — no `pkgacct`-style archive to produce on the source. The panel connects over SSH and reads the source's config database directly: CyberPanel keeps everything in a MySQL database named `cyberpanel` (tables like websiteFunctions_websites, databases_databases, e_users); CloudPanel keeps everything in a SQLite file at /home/clp/htdocs/app/data/db.sq3. Reads are plain SELECT statements. Restore synthesizes a cpmove-shape archive on the destination and reuses the cPanel restore path.
- What's the key difference between the two migrations?
- CyberPanel has a mail server (Postfix + Dovecot) so mailboxes, forwarders, and mail-domain mappings are part of the migration. CloudPanel is web-only — no mail migration phase because the source has no mailboxes. If your CloudPanel sites use external mail (Google Workspace, Zoho, Migadu), that flow continues unchanged after DNS repointing.
- Does Jabali Panel run OpenLiteSpeed?
- No. Jabali Panel uses nginx + PHP-FPM. OpenLiteSpeed vhosts on the CyberPanel source translate to fresh nginx vhosts rendered from the Jabali template. LSAPI-specific rewrites need manual review — most `.htaccess` mod_rewrite rules translate straight across, but LSAPI-only directives don't. LSCache is replaced by Jabali Cache for WordPress sites, wired to the panel's Redis instance.
- What about CyberPanel's Docker feature?
- Jabali Panel ships its own [Docker Apps marketplace](/blog/docker-apps-marketplace/) — 64+ curated self-hosted stacks (Nextcloud, Immich, Vaultwarden, Grafana, Gitea, Odoo, and more) with hardened multi-tenant install, automatic Let's Encrypt SSL, restic-based backups, and reconciler-driven updates. CyberPanel's Docker feature does not translate 1:1 — reinstall your workloads from the Jabali Docker catalog for the same one-click experience with better hardening.
- What credentials do the migrations need?
- SSH access to the source with root or sudo-capable admin. CyberPanel pipeline uses root's passwordless local MySQL access (default in CyberPanel installs) to read the `cyberpanel` database. CloudPanel pipeline uses `clpctl` for DB credentials and `sqlite3` to read the config database. Neither pipeline uses the source panel's HTTP API — pure SSH.
- Can I migrate the mail flow when leaving CloudPanel?
- CloudPanel has no source mail to migrate. But if you want to consolidate your external mail provider onto Jabali's built-in Stalwart Mail server, provision mailboxes in Jabali after the site migration completes, MX-repoint the domain, and use IMAP move to copy mail contents from the old provider. See our [self-hosted mail server](/blog/self-hosted-mail-server/) walkthrough.
- How much downtime does each migration require?
- Discovery (Analyze) happens with zero downtime on the source. Cutover downtime is bounded by DNS propagation: pre-lower TTLs 24-48h ahead to 300 seconds, freeze source writes at cutover, run Restore, repoint DNS, wait 5-10 minutes for TTL propagation. Most sites see 15-30 minutes of split-brain; no user sees a broken page.