Restic原生后端服务rest-Server的配置与使用

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可以查看。

0%