概述
该方案利用Shell脚本和定时任务(Cron),每日自动将您的Typecho博客的数据库和核心文件打包,并安全地推送到一个私有的GitHub仓库中,实现免费、可靠的异地灾备。
PS. 我没有用
root用户来操作备份,所以下面会有复制密钥、改路径等操作!!
第一阶段:准备工作(一次性配置)
1. 创建私有 GitHub 仓库
- 登录GitHub账户,创建一个新的仓库(例如,命名为
my-blog-backup)。 - 【关键步骤】 将仓库的可见性设置为 Private (私有)。
2. 在服务器上安装并配置Git
- 安装Git:
sudo apt update sudo apt install git -y - 配置Git身份信息(为当前用户和root用户分别配置):
# 为您的当前用户配置 git config --global user.name "GitHub用户名" git config --global user.email "GitHub注册邮箱" # 为root用户配置 sudo git config --global user.name "GitHub用户名" sudo git config --global user.email "GitHub注册邮箱"
3. 配置SSH密钥,实现免密推送(注意,我没有用root用户生成SSH密钥,所以下面会复制到root下并权限)
- 在服务器上生成SSH密钥:
ssh-keygen -t rsa -b 4096 -C "GitHub注册邮箱" - 将公钥添加到GitHub:
- 复制您的公钥内容:
cat ~/.ssh/id_rsa.pub - 登录GitHub,进入 Settings -> SSH and GPG keys -> New SSH key,粘贴公key。
- 复制您的公钥内容:
- 让
root用户也能使用此密钥:sudo mkdir -p /root/.ssh/ sudo cp ~/.ssh/id_rsa* /root/.ssh/ sudo chmod 600 /root/.ssh/id_rsa
第二阶段:编写核心备份脚本
1. 创建脚本文件
mkdir ~/backup_scripts
cd ~/backup_scripts
nano backup.sh
2. 粘贴并修改脚本内容
将以下脚本模板复制并粘贴到nano编辑器中。
#!/bin/bash
# --- ↓↓↓ 请根据您的实际情况修改以下配置信息 ↓↓↓ ---
# 您的数据库信息 (可以在Typecho的config.inc.php文件中找到)
DB_USER="您的数据库用户名" # <<< 请替换为您的信息
DB_PASS="您的数据库密码" # <<< 请替换为您的信息
DB_NAME="您的数据库名称" # <<< 请替换为您的信息
# 您的文件和仓库路径
TYPECHO_ROOT_DIR="/var/www/typecho" # Typecho网站根目录
BACKUP_REPO_DIR="/home/your_user/typecho_backup_repo" # <<< 请替换为您的实际路径
GIT_REPO_URL="git@github.com:您的GitHub用户名/您的仓库名.git" # <<< 请替换为您的信息
# --- ↑↑↑ 配置结束 ↑↑↑ ---
echo "--- [$(date '+%Y-%m-%d %H:%M:%S')] 开始备份 ---"
# 如果本地Git仓库不存在,则从GitHub克隆
if [ ! -d "$BACKUP_REPO_DIR" ]; then
echo "本地仓库不存在,正在从GitHub克隆..."
git clone $GIT_REPO_URL $BACKUP_REPO_DIR
fi
cd $BACKUP_REPO_DIR
# 滚动删除超过30天的旧备份文件
echo "正在清理30天前的旧备份..."
find . -type f -name 'db-backup-*.sql' -mtime +30 -delete
find . -type f -name 'usr-backup-*.tar.gz' -mtime +30 -delete
# 定义新备份的文件名
DATE_FORMAT=$(date "+%Y-%m-%d")
DB_BACKUP_FILE="db-backup-${DATE_FORMAT}.sql"
USR_BACKUP_FILE="usr-backup-${DATE_FORMAT}.tar.gz"
# 1. 备份数据库
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $DB_BACKUP_FILE
if [ $? -eq 0 ]; then
echo "数据库备份成功: ${DB_BACKUP_FILE}"
else
echo "错误:数据库备份失败!"
exit 1
fi
# 2. 备份usr目录
tar -czf $USR_BACKUP_FILE -C $TYPECHO_ROOT_DIR usr
if [ $? -eq 0 ]; then
echo "usr目录备份成功: ${USR_BACKUP_FILE}"
else
echo "错误:usr目录备份失败!"
exit 1
fi
# 3. 将备份推送到GitHub
git pull origin main
git add .
git commit -m "自动备份于 ${DATE_FORMAT}"
git push origin main
echo "--- [$(date '+%Y-%m-%d %H:%M:%S')] 备份完成并已推送到GitHub ---"
3. 保存并赋予权限
- 保存并退出
nano编辑器 (Ctrl + X,Y,Enter)。 - 赋予脚本执行权限:
chmod +x backup.sh
第三阶段:设置定时任务(Cron)
- 打开crontab编辑器:
crontab -e - 添加定时任务:在文件末尾添加以下内容,并确保路径正确。
0 3 * * * sudo /home/your_user/backup_scripts/backup.sh >> /home/your_user/backup_scripts/backup.log 2>&1将
/home/your_user/替换为实际用户主目录路径。