Borgmatic | Podman Quadlet (Systemd 声明式)容器化部署指南
First | 序
Borgmatic 同样也支持使用容器化部署
此篇记录使用 Podman Quadlet (Systemd 声明式) 容器化部署 Borgmatic
Version | 版本
- podman version 5.6.0
- podlet 0.3.0
- nftables v1.1.5 (Commodore Bullmoose #6)
Notes | 须知
- 本篇记录使用 Podman Quadlet 部署 Borgmatic , 如果你想要了解 docker run 或者 docker compose 方式,建议结合其他指南
- 建议结合 GitHub 页一齐食用效果更佳,同时冗余部分将不再赘述
- Blog 仍有其他关于 Borg* 文章较为
喂饭请结合食用
1. Deployment | 部署
主要分解为以下几个步骤
- 创建 .container 文件
- 依据 .container 文件创建目录
- 编辑 borgmatic 配置文件
- 重载 systemd
1.1. 创建 .container 文件
-
首先根据官方给出的 docker run 命令使用 Podlet 转换为 borgmatic.container 文件
podlet podman run \ --detach --name borgmatic \ -v /home:/mnt/source:ro \ -v ./data/repository:/mnt/borg-repository \ -v ./data/borgmatic.d:/etc/borgmatic.d/ \ -v ./data/.config/borg:/root/.config/borg \ -v ./data/.ssh:/root/.ssh \ -v ./data/.cache/borg:/root/.cache/borg \ -v ./data/.state/borgmatic:/root/.local/state/borgmatic \ -e TZ=Europe/Berlin \ ghcr.io/borgmatic-collective/borgmatic
转换后结果如下
# borgmatic.container [Container] ContainerName=borgmatic Environment=TZ=Europe/Berlin Image=ghcr.io/borgmatic-collective/borgmatic Volume=/home:/mnt/source:ro Volume=./data/repository:/mnt/borg-repository Volume=./data/borgmatic.d:/etc/borgmatic.d/ Volume=./data/.config/borg:/root/.config/borg Volume=./data/.ssh:/root/.ssh Volume=./data/.cache/borg:/root/.cache/borg Volume=./data/.state/borgmatic:/root/.local/state/borgmatic -
了解 Volume 映射卷作用
以下卷可用于挂载:
卷 (Volume) 描述 (Description) /mnt/source您希望备份的数据。为了一定的安全性,您可能希望以只读(read-only)方式挂载。borgmatic 以 root 用户身份运行,因此可以备份所有文件。 /mnt/borg-repository在此处挂载您的 borg 备份存储库。 /etc/borgmatic.d您需要在此处创建 crontab.txt和您的config.yml配置文件。/root/.borgmatic请注意:此卷现已冗余且已被弃用,请从您的配置中移除。 /root/.local/state/borgmatic用于周期性检查的状态文件存放于此。 /root/.config/borg用于存放 borg 的配置以及 keyfile加密模式下的密钥文件。请务必备份您的密钥文件!当加密方式设置为none(不加密)时也需要挂载此卷。/root/.ssh在此处挂载您自己的 .ssh目录,或者创建一个包含用于访问远程存储库的 SSH 密钥的新目录并挂载到此处。/root/.cache/borg一个用于持久化存储 borg 数据块(chunk)缓存的位置。 -
自定义 .container 文件
[Unit] Description=borgmatic-Container https://github.com/borgmatic-collective/borgmatic After=network-online.target Wants=network-online.target Before=shutdown.target [Container] User=root AddCapability=SYS_ADMIN AddDevice=/dev/fuse ContainerName=borgmatic Environment="TZ=Asia/Shanghai" "BACKUP_CRON=0 */1 * * *" Image=ghcr.io/borgmatic-collective/borgmatic Volume=/opt:/mnt/source/opt:ro Volume=/home:/mnt/source/home:ro Volume=/root:/mnt/source/root/:ro Volume=/etc:/mnt/source/etc:ro Volume=/var/lib/containers/storage/volumes:/mnt/source/containers-volumes:ro Volume=/var/lib/containers/storage/volumes/borgmatic/_data/repository:/mnt/borg-repository Volume=/var/lib/containers/storage/volumes/borgmatic/_data/borgmatic.d:/etc/borgmatic.d/ Volume=/var/lib/containers/storage/volumes/borgmatic/_data/.config/borg:/root/.config/borg Volume=/var/lib/containers/storage/volumes/borgmatic/_data/.ssh:/root/.ssh Volume=/var/lib/containers/storage/volumes/borgmatic/_data/.cache/borg:/root/.cache/borg Volume=/var/lib/containers/storage/volumes/borgmatic/_data:/root/.local/state/borgmatic [Install] WantedBy=default.target
- 添加了 [Unit] 单元
- 添加了 [Install] 单元 (用于开机自启)
- 将需要备份的目录以只读模式映射至容器的/mnt/source下
- 使用 Root 用户运行
- 添加以下两个环境变量
- "TZ=Asia/Shanghai"
- "BACKUP_CRON=0 */1 * * *"
- 添加 AddCapability=SYS_ADMIN & AddDevice=/dev/fuse 以支持将 archive 挂载为FUSE 文件系统
- ......
1.2. 依据 .container 文件创建目录
tree -a 命令输出如下
可以参考以下输出创建相应目录
.
├── borgmatic.d
│ ├── borgwarehouse-api.sh
│ └── config.yaml
├── .cache
│ └── borg
├── .config
│ └── borg
├── repository
├── .ssh
│ ├── config
│ ├── id_borgwarehouse
│ ├── known_hosts
└── .state
└── borgmatic
-
borgmatic.d 目录下存在 borgwarehouse-api.sh 是因为我需要在 Borgmatic 创建备份完成后与 borgwarehouse 交互以便汇报状态和占用空间
-
borgmatic.d 目录下不存在 crontab.txt 是因为我已通过环境变量定义此值,但如果data/borgmatic.d/crontab.txt 文件存在,它将优先于环境变量
-
.ssh目录有以下文件(目录内文件权限须设定为600)
- config 文件用于定义 ssh 连接至哪个主机需要使用哪个密钥
- known_hosts
- id_borgwarehouse 密钥文件
1.3. 编辑 borgmatic 配置文件
config.yaml 文件被映射至 容器的 /etc/borgmatic.d/ 目录下
示例配置如下所示
source_directories:
- /mnt/source
exclude_patterns:
- /mnt/source/containers-volumes/borgmatic/
repositories:
- path: ssh://[email protected]:2222/./a0c
archive_name_format: 'hostname-{now}'
encryption_passphrase: "**X&&S*@@XSmm2"
keep_daily: 4
keep_weekly: 2
keep_monthly: 4
checks:
- name: repository
- name: archives
frequency: 2 weeks
one_file_system: false
commands:
- after: configuration
run:
- /etc/borgmatic.d/borgwarehouse-api.sh
1.4. 重载 systemd
systemctl daemon-reload
用户修改 .container 文件 ➡ 运行 systemctl daemon-reload ➡ systemd 触发 quadlet-generator ➡ generator 生成/更新 .service 文件 ➡ systemd 读取新的 .service 文件
2. Usage | 使用
2.1. 启动 borgmatic.service
systemctl start borgmatic.service
回显如下 👇

2.2. 初始化(加密) repo
这里统一进入容器内操作
-
查询容器ID
podman ps -a | grep "borgmatic" -
进入 borgmatic 容器
podman exec -it 27fa7b7d1662 /bin/bash -
初始化(加密) repo
borgmatic --init --encryption repokey-blake2
2.3. 创建备份
使用以下命令创建归档
borgmatic create --verbosity 1 --list --stats
3. Advanced Topics | 高级用法
3.1. With borgwarehouse
Borgmatic 备份至 borgwarehouse 后可以指定运行配置文件中写明的shell脚本实现与 borgwarehouse Api 交互来同步状态和刷新存储库
Borgmatic 关键配置如下
commands:
- after: configuration
run:
- /etc/borgmatic.d/borgwarehouse-api.sh
其中 borgwarehouse-api.sh 内容如下所示
#!/bin/sh
/usr/bin/curl --request POST --url 'https://localhost/api/v1/cron/status' --header 'Authorization: Bearer CRONJOB_KEY' && /usr/bin/curl --request POST --url 'https://localhost/api/v1/cron/storage' --header 'Authorization: Bearer CRONJOB_KEY'
回显如下 👇 http 200 ok
{"status":200,"message":"Status cron executed successfully"}{"status":200,"message":"Storage cron executed successfully"}
- borgwarehouse-api.sh 文件需要赋执行权限
- API 可能随时会更新,若报错请点击下方链接至官方 api 说明

Thanks & Copy

Podman

Borgwarehouse

Borgmatic
podman-systemd.unit


