物理的脅威からデータを守る
多くの人は、デスクの下に置いた1台のサーバーやNASからHomeLabの運用を始めます。RAIDを設定し、外付けドライブにローカルバックアップを取り、安心して眠りにつくでしょう。しかし、RAIDはバックアップではありません。配管が破裂したり、キッチンから火が出たり、泥棒がオフィスを空にしたりすれば、ローカル의 冗長性は無意味になります。物理的な拠点の災害を生き延びるには、データを別の場所に置く必要があります。
私は、低電力(10W未満)で動作し、完全に暗号化され、数テラバイトのストレージのためにクラウドプロバイダーに月額20ドルも払わなくて済むソリューションを求めていました。そこで、Raspberry Pi 4と4TBの外付けドライブを使用して、専用のバックアップノードを自作しました。これを友人の家に設置し、セキュアなWireGuardトンネルを介して自宅と接続しました。このセットアップは14ヶ月以上、一度も止まることなく稼働しています。
アーキテクチャ
全体像は以下の通りです:
- サイトA(ソース): メインのHomeLab。Proxmoxノードやバックアップクライアントを実行しているSynology NASなど。
- サイトB(ターゲット): 別の物理的な住所にある、外付けHDDを接続したRaspberry Pi。
- 接続性: WireGuard VPNトンネルにより、両サイトが制限の厳しいNAT配下にあっても、2拠点間にプライベートな「ローカル」リンクを作成します。
- ソフトウェア:
resticを使用します。暗号化と重複排除を処理するため、変更されたデータブロックのみを送信します。
ワークフローはシンプルです。サイトAがWireGuardを介してサイトBへの接続を開始します。トンネルが確立されると、サイトAがresticコマンドを実行します。データはローカルのハードウェア上で暗号化され、トンネルを通じてサイトBに安全に保存されます。
ステップバイステップの構築手順
設定を始めましょう。Raspberry Pi OS(64ビット推奨)をクリーンインストールした2台のRaspberry Piが必要です。
1. WireGuardトンネルの設定
WireGuardは軽量で高速、かつOpenVPNよりも監査が格段に容易です。これにより、サイトAからサイトBをローカルIPアドレスとして「見る」ことができます。
まず、両方のデバイスにWireGuardツールをインストールします:
sudo apt update && sudo apt install wireguard -y
サイトB(ターゲット)で、キーを生成し、設定ファイルを開きます:
wg genkey | tee privatekey | wg pubkey > publickey
sudo nano /etc/wireguard/wg0.conf
実際のキーに置き換えて、以下の設定を貼り付けます:
[Interface]
PrivateKey = <Site_B_Private_Key>
Address = 10.0.0.1/24
ListenPort = 51820
[Peer]
PublicKey = <Site_A_Public_Key>
AllowedIPs = 10.0.0.2/32
サイトA(ソース)で、サイトBのパブリックIPまたはDDNSアドレスを指す、対応する設定を作成します:
[Interface]
PrivateKey = <Site_A_Private_Key>
Address = 10.0.0.2/24
[Peer]
PublicKey = <Site_B_Public_Key>
Endpoint = your-ddns-hostname.com:51820
AllowedIPs = 10.0.0.1/32
PersistentKeepalive = 25
プロのヒント:サイトBのルーターでUDPポート51820を、Raspberry PiのローカルIPへ転送(ポート開放)する必要があります。
2. ストレージ保管庫の準備
Linuxでの信頼性を最大化するため、外付けドライブをext4でフォーマットします。停電後に自動的に再マウントされるよう、/etc/fstabを介してマウントします。
# 専用のマウントポイントを作成
sudo mkdir -p /mnt/backup_vault
sudo chown -R pi:pi /mnt/backup_vault
3. Resticの初期化
Resticは、重複排除からスナップショットまで、すべてを単一のバイナリで処理する素晴らしいツールです。サイトAにインストールします:
sudo apt install restic -y
トンネル経由でリモートリポジトリを初期化します。このコマンドは、resticに対してSFTPを使用して10.0.0.1のPiと通信するように指示します:
restic -r sftp:[email protected]:/mnt/backup_vault/homelab init
強力なパスワードを選択し、Bitwardenなどのマネージャーに保存してください。これを紛失すると、バックアップはただの高価なランダムノイズになってしまいます。
自動化と容量管理
手動バックアップは失敗の元です。忘れてしまうからです。代わりに、スクリプトとsystemdタイマーを使用して、あなたが眠っている午前3時に重い処理を任せましょう。
1. バックアップスクリプト
サイトAに/home/pi/backup_script.shを作成します。このスクリプトはバックアップを実行し、ディスク容量を節約するために古いデータを削除(プルーニング)します:
#!/bin/bash
export RESTIC_REPOSITORY="sftp:[email protected]:/mnt/backup_vault/homelab"
export RESTIC_PASSWORD_FILE="/home/pi/.restic_pw"
# 特定のディレクトリをバックアップ
restic backup /home/pi/data /var/www/html --verbose
# 保存ポリシー:日次7つ、週次4つ、月次6つのスナップショットを保持
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
2. なぜsystemdタイマーがcronに勝るのか
cronは古くからの標準ですが、バックアップにはsystemdタイマーの方が優れています。予定時刻にPiの電源が切れていても、Persistent=trueを設定していれば、起動直後にジョブが即座に実行されます。
/etc/systemd/system/offsite-backup.timerを作成します:
[Unit]
Description=毎日午前3時にオフサイトバックアップを実行
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
現場で得た教訓
電源がすべて
Raspberry Piは電圧降下に非常に敏感であることで知られています。2.5インチHDDをUSBポートに直接差し込むと、ドライブの回転開始時にPiがクラッシュすることがあります。公式のRaspberry Pi 15W電源を使用してください。3.5インチドライブの場合は、必ず独自のACアダプターを備えたセルフパワーのエンクロージャーを使用してください。
Healthchecks.ioによる監視
音もなくバックアップが失敗するのは悪夢です。私はスクリプトの最後に、**Healthchecks.io**にpingを送信する簡単なcurlコマンドを追加しています。24時間Piからの連絡がない場合、スマホにアラートが届きます。ルーターのアップデートでWireGuardトンネルが切れた際、これで2回救われました。
「スニーカーネット」による初回同期
500GBのデータがあり、自宅の上り速度が20Mbpsの場合、初回の同期には60時間以上かかります。インターネット経由で行わないでください。「オフサイト」用のPiを自宅に持ち込み、ギガビットLAN経由で初回バックアップを実行してから、恒久的な設置場所に移動させましょう。その後はresticが増分変更のみを送信するため、通常は数分で完了します。
数台のRaspberry Piとわずかな電気代で、プロフェッショナルグレードの災害復旧計画が手に入りました。データが文字通り「火の海」のような災害から守られているという安心感を得るための、小さな投資です。

