Skip to content

Automatic cPanel Backup via Curl & Cron

This setup creates a full backup of your cPanel account each month, maintaining one backup for each previous year, and monthly backups for the current year. 

You need two files:

  • crontab.txt (for setting up the cron job, that is, the automation)
  • (the actual backup commands)


5 4 28 * * /home/yourdomain/
5 4 31 12 * /home/yourdomain/ --year

You'll have to set your crontab with a command like:

crontab crontab.txt

You can see what's in your crontab with the following command:

crontab -l

# cPanel Backup via Cron v1.2

#  Instructions
# Make sure CP_SCP_BACKUP_ROOT directory exists. It is "web_backup" by default.
# Within this directory you'll need a directory for each cPanel account you're
# backing up.
# I.e. if you're backing up "" and "" and you want them
# to be backed up in the default location of "web_backup", you'll need to
# execute the following commands at the recieving end:
# mkdir ~/web_backup
# mkdir ~/web_backup/
# mkdir ~/web_backup/

#cPanel info -- host that is being backed up
CP_SKIN=x3 # plain "x" is probably the most common one

#SCP/FTP info -- host to receive the backup file

# see cPanel backup page for alternatives of transfer mode

# target directory on remote host; do not include domain names in this one
CP_SCP_BACKUP_ROOT=web_backup%2F  # url encoded, e.g. "/" equals "%2F"

# creates the target path (directory and filename)
# if you make changes, remember to url encode slashes, i.e. "/" equals "%2F"
# if --year option is used, script creates a yearly filename, otherwise a monthly one
if [ "$1" = '--year' ]; then

# email address for sending notification after backup is completed
# initiate backup (the following command should be on one line)
curl --silent --insecure --user $CP_USERNAME:$CP_PASSWORD -d "dest=$CP_SCP_MODE&email=$CP_EMAIL&server=$CP_SCP_HOST&user=$CP_SCP_USER&pass=$CP_SCP_PASS&port=$CP_SCP_PORT&rdir=$CP_SCP_RDIR" https://$CP_DOMAIN:2083/frontend/$CP_SKIN/backup/dofullbackup.html > /dev/null

# gets curl return code

# curl encountered an error
if [ $CURL_EXIT -gt 0 ]; then
	echo curl returned exit status $CURL_EXIT - see curl manual pages for more details
	exit 69

# everything ok
exit 0

Put the file, say, in your account root and make the file executable (e.g. with command "chmod 700").

Let me know in the comments how it works for you. Thanks!

Monthly Archives: December 2009

Online Backup for Mac (Mozy, Carbonite, iDrive, Dropbox, ...)


Trying to find out a way to backup my data online. Lots of options. Most of the "unlimited" backup plans have a caveat: Mozy -- Free account of 2 GB. Deletes permanently deleted files after 30 days. Carbonite -- Deletes permanently deleted files after 30 days. Backblaze -- Deletes permanently deleted files after 4 weeks. […]

[Google Analytics] Track to Two Profiles the Async Way


The new asynchronous tracking in Google Analytics requires new code as well. If you need to track more than one profile, this is how you do it.

[Excel] Recalculate Sheets on Workbook Open (Using VBA)


Add to ThisWorkbook->Workbook code. Private Sub Workbook_Open() Dim oSht As Worksheet Dim xlCalc As XlCalculation On Error GoTo ErrorHandler 'remember the user's calculation setting before setting it to manual xlCalc = Application.Calculation Application.Calculation = xlCalculationManual For Each oSht In Worksheets oSht.EnableCalculation = False oSht.EnableCalculation = True Next oSht Application.Calculate ErrorExit: On Error Resume Next 'restore […]

[Outlook] Remove Attachments (Bulk/Batch): Use VBA


Had to remove attachments from a bunch of emails. This VBA code did the trick (although it does not know how to handle attached emails, i.e. emails that have another email attached). (Remembe to create a reference to the Microsoft Scripting Runtime library: in VBA choose Tools -> References and check its checkbox.) Option Explicit […]

[Excel] Days in Month


=DAY(DATE(YEAR(A1);MONTH(A1)+1;1)-1) , where A1 contains a valid date.