网站自动备份脚本,自动备份网站目录和数据库并上传到Minio自建的S3服务器

```
#!/bin/bash

===============================

综合备份脚本:备份 MySQL 数据库和网站文件并上传到 S3,同时保留最近3天的备份

===============================

配置部分

DB_USER=“root” # MySQL 用户名
DB_PASSWORD=“password” # MySQL 密码
DB_NAME=“nodeloc” # 数据库名称
WEB_ROOT=“/www/www.nodeloc.com” # 网站根目录
BACKUP_PATH=“/www/backups” # 本地备份存放路径
S3_DB_BUCKET=“s3backup/backup/database/nodeloc” # S3 数据库备份存储桶路径
S3_WEB_BUCKET=“s3backup/backup/site/nodeloc.com” # S3 网站文件备份存储桶路径
LOG_FILE=“/var/log/backup_all.log” # 日志文件路径
DAYS_TO_KEEP=3 # 保留备份的天数

创建备份目录(如果不存在)

mkdir -p “$BACKUP_PATH”

获取当前日期

DATE=$(date +‘%Y-%m-%d’)

定义备份文件名

DB_BACKUP_FILE=“${BACKUP_PATH}/nodeloc_backup_${DATE}.sql.gz”
WEB_BACKUP_FILE=“${BACKUP_PATH}/nodeloc_web_backup_${DATE}.tar.gz”

开始备份数据库

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 开始备份数据库 ‘${DB_NAME}’。” >> “$LOG_FILE”
mysqldump -u “$DB_USER” -p"$DB_PASSWORD" “$DB_NAME” | gzip > “$DB_BACKUP_FILE”

检查数据库备份是否成功

if [ $? -ne 0 ]; then
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 错误:数据库备份失败。” >> “$LOG_FILE”
exit 1
fi

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 数据库备份成功,备份文件:${DB_BACKUP_FILE}” >> “$LOG_FILE”

开始备份网站文件

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 开始备份网站文件 ‘${WEB_ROOT}’。” >> “$LOG_FILE”
tar -czf “$WEB_BACKUP_FILE” -C “$(dirname “$WEB_ROOT”)” “$(basename “$WEB_ROOT”)”

检查网站文件备份是否成功

if [ $? -ne 0 ]; then
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 错误:网站文件备份失败。” >> “$LOG_FILE”
exit 1
fi

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 网站文件备份成功,备份文件:${WEB_BACKUP_FILE}” >> “$LOG_FILE”

上传数据库备份文件到 S3

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 开始上传数据库备份文件到 S3。” >> “$LOG_FILE”
mc cp “$DB_BACKUP_FILE” “$S3_DB_BUCKET/”

检查数据库备份上传是否成功

if [ $? -ne 0 ]; then
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 错误:上传数据库备份文件到 S3 失败。” >> “$LOG_FILE”
exit 1
fi

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 数据库备份文件成功上传到 S3:${S3_DB_BUCKET}/” >> “$LOG_FILE”

上传网站文件备份到 S3

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 开始上传网站文件备份到 S3。” >> “$LOG_FILE”
mc cp “$WEB_BACKUP_FILE” “$S3_WEB_BUCKET/”

检查网站文件备份上传是否成功

if [ $? -ne 0 ]; then
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 错误:上传网站文件备份到 S3 失败。” >> “$LOG_FILE”
exit 1
fi

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 网站文件备份成功上传到 S3:${S3_WEB_BUCKET}/” >> “$LOG_FILE”

删除本地备份文件(保留最近3天)

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 开始删除本地超过 ${DAYS_TO_KEEP} 天的备份文件。” >> “$LOG_FILE”
find “$BACKUP_PATH” -type f -mtime +$DAYS_TO_KEEP -name “.sql.gz" -exec rm {} ;
find “$BACKUP_PATH” -type f -mtime +$DAYS_TO_KEEP -name "
.tar.gz” -exec rm {} ;

if [ $? -ne 0 ]; then
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 警告:删除本地旧备份文件失败。” >> “$LOG_FILE”
else
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 本地旧备份文件已删除。” >> “$LOG_FILE”
fi

删除 S3 上超过3天的备份文件

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 开始删除 S3 上超过 ${DAYS_TO_KEEP} 天的数据库备份文件。” >> “$LOG_FILE”
mc find “$S3_DB_BUCKET” --older-than ${DAYS_TO_KEEP}d --name “nodeloc_backup_*.sql.gz” --exec “mc rm {}”

if [ $? -ne 0 ]; then
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 警告:删除 S3 上旧数据库备份文件失败。” >> “$LOG_FILE”
else
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - S3 上旧数据库备份文件已删除。” >> “$LOG_FILE”
fi

echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 开始删除 S3 上超过 ${DAYS_TO_KEEP} 天的网站文件备份。” >> “$LOG_FILE”
mc find “$S3_WEB_BUCKET” --older-than ${DAYS_TO_KEEP}d --name “nodeloc_web_backup_*.tar.gz” --exec “mc rm {}”

if [ $? -ne 0 ]; then
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - 警告:删除 S3 上旧网站文件备份文件失败。” >> “$LOG_FILE”
else
echo “$(date +‘%Y-%m-%d %H:%M:%S’) - S3 上旧网站文件备份文件已删除。” >> “$LOG_FILE”
fi

echo “----------------------------------------” >> “$LOG_FILE”
```

高手

s3是aws吗?

@“kuisa”#p111388 aws s3 compatible 兼容的协议都可以,比如 CF 的R2,minio ,B2等。

S3账号在哪设置?