一个WEB 服务器自动备份脚本
主机上运行了一些服务,虽然都不是很重要,但数据还是有备份的必要,文件类的可以直接复制备份,数据库也可以手动备份,有自动化脚本则减轻了负担。WebServerAutoBackup项目可以完成这个任务。
已实现功能:
- 自动备份网站和数据库到本地
- 自动记录日志到文件
- 自动删除三天前的备份文件和日志
- 备份脚本和配置文件分离(通过ini解析引擎解析外置config.ini)
- 自动判断机器类型,下载相应的云上传工具
自动将备份文件上传到云并和本地同步删除
原理:
- 通过ini解析引擎bash-ini-parser解析用户配置文件config.ini
- 通过mysqldump导出数据库
- zip压缩备份
- 备份日志通过echo和tee同时显示屏幕和输出到文件
config.ini内容
###################################################################
#################### Your Server Info Config ####################
#################### 备份脚本的配置文件 ####################
#------------------------------------------------------------------
#配置文件填写说明
#Tip: You can edit it like this:
#[WWWROOT_CONFIG]
#WWWROOT=/home/wwwroot //需要备份的目录
#If you have multiple wwwroot,you can set it like this:
#WWWROOT=/home/wwwroot1 /home/wwwroot2 //多个目录中间用空格隔开
#------------------------------------------------------------------
[WWWROOT_CONFIG]
WWWROOT_DIR=/www/wwwroot
#------------------------------------------------------------------
#[MYSQL_CONFIG]
#MYSQL_BACKUP_ALL=yes/no //是否备份实例上所有数据库? yes:备份所有数据库; no:备份指定数据库
#MYSQL_DBS=dbname
#If you have multiple databases,you can set it like this:
#MYSQL_DBS=dbname1 dbname2 //数据库名字,多个数据库中间用空格隔开
#MYSQL_PASSWD=123456 //数据库密码
#MYSQL_USER=root //数据库用户名
#MYSQL_SERVER=127.0.0.1 //数据库地址
#MYSQL_SERVER_PORT=3306 //数据库端口
#------------------------------------------------------------------
[MYSQL_CONFIG]
MYSQL_BACKUP_ALL=yes
MYSQL_DBS=
MYSQL_USER=
MYSQL_PASSWD=
MYSQL_SERVER=127.0.0.1
MYSQL_SERVER_PORT=3306
#------------------------------------------------------------------
#[SAVE_CONFIG]
#SAVE_DIR=/home/backup/save //备份文件保存目录
#SAVE_LOG_DIR=/home/backup/log //备份日志保存目录
#------------------------------------------------------------------
[SAVE_CONFIG]
SAVE_LOG_DIR=/root/backup/log
SAVE_DIR=/root/backup/save
#------------------------------------------------------------------
#[TEMP_CONFIG]
#TEMP_DIR=/tmp/backup //备份工作目录(自动删除)
#------------------------------------------------------------------
[TEMP_CONFIG]
TEMP_DIR=/tmp/backup
#------------------------------------------------------------------
#[DAY_CONFIG]
#DAY=0 //不自动删除之前备份的文件和日志
#DAY=n //自动删除n天前备份和日志
#特别注意:备份的文件/日志不要动修改日期,否则无法删除!!
#Warning:Do not change your backup log or files!
#------------------------------------------------------------------
[DAY_CONFIG]
DAY=0
#------------------------------------------------------------------
#[QSHELL_CONFIG]
#AUTO_UPLOAD=NO //不自动上传七牛空间
#AUTO_UPLOAD=YES //自动上传到七牛空间
#如果要上传到七牛空间,请填写您的ACCESS_Key和SECRET_Key以及BUCKET
#AUTO_DELETE=no //自动和本地同步删除n天前的备份和日志
#BUCKET=backup //空间名,建议是私有空间
#ACCESS_Key= //您的ACCESS_Key
#SECRET_Key= //您的SECRET_Key
#key_prefix=backup //前缀名,用来方便区分和管理
#------------------------------------------------------------------
[QSHELL_CONFIG]
AUTO_UPLOAD=no
AUTO_DELETE=no
BUCKET=backup
ACCESS_Key=
SECRET_Key=
key_prefix=backup
#------------------------------------------------------------------
#[UPX_CONFIG]
#AUTO_UPLOAD=NO //不自动上传又拍云空间
#AUTO_UPLOAD=YES //自动上传到又拍云空间
#如果要上传到又拍云空间,请填写您的操作员账户密码,并进行相关权限的设置
#AUTO_DELETE=no //自动和本地同步删除n天前的备份和日志
#BUCKET=backup //空间名,建议是私有空间
#UPX_UESR= //您的操作员账户
#UPX_PASSWD= //您的账户密码
#UPX_DIR= //又拍云上传文件夹 请勿加路径/符号!
#------------------------------------------------------------------
[UPX_CONFIG]
AUTO_UPLOAD=no
AUTO_DELETE=no
BUCKET=
UPX_UESR=
UPX_PASSWD=
UPX_DIR=backup
#------------------------------------------------------------------
#[BPCS_UPLOADER_CONFIG]
#If you want to upload to BauDuYun,You must install php and init the bpcs_uploader
#AUTO_UPLOAD=yes or no //是否自动上传到百度网盘
#BDY_DIR=backup //百度云上存储备份的文件夹,前面请勿加 / 符号
#AUTO_DELETE=yes //是否自动和本地同步删除备份
#------------------------------------------------------------------
[BPCS_UPLOADER_CONFIG]
AUTO_UPLOAD=no
BDY_DIR=backup
AUTO_DELETE=no
#------------------------------------------------------------------
#[FTP_CONFIG]
#IF you want to upload to ftp,you must install command ftp.
#And you ftp server must allow through the firewall.
#警告:如果要上传到ftp,本机需要安装ftp命令
# 远程ftp服务器需要放行相关端口
# ftp上传受网络影响较大
#AUTO_UPLOAD=NO //不自动上传ftp
#AUTO_DELETE=YES //自动上传到ftp
#AUTO_DELETE=no //自动和本地同步删除n天前的备份和日志
#FTP_DIR=backup //ftp上传文件夹 请勿加路径/符号!
#FTP_UESR=test //ftp用户名
#FTP_PASSWD=test //ftp密码
#FTP_ADDR=xxx.xxx.xxx.xxx //ftp地址
#FTP_PORT=21 //ftp端口
#------------------------------------------------------------------
[FTP_CONFIG]
AUTO_UPLOAD=no
AUTO_DELETE=no
FTP_DIR=backup
FTP_UESR=
FTP_PASSWD=
FTP_ADDR=
FTP_PORT=21
#------------------------------------------------------------------
#[COS_CONFIG]
#上传到腾讯云对象存储设置
#AUTO_UPLOAD=no/yes 是否自动上传到COS
#AUTO_DELETE=no/yes 是否自动和本地同步删除备份
#COS_UPLOAD_DIR=backup // COS上存储备份的文件夹,前面请勿加符号 /
#SECRET_ID=XXXXXXXXXXXXXXX APPID 对应的密钥 ID,可从控制台获取,参考:https://cloud.tencent.com/doc/product/436/6225
#SECRET_KEY=YYYYYYYYYYYYYY APPID 对应的密钥 Key,可从控制台获取,参考: https://cloud.tencent.com/doc/product/436/6225
#BUCKET=NAME-XXXXXXX 指定的存储桶名称,bucket的命名规则为{name}-{appid} ,参考:https://cloud.tencent.com/doc/product/436/6232
#REGION=XXXXXXXXX 存储桶所在地域。参考:https://cloud.tencent.com/doc/product/436/6224
#------------------------------------------------------------------
[COS_CONFIG]
AUTO_UPLOAD=no
AUTO_DELETE=no
COS_UPLOAD_DIR=backup
SECRET_ID=**********************************
SECRET_KEY=*********************************
BUCKET=**************
REGION=ap-beijing
#------------------------------------------------------------------
#[COMPRESS_CONFIG]
#备份压缩设置
#使用ZIP压缩,请确保安装zip命令
#COMPRESS_PASSWD=xxxxx 指定ZIP压缩包密码
#------------------------------------------------------------------
[COMPRESS_CONFIG]
COMPRESS_PASSWD=
#------------------------------------------------------------------
#[SFTP_CONFIG]
#使用SFTP上传到远程服务器(实验性功能!!)
#SFTP上传基于SSH远程连接,请本机安装SSH命令。远程服务器须有SSHD服务,并且打开远程登陆
#若使用请设置登陆密码,或者登陆密钥证书(推荐),你可以参考这里:http://www.runoob.com/w3cnote/set-ssh-login-key.html
#若使用密钥,请下载到本地,并且指定路径地址(包括文件名)
#AUTO_UPLOAD=no/yes 是否通过SFTP自动上传到远程服务器
#AUTO_DELETE=no/yes 是否自动和本地同步删除备份
#AUTH_METHOD=password/certificate 认证方法:password密码/certificate证书
#!!请指定一种认证方法并且在远程服务器做相关设置!!
#REMOTE_IP=xxx.xxx.xxx.xxx //远程服务器IP地址
#REMOTE_PORT=22 //远程服务器登陆端口
#REMOTE_USER=root //远程服务器用户名
#REMOTE_PASSWD=xxxxxx //远程服务器登陆密码(如果选择密码登陆并设置)
#REMOTE_CERT=/etc/cert/remote //远程服务器登陆密钥证书(如果选择密钥证书登陆并设置,设置包括文件名)
#REMOTE_DIR=/home/backup //远程服务器存储路径 (绝对路径)
#!!请注意远程服务器存储路径是绝对路径!!
#------------------------------------------------------------------
[SFTP_CONFIG]
AUTO_UPLOAD=no
AUTO_DELETE=no
AUTH_METHOD=
REMOTE_IP=
REMOTE_PORT=22
REMOTE_USER=root
REMOTE_PASSWD=
REMOTE_CERT=/etc/cert/remote
REMOTE_DIR=/home/backup
###################################################################
backup.sh内容
太长了,略。
使用方法
apt -y install wget zip curl #for Debian/Ubuntu
git clone https://github.com/CHN-STUDENT/WebServerAutoBackup.git
cd WebServerAutoBackup
nano config.ini //修改配置文件内的网站、数据库等参数
chmod a+x backup.sh
./backup.sh //使用默认配置文件运行
./backup.sh config-customize.ini //使用指定配置文件运行
注意:勿将临时目录设置成根/等重要目录,不然可能会造成系统及重要数据丢失的情况!!!这些目录也尽量不要设置到移动硬盘上,防止移动断电等意外情况。
添加计划任务,每天凌晨两点自动备份
crontab -e
0 2 * * * cd /data/backup/WebServerAutoBackup && ./backup.sh > /data/backup/log/backup-cron.log 2>&1 &
自己的主机,没有各类云,备份到本地即可。这里备份了memos,trilium,sun-panel,typecho,php自动更换图片api。前三个都是sqlite数据库,备份数据库文件即可,涉及备份上传到云的部分原样不动。
备份的文件
backup.20250207104309.zip
备份日志
20250207.backup.log