Hetzner Cloud | 快照作为备份
此脚本会自动为您的 Hetzner Cloud 服务器创建快照并删除旧的快照。
快照随后将像 Hetzner 直接提供的自动备份一样工作,其优势在于可以创建更多备份并在自定义的时间执行。
为了便于使用,该脚本直接在 Hetzner Cloud 控制台中使用强大的标签。只需为服务器添加标签即可。
安装
安装:使用 Docker(推荐)
1. 运行 docker 镜像
docker run -d --name hcloud-snapshot-as-backup \
--restart unless-stopped \
-v /etc/localtime:/etc/localtime:ro \
-e API_TOKEN= \
-e SNAPSHOT_NAME="%name%-%timestamp%" \
-e LABEL_SELECTOR="AUTOBACKUP" \
-e KEEP_LAST=3 \
-e CRON="0 1 * * *" \
fbrettnich/hcloud-snapshot-as-backup
将您的 Hetzner Cloud 控制台 API 密钥 放在第 4 行的 API_TOKEN= 之后。
可选:将 CRON 设置为 false 以禁用容器内的 CronScheduler,并在容器外部进行调度,特别是用于使用 Amazon ECS 计划任务 或 Google Cloud Run 作业 等服务。
安装:使用 Docker Compose
1. 下载 docker-compose.yml
curl -sSL https://raw.githubusercontent.com/fbrettnich/hcloud-snapshot-as-backup/main/docker-compose.yml > docker-compose.yml
2. 编辑配置
打开 docker-compose.yml 文件以完成配置。
您可以在下方找到有关配置的更多信息(点击此处)
3. 运行 docker-compose
docker-compose up -d
安装:在 Kubernetes 上使用 Helm
.helm 目录中包含一个 Helm chart。
它将脚本部署为 Kubernetes CronJob,并支持在单个 release 中管理多个 Hetzner Cloud 项目——每个项目对应一个 CronJob,各自拥有独立的 API token、调度计划、标签选择器和保留策略。
1. 克隆此仓库
git clone https://github.com/fbrettnich/hcloud-snapshot-as-backup.git
cd hcloud-snapshot-as-backup
2. 创建 values 文件
# values.yaml
timeZone: "Europe/Berlin"
projects:
- name: production
apiToken: "YOUR_HETZNER_API_TOKEN"
schedule: "0 1 * * *"
keepLast: 7
- name: staging
existingSecret: hcloud-staging # Secret you manage yourself
schedule: "0 3 * * 0"
keepLast: 2
3. 安装 chart
helm install hcloud-snapshot-as-backup ./.helm \
--namespace hcloud-snapshot-as-backup --create-namespace \
-f values.yaml
调度由 Kubernetes 处理,因此 chart 始终在容器中设置 CRON=false。
所有可用选项均在 chart README 中有文档说明。
安装:不使用 Docker
1. 克隆此仓库
apt install git
git clone https://github.com/fbrettnich/hcloud-snapshot-as-backup.git /opt/hcloud-snapshot-as-backup
2. 安装依赖项
apt install python3 python3-pip
pip3 install -r /opt/hcloud-snapshot-as-backup/requirements.txt
3. 复制 config.json
cd /opt/hcloud-snapshot-as-backup/
cp config-example.json config.json
4. 编辑配置
打开 config.json 文件以完成配置。
您可以在下方找到有关配置的更多信息(点击此处)
5. 运行脚本
python3 /opt/hcloud-snapshot-as-backup/snapshot-as-backup.py
要自动执行脚本,您可以创建一个 crontab:Crontab Generator
crontab -e
在文件末尾添加 crontab:
0 1 * * * python3 /opt/hcloud-snapshot-as-backup/snapshot-as-backup.py >/dev/null 2>&1
此 crontab 每天凌晨 1 点执行该脚本。
配置
根据你运行脚本的方式,你需要进行配置。
当你使用 Docker 运行脚本时,选项通过环境变量设置。
当你通过命令/crontab 运行脚本时,选项通过配置文件设置(config.json)。
当你使用 Helm 部署脚本时,选项在你的 values 文件中按项目设置(chart README)。
Generate Hetzner Cloud Console API-Key
- Login to Hetzner Cloud Console
- Select your project
- Click "Access" on the left side
- Switch to "API-Tokens" at the top
- Click on "Create API Token" and create a new token with read & write permission
- Copy the key and paste it into the environment variables under
API_TOKENor in the config underapi-token

选择默认保留的备份数量
您可以在 KEEP_LAST 下的环境变量或 keep-last 下的配置中指定默认情况下每台服务器要保留多少个备份。
可以使用标签直接在 Hetzner Cloud Console 中覆盖默认值。
添加标签 AUTOBACKUP.KEEP-LAST,其值为应应用于该服务器的值。
最新的备份会被保留,旧的备份会被删除。
为应备份的服务器添加标签
所有应被脚本和自动快照备份包含的服务器,必须具有标签 AUTOBACKUP,其值为 true。
将默认标签更改为其他值
您可以通过更改配置中的 label_selector 值,将默认标签从 AUTOBACKUP 更改为其他值。如果在 docker 环境中,您可以设置 LABEL_SELECTOR 环境变量。更改 label_selector 时,您还必须将其用于 KEEP-LAST 设置。
为您的快照选择名称(可选)
在 SNAPSHOT_NAME 下的环境变量或配置中的 snapshot-name 下指定您希望如何命名您的快照。
默认情况下,它们的名称为 <server name>-<timestamp>。
| 占位符 | 值 |
|---|---|
| %id% | 服务器的 ID |
| %name% | 服务器的名称 |
| %timestamp% | 当前时间戳 |
| %date% | 当前日期 (%Y-%m-%d) |
| %time% | 当前时间 (%H:%M:%S) |
Docker: 通过 cron 指定脚本的执行频率
如果在 Docker 中运行该脚本,可以在 CRON 下的环境变量中指定一个 cron。
该 cron 用于定义脚本应执行的频率和时间。
可选地,将 CRON 设置为 false 以在容器中禁用 CronScheduler,并在容器外部进行调度。
您可以在此处创建一个 cron:Cron Generator
例如:
0 1 * * *
此 cron 使脚本每天凌晨 1 点执行。
关于标签
此脚本与功能强大的 Hetzner 标签配合使用。
- Server
AUTOBACKUP- 带有标签
AUTOBACKUP且值为true的服务器将被脚本包含 - 这使得可以直接在 Hetzner Cloud 控制台中指定哪些服务器应创建自动快照备份
- 带有标签
AUTOBACKUP.KEEP-LAST(可选)- 标签
AUTOBACKUP.KEEP-LAST可用于指定应为该服务器保留多少个备份 - 如果未指定此标签,则使用配置中的默认值
- 标签
- Snapshots
AUTOBACKUP- 快照会带有标签
AUTOBACKUP - 这使得可以查看哪些快照是由脚本自动创建的
- 脚本会忽略所有不带此标签的快照(因此,只有带有此标签的旧快照会被删除)
- 如果您想保留一个自动生成的快照,只需移除标签
AUTOBACKUP
- 快照会带有标签

为什么这个脚本有用?
| 优点 | 缺点 |
|---|---|
| 快照备份可以在自定义时间创建(在指定时间备份) | 快照数量有限(但可以申请更高的限制) |
| 可以保留任意数量(备份最多仅 7 个) | 对于超大型服务器可能更昂贵(大量存储) |
| 对于较小的服务器,比备份更便宜(占用更少的存储空间) | |
| 不绑定服务器(如果删除云服务器,备份将被删除) | |
| 可以直接从快照创建新服务器 | |
| 快照的存储位置与云服务器不同(同一网络区域)(备份仅存储在云服务器的同一位置) | |
| 快照可以移动到另一个项目 |