<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tailscale on unchama's blog</title><link>http://blog.unchama.com/tags/tailscale/</link><description>Recent content in Tailscale on unchama's blog</description><generator>Hugo -- gohugo.io</generator><language>ja</language><lastBuildDate>Wed, 01 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://blog.unchama.com/tags/tailscale/index.xml" rel="self" type="application/rss+xml"/><item><title>PBS で実現する VM・ファイル・K8s PVC・遠隔レプリケーションの統合バックアップ</title><link>http://blog.unchama.com/p/pbs-%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-vm%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABk8s-pvc%E9%81%A0%E9%9A%94%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%B5%B1%E5%90%88%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>http://blog.unchama.com/p/pbs-%E3%81%A7%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B-vm%E3%83%95%E3%82%A1%E3%82%A4%E3%83%ABk8s-pvc%E9%81%A0%E9%9A%94%E3%83%AC%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E7%B5%B1%E5%90%88%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97/</guid><description>&lt;blockquote class="gh-alert gh-alert-note"&gt;
&lt;p class="gh-alert-title"&gt;Note&lt;/p&gt;
&lt;p&gt;このドキュメントは &lt;a class="link" href="https://claude.ai/claude-code" target="_blank" rel="noopener"
&gt;Claude Code&lt;/a&gt; を用いて作業しながら生成したものです。&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://github.com/GiganticMinecraft/seichi_infra" target="_blank" rel="noopener"
&gt;GiganticMinecraft/seichi_infra&lt;/a&gt; での実装例を題材にしていますが、Proxmox Backup Server の活用方法を広く紹介することを主な目的としています。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="はじめに"&gt;はじめに
&lt;/h2&gt;&lt;p&gt;自宅で Minecraft サーバーや各種インフラを運用している中で、バックアップ基盤として &lt;a class="link" href="https://www.proxmox.com/en/proxmox-backup-server/overview" target="_blank" rel="noopener"
&gt;Proxmox Backup Server (PBS)&lt;/a&gt; を採用しています。本記事では、VM バックアップだけでなく Kubernetes の PVC バックアップや遠隔地レプリケーションまで PBS で統合している事例を紹介します。&lt;/p&gt;
&lt;h2 id="環境の全体像"&gt;環境の全体像
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;span class="lnt"&gt;26
&lt;/span&gt;&lt;span class="lnt"&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌─────────────────────────────────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 自宅 (本家) │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ┌──────────────┐ ┌──────────────┐ ┌────────────────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ Proxmox VE │──▶│ PBS │ │ K8s クラスタ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ (複数クラスタ) │ │ sc-proxbksrv │◀──│ (seichi-onp) │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └──────────────┘ │ -01 │ └────────────────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ zfs-vol-01(2T)│ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ zfs-vol-02(2T)│ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └──────┬───────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└────────────────────────────┼────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Tailscale VPN
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ (毎時 Pull Sync)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌────────────────────────────┼────────────────────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ 実家 (バックアップ拠点) │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ┌──────▼───────┐ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ PBS │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ zikka-prox │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ bksrv-01 │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ zfs-vol-ssd │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ -01(2T) │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ zfs-vol-hdd │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ │ -01(2T) │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └──────────────┘ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└─────────────────────────────────────────────────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;本家側 PBS&lt;/strong&gt; (&lt;code&gt;sc-proxbksrv-01&lt;/code&gt;): PBS 4.1.x / ZFS データストア 2本 (各2TB, lz4圧縮)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;実家側 PBS&lt;/strong&gt; (&lt;code&gt;zikka-proxbksrv-01&lt;/code&gt;): PBS 4.1.x / ZFS データストア 2本 (SSD 2TB + HDD 2TB, lz4圧縮)&lt;/li&gt;
&lt;li&gt;両拠点間は &lt;strong&gt;Tailscale&lt;/strong&gt; で接続し、実家側が毎時 Pull Sync でレプリケーション&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="1-なぜ-pbs-を選んだか"&gt;1. なぜ PBS を選んだか
&lt;/h2&gt;&lt;p&gt;PBS を選んだ理由は以下の通りです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;バックアップ対象の広さ&lt;/strong&gt;: VM だけでなくファイルベースのバックアップにも対応しており、あらゆる環境のバックアップ管理を一元化できる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;遠隔レプリケーションの容易さ&lt;/strong&gt;: 拠点間の Sync が PBS の標準機能として用意されている&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;チャンクベースの重複排除&lt;/strong&gt;: 転送量・ストレージ使用量の両方を効率化できる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Proxmox VE との統合度&lt;/strong&gt;: ストレージ追加だけで VM バックアップが完結する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以降のセクションで、それぞれの側面を実際の構成とともに紹介していきます。&lt;/p&gt;
&lt;h2 id="2-pve-連携と-pbs-の基本構成"&gt;2. PVE 連携と PBS の基本構成
&lt;/h2&gt;&lt;h3 id="pve-側の設定はストレージ追加だけ"&gt;PVE 側の設定はストレージ追加だけ
&lt;/h3&gt;&lt;p&gt;Proxmox VE の Web UI から「ストレージ追加 → Proxmox Backup Server」を選ぶだけで、PBS がバックアップ先として使えるようになります。vzdump のバックアップジョブをスケジュール設定すれば、あとは放っておくだけです。&lt;/p&gt;
&lt;h3 id="namespace-によるマルチクラスタ管理"&gt;namespace によるマルチクラスタ管理
&lt;/h3&gt;&lt;p&gt;自宅では複数の Proxmox VE クラスタを運用しています。PBS の &lt;strong&gt;namespace&lt;/strong&gt; 機能を使うと、1つのデータストアを論理的に分離してクラスタごとにバックアップを整理できます。&lt;/p&gt;
&lt;p&gt;実際の構成では、監視用クラスタ (&lt;code&gt;proxmox-mon&lt;/code&gt;) の VM は namespace &lt;code&gt;proxmox-mon&lt;/code&gt; 配下にバックアップしていますが、メインクラスタの VM はデータストアの root namespace に直接置いてしまっています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zfs-vol-01/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── vm/102, vm/104, vm/120, ... ← メインクラスタ (root namespace)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── ns/proxmox-mon/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── vm/1001, vm/1002, ... ← 監視クラスタ
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;これは namespace 機能を知る前にバックアップを取り始めた名残で、理想的にはすべてのクラスタを個別の namespace に分離すべきです。root namespace にバックアップが混在していると、ACL でクラスタ単位の権限分離をしようとしたときに root namespace 全体へのアクセス権が必要になってしまい、分離の意味が薄れます。今後の改善ポイントです。&lt;/p&gt;
&lt;p&gt;API トークンの ACL と namespace を組み合わせることで、各クラスタが自分の領域だけにアクセスする権限分離を実現できます。&lt;/p&gt;
&lt;h3 id="api-トークンによる権限分離"&gt;API トークンによる権限分離
&lt;/h3&gt;&lt;p&gt;PBS ではクラスタごと・用途ごとに API トークンを発行し、最小権限で運用しています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ユーザー&lt;/th&gt;
&lt;th&gt;トークン&lt;/th&gt;
&lt;th&gt;用途&lt;/th&gt;
&lt;th&gt;権限&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;machine-user--bk@pbs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;prox-cluster--seichi-network&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PVE クラスタからの VM バックアップ&lt;/td&gt;
&lt;td&gt;DatastoreAdmin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;machine-user--bk@pbs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;prox-cluster--proxmox-mon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;監視クラスタからの VM バックアップ&lt;/td&gt;
&lt;td&gt;DatastoreAdmin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;machine-user--bk-k8s@pbs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;seichi-onp-k8s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;K8s からの PVC バックアップ&lt;/td&gt;
&lt;td&gt;DatastoreBackup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;monitoring@pbs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;zabbix-mon&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zabbix からの監視&lt;/td&gt;
&lt;td&gt;DatastoreReader&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;トークンごとに namespace のスコープも指定できるため、K8s バックアップ用トークンが VM バックアップ領域に触れない、といった分離が簡単に実現できます。&lt;/p&gt;
&lt;h2 id="3-proxmox-backup-client--どこでも使える汎用バックアップツール"&gt;3. proxmox-backup-client ── どこでも使える汎用バックアップツール
&lt;/h2&gt;&lt;p&gt;PBS の強みの一つが &lt;code&gt;proxmox-backup-client&lt;/code&gt; の手軽さです。Debian/Ubuntu 環境なら &lt;code&gt;apt-get install proxmox-backup-client&lt;/code&gt; だけでインストールでき、PVE 管理外のマシンからでもすぐにバックアップが取れます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;proxmox-backup-client&lt;/code&gt; は任意のディレクトリを pxar 形式でバックアップできるため、本質的には &lt;strong&gt;汎用的なファイルレベルバックアップツール&lt;/strong&gt; です。後述する K8s PVC のバックアップも、PVC をマウントしたディレクトリに対して &lt;code&gt;proxmox-backup-client backup &amp;quot;data.pxar:/data&amp;quot;&lt;/code&gt; を実行しているだけで、やっていることはファイルレベルバックアップそのものです。&lt;/p&gt;
&lt;h3 id="コマンド一発でバックアップ"&gt;コマンド一発でバックアップ
&lt;/h3&gt;&lt;p&gt;基本的な使い方は非常にシンプルです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 環境変数でPBS接続情報を設定&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PBS_REPOSITORY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user@pbs!token@pbs-host:datastore&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PBS_FINGERPRINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;XX:XX:...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PBS_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;token-secret&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ディレクトリをまるごとバックアップ (pxar形式)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;proxmox-backup-client backup &lt;span class="s2"&gt;&amp;#34;data.pxar:/path/to/data&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --backup-id &lt;span class="s2"&gt;&amp;#34;my-backup&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Proxmox VE をまったく使っていない環境でも、PBS をバックアップサーバーとして独立利用できます。&lt;/p&gt;
&lt;h3 id="チャンクベースの重複排除と差分転送"&gt;チャンクベースの重複排除と差分転送
&lt;/h3&gt;&lt;p&gt;ここで、PBS のバックアップが効率的な理由を説明しておきます。&lt;/p&gt;
&lt;p&gt;PBS はバックアップデータをチャンクに分割して保存しています。VM イメージは固定長（通常 4MiB）、pxar ファイルアーカイブは可変長（Buzhash ローリングハッシュで境界を決定）のチャンクに分割されます。各チャンクはその内容の SHA-256 チェックサムで識別され、同じ内容のチャンクはデータストア内で再利用されます。&lt;a class="link" href="https://pbs.proxmox.com/docs/technical-overview.html" target="_blank" rel="noopener"
&gt;公式ドキュメント&lt;/a&gt;では次のように説明されています。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The deduplication of datastores is based on reusing chunks, which are referenced by the indexes in a backup snapshot.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;つまり、インデックスファイルが「元のデータを復元するにはどのチャンクをどの順で並べればよいか」を保持し、同一内容のチャンクは複数のスナップショットから共有されます。バックアップ時もサーバー側に既に同じチェックサムのチャンクがあれば実データの転送はスキップされるため、各スナップショットは論理的には完全バックアップでありながら、転送量はインクリメンタルです。&lt;/p&gt;
&lt;p&gt;この仕組みは、大量の小さなファイル（Minecraft のワールドデータなど）のバックアップや、後述する遠隔レプリケーションで特に効果を発揮します。&lt;/p&gt;
&lt;h3 id="vm-以外のバックアップにも対応"&gt;VM 以外のバックアップにも対応
&lt;/h3&gt;&lt;p&gt;自宅では Proxmox VE の VM バックアップだけでなく、以下のような用途で &lt;code&gt;proxmox-backup-client&lt;/code&gt; を直接利用しています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;バックアップ対象&lt;/th&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;backup-id&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Minecraft サーバーの PVC (5サーバー分)&lt;/td&gt;
&lt;td&gt;K8s CronWorkflow から実行&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mcserver--s1&lt;/code&gt; 〜 &lt;code&gt;mcserver--s7&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Garage (S3互換オブジェクトストレージ)&lt;/td&gt;
&lt;td&gt;S3 dump → pxar 化&lt;/td&gt;
&lt;td&gt;&lt;code&gt;garage&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minecraft ロビーサーバー&lt;/td&gt;
&lt;td&gt;K8s CronWorkflow から実行&lt;/td&gt;
&lt;td&gt;&lt;code&gt;mcserver--lobby&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PBS に &lt;code&gt;host/&lt;/code&gt; タイプとして記録されるこれらのバックアップは、VM バックアップと同じ Web UI 上で一覧・リストア・検証が可能です。バックアップ基盤をPBSに統合することで、監視や管理の対象がバラけずに済んでいます。&lt;/p&gt;
&lt;h2 id="4-kubernetes-pvc-バックアップの実践"&gt;4. Kubernetes PVC バックアップの実践
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;proxmox-backup-client&lt;/code&gt; が汎用的なファイルバックアップツールだと分かったところで、K8s 上でどのように活用しているかを紹介します。&lt;/p&gt;
&lt;h3 id="volumesnapshot-ではなくバックアップが必要な理由"&gt;VolumeSnapshot ではなくバックアップが必要な理由
&lt;/h3&gt;&lt;p&gt;Kubernetes には &lt;a class="link" href="https://kubernetes.io/docs/concepts/storage/volume-snapshots/" target="_blank" rel="noopener"
&gt;VolumeSnapshot&lt;/a&gt; という仕組みがあり、CSI ドライバーを通じて PVC のスナップショットを取得できます。しかし、VolumeSnapshot はバックアップの代替にはなりません。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;VolumeSnapshot&lt;/th&gt;
&lt;th&gt;PBS バックアップ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;保存先&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;元の PVC と同じストレージバックエンド&lt;/td&gt;
&lt;td&gt;別サーバー (PBS)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;障害ドメイン&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ストレージ障害で本体もスナップショットも失われる&lt;/td&gt;
&lt;td&gt;ストレージとは独立&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;オフサイトコピー&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;不可&lt;/td&gt;
&lt;td&gt;PBS Sync で遠隔拠点にレプリケーション可能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ストレージ非依存のリストア&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;不可（同じ CSI ドライバーとストレージが必要）&lt;/td&gt;
&lt;td&gt;PBS からどこにでもリストア可能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;整合性検証&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;なし&lt;/td&gt;
&lt;td&gt;PBS の Verify ジョブで定期検証&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;VolumeSnapshot は「うっかり削除してしまったファイルをすぐ戻したい」といったオペレーションには便利ですが、ストレージ障害やクラスタ全損からのリカバリには使えません。自宅環境では TrueNAS や Synology NAS をストレージバックエンドに使っていますが、これらが壊れたときに VolumeSnapshot も一緒に消えます。&lt;/p&gt;
&lt;p&gt;そのため、PVC のデータを PBS という別のサーバーに取り出し、さらに実家の PBS にレプリケーションすることで、ストレージ障害からもクラスタ全損からも復旧できるバックアップにしています。&lt;/p&gt;
&lt;p&gt;なお、VolumeSnapshot を PBS バックアップと組み合わせることで改善できる余地もあります。現在の構成では StatefulSet を停止してから PVC を直接マウントしてバックアップしているため、その間 Minecraft サーバーにダウンタイムが発生します。「Pod 稼働中にスナップショットを取得 → スナップショットから PVC を作成 → その PVC をマウントして PBS にバックアップ」という流れにすれば、ダウンタイムを大幅に短縮できるはずです。これは今後の改善候補です。&lt;/p&gt;
&lt;h3 id="構成-argo-workflows--proxmox-backup-client"&gt;構成: Argo Workflows + proxmox-backup-client
&lt;/h3&gt;&lt;p&gt;K8s 上の PVC バックアップは &lt;a class="link" href="https://argoproj.github.io/workflows/" target="_blank" rel="noopener"
&gt;Argo Workflows&lt;/a&gt; の CronWorkflow で自動化しています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;span class="lnt"&gt;19
&lt;/span&gt;&lt;span class="lnt"&gt;20
&lt;/span&gt;&lt;span class="lnt"&gt;21
&lt;/span&gt;&lt;span class="lnt"&gt;22
&lt;/span&gt;&lt;span class="lnt"&gt;23
&lt;/span&gt;&lt;span class="lnt"&gt;24
&lt;/span&gt;&lt;span class="lnt"&gt;25
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;毎日 04:00 JST (Minecraft サーバー)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;毎日 10:00 JST (Garage)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; CronWorkflow 起動
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ StatefulSet を │ ← データ整合性のため Pod を停止
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ replicas: 0 に │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ PVC をマウントした │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ジョブ Pod を起動 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ proxmox-backup- │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ client backup │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ &amp;#34;data.pxar:/data&amp;#34; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └────────┬─────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ┌──────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ ArgoCD sync で │ ← Pod を再起動
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ StatefulSet 復帰 │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └──────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="ポイント-statefulset-停止による整合性確保"&gt;ポイント: StatefulSet 停止による整合性確保
&lt;/h3&gt;&lt;p&gt;Minecraft サーバーのようなステートフルワークロードでは、稼働中にファイルをコピーするとデータ破損のリスクがあります。そこで、バックアップ前に StatefulSet のレプリカを 0 にスケールダウンし、Pod が完全に停止したことを確認してから PVC をマウント・バックアップしています。&lt;/p&gt;
&lt;p&gt;バックアップ完了後は、ワークフロー内から &lt;code&gt;argocd app sync&lt;/code&gt; を明示的に呼び出して StatefulSet を Git 上の定義（replicas: 1）に戻します。&lt;/p&gt;
&lt;p&gt;ここで厄介なのが ArgoCD の &lt;strong&gt;selfHeal&lt;/strong&gt; との競合です。バックアップ中に &lt;code&gt;kubectl patch&lt;/code&gt; で replicas を 0 にしますが、selfHeal が有効だと ArgoCD が「Git の定義と違う」と検知して replicas を元に戻してしまいます。かといって selfHeal を常時無効にすると、意図しないドリフトの自動修復が効かなくなります。&lt;/p&gt;
&lt;p&gt;そこで ArgoCD の &lt;strong&gt;SyncWindow&lt;/strong&gt; を使い、selfHeal が動作する時間帯を制限しています。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;syncWindows&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# バックアップ中に selfHeal で replicas が戻されないよう、&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# selfHeal の実行時間を制限する&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;allow&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;00 7 * * *&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# JST 7:00 から&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;1h &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 1時間だけ selfHeal を許可&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Asia/Tokyo&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;manualSync&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 手動 sync はいつでも可能&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;deny&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;schedule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;00 8 * * *&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# JST 8:00 から&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;23h &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# 23時間 selfHeal を抑止&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;timeZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Asia/Tokyo&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;manualSync&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;バックアップは JST 4:00 に開始されるため、deny ウィンドウ中に実行されます。selfHeal は抑止されつつ、&lt;code&gt;manualSync: true&lt;/code&gt; によりワークフローからの明示的な sync は通ります。JST 7:00〜8:00 の allow ウィンドウで selfHeal が動作し、万が一ワークフローが途中で失敗して replicas が 0 のままになっていても自動修復されます。&lt;/p&gt;
&lt;h3 id="ポイント-ジョブ内で-proxmox-backup-client-をインストール"&gt;ポイント: ジョブ内で proxmox-backup-client をインストール
&lt;/h3&gt;&lt;p&gt;バックアップジョブの実行コンテナ内で PBS のリポジトリを追加し、&lt;code&gt;proxmox-backup-client&lt;/code&gt; をインストールしています。常駐エージェントを K8s 内にデプロイする必要がなく、ジョブ単位で完結するためクラスタへの影響が最小限です。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ワークフロー内のインストールステップ (抜粋)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;debian:13&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;bash]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; apt-get install -y proxmox-backup-client
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; proxmox-backup-client backup &amp;#34;data.pxar:/data&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; --repository &amp;#34;$PBS_USER@$PBS_HOST:$PBS_DATASTORE&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; --backup-id &amp;#34;{{ inputs.parameters.backup-id }}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="障害通知"&gt;障害通知
&lt;/h3&gt;&lt;p&gt;バックアップワークフローが失敗した場合、Argo Workflows の &lt;a class="link" href="https://github.com/GiganticMinecraft/seichi_infra/blob/main/seichi-onp-k8s/manifests/seichi-kubernetes/apps/cluster-wide-apps/backup-failure-notification/cluster-workflow-template.yaml" target="_blank" rel="noopener"
&gt;exit handler&lt;/a&gt; から Discord Webhook で通知が飛びます。深夜のバックアップ失敗にもすぐに気付ける体制にしています。&lt;/p&gt;
&lt;h3 id="実際のコード"&gt;実際のコード
&lt;/h3&gt;&lt;p&gt;この仕組みは OSS として公開しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Minecraft サーバー PVC バックアップ&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/GiganticMinecraft/seichi_infra/blob/main/seichi-onp-k8s/manifests/seichi-kubernetes/apps/seichi-minecraft/workflows/mcserver-backup/cron-workflow.yaml" target="_blank" rel="noopener"
&gt;CronWorkflow 定義&lt;/a&gt; — スケジュールと対象サーバー一覧&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/GiganticMinecraft/seichi_infra/blob/main/seichi-onp-k8s/manifests/seichi-kubernetes/apps/seichi-minecraft/workflows/mcserver-backup/workflow-template.yaml" target="_blank" rel="noopener"
&gt;WorkflowTemplate&lt;/a&gt; — StatefulSet 停止 → PVC バックアップ → 復帰の DAG&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/GiganticMinecraft/seichi_infra/blob/main/seichi-onp-k8s/manifests/seichi-kubernetes/apps/seichi-minecraft/workflows/mcserver-backup/service-account.yaml" target="_blank" rel="noopener"
&gt;ServiceAccount / RBAC&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Garage バックアップ&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/GiganticMinecraft/seichi_infra/blob/main/seichi-onp-k8s/manifests/seichi-kubernetes/apps/cluster-wide-apps/garage-backup-to-pbs/argo-workflows-backup.yaml" target="_blank" rel="noopener"
&gt;バックアップ WorkflowTemplate&lt;/a&gt; — S3 dump → PBS への pxar バックアップ&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/GiganticMinecraft/seichi_infra/blob/main/seichi-onp-k8s/manifests/seichi-kubernetes/apps/cluster-wide-apps/garage-backup-to-pbs/argo-workflows-restore.yaml" target="_blank" rel="noopener"
&gt;リストア WorkflowTemplate&lt;/a&gt; — PBS からのリストア手順&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="5-tailscale--pbs-sync-で遠隔地レプリケーション"&gt;5. Tailscale × PBS Sync で遠隔地レプリケーション
&lt;/h2&gt;&lt;p&gt;自宅のデータを物理的に離れた実家にレプリケーションするために、PBS の &lt;strong&gt;Sync Job&lt;/strong&gt; と &lt;strong&gt;Tailscale&lt;/strong&gt; を組み合わせています。&lt;/p&gt;
&lt;h3 id="構成"&gt;構成
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;実家側 PBS から自宅側 PBS に対して &lt;strong&gt;Pull Sync&lt;/strong&gt; を毎時実行&lt;/li&gt;
&lt;li&gt;接続は Tailscale の VPN 経由 (ポート開放不要)&lt;/li&gt;
&lt;li&gt;データストアの対応: &lt;code&gt;zfs-vol-01 → zfs-vol-ssd-01&lt;/code&gt;, &lt;code&gt;zfs-vol-02 → zfs-vol-hdd-01&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 実家側 PBS の sync-job 設定
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Remote: sc-proxbksrv-01 (100.x.x.x) ← Tailscale IP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Schedule: hourly
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Mode: Pull
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="なぜ-pbs-sync-が良いか"&gt;なぜ PBS Sync が良いか
&lt;/h3&gt;&lt;p&gt;PBS の Sync は単なるファイルコピーではなく、&lt;strong&gt;チャンク単位の差分転送&lt;/strong&gt;です。セクション3で説明したチャンクの仕組みが Sync でもそのまま働くため、既に転送済みのチャンクはチェックサムの照合だけで済みます。&lt;/p&gt;
&lt;p&gt;これにより、自宅〜実家間の Tailscale 回線 (実質的には家庭用インターネット回線) でも、毎時の同期が現実的な時間で完了しています。&lt;/p&gt;
&lt;h2 id="6-運用のコツ"&gt;6. 運用のコツ
&lt;/h2&gt;&lt;h3 id="gcpruneverify-の三点セット"&gt;GC・Prune・Verify の三点セット
&lt;/h3&gt;&lt;p&gt;PBS ではバックアップの保守タスクとして以下の3つをスケジュール実行しています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;タスク&lt;/th&gt;
&lt;th&gt;スケジュール&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prune&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;毎時&lt;/td&gt;
&lt;td&gt;保持ポリシーに基づいて古いスナップショットのメタデータ（マニフェスト、インデックス等）を削除&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GC&lt;/strong&gt; (Garbage Collection)&lt;/td&gt;
&lt;td&gt;毎日&lt;/td&gt;
&lt;td&gt;Prune の結果どこからも参照されなくなったチャンクを削除し、ストレージを解放&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verify&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;毎日&lt;/td&gt;
&lt;td&gt;バックアップデータの整合性を検証 (30日以内に検証済みのものはスキップ)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="余談-pbs-の重複排除と-zfs-dedup-は別物だった"&gt;余談: PBS の重複排除と ZFS dedup は別物だった
&lt;/h3&gt;&lt;p&gt;正直に書くと、筆者はつい最近まで「PBS のデータストアに ZFS が必要なのは ZFS dedup で重複排除するためだ」と思い込んでいました。この記事を書く過程で実際に確認してみたところ:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# zfs get dedup zfs-vol-01 zfs-vol-02
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME PROPERTY VALUE SOURCE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zfs-vol-01 dedup off default
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zfs-vol-02 dedup off default
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;ZFS dedup は &lt;code&gt;off&lt;/code&gt; でした。PBS の重複排除はあくまで PBS 自身がチャンクレベルで行っているものであり、ZFS の dedup 機能とは無関係です。&lt;/p&gt;
&lt;p&gt;そもそも PBS のデータストアは ZFS 必須ではなく、&lt;a class="link" href="https://pbs.proxmox.com/docs/storage.html" target="_blank" rel="noopener"
&gt;公式ドキュメント&lt;/a&gt;にも:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The current implementation uses a directory inside a standard Unix file system (&lt;code&gt;ext4&lt;/code&gt;, &lt;code&gt;xfs&lt;/code&gt; or &lt;code&gt;zfs&lt;/code&gt;) to store the backup data.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;と書かれている通り、ext4 や XFS でも構いません。&lt;/p&gt;
&lt;p&gt;では &lt;strong&gt;なぜ ZFS を選ぶのか？&lt;/strong&gt; 重複排除のためではなく、以下の機能がバックアップサーバーと相性が良いからです。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ZFS の機能&lt;/th&gt;
&lt;th&gt;バックアップサーバーにおけるメリット&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;lz4 圧縮&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CPU 負荷がほぼゼロで透過的に容量を節約できる。自宅環境では 1.02〜1.04x の圧縮が効いている&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;scrub + &lt;a class="link" href="https://openzfs.github.io/openzfs-docs/Basic%20Concepts/Checksums.html" target="_blank" rel="noopener"
&gt;チェックサム&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;全ブロックにチェックサムを持ち、読み書き時に常時検証する。&lt;a class="link" href="https://openzfs.github.io/openzfs-docs/man/8/zpool-scrub.8.html" target="_blank" rel="noopener"
&gt;scrub&lt;/a&gt; は定期的にディスク上の全データを走査し、ハードウェア障害によるサイレントエラーを検出する。ext4 等のジャーナリングは「書き込み途中のクラッシュからファイルシステム構造を守る」仕組みであり、正常に書き込まれた後のビット腐敗（ビットロット）は検出できない。ZFS はこのサイレントなデータ破損を検出できる。バックアップは「いざというとき読めなければ意味がない」ため、これが重要&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;PBS は Verify ジョブでバックアップデータの整合性を検証しますが、これはアプリケーションレベルのチェックです。ZFS の scrub はファイルシステムレベルで全データを検証するため、両者を組み合わせることで二重の安全網になります。&lt;/p&gt;
&lt;p&gt;一方、ZFS dedup を PBS の上で有効にするのは逆効果です。PBS のチャンクは既に SHA-256 で一意に管理されているため ZFS 側で重複がほとんど見つからず、dedup テーブルが RAM を大量に消費する（一般に 1TB あたり数 GB）だけで終わります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;結論: PBS のデータストアには「ZFS + lz4 圧縮 + dedup なし」が最適解。&lt;/strong&gt; 重複排除は PBS に任せ、ZFS には圧縮とデータ整合性の仕事をしてもらうのが正しい役割分担です。&lt;/p&gt;
&lt;h3 id="zabbix-による-pbs-バックアップ監視"&gt;Zabbix による PBS バックアップ監視
&lt;/h3&gt;&lt;p&gt;PBS の REST API と Zabbix を組み合わせて、全バックアップグループの鮮度を自動監視しています。&lt;/p&gt;
&lt;h4 id="監視アーキテクチャ"&gt;監視アーキテクチャ
&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PBS ホスト上:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /usr/local/bin/pbs-backup-monitor ← カスタムスクリプト
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ PBS REST API (monitoring@pbs!zabbix-mon トークン)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; JSON で全バックアップグループの情報を出力
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ Zabbix Agent 2 UserParameter
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Zabbix Server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ LLD (ローレベルディスカバリ)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; バックアップグループごとにアイテム・トリガーを自動生成
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;PBS ホスト上に配置したカスタムスクリプト (&lt;code&gt;pbs-backup-monitor&lt;/code&gt;) が PBS REST API を叩き、全バックアップグループの情報を JSON で出力します。これを Zabbix Agent 2 の UserParameter 経由で収集し、&lt;strong&gt;ローレベルディスカバリ (LLD)&lt;/strong&gt; で各バックアップグループのアイテムとトリガーを自動生成しています。&lt;/p&gt;
&lt;h4 id="自作テンプレートpbs-backup-monitoring"&gt;自作テンプレート「PBS Backup Monitoring」
&lt;/h4&gt;&lt;p&gt;PBS ホスト上のスクリプトがローカルの PBS API を叩き、その結果を Zabbix Agent 経由で Zabbix サーバーに返す構成です。カスタムスクリプトとテンプレートは以下のファイルとして公開しています。セットアップ手順はテンプレートの description に記載しています。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="pbs-backup-monitor.py" &gt;pbs-backup-monitor.py&lt;/a&gt; — PBS ホスト上に配置するカスタムスクリプト (&lt;code&gt;/usr/local/bin/pbs-backup-monitor&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="pbs.conf" &gt;pbs.conf&lt;/a&gt; — Zabbix Agent 2 の UserParameter 設定 (&lt;code&gt;/etc/zabbix/zabbix_agent2.d/pbs.conf&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="pbs-backup-monitoring-template.yaml" &gt;pbs-backup-monitoring-template.yaml&lt;/a&gt; — Zabbix 7.0 テンプレート (インポートしてそのまま使えます)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;テンプレートの構成:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;要素&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;マスターアイテム&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pbs.groups.all&lt;/code&gt; — 全バックアップグループの JSON を一括取得&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ディスカバリルール&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pbs.groups.discovery&lt;/code&gt; — マスターアイテムの JSON からグループを自動検出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;アイテムプロトタイプ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;グループごとに &lt;code&gt;Last backup age&lt;/code&gt; (最終バックアップからの経過秒数) と &lt;code&gt;Snapshot count&lt;/code&gt; (スナップショット数) を生成&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;トリガープロトタイプ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Backup is too old&lt;/code&gt; (経過時間がしきい値超過) / &lt;code&gt;No backup snapshots&lt;/code&gt; (スナップショット数 0)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="しきい値のカスタマイズ"&gt;しきい値のカスタマイズ
&lt;/h4&gt;&lt;p&gt;トリガーのしきい値はホストマクロ &lt;code&gt;{$PBS.MAX.AGE.SECONDS}&lt;/code&gt; で制御しており、バックアップグループ単位で上書きできます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# デフォルト (日次バックアップ向け)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{$PBS.MAX.AGE.SECONDS} = 129600 (36時間)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# 週次バックアップのグループは個別に緩和
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{$PBS.MAX.AGE.SECONDS:&amp;#34;zfs-vol-02::vm:1001&amp;#34;} = 720000 (約200時間)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{$PBS.MAX.AGE.SECONDS:&amp;#34;zfs-vol-02::vm:1101&amp;#34;} = 720000
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;日次バックアップなら 36 時間以内に次のバックアップが来なければアラート、週次のものは 200 時間、というようにグループの性質に合わせて調整しています。&lt;/p&gt;
&lt;h4 id="監視のポイント"&gt;監視のポイント
&lt;/h4&gt;&lt;p&gt;この仕組みの良いところは、PBS にバックアップグループが増えると LLD が自動検出し、新しいアイテムとトリガーが勝手に生成される点です。新しい VM を Proxmox VE のバックアップジョブに追加したり、K8s で新しい PVC バックアップを設定したりしても、Zabbix 側は何もしなくて済みます。&lt;/p&gt;
&lt;p&gt;また、本家・実家の両方の PBS に同じテンプレートを適用しているため、Sync の遅延や失敗も間接的に検知できます。実家側で特定グループの &lt;code&gt;Last backup age&lt;/code&gt; が異常に大きくなれば、Sync が止まっているか元のバックアップ自体が止まっているかのどちらかです。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ
&lt;/h2&gt;&lt;p&gt;Proxmox Backup Server を使ってみて感じた利点をまとめます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Proxmox VE とのシームレスな統合&lt;/strong&gt;: VM バックアップがストレージ追加だけで完結する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;proxmox-backup-client の汎用性&lt;/strong&gt;: VM に限らず、K8s の PVC やオブジェクトストレージのデータなど、あらゆるファイルベースのバックアップに使える&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;チャンク単位の重複排除・差分転送&lt;/strong&gt;: 回線帯域が限られる遠隔地レプリケーションでも実用的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;namespace と API トークンによる権限分離&lt;/strong&gt;: マルチクラスタ・マルチ用途でも1台の PBS で安全に管理できる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web UI でのバックアップ一覧・リストア・検証&lt;/strong&gt;: VM もファイルバックアップも同じ画面で管理できる統一感&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらを組み合わせた結果、バックアップの「3-2-1 ルール」もおおむね達成できています。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ルール&lt;/th&gt;
&lt;th&gt;実現方法&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt; コピー&lt;/td&gt;
&lt;td&gt;本番データ + 自宅 PBS + 実家 PBS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt; 種類のメディア&lt;/td&gt;
&lt;td&gt;本番環境のストレージ + PBS の ZFS (SSD/HDD)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt; つはオフサイト&lt;/td&gt;
&lt;td&gt;実家に物理的に分離された PBS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;「PBS は Proxmox VE のオマケ」と思われがちですが、実際には Proxmox VE なしでもスタンドアロンのバックアップサーバーとして十分に機能します。特に &lt;code&gt;proxmox-backup-client&lt;/code&gt; の手軽さは、Kubernetes のようなコンテナ環境との組み合わせで真価を発揮します。&lt;/p&gt;
&lt;p&gt;自宅サーバーのバックアップに悩んでいる方は、ぜひ PBS を検討してみてください。&lt;/p&gt;</description></item></channel></rss>