技术存在的终级意义,是为了解决问题。

使用rsync备份Hexo博客至NAS

对于运维来说,服务搭建调试好并不代表工作的结束。正相反,服务全部调试完毕才是运维工作的开端。

下面将要记录一下我设定的整个博客系统的备份策略

环境

  • 博客系统部署在良心云 VPS 上,香港节点
  • 备份端为家用 NAS,白群晖系统
  • 家用联通网络,有公网 IP,使用 DDNS
  • 软路由做端口映射和 DDNS

方案

因为目前使用的是白群晖,那么操作起来就比较简单了,毕竟群晖的功能还是很方便的,当然也就没有自建的 NAS 系统那么有自主性。

首先,群晖提供 NFS、FTP、rsync 等多种同步方式,这里由于工作中遇到的 FTP 总是不那么稳定,所以我个人对 rsync 更加偏爱。

那么方案基本就是:

  • 服务器端自己编写脚本,功能包括打包备份目录以及调用 rsync 进行同步,然后使用 crontab 定期执行
  • NAS 端启用 rsync 功能,接收服务器的同步
  • 配置服务器和 NAS 之间的密钥,达到免密码登录,使脚本能自动执行

备份脚本

脚本很简单,直接放上来:

#!/bin/bash
#备份文件存放目录为/data/backup
#博客目录为/data/www
rq=` date +%Y-%m-%d
cd /data/
tar -zcf /data/backup/web/blog_$rq.tar.gz www
find /data/backup/web -mtime +30 -name "*.gz" -exec rm -f {} \;
#删除30天之前的备份文件
/usr/bin/rsync -e 'ssh -p <port>' -a --delete /data/backup/ <user>@<your_nas_domain_or_ip>::NetBackup
#NAS上的存放路径为NetBackup
#<port>是NAS的22端口对外映射的端口号
#<user>是NAS的用户名,需要在administrator组
#<your_nas_domain_or_ip>是你NAS的公网IP或者域名

NAS 端 rsync 设置

首先默认有一个管理组的账号,下面这个账号统一用user1来代替。

其实为了安全考虑,这里是应该使用非管理组账号的,但是那样设置免密码登录的时候就不能选择 ssh-key 的方式了,因为权限不足。

所以综合考量我还是使用了管理组账号。

另外这一步默认前面已经做好了 22 端口的外网映射,假定这里的映射端口为 1122。

那么下面正式开始设置 NAS:

  • 进入 DSM,打开 控制面板 > 文件服务 > rsync 选择 启用 ,ssh 加密端口保持默认的 22

  • 打开 控制面板 > 终端机和SNMP > 终端机 勾选 启用 SSH 功能 ,端口默认 22

  • 去路由器、防火墙等起到网关作用的设备上,设置好端口映射和访问控制策略,为安全严格考虑的话可以只针对 VPS 的 IP 开启

  • 打开 ssh 软件通过 ssh 协议连接 NAS,用户名为 user1,密码是用户登录密码

  • 执行命令 sudo -i 切换到 root 用户,密码还是 user1 的密码

  • 执行命令 chmod 755 /var/services/homes/user1 把 homes 目录下的 user1 这个用户的同名家目录权限设置为 755

  • 编辑 ssh 的配置文件 vim /etc/ssh/sshd_config 检查如下三行是否存在,没有则添加:

    1
    2
    3
    RSAAuthentication yes  
    PubkeyAuthentication yes
    AuthorizedKeysFile .ssh/authorized_keys
  • 之前搭建博客的时候应该已经创建了密钥文件,所以这里只需要把服务器上的密钥文件内容复制过来就可以:

    1
    2
    3
    4
    5
    6
    7
    # cd /var/services/homes/user1
    # mkdir .ssh
    # vim .ssh/authorized_keys
    //创建文件并把服务器上的密钥串复制然后然后保存
    # chmod 700 ./.ssh
    # chmod 600 ./.ssh/authorized_keys
    //更改权限,否则不会生效
  • 最后执行 synoservicectl --restart sshd 重启 ssh 服务,重启后需要去控制面板中关闭再开启 NAS 的 ssh 功能,这样如果没问题的话就能通过服务器成功免密码连接到 NAS 了。

服务器端设置

服务器端其实没什么好设置的,只要编辑好备份脚本,然后测试脚本效果就可以了。

测试命令:

1
2
# touch /data/backup/test_file
# /usr/bin/rsync -e 'ssh -p 1122' -a --delete /data/backup/ [email protected]<your_nas_domain_or_ip>::NetBackup

这里如果正常是不会有错误信息输出的,然后打开 DSM 的文件管理器,去到 NetBackup 目录下面应该可以看到刚才新建的测试文件 test_file

在服务器上把测试文件删掉之后重新执行上面第二条命令,执行完毕去 DSM 上检查应该发现测试文件已经消失。

测试无误后,我们执行命令 crontab -e 打开计划任务,添加新的一行来使刚刚编写的脚本定期执行:

1
2
0 3 * * * /bin/bash /data/shell/backup.sh
#每天凌晨3点执行备份脚本

这样备份任务就基本完成了。

小结

其实运维就是个搭积木的活,把多个简单的小功能用脚本或者工具来进行组合,达到所谓“自动化”的效果。

所以再进阶一点的话,还可以考虑实时备份,比如每次编辑完成并发布后,使用 git 钩子来调用上面的备份脚本,这样每次发布完成都会自动备份然后同步。

如果后期备份目录变大,每次打包不现实的话,也可以改动脚本只对博客的数据文件进行同步,这样只同步变动文件,会使实时同步压力小非常多。并且这样的好处是还可以配合 NAS 的历史版本功能,对历史编辑变动进行记录和必要的回溯。

当然了,这些我都没做,因为对我来说这样的必要性没那么大,不过可操作性应该还是很高并且也不难的。

打赏猫粮!!!