This is one approach to setting up automated backups of 3CX instances that run on Linux. This approach will use tools that are readily available.

Determine Local Public Key

I’m going to be using webinstall.dev to make things easier. Start by heading there and installing webi on your local machine. You’ll want to reopen your shell after the install.

Determine the local public key.

webi ssh-pubkey

Set up the Backup Server

Let’s provision a backup server. I’ll be using Ubuntu 18.04 on Digital Ocean, but AWS Lightsail works just as well. These instructions should also be usable on other distributions with minor modifications.

Once the backup server instance is ready, access it using SSH.

Add the local public key to the authorized keys on your backup server.

mkdir .ssh
nano .ssh/authorized_keys

Paste in the local public key from your computer and save the file. Exit and reconnect, making sure you can access the terminal without a password.

For security, at this point make two changes to the SSH daemon configuration.

  • Disable password authentication, we’ll only use keys
  • Disable Root login entirely
# /etc/ssh/sshd_config
PasswordAuthentication no
PermitRootLogin no

Set up a Backup User

Set up a user for each instance of 3CX that needs to be backed up.

sudo adduser backup3CX1

Change the permissions on the home directory so no instance can see any other instance’s backups.

sudo chmod o-rw /home/backup3CX1

Backup Script

Connect to the 3CX instance using SSH.

Implement rsync to transfer the files from the instance to the backup server. First, locate rsync on the current system.

which rsync

Make a note of the path. We’re going to reference binaries using full paths so we don’t have $PATH issues that stop our scripts from working.

Let’s make a $HOME/bin directory if it doesn’t already exist, and start creating the backup script.

mkdir bin
nano bin/backup

The backup script will look something like this. Be sure to use your own full path to rsync. If you have multiple instances, you can have multiple rsync commands in the script. Replace [username] and [hostname] (or ip address) with the username you previously set up, and the hostname of the server that hosts your backups.

#!/usr/bin/env bash
/usr/bin/rsync -avz /var/lib/3cxpbx/Instance1/Data/Backups/ [username]@[hostname]:backups/

Make the backup script executable.

chmod +x bin/backup

Make sure the backup script works.

bin/backup

You should see the details of the file transfer. Verify that the files are now intact on the backup server at /home/[user]/backups/.

Schedule the Backup Script

Now that we have a working backup, schedule the backup script on the 3CX instance to run on a predetermined interval.

crontab -e

Add something like this to the crontab. Make sure to use the full path to the backup script. Note that 0 0 * * SUN is a cron expression. Check out crontab guru for help with these expressions.

0 0 * * SUN /root/bin/backup

Keep an eye on your logs to make sure your backups are working

sudo journalctl _COMM=cron