NAS 自动备份网站教程

📅 2026-10-13 20:35 👤 ajie2012 📁 服务器运维 👁 1 阅读

先说清楚: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

五、验证备份

  1. 手动跑一次:/path/to/backup.sh
  2. 看日志:tail /path/to/backup.log,应显示“备份成功”
  3. 检查文件:备份目录里应该有完整的网站文件
  4. 特别检查数据库文件有没有过来(SQLite 的话在 wp-content/database/ 下)

六、没有 NAS 的替代方案

  • 另一台 VPS:同上,把 NAS 换成另一台服务器就行
  • 对象存储:用 rclone 同步到 OSS/COS/R2,命令类似
  • 本地电脑:Windows 可用 WSL 跑同样的脚本

核心就是三样:定时任务 + rsync + SSH 免密,换到哪都一样。

常见问题

  • Permission denied:检查服务器端 sudo 免密是否配置,rsync 路径对不对
  • 数据库文件没同步:SQLite 的 database 目录权限可能是 700,用 sudo rsync 解决
  • 备份很慢:第一次全量慢正常,之后增量很快

本文为杰哥的折腾笔记原创教程,转载请注明出处。

发表评论