这是一份内部文档(去除了敏感信息),发出来分享 linux-timemachine 在特殊场景的使用,在本例,备份的文件夹中不是所有文件都需要备份,且访问需要 root 权限
需要备份的数据
根据 OJ 官方文档:https://opensource.qduoj.com/#/onlinejudge/guide/backup
需要备份 backend/public
backend/test_case
两个目录和导出的 OJ 数据库文件
根据我们的实际情况,还需要备份 docker-compose.yml
文件和 dist
目录
建立待备份文件夹
因为 OJ 的数据目录有很多文件不需要备份,所以建立一个待备份文件夹 /srv/containers/OnlineJudgeDeploy/ojbk/
(ojbk 为 OJBackup 的缩写~~)
将需要备份的 backend/public
backend/test_case
docker-compose.yml
dist
软链接到待备份文件夹内
设置 ssh 帐号
备份脚本需要使用 ssh 登陆到 OJ 上执行一些特权命令,因此需要设置 ssh 免密登陆(既公私钥登陆),还需要设置 sudo 免密,目前备份使用的帐号是 username
sudo 免密
运行 sudo visudo
在末尾添加两行
username ALL=(ALL) ALL
username ALL=(ALL) NOPASSWD:ALL
ssh 免密登陆
设置方法不具体说,公私钥和配置都在备份服务器的 /root/.ssh/
目录下,配置内容如下
Host oj_username
HostName ip
User username
Port port
IdentityFile ~/.ssh/id_rsa_oj_username
备份脚本
在备份服务器的 /srv/backup/ojbk/ojbk.sh
用到的工具 linux-timemachine
修改脚本时,建议阅读完 README,并对每个参数都理解
脚本内容如下:
#!/bin/bash
# 发生错误立即终止
set -e
# 进入备份目录
cd /srv/backup/ojbk/
# 重定向输出到日志文件
exec >> ./ojbk.log 2>&1
echo `date +%Y-%m-%d-%H:%M:%S`
# 在 OJ 上备份数据库
ssh oj_username "sudo bash -c 'docker exec oj-postgres pg_dumpall -c -U onlinejudge > /srv/containers/OnlineJudgeDeploy/ojbk/db_backup.sql'"
# 增量备份到本地
timemachine oj_username:/srv/containers/OnlineJudgeDeploy/ojbk/ ./ -- --copy-unsafe-links --rsync-path="'sudo rsync'"
# 打包一份到阿里云盘目录
tar -czhf /aliyun_data/OnlineJudge/education/`date +%Y-%m-%d`.tar.gz current
# 清理阿里云盘目录中超过2天未修改的文件,即超过2天的备份
tmpreaper -m 2d /aliyun_data/OnlineJudge/education/
# 清理备份目录中超过10天未更改状态的文件,这可以节省空间,但会导致超过10天的备份可能不完整
tmpreaper -c 10d --protect 'ojbk.sh' ./
定时执行
设定 root 权限的定时任务
sudo crontab -e
添加以下内容,每天 1 点定时执行
0 1 * * * /srv/backup/ojbk/ojbk.sh