Blog / Others/ Automated Backup Script for Linux VPS: Website & Database to FTP

Automated Backup Script for Linux VPS: Website & Database to FTP

自动备份Linux VPS/服务器网站/数据库并上传到FTP的脚本

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 lftp client for FTP transfers.
    • CentOS/RHEL: yum install lftp
    • Debian/Ubuntu: apt-get install lftp
  • 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.
  • 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

  1. 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 like vi, nano, or an SFTP client.
  2. Grant Execute Permission: Run chmod +x /root/backup.sh.
  3. Add Cron Job: Run crontab -e and add the following line to execute the backup daily at 3 AM:
    0 3 * * * /root/backup.sh
  4. 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 mysqldump path in the script matches your server's. Use which mysqldump to find it.
  • Password Security: The script contains plaintext passwords. For better security, consider using a configuration file with strict permissions or MySQL's .my.cnf file.
  • Retention Policy: The script keeps only the last 3 days of backups. Adjust the number in date -d -3day based 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.

Post a Comment

Your email will not be published. Required fields are marked with *.