消えるRAMディスクへの防衛策。Restic×Rcloneのバディで実現する「超高速・重複排除・全自動」二重バックアップ戦略

この記事は約64分で読めます。

サイトの健康状態を把握することは安定運用の第一歩ですが、そのためだけに毎回わざわざSSHでログインして、黒い画面で tophtop コマンドを叩き続けるのはスマートではありません。仕事中であっても、デスクの前にいるときであっても、愛機の鼓動を一目で、かつグラフィカルに確認できるダッシュボードが欲しい。

前回の記事では、そんなエンジニアのロマンと実用性を同時に満たす「Prometheus + Grafana」による最強のグラフィカル管制室を爆誕させました。
しかし、美しい管制室と爆速の10G環境を手に入れた私たちが、次に絶対に目を背けてはならない現実があります。それが「バックアップ」です。
とくに静的ファイルをRAMディスク上に配置して超高速化している環境では、万が一のクラッシュや停電による再起動一発で、データがすべて水泡に帰す宿命を背負っています。「構築して満足」で終わらせず、愛機を物理災害からも守り抜く鉄壁の防衛ラインを敷きましょう。

  1. 1. RAMディスク運用の宿命と「3-2-1バックアップルール」
    1. 💡 爆速の代償:電源が落ちたらすべてが消える世界
    2. 🛡️ 自宅サーバーに適用する鉄壁の「3-2-1ルール」
  2. 2. なぜ Restic × Rclone なのか?3つの神機能
    1. 📂1. 毎回フルバックアップ級の安心「重複排除(デデュプリケーション)」
    2. 🔑2. クラウドを過信しない「クライアント側暗号化」
    3. 📃3. あらゆるストレージを土管化する「Rclone連携」
  3. 3. 【事前準備】NASの常時マウントとオブジェクトストレージのAPIキー取得
    1. 📂1. ローカルの受け皿:NASの共有フォルダーをUbuntuに常時マウントする
      1. Aパターン:SMB/CIFS(Windowsで使っているNAS、一般的なNAS)の場合
      2. Bパターン:NFS(Linux特化の爆速プロトコル)を使う場合
      3. 🔄 サーバー再起動時も自動でNASに繋ぐ設定(fstabの編集)
    2. ☁️ 2. クラウドの受け皿:Cloudflareの登録とR2オブジェクトストレージの準備
      1. ① Cloudflareアカウントの作成(無料)
      2. ② 支払い方法(クレジットカードやPayPal)の登録
      3. ③ R2サブスクリプションの追加
      4. ④ バックアップ用バケット(保管庫)の作成
      5. ⑤ 自宅サーバーからの通行証「APIアクセストークン」の発行
      6. ⑥ 【超重要】発行された認証情報を手元に控える(※二度と表示されません)
  4. 4. 【実践】Rclone と Restic のインストール&初期設定
    1. 📥 1. Restic と Rclone のインストール
    2. 🎛️ 2. Rcloneの設定(Cloudflare R2へのルート開通)
      1. ① 新しい接続を作成する
      2. ② 設定に名前をつける
      3. ③ ストレージのタイプ(種類)を選択する
      4. ④ S3プロバイダ(提供元)の種類を選択する
      5. ⑤ 認証情報の入力方法を選択する
      6. ⑥ アクセスキー ID の入力
      7. ⑦ シークレット アクセス キー の入力
      8. ⑧ リージョンの選択
      9. ⑨ エンドポイントの入力
      10. ⑩ 詳細設定のスキップ
      11. ⑪ 設定の確定・保存
      12. ⑫ 設定の保存とウィザードの終了
    3. 🔒 3. Resticリポジトリ(保管庫)の初期化手順
      1. 🏡【保管庫①】宅内NASをセットアップする
      2. ☁️【保管庫②】Cloudflare R2(クラウド)をセットアップする
  5. 📂 5. 【自動化】丸ごと固める一発バックアップスクリプトの作成
    1. 1. バックアップ全体の流れ(仕様設計)
    2. 2. スクリプトの作成と配置
      1. 📂複数サイトの場合(少し記述が変わります)
      2. ✍️ 貼り付け後の書き換えポイント
    3. 🚀 3. スクリプトに実行権限を与えてテスト走行(手動実行)する
      1. 📺 手動テストの実行ログ
      2. 💡 このログのポイント
    4. 4. cronを使った毎日定時実行の完全自動化設定
      1. ⏰ スケジュールの解説
  6. 6. 【確認・保守】手動チェックを1秒で終わらせる超スマート管理テクニック
    1. 📂 1. 一発確認用ショートカットスクリプトの作成
    2. 🚀 2. 実行権限の付与とテスト
    3. 📺 実際の出力画面(確認ポイント)
      1. 💡 ここをチェック!
    4. 💡 運用のまとめ
  7. まとめ & 次回予告
    1. 🚨 バックアップは「戻せること」がゴール

1. RAMディスク運用の宿命と「3-2-1バックアップルール」

💡 爆速の代償:電源が落ちたらすべてが消える世界

静的ファイルをRAMディスク(tmpfsなど)に載せる運用は、10G回線のポテンシャルをミリ単位まで引き出す究極のチューニングです。しかし、その圧倒的なスピードと引き換えに、「揮発性ストレージである」という最大の弱点を持っています。

不意の停電、カーネルパニック、ハードウェアの突然死。あるいは、システムのアップデートに伴うただの一度の再起動。もし手元に「絶対に信頼できる最新のデータ」がなければ、愛機は二度と元の姿で目覚めることはできません。RAMディスク運用だからこそ、バックアップには1ミリの妥協も許されないのです。

🛡️ 自宅サーバーに適用する鉄壁の「3-2-1ルール」

データ保護の世界には、プロが絶対死守する「3-2-1バックアップルール」という鉄則があります。

  • 3:データはオリジナルを含めて3つ持つ
  • 22種類の異なるメディア(ストレージ)に保存する
  • 11箇所は遠隔地(クラウド)に保管する

自宅のサーバー機がどれだけ頑丈でも、落雷による過電流でのマシン全損や、地震・火災といった物理的災害が起きれば、室内のデータは全滅します。

そこで本記事では、このルールを完全にクリアするために、「宅内のNAS(ローカル)」「格安オブジェクトストレージ(クラウド)」の二箇所へデータを自動で叩き込む、最強の二重防災配管を構築します。

2. なぜ Restic × Rclone なのか?3つの神機能

「バックアップなんて、毎日 tar で固めて cron で回せばいいのでは?」と思うかもしれません。しかし、大容量のWordPressデータやデータベース、各種ログを愚直に丸ごとコピーしていては、NASの容量も10G回線の帯域もあっという間に食い潰されてしまいます。
そこで輝くのが、Restic(レスティック)とRclone(アールクローン)という、2つの強力なOSSの組み合わせです。

📂1. 毎回フルバックアップ級の安心「重複排除(デデュプリケーション)」

Resticは、データを単純なファイルコピーではなく、細切れの「ブロック単位」でスナップショットとして管理します。 2回目以降のバックアップでは、前回から変更があったブロックだけを抽出して保存(増分バックアップ)するため、実行は一瞬で終わり、ストレージ容量もほとんど消費しません。それでいて、データを復元(リストア)するときは、いつでも「その日の完全なフルバックアップ」として過去の状態へタイムトラベルできます。

🔑2. クラウドを過信しない「クライアント側暗号化」

バックアップデータは、自宅サーバーから送り出される前の段階(手元)で、Resticによって強力に暗号化されます。 万が一、転送先のクラウドストレージの認証情報が漏洩したり、サービス側がハッキングされたりしても、あなたが設定した暗号化パスワードを持たない第三者が中身を覗き見ることは絶対に不可能です。

📃3. あらゆるストレージを土管化する「Rclone連携」

Rcloneは、世界中のクラウドストレージ(Cloudflare R2、Wasabi、Google Driveなど)とコマンドラインで自在に通信できる「魔法の土管」です。 Resticは非常にスマートで、自身のバックアップ出力先としてRcloneのプロファイルを直接指定できる仕様になっています。

【無敵のバディ構造】
「手元のResticがデータをガチガチに暗号化&重複排除しながら固める」➔「できたデータをRcloneがオブジェクトストレージへダイレクトに流し込む」という一連の処理が、サーバー内に重いテンポラリファイル(一時保存用のzip等)を作ることなく、メモリ上で滑らかに完結します。

3. 【事前準備】NASの常時マウントとオブジェクトストレージのAPIキー取得

ResticとRcloneを動かす前に、まずはデータの流し込み先となる「2つの受け皿」を自宅サーバー側でいつでも叩ける状態にセットアップします。

📂1. ローカルの受け皿:NASの共有フォルダーをUbuntuに常時マウントする

自宅サーバー(Ubuntu)からLAN内にあるNASへ高速かつ安定してデータを送るため、NASの共有フォルダーをUbuntuのファイルシステムの一部として常時マウント(固定)します。

💡 コラム:Windowsで普段使っているNASはそのまま使える? 100%そのまま使えます!
Windowsのエクスプローラーで \\192.168.x.x\share のようにアクセスして使っているNAS(Synology、QNAP、BUFFALO製、あるいはWindows PCの共有フォルダなど)は、裏側で「SMB(CIFS)」という共通規格で動いています。 Ubuntu側にこのSMBを解釈するツールを入れることで、Windows側のデータを消すことなく、同じNASの空きスペースをバックアップ先として相乗りさせることが可能です。

お使いのNASの接続方式に合わせて、以下のいずれかのパターンで設定してください。

Aパターン:SMB/CIFS(Windowsで使っているNAS、一般的なNAS)の場合

Ubuntu側にネットワーク共有を扱うためのパッケージをインストールします。

Bash
sudo apt update
sudo apt install cifs-utils -y

NASへログインするためのユーザー名とパスワードを安全に保管するファイル(/.nascredentials)を作成します。

Bash
sudo nano /.nascredentials

中身にNASのアクセス情報を記述します(WindowsからNASに繋ぐときに入力しているユーザー名とパスワードです)。

Plaintext
username=your_nas_username
password=your_nas_password

この認証ファイルを他の一般ユーザーに見られないよう、パーミッションを厳重に制限します。

Bash
sudo chmod 600 /.nascredentials

Ubuntu側にバックアップの着弾点となるディレクトリ(マウントポイント)を作成し、手動でテスト接続します。

Bash
sudo mkdir -p /mnt/nas_backup
sudo mount -t cifs -o credentials=/.nascredentials,iocharset=utf8,uid=1000,gid=1000 //NASのIPアドレス/共有フォルダ名 /mnt/nas_backup

//NASのIPアドレス/共有フォルダ名 は、普段Windowsでネットワークドライブ割り当てなどをしているパス(例: //192.168.1.50/backup)に置き換えてください。

Bパターン:NFS(Linux特化の爆速プロトコル)を使う場合

NAS側でLinux向けのNFSサービスを有効化し、自宅サーバーのローカルIPからのアクセスを許可している場合はこちらが最速です。

Ubuntu側に必要なパッケージをインストールします。

Bash
sudo apt update
sudo apt install nfs-common -y

マウントポイントを作成し、手動でテストマウントします。

Bash
sudo mkdir -p /mnt/nas_backup
sudo mount -t nfs NASのIPアドレス:/volume1/nas_backup /mnt/nas_backup

※ NAS側の実際のNFSエクスポートパス(例: /volume1/backup)に合わせて変更してください。

🔄 サーバー再起動時も自動でNASに繋ぐ設定(fstabの編集)

手動でのマウントが成功し、df -h コマンドでNASの容量が正しく表示されていることを確認したら、サーバーが再起動した際にも自動で接続されるよう設定ファイル /etc/fstab に追記します。

Bash
sudo nano /etc/fstab

ファイルの最下部に、先ほど成功したパターンの行を追記します。

【Aパターン:SMB/CIFS(Windows用NAS等)の場合】

Bash
//NASのIPアドレス/共有フォルダ名  /mnt/nas_backup  cifs  credentials=/.nascredentials,iocharset=utf8,uid=1000,gid=1000,_netdev  0  0

【Bパターン:NFSの場合】

Bash
NASのIPアドレス:/volume1/nas_backup  /mnt/nas_backup  nfs  defaults,_netdev  0  0

💡 フリーズを防ぐ重要ポイント
末尾の手前に書かれている _netdev というオプションが非常に重要です。これを記述しておくことで、「OSの起動時、ネットワークが完全に繋がったことを確認してからNASへマウントしにいく」という挙動になり、LANケーブルが抜けていたりNASが落ちていたりしてもUbuntuの起動自体がフリーズする致命的なトラブルを防げます。

追記が完了したら、一度接続を切って、自動マウントが正しく機能するかテストします。

Bash
sudo umount /mnt/nas_backup
sudo mount -a

エラーが出ずに /mnt/nas_backup の中身が正常に見えていれば、ローカル側の鉄壁の受け皿は完成です!

☁️ 2. クラウドの受け皿:Cloudflareの登録とR2オブジェクトストレージの準備

続いて、遠隔地バックアップ用として格安で信頼性の高い「Cloudflare R2」の準備をします。R2はデータのダウンロードにかかる転送量(Egress料金)が無料なため、有事の際のリストア(復元)で想定外の課金が発生しない、バックアップ用途には極めて最適な選択肢です。

ここでは、これまでのサーバー構築でお名前.com等の別サービスを使っており、「Cloudflareのアカウントをまだ持っていない」という前提で、最初の登録から解説します。

① Cloudflareアカウントの作成(無料)

  1. Cloudflareの公式サイトhttps://www.cloudflare.com/)にアクセスし、画面右上の「サインアップ(登録)」をクリックします。
  2. メールアドレスと任意のパスワードを入力して、アカウントを作成します。
  3. 登録したメールアドレスに確認メールが届くので、本文のリンクをクリックしてアカウントを有効化します。

② 支払い方法(クレジットカードやPayPal)の登録

Cloudflare R2は「毎月10GBまで完全無料」で利用できますが、オブジェクトストレージというサービスの性質上、初回利用時に有効な支払い手段(クレジットカードまたはPayPal)をアカウントに紐付ける必要があります。無料枠の範囲内で運用する限り、勝手に課金されることはありません。

  1. ダッシュボードにログイン後、左メニューの最下部にある「アカウントの管理」➔「請求」をクリックします。
  2. 「支払い方法」の項目から、クレジットカードまたはPayPalのアカウントを登録します。

③ R2サブスクリプションの追加

  1. 支払い方法の登録が終わったら、左メニューから「ストレージとデータベース」を選択します。
  2. 展開されたメニューから「R2」➔「概要」をクリックします。
  3. 初めてR2にアクセスすると、「毎月の無料使用が含まれます」という案内と、先ほど登録した支払い方法が表示されます。
  4. 内容を確認し、青い「R2 サブスクリプションをアカウントに追加する」ボタンをクリックして有効化します。

④ バックアップ用バケット(保管庫)の作成

  1. 画面右上にある青い「+ バケットを作成」ボタンをクリックします。
  2. バケット名を入力します(例:server-backup)。
  3. 位置情報はデフォルトの「自動」のままでOKです(自動的に最適な「アジア太平洋」が選択されます)。
  4. デフォルトのストレージクラスも、通常のバックアップ用途である「Standard」のままでOKです。
  5. 最後に右下の青い「バケットを作成」ボタンをクリックします。

⑤ 自宅サーバーからの通行証「APIアクセストークン」の発行

RcloneやResticが自宅サーバーからこのR2バケットへデータを自動で流し込めるようにするための「通行証」を発行します。後から権限不足でエラーになるのを防ぐため、最初から適切な権限を付与して作成するのが最大のポイントです。

  1. 左メニューの「R2 オブジェクトストレージ」のすぐ下にある「概要」をクリックし、バケット一覧画面に戻ります。
  2. 画面右下にある「アカウント詳細」エリア内の、「API トークン」の横にある「⚙️ 管理」ボタンをクリックします。
  3. 画面が変わったら、下側にある青い「User API トークンを作成する」をクリックします。
  4. トークン名:適当な名前を入力します(例: restic-backup-token)。
  5. アクセス許可の選択【最重要】: 画面には4つの選択肢が並んでいます。デフォルトでは一番下の「オブジェクト読み取り専用」にチェックが入っていますが、Resticのセットアップ時にフォルダを作成する権限が必要になるため、必ず一番上の「管理者読み取りと書き込み」にチェックを付けてください。
    • 🔘 管理者読み取りと書き込み (←これだけを選択!)
    • ⚪️ 管理者読み取り専用
    • ⚪️ オブジェクト読み取りと書き込み
    • ⚪️ オブジェクト読み取り専用
  6. バケットの指定: デフォルトの「このアカウント内のすべてのバケットに適用します」のままでOKです。
  7. TTL(有効期限): デフォルトの「無期限」のままでOKです。
  8. クライアント IP アドレス フィルタリング: 基本的には空欄のままでOKです。 ※もし自宅のネット環境が「固定IP契約」で、かつセキュリティを極限まで高めたい場合は、「含む:」の欄に自宅サーバーのグローバルIPアドレスを入力することで、自宅以外からの接続を完全にシャットアウトできます。ただし、一般的なプロバイダの動的IP環境(ルーター再起動でIPが変わる環境)の場合は、ある日突然バックアップが繋がらなくなるため、空欄のまま進めるのが安全です。
  9. 最後に右下の青い「User API トークンを作成する」ボタンをクリックすると、キーが発行されます。

⑥ 【超重要】発行された認証情報を手元に控える(※二度と表示されません)

トークンの作成が完了すると、画面に自宅サーバーとCloudflareを繋ぐための重要な認証情報が表示されます。

画面最下部にも書かれている通り、セキュリティ上の理由により、この画面を閉じると各種キーは二度と再表示されません。 画面を開いたまま、以下の情報を必ず手元のメモ帳等に確実にコピペして保存してください。

  • トークンの値(Rcloneの設定では使いませんが、念のため控えます)
  • アクセスキー ID (「S3 クライアントには次の認証情報を使用します」の枠内にあります)
  • シークレット アクセス キー (これが紛失するとアウトになる最重要キーです)
  • エンドポイントURL (「デフォルト」タブに表示されている https://〜 から始まるURLです)

各項目のすぐ下にある「クリックしてコピー」を使うと、タイポ(打ち間違い)なく安全にクリップボードにコピーできます。

4. 【実践】Rclone と Restic のインストール&初期設定

受け皿となるストレージの準備が整ったら、自宅サーバー(Ubuntu)に舞台を戻します。 ここからは、バックアップの心臓部となる「Restic」と、クラウドへの通信を担う「Rclone」をインストールし、それぞれを初期設定していきます。

📥 1. Restic と Rclone のインストール

Ubuntuの公式リポジトリから、最新の安定版をサクッとインストールします。SSHでサーバーにログインし、以下のコマンドを実行してください。

Bash
sudo apt update
sudo apt install restic rclone -y

正しく導入されたか、バージョンを確認しておきましょう。

Bash
restic version
rclone version

※コマンドが通り、バージョン情報が表示されればインストールは成功です。

🎛️ 2. Rcloneの設定(Cloudflare R2へのルート開通)

まずは、Rcloneを使って先ほど作成した「Cloudflare R2」へアクセスするためのプロファイル(設定)を作成します。 Rcloneには対話型の設定ウィザードが用意されているので、指示に従って入力していくだけで簡単につなげられます。

設定コマンドを起動します。

Bash
rclone config

コマンド rclone config を叩くと、以下の画面が表示されます。

Plaintext
No remotes found, make a new one?
n) New remote
s) Set configuration password
q) Quit config
n/s/q>

① 新しい接続を作成する

まずは新規作成なので、n と入力して Enter を押します。

② 設定に名前をつける

Plaintext
name>

と聞かれるので、分かりやすく cloudflare-r2 と入力して Enter を押します。

③ ストレージのタイプ(種類)を選択する

膨大な種類のストレージの選択肢(1, 2, 3… と番号がついたリスト)がズラッと流れます。 Cloudflare R2は「Amazon S3の仕組み(互換)」を使って動いているため、リストの中から s3 という文字列を探して入力するか、直接 s3 と入力して Enter を押します。

Plaintext
Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
...
 5 / Amazon S3 Compliant Storage Providers including AWS, Alibaba, Ceph, China Mobile, Cloudflare, ArvanCloud, Digital Ocean, Dreamhost, Huawei OBS, IBM COS, IDrive e2, IONOS Cloud, Lyve Cloud, Minio, Netease, RackCorp, Scaleway, SeaweedFS, StackPath, Storj, Tencent COS, Qiniu and Wasabi
   \ (s3)
...
Storage>

5 を入力して Enter を押します。

④ S3プロバイダ(提供元)の種類を選択する

どのS3互換サービスを使うかを聞かれます。

Plaintext
Option provider.
Choose your S3 provider.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
...
 5 / Cloudflare R2 Storage
   \ (Cloudflare)
...
provider>

5 を入力して Enter を押します。

⑤ 認証情報の入力方法を選択する

Plaintext
Option env_auth.
Get AWS credentials from runtime (environment variables or EC2/ECS meta data if no env vars).
...
 1 / Enter AWS credentials in the next step.
   \ (false)
 2 / Get AWS credentials from the environment (env vars or IAM).
   \ (true)
env_auth>

➔ 次のステップで手動入力するため、1 を入力して Enter を押します。

⑥ アクセスキー ID の入力

Plaintext
Option access_key_id.
AWS Access Key ID.
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
access_key_id>

➔ Cloudflareの登録時に控えた 「アクセスキー ID」 をコピペして Enter を押します。

⑦ シークレット アクセス キー の入力

Plaintext
Option secret_access_key.
AWS Secret Access Key (password).
Leave blank for anonymous access or runtime credentials.
Enter a value. Press Enter to leave empty.
secret_access_key>

➔ Cloudflareの登録時に控えた 「シークレット アクセス キー」 をコピペして Enter を押します。

⑧ リージョンの選択

Plaintext
Option region.
Region to connect to.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
 1 / R2 buckets are automatically distributed across Cloudflare's data centers for low latency.
   \ (auto)
region>

➔ 自動的に最適なデータセンターが選ばれるため、1 を入力して Enter を押します。

⑨ エンドポイントの入力

Plaintext
Option endpoint.
Endpoint for S3 API.
Required when using an S3 clone.
Enter a value. Press Enter to leave empty.
endpoint>

➔ Cloudflareの登録時に控えた 「S3 API エンドポイントURL」 を丸ごとコピペして Enter を押します。

⑩ 詳細設定のスキップ

Plaintext
Edit advanced config?
y) Yes
n) No (default)
y/n>

➔ 特殊なカスタマイズは不要なため、n を入力して Enter を押します。

⑪ 設定の確定・保存

Plaintext
Configuration complete.
Options:
- type: s3
- provider: Cloudflare
...
Keep this "cloudflare-r2" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>

➔ 表示された設定内容(アクセスキーやエンドポイント)に間違いがなければ、y を入力して Enter を押します。

⑫ 設定の保存とウィザードの終了

Plaintext
Current remotes:

Name                 Type
====                 ====
cloudflare-r2        s3

e) Edit existing remote
n) New remote
d) Delete remote
...
q) Quit config
e/n/d/r/c/s/q>

➔ 一覧に cloudflare-r2 が無事登録されたことを確認し、q を入力して Enter を押し、設定ウィザードを終了(脱出)します。

ウィザードを無事に抜けられましたら、設定が100%成功しているか、以下の「バケット一覧表示コマンド」を叩いて最終テストをしてみましょう!

Plaintext
rclone ls cloudflare-r2:あなたのバケット名

※コロン(:)の直後に、Cloudflareで作成した実際のバケット名を入力します。

実行後、エラーが表示されずにそのまま次の行に進めば(無反応であれば)接続テストは完全大成功です!(まだ何もバックアップしていないため、中身が空っぽなのが正常な状態です)。

🔒 3. Resticリポジトリ(保管庫)の初期化手順

Resticでは、バックアップデータを安全に保存するための部屋(暗号化された保管庫)のことを「リポジトリ」と呼びます。 データを送信する前に、それぞれの保存先で「これからResticのデータを入れますよ」という初期化サインを出す必要があります。

⚠️ 超重要:リポジトリのパスワードを決めよう
Resticのリポジトリを初期化する際、データを手元で強力に暗号化するための「パスワード」を設定します。 このパスワードを紛失すると、どんなにバックアップが正しく取れていても100%復元できなくなります。 先ほど控えたCloudflareのキーと一緒に、絶対に忘れないパスワードを1つ決めておいてください。(NAS用とR2用で同じパスワードを使っても大丈夫です)

🏡【保管庫①】宅内NASをセットアップする

第3章で /mnt/nas_backup にマウントしたNASのディレクトリを指定して、セットアップコマンドを実行します。

Plaintext
restic -r /mnt/nas_backup init

コマンドを叩くと、画面に以下のように表示されます。

Plaintext
enter password for new repository: (ここで決めたパスワードを入力してEnter)
enter password again: (もう一度同じパスワードを入力してEnter)

※入力中、画面にはセキュリティのためパスワードの文字(*** など)は一切表示されませんが、内部では入力されているのでそのまま打ち込んでEnterを押してください。

コマンドを実行すると、以下のように保管庫(リポジトリ)が作成されます。

Plaintext
# restic -r /mnt/nas_backup init

enter password for new repository:
enter password again:
created restic repository 23a2cc2ea9 at /mnt/nas_backup

Please note that knowledge of your password is required to access
the repository. Losing your password means that your data is
irrecoverably lost.

最後の英語のメッセージは、「パスワードを忘れたらデータは二度と絶対に復元できないからね」というResticからの超重要アラートです。登録したパスワードは、手元のメモやパスワード管理ツールなどに必ず厳重に保管しておいてください!

これでNAS側(リポジトリ①)のセットアップは完璧です!

☁️【保管庫②】Cloudflare R2(クラウド)をセットアップする

次に、Cloudflare R2のバケット側もセットアップします。 クラウド側への接続には、Rcloneを中間に挟むと通信の相性エラー(501 NotImplemented)が発生するため、Resticの持つ「S3直接接続機能」を使って一発で安全にセットアップします。
第2章の⑤で厳重に控えたCloudflare R2の「通行証(3つのキー情報)」を使い、以下のコマンドを順番に実行してください。

まず、一時的にCloudflareの認証キーを自宅サーバー(Ubuntu)に認識させます。

Plaintext
export AWS_ACCESS_KEY_ID="あなたのアクセスキーID"
export AWS_SECRET_ACCESS_KEY="あなたのシークレットアクセスキー"

" " の中に、第2章で控えた実際のキーを入力してそれぞれEnterを押します。

認証キーがセットできたら、以下のセットアップコマンドを実行します。

Plaintext
restic -r s3:https://あなたのS3_API_エンドポイント/server-backup init

あなたのS3_API_エンドポイント の部分は、控えておいた xxxx.r2.cloudflarestorage.com という文字列に書き換えてください。(先頭に https:// をつけ、末尾に /server-backup などのバケット名をくっつけるのがポイントです)

NASのときと同様に、新しく登録するパスワードを2回求められます。

Plaintext
enter password for new repository: (新しく登録するパスワードを入力してEnter)
enter password again: (もう一度同じパスワードを入力してEnter)

※ここでもセキュリティの仕様上、パスワード入力中の文字は画面に一切表示されません。画面を信じて打ち込んでください。

少し待って、画面に正常終了のメッセージ(created restic repository)が出れば……クラウド側の暗号化保管庫も準備完了です!
これで、自宅サーバー内部に「Restic」という最強のバックアップエンジンが搭載され、送り先であるNASとクラウド双方の暗号庫の紐付けが完全に終わりました!事前準備とツールの初期設定はこれですべてクリアです。

📂 5. 【自動化】丸ごと固める一発バックアップスクリプトの作成

ここからは、毎日手動でコマンドを叩かなくても、サーバーが裏で全自動でバックアップを処理してくれるように「シェルスクリプト」を1本書き上げます。

1. バックアップ全体の流れ(仕様設計)

このスクリプトが実行されると、内部では以下の手順がミリ秒単位で高速に実行されます。

バックアップ全体の流れ(仕様設計)
  • 手順1
    データベースのダンプ(抽出)

    WordPressのブログ記事やサイト設定が入っているデータベース(MySQL/MariaDB)から、最新のデータを .sql ファイルとして安全に一時ディレクトリへ書き出します。

  • 手順2
    RAMディスク内データの固め(アーカイブ)

    サーバー再起動で消えてしまうRAMディスク(tmpfs)上のデータを、揮発して消える前に一度 .tar.gz 形式で1つの塊にギュッと固めます。

  • 手順3
    Resticによる「宅内NAS」への高速送信

    WordPressの「本体ファイル(画像やテーマ等)」 と、手順1〜2で一時フォルダに集めた「DB・RAMディスクのデータ」をすべてまとめて暗号化し、自宅のNAS保管庫(/mnt/nas_backup)へ一気に送信します。

  • 手順4
    Resticによる「Cloudflare R2」への高速送信

    同じセット(WordPress本体+DB+RAMディスク)のバックアップデータを、今度はインターネットを超えてCloudflare R2の暗号化保管庫へ、S3直接接続を使って安全かつ最高速度で転送します。

  • 手順5
    古いバックアップの自動お掃除(メンテナンス)

    NASやクラウドの容量が溢れてしまわないよう、指定した期間(例:過去7日分など)よりも古くなった過去のデータを自動的に安全に削除(クリーンアップ)します。

    ここがポイント:
    Resticは超強力な重複排除を行っているため、古い世代を削除しても、現在もサイト内に存在するファイルの実体が消えることはありません。 完全にサイトから消去され、どの世代からも参照されなくなった「本当のゴミデータ」だけを裏側で安全にクリーンアップ(prune)してくれる賢い仕組みです。

2. スクリプトの作成と配置

先ほど設計した5つの手順を全自動で実行する「シェルスクリプト」をサーバー内に作成していきましょう。
管理者権限(root)で、汎用的なスクリプトを保管するための専用ディレクトリを作り、そこにファイルを作成します。以下のコマンドを実行して、Nanoエディタを開いてください。

Plaintext
mkdir -p /root/scripts
nano /root/scripts/wp-backup.sh

エディタが開いたら、以下のスクリプトをそのまま丸ごと貼り付けます。

Bash
#!/bin/bash

# ==========================================
# ⚙️ 各種設定(あなたの環境に合わせて書き換えてください)
# ==========================================

# 1. パスワード・キー情報
RESTIC_PASSWORD="あなたが第4章で登録したResticの共通パスワード"
export AWS_ACCESS_KEY_ID="あなたのCloudflareアクセスキーID"
export AWS_SECRET_ACCESS_KEY="あなたのCloudflareシークレットアクセスキー"

# 2. データベース(WordPress)の設定
DB_USER="wordpressのデータベースユーザー名"
DB_PASS="wordpressのデータベースパスワード"
DB_NAME="wordpressのデータベース名"

# 3. バックアップ対象と一時保存先
BACKUP_TARGET_DIR="/var/www/WordPressの本体フォルダ"
RAM_DISK_DIR="/mnt/ramdisk"       # RAMディスクのマウント先
TMP_BACKUP_DIR="/tmp/wp_backup_files" # 一時的にデータを集める場所

# 4. Resticのリポジトリ(保管庫)の場所
NAS_REPO="/mnt/nas_backup"
R2_REPO="s3:https://あなたのS3_API_エンドポイント/server-backup"

# ==========================================
# 🚀 バックアップ処理の開始
# ==========================================
export RESTIC_PASSWORD

echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] バックアップ処理を開始します ==="

# 既存の一時フォルダがあれば削除し、新しく作成
rm -rf "${TMP_BACKUP_DIR}"
mkdir -p "${TMP_BACKUP_DIR}"

# --- STEP 1: データベースのダンプ ---
echo "データベースをダンプ中..."
mysqldump -u"${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" > "${TMP_BACKUP_DIR}/wordpress_db.sql"

# --- STEP 2: RAMディスクデータのアーカイブ ---
echo "RAMディスクのデータを固め中..."
if [ -d "${RAM_DISK_DIR}" ]; then
    tar -czf "${TMP_BACKUP_DIR}/ramdisk_backup.tar.gz" -C "${RAM_DISK_DIR}" .
fi

# --- STEP 3: Resticによる「宅内NAS」へのバックアップ ---
echo "宅内NAS(リポジトリ①)へデータを送信中..."
restic -r "${NAS_REPO}" backup "${BACKUP_TARGET_DIR}" "${TMP_BACKUP_DIR}"

# --- STEP 4: Resticによる「Cloudflare R2」へのバックアップ ---
echo "Cloudflare R2(リポジトリ②)へデータを送信中..."
restic -r "${R2_REPO}" backup "${BACKUP_TARGET_DIR}" "${TMP_BACKUP_DIR}"

# --- STEP 5: 古いバックアップの自動削除(過去7日間分を残す設定) ---
echo "古いバックアップをお掃除中(過去7日分をキープ)..."
restic -r "${NAS_REPO}" forget --keep-within 7d --prune
restic -r "${R2_REPO}" forget --keep-within 7d --prune

# 後片付け(一時フォルダの削除)
rm -rf "${TMP_BACKUP_DIR}"

echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] すべてのバックアップが正常に完了しました! ==="

📂複数サイトの場合(少し記述が変わります)

Bash
#!/bin/bash

# ==========================================
# ⚙️ 共通設定(パスワードやキー情報)
# ==========================================
RESTIC_PASSWORD="あなたが第4章で登録したResticの共通パスワード"
export AWS_ACCESS_KEY_ID="あなたのCloudflareアクセスキーID"
export AWS_SECRET_ACCESS_KEY="あなたのCloudflareシークレットアクセスキー"
export RESTIC_PASSWORD

# Resticのリポジトリ(保管庫)の場所
NAS_REPO="/mnt/nas_backup"
R2_REPO="s3:https://あなたのS3_API_エンドポイント/server-backup"

# 一時的にデータを集める場所
TMP_BACKUP_DIR="/tmp/wp_backup_files"

echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] 複数サイトのバックアップ処理を開始します ==="

# ==========================================
# 📂 サイトごとの個別設定(ここに対象を並べます)
# ==========================================
# 「サイト名 | 本体フォルダのパス | DB名 | DBユーザー | DBパス」の順で半角スペースを空けて並べます
SITES=(
    "a_site /var/www/aサイトのフォルダ名 aサイトのDB名 aサイトのDBユーザー aサイトのDBパスワード"
    "b_site /var/www/bサイトのフォルダ名 aサイトのDB名 bサイトのDBユーザー bサイトのDBパスワード"
)

# RAMディスクの設定(両サイトで共通、または片方だけ等環境に合わせて)
RAM_DISK_DIR="/mnt/ramdisk"

# ==========================================
# 🚀 バックアップ処理(自動ループ実行)
# ==========================================
for SITE_INFO in "${SITES[@]}"; do
    # 設定を分解して変数に代入
    read -r SITE_NAME BACKUP_TARGET_DIR DB_NAME DB_USER DB_PASS <<< "${SITE_INFO}"
    
    echo "----------------------------------------"
    echo "▶️ 【${SITE_NAME}】のバックアップを開始します"
    echo "----------------------------------------"

    # 一時フォルダのクリーンアップ
    rm -rf "${TMP_BACKUP_DIR}"
    mkdir -p "${TMP_BACKUP_DIR}"

    # --- STEP 1: データベースのダンプ ---
    echo "[${SITE_NAME}] データベースをダンプ中..."
    mysqldump -u"${DB_USER}" -p"${DB_PASS}" "${DB_NAME}" > "${TMP_BACKUP_DIR}/${SITE_NAME}_db.sql"

    # --- STEP 2: RAMディスクデータのアーカイブ ---
    # ※RAMディスクがサイトごとに分かれている場合はパスを要調整
    echo "[${SITE_NAME}] RAMディスクのデータを固め中..."
    if [ -d "${RAM_DISK_DIR}" ]; then
        tar -czf "${TMP_BACKUP_DIR}/${SITE_NAME}_ramdisk.tar.gz" -C "${RAM_DISK_DIR}" .
    fi

    # --- STEP 3: Resticによる「宅内NAS」へのバックアップ ---
    echo "[${SITE_NAME}] 宅内NAS(リポジトリ①)へ送信中..."
    restic -r "${NAS_REPO}" backup "${BACKUP_TARGET_DIR}" "${TMP_BACKUP_DIR}"

    # --- STEP 4: Resticによる「Cloudflare R2」へのバックアップ ---
    echo "[${SITE_NAME}] Cloudflare R2(リポジトリ②)へ送信中..."
    restic -r "${R2_REPO}" backup "${BACKUP_TARGET_DIR}" "${TMP_BACKUP_DIR}"

done

# --- STEP 5: 古いバックアップの自動削除(過去7日間分を残す設定) ---
echo "----------------------------------------"
echo "🧹 古いバックアップをお掃除中(過去7日分をキープ)..."
echo "----------------------------------------"
restic -r "${NAS_REPO}" forget --keep-within 7d --prune
restic -r "${R2_REPO}" forget --keep-within 7d --prune

# 最終後片付け
rm -rf "${TMP_BACKUP_DIR}"

echo "=== [$(date '+%Y-%m-%d %H:%M:%S')] すべてのサイトのバックアップが正常に完了しました! ==="

✍️ 貼り付け後の書き換えポイント

貼り付けたら、ご自身の環境に合わせて「各種設定」の項目(1〜4)を書き換えます。

  • RESTIC_PASSWORD:
    4章で決めた、Resticの暗号化パスワードです。NASもクラウドも共通でこれを使います。
  • AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY:
    2章⑤で作成・保管した、Cloudflare R2の「管理者(読取り/書込み)」トークンのキー情報です。
  • DB_USER / DB_PASS / DB_NAME:
    WordPressが現在接続しているMySQL/MariaDBの情報をそのまま入力します。
  • R2_REPO:
    先ほどテストが成功した s3:[https://xxxx.r2.cloudflarestorage.com/バケット名](https://xxxx.r2.cloudflarestorage.com/バケット名) の形式でそのまま入力してください。
  • BACKUP_TARGET_DIR:
    /var/www/WordPressの本体フォルダに任意のフォルダ名を入力します。

書き換えが完了したら、Ctrl + OEnter でファイルを保存し、Ctrl + X でNanoエディタを閉じます。

🚀 3. スクリプトに実行権限を与えてテスト走行(手動実行)する

スクリプトファイルを保存しただけでは、まだただの「テキストファイル」なのでサーバーがプログラムとして実行できません。実行権限を与えて、まずは手動で正しくバックアップが二重に飛ぶかテストします。

Bash
# スクリプトに実行権限(+x)を付与する
chmod +x /root/scripts/wp-backup.sh

# テスト走行(手動実行)する
/root/scripts/wp-backup.sh

📺 手動テストの実行ログ

実行後、画面に以下のようなログが出力され、最後に 正常に完了しました! と表示されれば大成功です。

Bash
=== [2026-07-19 01:05:33] 複数サイトのバックアップ処理を開始します ===
----------------------------------------
▶️ 【dot_com_site】のバックアップを開始します
----------------------------------------
[dot_com_site] データベースをダンプ中...
[dot_com_site] RAMディスクのデータを固め中...
[dot_com_site] 宅内NAS(リポジトリ①)へ送信中...
repository 23a2cc2e opened (version 2, compression level auto)
using parent snapshot d479092e

Files:           0 new,     2 changed, 95578 unmodified
Dirs:            0 new,     2 changed,  4587 unmodified
Added to the repository: 8.019 MiB (1.079 MiB stored)

processed 95580 files, 2.684 GiB in 0:04
snapshot 6847fd8c saved
[dot_com_site] Cloudflare R2(リポジトリ②)へ送信中...
processed 95580 files, 2.684 GiB in 0:05
snapshot 9fb4c723 saved

----------------------------------------
▶️ 【tech_site】のバックアップを開始します
----------------------------------------
[tech_site] データベースをダンプ中...
[tech_site] RAMディスクのデータを固め中...
[tech_site] 宅内NAS(リポジトリ①)へ送信中...
repository 23a2cc2e opened (version 2, compression level auto)

Files:       11947 new,     0 changed,     0 unmodified
Dirs:         1795 new,     0 changed,     0 unmodified
Added to the repository: 59.743 MiB (27.228 MiB stored)

processed 11947 files, 245.146 MiB in 0:01
snapshot 5b62197a saved
[tech_site] Cloudflare R2(リポジトリ②)へ送信中...
repository cee439d8 opened (version 2, compression level auto)

Files:       11947 new,     0 changed,     0 unmodified
Dirs:         1795 new,     0 changed,     0 unmodified
Added to the repository: 62.185 MiB (27.375 MiB stored)

processed 11947 files, 245.146 MiB in 0:03
snapshot 5230ea96 saved

----------------------------------------
🧹 古いバックアップをお掃除中(過去7日分をキープ)...
----------------------------------------
repository 23a2cc2e opened (version 2, compression level auto)
Applying Policy: keep all snapshots within 7d of the newest
keep 2 snapshots: ...

=== [2026-07-19 01:05:55] すべてのサイトのバックアップが正常に完了しました! ===

💡 このログのポイント

  • 本館と別館の全データ同期: 本館(dot_com_site)だけでなく、別館(tech_site)の 11,947個のファイル も、漏れなく綺麗にNASとCloudflare R2の両方へ吸い上げられています。
  • Resticによる高速な差分処理: すでに過去にバックアップが取られているフォルダは、Resticの重複排除機能により「新しく変更のあったファイル(2 changed)」だけを自動判定して数秒で処理を終えるため、サーバーや回線への負荷が最小限に抑えられます。

4. cronを使った毎日定時実行の完全自動化設定

手動でのテスト走行で、WordOps環境にある複数サイトのデータベース、本体ファイル、RAMディスクデータが完璧に二重バックアップできることが確認できました。
最後に、このスクリプトを「毎日午前3時(アクセスが最も少ない時間帯)」に完全自動で実行するように、Linuxの定時実行ツール「cron」へ登録して仕上げます。

Ubuntuの画面で、以下のコマンドを実行してcronの設定画面を開きます。

Bash
crontab -e
  • ※初めて実行した場合、「どのエディタを使いますか?」と番号を聞かれることがあります。その場合は一番簡単な 1(nano)を選んでEnterを押してください。

設定ファイルが開いたら、一番下の行に以下の設定を追記します。

Plaintext
0 3 * * * /root/scripts/wp-backup.sh > /dev/null 2>&1

⏰ スケジュールの解説

  • 0 3 * * * :「毎日、夜中の3時00分」に実行するという意味です。
  • /root/scripts/wp-backup.sh :先ほど作成したスクリプトのフルパスです。
  • > /dev/null 2>&1 :実行時の画面出力をログに残さず、静かに裏側で処理させるためのおまじないです。

追記が終わったら、Ctrl + OEnter で保存し、Ctrl + X で画面を閉じます。

画面に crontab: installing new crontab と表示されればすべての設定が完了です!これでもう、あなたが寝ている間も、サーバーが毎日夜中に勝手に生存データを宅内NASとCloudflare R2へと送り続けてくれます。

6. 【確認・保守】手動チェックを1秒で終わらせる超スマート管理テクニック

バックアップシステムは構築して終わりではありません。定期的に「本当に裏で正しくバックアップが生成されているか?」を確認してこそ、真の安心が得られます。

しかし、Resticはセキュリティが非常に強固な反面、手動で状態を確認しようとすると AWS APIキー暗号化パスワード を毎回コマンドラインで指定しなければならず、非常に面倒です。

ここでは、複雑なコマンド入力を一瞬でパスし、「たった1コマンドで宅内NASとCloudflare R2の両方の状態を一覧表示する」 超スマートなメンテナンス環境を仕込みます。

📂 1. 一発確認用ショートカットスクリプトの作成

管理用のショートカットコマンド(restic-list)をシステムに作成します。以下のコマンドを実行してNanoエディタを開きます。

Bash
sudo nano /usr/local/bin/restic-list

エディタが開いたら、以下のスクリプトを貼り付けます。

Bash
#!/bin/bash

# ==========================================
# ⚙️ 認証情報(`wp-backup.sh` と同じものを記述)
# ==========================================
export AWS_ACCESS_KEY_ID="あなたのCloudflareアクセスキーID"
export AWS_SECRET_ACCESS_KEY="あなたのCloudflareシークレットアクセスキー"
export RESTIC_PASSWORD="あなたが設定したResticの共通パスワード"

# リポジトリの場所
NAS_REPO="/mnt/nas_backup"
R2_REPO="s3:https://あなたのS3_API_エンドポイント/server-backup"

# ==========================================
# 📊 バックアップ一覧表示
# ==========================================
echo "=========================================="
echo "🏠 【宅内NAS】バックアップスナップショット一覧"
echo "=========================================="
restic -r "${NAS_REPO}" snapshots

echo ""
echo "=========================================="
echo "☁️ 【Cloudflare R2】バックアップスナップショット一覧"
echo "=========================================="
restic -r "${R2_REPO}" snapshots

保存してエディタを閉じます(Ctrl + OEnterCtrl + X)。

🚀 2. 実行権限の付与とテスト

作成したスクリプトに実行権限を与えます。

Bash
sudo chmod +x /usr/local/bin/restic-list

準備は完了です!今後はターミナルで以下の1行を叩くだけで、いつでも即座に両方の保管庫の健康状態をチェックできます。

Bash
sudo restic-list

📺 実際の出力画面(確認ポイント)

コマンドを実行すると、以下のようにNASとクラウドの履歴が整然と表示されます。

Plaintext
==========================================
🏠 【宅内NAS】バックアップスナップショット一覧
==========================================
repository a1b2c3d4 opened (version 2, compression level auto)
ID        Time                 Host           Tags        Paths
----------------------------------------------------------------------------------------
e5f6g7h8  2026-07-27 03:00:07  test-server                /tmp/wp_backup_files
                                                          /var/www/test-site.online

i9j0k1l2  2026-07-28 03:00:06  test-server                /tmp/wp_backup_files
                                                          /var/www/test-site.online
----------------------------------------------------------------------------------------
14 snapshots

==========================================
☁️ 【Cloudflare R2】バックアップスナップショット一覧
==========================================
repository m3n4o5p6 opened (version 2, compression level auto)
ID        Time                 Host           Tags        Paths
----------------------------------------------------------------------------------------
q7r8s9t0  2026-07-27 03:00:07  test-server                /tmp/wp_backup_files
                                                          /var/www/test-site.online

u1v2w3x4  2026-07-28 03:00:06  test-server                /tmp/wp_backup_files
                                                          /var/www/test-site.online
----------------------------------------------------------------------------------------
14 snapshots

💡 ここをチェック!

  1. 日付と時間:毎朝設定した時間(例:03:00)に新しいスナップショットが追加されているか。
  2. パス(Paths):対象のWordPressディレクトリ(/var/www/...)とDB・RAMディスク圧縮領域(/tmp/wp_backup_files)がセットで残っているか。
  3. 世代数の維持:自動削除ルール(forget --keep-within 7d)により、古いデータが正しく整理されてヘルシーな数に保たれているか。

💡 運用のまとめ

  • 日々の動作:Cronが裏で完全に自動処理(全自動)
  • 日常の点検:気が向いた時に sudo restic-list を1回叩くだけ

まとめ & 次回予告

お疲れ様でした!
これにて、WordOps環境における複数サイトの「データベース」「本体ファイル」「RAMディスクデータ」の二重自動バックアップ体制がすべて整いました。
手動でのテスト走行でも確認した通り、Restic(重複排除・暗号化)× Cloudflare R2(格安・高速クラウド)× 宅内NAS の組み合わせは、個人開発・ブロガーにとって現時点で間違いなく最強・最安のディザスタリカバリ(災害対策)環境です。一度設定してしまえば、あとは毎晩サーバーが勝手にデータを守り続けてくれます。

🚨 バックアップは「戻せること」がゴール

これで一安心……と枕を高くして寝たいところですが、バックアップ構築において最も重要な鉄則があります。 それは、「復元(リストア)できないバックアップは、取っていないのと同じ」 ということです。
どれだけ毎日綺麗にログが流れていても、いざサーバーが消し飛んだ時にデータを元の状態に戻せなければ何の意味もありません。

そこで次回は、「万が一サーバーが完全に大破した状態から、数分で元のWordPress環境を完全に復元する、失敗しない爆速リストア手順」 を徹底解説します。
コマンド数発で元のWebサイトもデータベースも寸分の狂いなく元通りに蘇る、Resticならではの圧倒的なリカバリ力をマスターしましょう。

次回「爆速リカバリ・リストア編」は、2026年8月7日に公開予定です。データのバックアップを「完全な安心」に変える最後のステップ、どうぞお楽しみに!

404 NOT FOUND | 半ちゃーはん特盛り テック別館
なんか動いたからヨシ!

コメント

タイトルとURLをコピーしました