A cPanel account backup that only copies files is useless on disaster day: without the account’s configuration, the admin rebuilds everything by hand. Does backing up the whole cPanel account (configuration to recreate it, files, email and databases) run well on a production server, one account at a time and several at once? And what does the next copy cost?
Why it matters to whoever runs the server
- The whole account (configuration, files, email and databases) in 33 s for 3 accounts together, on a production server: the backup doesn’t take the night.
- The incremental of the same 3 accounts took 7 s: each night’s copy costs the server and the storage almost nothing.
- The test caught databases with @ in the name and marked them as failed, instead of saying all went well. A silent failure only shows up the day someone needs to restore.
See the data as a table
| Run | Time | Backup memory |
|---|---|---|
| 1st backup, 3 accounts one at a time (2.9 GB) | 47 s | 741 MB |
| 1st backup, 3 accounts at once (3.4 GB) | 33 s | 935 MB |
| Incremental, one at a time | 18 s | 240 MB |
| Incremental, at once | 7 s | 249 MB |
Method
How Salvo copies a cPanel account (the same principle as JetBackup): the configuration through cPanel’s own pkgacct, without the data (domains, DNS, email accounts, database users and grants, SSL, cron and FTP); the account files, including email, incrementally; and one dump per database, with MyISAM tables locked only while they’re copied. Everything goes to the account’s own repository, compressed.
A production cPanel server (AlmaLinux 8, 8 cores, 11 GB of memory, no swap), during business hours, with the sites’ normal load (5 to 6). Six WordPress accounts of about 1 GB each (13 to 38 thousand files).
Low priority, a 2 GB memory cap for the backup and an automatic pause if load went above 8. The incremental ran minutes after the first backup.
What the test caught: two databases had @ in their name. The first version rejected that character and marked the databases as failed, without pretending everything was fine. We fixed it (the name is valid in MySQL), ran again and the databases passed.
What we decided
In production, the default starts with 2 accounts at a time.