DIYオフサイトバックアップ:Raspberry PiとWireGuardでセキュアな4TBの保管庫を構築した方法

HomeLab tutorial - IT technology blog
HomeLab tutorial - IT technology blog

物理的脅威からデータを守る

多くの人は、デスクの下に置いた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とわずかな電気代で、プロフェッショナルグレードの災害復旧計画が手に入りました。データが文字通り「火の海」のような災害から守られているという安心感を得るための、小さな投資です。

Share: