第765回と第766回では、多機能で使いやすいバックアップツールとしてResticを紹介しました。今回はResticのWeb UI兼オーケストレーターであるBackrestを紹介します。
Resticとは
本連載で既に解説しているとおり、ResticはGo言語で実装されたオープンソースのバックアップツールです。バックアップ先にはローカルのディレクトリをはじめ、SFTPサーバー、Amazon S3やS3互換のオブジェクトストレージなどにも対応しています。Rcloneを介せば、Rcloneがサポートしているさらに多くのストレージサービスへもバックアップできます。
Resticではバックアップの保存先を
バックアップを実行するたびに、その時点におけるディレクトリ構造とファイルを表すスナップショットが作成されます。実際のファイルデータは重複が排除され、複数のスナップショット間で共有されていますが、各スナップショットから任意の時点の完全なディレクトリ構造を参照できるようになっています。そのため利用者は、フルバックアップか増分バックアップかといった違いを意識することなく、任意の時点のファイルを復元できるのです。
Backrestとは
Resticはコマンドラインから扱うツールなので、定期的なバックアップを行うにはsystemd.
Backrestは、ResticにWeb UIとスケジューラーを追加するソフトウェアです。Backrestを使うと、バックアップ先と対象ディレクトリの設定、実行スケジュール、保存する世代数などをWebブラウザーから設定できます。作成済みのスナップショットを閲覧し、必要なファイルを選んで復元もできます。
BackrestはあくまでResticにかぶせる
Backrestでは、主に次の操作をWebブラウザーから行えます。
- Resticリポジトリの作成と、既存リポジトリの登録
- バックアップ対象と実行スケジュールの設定
- 保存するスナップショットの世代数の設定
- バックアップの手動実行と実行結果の確認
- スナップショットに含まれるファイルの閲覧と復元
- バックアップ前後に任意のコマンドを実行するフック
Resticはスクリプトへ組み込みやすい優れたコマンドラインツールです。しかし異常がないかを確認したり、古いスナップショットからファイルを探したりする用途では、グラフィカルなUIがあると便利です。最近ではサーバーの管理機能をWebへ集約することも一般的ですから、Resticを運用しているのであれば、Backrestの導入は検討する価値があるでしょう。
Backrestからは、バックアップの削除や復元も実行できます。そのためLAN内だけに閉じて運用するか、VPNや認証機能を備えたリバースプロキシーを介してアクセスするなど、セキュリティには十分配慮してください。
リポジトリサーバーの用意
本記事ではバックアップ取得の対象となり、Backrestを動かすサーバー
まずはバックアップの保存先となる、backrest-repoサーバーを準備します。サーバー版のUbuntuをインストールしたPC
$ sudo adduser restic
続いて、リポジトリの保存先を作成します。所有者を先ほど作成した
$ sudo install -d -o restic -g restic -m 0750 /srv/restic $ sudo install -d -o restic -g restic -m 0750 /srv/restic/server1
「/srv/
Backrestのインストール
続いてBackrest本体をインストールしましょう。こちらはバックアップの対象となる、server1上で作業します。
Backrestは、サーバー上に実行バイナリを直接インストールすることでも動かせます。ですが今回は
$ sudo apt install -U -y docker.io docker-compose-v2
ホームディレクトリの下に、Backrest用のディレクトリを作成します。なおDockerコンテナはroot権限で動作するため、こちらは普段使いのホームディレクトリ下に用意して構いません。
$ mkdir -p ~/backrest/{data,config,cache,tmp,ssh,restore}
$ chmod 700 ~/backrest/ssh
$ cd ~/backrest
それぞれのディレクトリの役割は以下のとおりです。
| ディレクトリ | 保存されるデータ |
|---|---|
| data | Backrestの内部データや処理履歴 |
| config | リポジトリやプラン、Web UIの認証情報を含む設定 |
| cache | Resticが使用するキャッシュ |
| tmp | 一時ファイル |
| ssh | SFTP接続に使用するSSH鍵と設定 |
| restore | リストアしたファイルをホストに取り出すための出力先 |
次の内容でcompose.
services:
backrest:
image: ghcr.io/garethgeorge/backrest:v1.14.1
container_name: backrest
hostname: server1
restart: unless-stopped
ports:
- "9898:9898"
volumes:
- ./data:/data
- ./config:/config
- ./cache:/cache
- ./tmp:/tmp
- ./ssh:/root/.ssh:ro
- ./restore:/restore
- /srv/data:/userdata:ro
environment:
- BACKREST_DATA=/data
- BACKREST_CONFIG=/config/config.json
- XDG_CACHE_HOME=/cache
- TMPDIR=/tmp
- TZ=Asia/Tokyo
「/srv/
「config」
「ssh」
SSH鍵の作成と登録
Backrest専用のSSH鍵を、先ほど作成した
$ cd ~/backrest $ ssh-keygen -t ed25519 -f ./ssh/id_ed25519 -N '' -C 'backrest@server1'
秘密鍵の
SSH接続が行われますので、先ほど設定した
$ ssh-copy-id -i ./ssh/id_ed25519.pub restic@backrest-repoサーバーのIPアドレス (...略...) restic@backrest-repoサーバーのIPアドレス's password: ← resticユーザーのパスワードを入力 Number of key(s) added: 1 Now try logging into the machine, with: "ssh -i ./ssh/id_ed25519 'restic@backrest-repoサーバーのIPアドレス'" and check to make sure that only the key(s) you wanted were added.
続いて、Backrestが使用するSSHの設定ファイルを作成します。以下のコマンドでSSHクライアントの設定ファイルを作成してください。
$ cat <<EOF > ./ssh/config
Host backrest-repo
HostName backrest-repoサーバーのIPアドレス
User restic
IdentityFile /root/.ssh/id_ed25519
IdentitiesOnly yes
Port 22
UpdateHostKeys no
StrictHostKeyChecking yes
EOF
「backrest-repo」
$ ssh-keyscan -t ed25519 -H backrest-repoサーバーのIPアドレス > ./ssh/known_hosts
Backrestの標準Dockerイメージでは、SSHクライアントはコンテナ内のrootユーザーとして実行されます。bind mountではホスト側のUIDとGIDが維持されるため、一般ユーザーが作成したSSH設定をそのままマウントすると、OpenSSHから所有者が不正だと判断されます。このためSSHの設定が完了したら、以下のコマンドでsshディレクトリのパーミッションを設定した上で、所有者をrootに変更します。
$ chmod 600 ./ssh/* $ sudo chown root:root -R ./ssh
Backrestの起動
以下のコマンドでBackrestを起動します。
$ cd ~/backrest $ sudo docker compose up -d
起動が完了したら、コンテナの状態を確認しておきましょう。
$ sudo docker compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS backrest ghcr.io/garethgeorge/backrest:v1.14.1 "/sbin/tini -- /dock…" backrest 6 seconds ago Up 5 seconds 0.0.0.0:9898->9898/tcp, [::]:9898->9898/tcp
またコンテナ内からbackrest-repoサーバーへSSH接続ができるかも、念のため確認しておきましょう。以下のコマンドを実行し、backrest-repoサーバーのホスト名が表示されれば成功です。
$ sudo docker exec backrest ssh -o BatchMode=yes backrest-repo hostname backrest-repo
Webブラウザーで
なお今回は解説の都合上、認証を無効にし、ユーザーの作成を省略しています。このままでは誰もがバックアップにアクセスできてしまうため、本格的に運用する場合は
リポジトリの登録
初期設定が終わったら、リポジトリを登録します。左ペインにある
「リポジトリ名」
「リポジトリのURI」
「パスワード」
それ以外はデフォルトのままでよいでしょう。
「決定」
なおここで入力したリポジトリのパスワードを失うと、バックアップからの復元ができなくなります。Backrestの設定ファイルだけに保存せず、パスワードマネージャーなど、バックアップ対象とは独立した安全な場所にも保存するよう注意してください。
バックアップする
Backrestでは、バックアップ対象のディレクトリ、バックアップ先のリポジトリ、スケジュール、保持ポリシーなどをまとめた設定を
「プラン名」
「バックアップのスコープ」
「バックアップスケジュール」
バックアップを自動実行していると、いずれはリポジトリの容量を使い切ってしまいます。適度な間隔で古いスナップショットは削除していくとよいでしょう。
なお保持ポリシーにもとづいて実行されるのは
プランの設定を入力し終わったら
バックアップ処理中は、読み取ったファイル数や転送量が表示されます。作業が終了すると、作成されたスナップショットがツリーに追加されます。
backrest-repoサーバー上では、以下のようにファイルが作成されていることも確認できます。
$ sudo -u restic ls -l /srv/restic/server1 total 24 -r-------- 1 restic restic 155 Sep 9 13:29 config drwx------ 258 restic restic 4096 Sep 9 13:29 data drwx------ 2 restic restic 4096 Sep 10 11:01 index drwx------ 2 restic restic 4096 Sep 9 13:29 keys drwx------ 2 restic restic 4096 Sep 10 11:01 locks drwx------ 2 restic restic 4096 Sep 10 11:01 snapshots
当然ですが、このディレクトリにあるファイルを個別に編集したり削除してはいけません。スナップショットの削除やリポジトリの保守作業は、BackrestやResticを介して行いましょう。
スナップショットからリストアする
リストアできないバックアップに価値はありません。スナップショットを取得したら、実際にリストアできることを確認しましょう。Backrestでは、リポジトリまたはプランの画面にスナップショットが時系列で表示されます[6]。
リストアしたいスナップショットを選択してから、右側にある
スナップショット全体をリストアしたい場合は、ここからルートディレクトリに対してリストアを行います。ルートディレクトリの右側の、点が3つ並んだ
Backrestはコンテナ内で実行されているため、リストアしたディレクトリツリーもコンテナ内に展開されてしまいます。そこでリストアしたファイルをホストに取り出せるよう、あらかじめホストの
これでホスト上の
Backrestを使うと、Resticの堅牢なリポジトリ形式や多彩な保存先をそのまま利用しながら、バックアップのスケジュール、世代管理、リストアをWebブラウザーから操作できます。Resticを使いつつ、バックアップの成否や世代を手軽に管理したいという用途に適しています。またバックアップは目的ではなく手段です。Backrestを導入し、バックアップをスケジュールしただけで満足せず、データを確実に復旧できるようテストを忘れないでください。