By xzllll

Borgmatic | Podman Quadlet (Systemd 声明式)容器化部署指南

指南 | Guides 2025年9月3日

First | 序

Borgmatic 同样也支持使用容器化部署

此篇记录使用 Podman Quadlet (Systemd 声明式) 容器化部署 Borgmatic

GitHub - borgmatic-collective/docker-borgmatic: Borgmatic in Docker
Borgmatic in Docker. Contribute to borgmatic-collective/docker-borgmatic development by creating an account on GitHub.

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 | 部署

主要分解为以下几个步骤

  1. 创建 .container 文件
  2. 依据 .container 文件创建目录
  3. 编辑 borgmatic 配置文件
  4. 重载 systemd

1.1. 创建 .container 文件

  1. 首先根据官方给出的 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
    
  2. 了解 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)缓存的位置。
  3. 自定义 .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

🤔
在quadlet的配合下此条命令做了什么?

用户修改 .container 文件 ➡ 运行 systemctl daemon-reload ➡ systemd 触发 quadlet-generator ➡ generator 生成/更新 .service 文件 ➡ systemd 读取新的 .service 文件

2. Usage | 使用

2.1. 启动 borgmatic.service

systemctl start borgmatic.service

回显如下 👇

2.2. 初始化(加密) repo

这里统一进入容器内操作

  1. 查询容器ID

    podman ps -a | grep "borgmatic"
    
  2. 进入 borgmatic 容器

    podman exec -it 27fa7b7d1662 /bin/bash
    
  3. 初始化(加密) 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"}

⚠️
注意
  1. borgwarehouse-api.sh 文件需要赋执行权限
  2. API 可能随时会更新,若报错请点击下方链接至官方 api 说明
API
Description of each API

Thanks & Copy

Podman

Podman


BorgWarehouse
Fast and modern WebUI to manage BorgBackup’s central repository server.

Borgwarehouse


borgmatic

Borgmatic


podman-systemd.unit — Podman documentation

podman-systemd.unit

标签

xzllll

三分钟热度三分钟收获