Introduction
For users of low-memory VPS, regular backups are essential. This protects against data loss from service provider (IDC) termination or hardware failure. This article introduces a script that uses a cron job to automatically back up website files and MySQL databases and upload them to an FTP server.
Prerequisites
Before deploying the script, ensure the following:
- Install lftp: The script uses the powerful
lftpclient for FTP transfers.- CentOS/RHEL:
yum install lftp - Debian/Ubuntu:
apt-get install lftp
- CentOS/RHEL:
- Create Directories:
- Create a local staging directory on your VPS, e.g.,
/home/backup/. - Create a target directory on your FTP server, e.g.,
backup.
- Create a local staging directory on your VPS, e.g.,
- FTP Storage: Choose suitable FTP space. For small backups, free space often provided with domain registration may suffice.
Backup Script Explained
Below is a fully functional backup script with detailed comments. Modify the configuration values for your environment.
#!/bin/bash
# Function: Backup website and mysql database
# Author: licess
# Website: http://lnmp.org
# IMPORTANT!!! Please Setting the following Values!
######~Set Directory you want to backup~######
# Modify the directories below to your own.
# Typically website directories are in /home/wwwroot/
# To add more, use: Backup_Dir5="your_directory"
# To remove, delete the line and adjust the tar commands.
Backup_Dir1="vpser.net"
Backup_Dir2="lnmp.org"
Backup_Dir3="licess.org"
Backup_Dir4="jungehost.com"
######~Set MySQL UserName and password~######
MYSQL_UserName="root"
MYSQL_PassWord="yourmysqlrootpassword"
######~Set MySQL Database you want to backup~######
Backup_Database_Name1="vpser"
Backup_Database_Name2="licess"
Backup_Database_Name3="junge"
Backup_Database_Name4="vpserorg"
######~Set FTP Information~######
FTP_HostName="184.168.192.43" # FTP Server IP/Hostname
FTP_UserName="vpsernet" # FTP Username
FTP_PassWord="yourftppassword" # FTP Password
FTP_BackupDir="backup" # FTP Backup Directory
#Values Setting END!
TodayWWWBackup="www-*-$(date +"%Y%m%d").tar.gz"
TodayDBBackup="db-*-$(date +"%Y%m%d").sql"
OldWWWBackup="www-*-$(date -d -3day +"%Y%m%d").tar.gz"
OldDBBackup="db-*-$(date -d -3day +"%Y%m%d").sql"
# Backup Website Files
# Use --exclude to skip subdirectories.
tar zcf /home/backup/www-$Backup_Dir1-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir1 --exclude=soft
tar zcf /home/backup/www-$Backup_Dir2-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir2
tar zcf /home/backup/www-$Backup_Dir3-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir3 --exclude=test
tar zcf /home/backup/www-$Backup_Dir4-$(date +"%Y%m%d").tar.gz -C /home/wwwroot/ $Backup_Dir4
# Backup MySQL Databases
# Adjust the mysqldump path if necessary.
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name1 > /home/backup/db-$Backup_Database_Name1-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name2 > /home/backup/db-$Backup_Database_Name2-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name3 > /home/backup/db-$Backup_Database_Name3-$(date +"%Y%m%d").sql
/usr/local/mysql/bin/mysqldump -u$MYSQL_UserName -p$MYSQL_PassWord $Backup_Database_Name4 > /home/backup/db-$Backup_Database_Name4-$(date +"%Y%m%d").sql
# Delete local backups older than 3 days
rm -f /home/backup/$OldWWWBackup
rm -f /home/backup/$OldDBBackup
# Upload to FTP and delete old FTP backups
cd /home/backup/
lftp $FTP_HostName -u $FTP_UserName,$FTP_PassWord << EOF
cd $FTP_BackupDir
mrm $OldWWWBackup
mrm $OldDBBackup
mput $TodayWWWBackup
mput $TodayDBBackup
bye
EOF
Usage Instructions
- Download & Edit: Save the script to your server (e.g.,
/root/backup.sh). Edit all configuration values (directories, databases, FTP info) using a text editor likevi,nano, or an SFTP client. - Grant Execute Permission: Run
chmod +x /root/backup.sh. - Add Cron Job: Run
crontab -eand add the following line to execute the backup daily at 3 AM:0 3 * * * /root/backup.sh - Test: Manually run the script (
/root/backup.sh) to verify local backup creation, FTP upload, and check for errors.
Notes & Optimization
- Path Verification: Ensure the
mysqldumppath in the script matches your server's. Usewhich mysqldumpto find it. - Password Security: The script contains plaintext passwords. For better security, consider using a configuration file with strict permissions or MySQL's
.my.cnffile. - Retention Policy: The script keeps only the last 3 days of backups. Adjust the number in
date -d -3daybased on your storage and needs. - Error Handling: For production use, add robust error checking and logging to track backup success/failure.
- Storage Diversity: Consider syncing backups to cloud storage (e.g., S3, OSS) or another server for geographic redundancy.
Following these steps establishes a simple, reliable automated backup system to protect your VPS data.