NAS 自动备份网站教程
本文目录
先说清楚:NAS 只是备份目标之一,不是必须的。没有 NAS 的可以用其他方案:另一台 VPS、对象存储(OSS/COS/R2)、甚至家里的旧电脑。原理都一样:定时把网站文件同步到异地。
这篇以 NAS 为例,讲 rsync + crontab 自动备份的完整方案。
一、原理
- 服务器上:网站文件 + 数据库
- 备份机上(NAS):跑定时任务,用 rsync 通过 SSH 拉取服务器文件
- 频率:每 2 小时一次,增量同步(只传变化的部分)
二、准备工作
1. NAS 开启 SSH
在 NAS 管理后台找到 SSH/终端服务并启用,记下端口(默认 22)。
2. 生成密钥对(NAS 上操作)
ssh-keygen -t ed25519 -f /path/to/nas_key -N ""
3. 把公钥加到服务器
复制 nas_key.pub 的内容,在服务器上执行:
echo "粘贴公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
4. 测试连通
ssh -i /path/to/nas_key -o StrictHostKeyChecking=no user@服务器IP "echo OK"
返回 OK 说明免密登录成功。
三、写备份脚本(NAS 上)
cat > /path/to/backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/path/to/wp-backup"
LOG="$BACKUP_DIR/backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
echo "[$DATE] 开始备份..." >> $LOG
rsync -avz --delete --rsync-path="sudo rsync" \
-e "ssh -i /path/to/nas_key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \
user@服务器IP:/var/www/html/ $BACKUP_DIR/html/ >> $LOG 2>&1
if [ $? -eq 0 ]; then
echo "[$DATE] 备份成功" >> $LOG
else
echo "[$DATE] 备份失败!" >> $LOG
fi
EOF
chmod +x /path/to/backup.sh
关键点:
--delete:服务器删了的文件,备份端也删,保持镜像一致--rsync-path="sudo rsync":服务器端用 sudo 运行,解决 www-data 文件的权限问题(需要服务器用户有免密 sudo)UserKnownHostsFile=/dev/null:NAS 用户可能没有 home 目录,跳过 known_hosts 写入
四、设置定时任务
crontab -e # 每 2 小时备份一次 0 */2 * * * /path/to/backup.sh
五、验证备份
- 手动跑一次:
/path/to/backup.sh - 看日志:
tail /path/to/backup.log,应显示“备份成功” - 检查文件:备份目录里应该有完整的网站文件
- 特别检查数据库文件有没有过来(SQLite 的话在 wp-content/database/ 下)
六、没有 NAS 的替代方案
- 另一台 VPS:同上,把 NAS 换成另一台服务器就行
- 对象存储:用 rclone 同步到 OSS/COS/R2,命令类似
- 本地电脑:Windows 可用 WSL 跑同样的脚本
核心就是三样:定时任务 + rsync + SSH 免密,换到哪都一样。
常见问题
- Permission denied:检查服务器端 sudo 免密是否配置,rsync 路径对不对
- 数据库文件没同步:SQLite 的 database 目录权限可能是 700,用 sudo rsync 解决
- 备份很慢:第一次全量慢正常,之后增量很快
本文为杰哥的折腾笔记原创教程,转载请注明出处。
