Restic原生后端服务rest-server的配置与使用
rest-server是restic的官方原生后端,由于restic数据块已经加密,相比SFTP还要再加密一次传输性能更好,适合在专门用于作为restic备份目标的服务器或者NAS上使用。但是它的官方文档写的太含糊了,很多操作还是要查阅一番,故此记录。
安装
使用你的包管理器/conda/源码安装rest-server:
1
| yay -S restic-rest-server
|
但请注意最终安装的可执行文件名称,例如上述的yay包提供的是restic-rest-server,其他的包管理器也可能是rest-server。
配置rest-server运行用户
我们需要一个单独的权限隔离的用户用于运行rest-server,例如:
1
| sudo useradd --system --shell /sbin/nologin rest-server-user
|
这样就创建了一个名为rest-server-user的系统用户,并且禁用直接登录。
配置repo存放路径
寻找一个合适的路径用于存放restic的备份仓库,例如/mnt/restic-backups,然后转移权限到上面创建的运行用户。
1
2
| sudo mkdir /mnt/restic-backups
sudo chown -R rest-server-user:rest-server-user /mnt/restic-backups
|
配置rest-server客户端访问用户
如果禁用auth,所有可访问服务器的人都可以创建、删除、访问我们服务器上的restic repo,所以我们需要配置一个用户名和密码用于认证。rest-server支持htpasswd密码,通过如下流程配置:
1
2
3
4
5
6
7
| #使用包管理器安装apache-tools, 或apache/http-tools,包含我们所需的htpasswd工具
yay -S apache-tools
# 创建一个名为rest-user的客户端用户(会询问密码)
cd /mnt/restic-backups
sudo htpasswd -B -c .htpasswd rest-user
# 此时会创建一个.htpasswd文件,但是在root下,转给rest-server-user
sudo chown -R rest-server-user:rest-server-user ./.htpasswd
|
配置systemd
rest-server的源码的examples目录提供了systemd的示例配置,包括rest-server.service和rest-server.socket两个文件。使用任何方式(git clone, curl, 直接复制粘贴)到服务器上,然后按所需的内容修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| # rest-server.service
[Unit]
Description=Rest Server
After=syslog.target
After=network.target
Requires=rest-server.socket
After=rest-server.socket
[Service]
Type=simple
# ↓修改为前面创建的运行用户
User=rest-server-user
Group=rest-server-user
# ↓修改为实际的可执行文件路径(必须是绝对路径),目标备份位置,监听端口
ExecStart=/usr/bin/restic-rest-server --path /mnt/restic-backups --append-only --listen 38000
Restart=always
RestartSec=5
#...
# ↓修改为实际的目标备份位置
ReadWritePaths=/mnt/restic-backups
#...(其他配置项按需配置)
|
ExecStart执行命令的更多参数可通过restic-rest-server --help查看,上述--append-only表示只允许追加内容,不允许删除或修改。
1
2
3
4
5
6
7
| # rest-server.socket
[Socket]
# ↓修改为监听端口
ListenStream = 38000
[Install]
WantedBy = sockets.target
|
修改完文件后复制到systemd目录,然后启用(开机服务自启)并运行:
1
2
3
4
5
| sudo cp ./rest-server.service ./rest-server.socket /etc/systemd/system/
sudo systemctl enable --now rest-server.service
sudo systemctl enable --now rest-server.socket
# 检查运行状态,active(running)为正常
systemctl status rest-server.service
|
配置防火墙
如何服务器有防火墙设置,需要放行对应端口,以ufw为例:
1
2
| sudo ufw allow 38000/tcp
sudo ufw reload
|
客户端restic连接备份
以下内容执行在运行restic的客户端服务器上
即需要备份的文件在这台,通过restic备份到上面配置的rest-server服务器
参考restic官方文档:
1
2
3
| export RESTIC_REST_USERNAME=<MY_REST_SERVER_USERNAME>
export RESTIC_REST_PASSWORD=<MY_REST_SERVER_PASSWORD>
restic -r rest:http://[host]:[port]/my-restic-repo init
|
也有直接将用户名和密码写在repo url中的使用方法,但是这样会暴露用户名和密码在command history,自行决定是否使用:
1
| restic -r rest:http://[user]:[password]@[host]:[port]/my-restic-repo init
|
其他restic操作略。
注意事项:未配置证书的情况下rest-server默认使用http,所以即使设置了用户名和密码在传输时也是明文传输,如果需要加密,rest-server也支持自行配置tls证书以允许使用https,此处不再赘述。
crontab自动化定时备份
首先创建一个备份脚本/path/to/restic-backup.sh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| #!/usr/bin/bash
#前面定义的连接用户和密码
export RESTIC_REST_USERNAME=<MY_REST_SERVER_USERNAME>
export RESTIC_REST_PASSWORD=<MY_REST_SERVER_PASSWORD>
# repo密码
export RESTIC_PASSWORD=<repo-password>
repo=rest:http://[host]:[port]/[repo-name]
script_path=$(dirname $0)
#需要备份的路径
source=/path/to/your/source
#按需定义参数
args="--skip-if-unchanged --exclude-file $script_path/.resticignore --host $USER@$HOSTNAME --read-concurrency 30 --exclude-caches"
mkdir $script_path/rest-logs
log_file=$script_path/rest-logs/$(date +%F@%R).log
nice -n 19 /path/to/restic -r $repo backup $args $source -vv | grep "added" > $log_file 2>&1
echo "restic ended with exit code $? " >>$log_file
|
其中设置–host便于区分不同的来源服务器。
然后执行chmod +x /path/to/restic-backup.sh赋予执行权限。
运行crontab -e编辑,将定时任务添加到crontab(例如每天零点五分执行备份):
1
| 5 0 * * * /path/to/restic-backup.sh >>path/to/backup.log 2>&1
|
crontab表达式可以通过https://crontab.guru生成。crontab符合vi键位,按i进行编辑,按:wq保存退出。使用crontab -l可以查看。