Resticで重要なデータをバックアップする

以前はかなり長い間、Cryptomatorを使ってコンテンツを管理していました。Cryptomatorの利点は、ローカルデータにアクセスするにもパスワードが必要なことです。暗号化されたコンテンツはNutstore、Dropboxなどの同期ドライブに置いておけば、ファイルを追加または変更するたびにリアルタイムでクラウドにアップロードできます。

保存するコンテンツが編集する必要のない増分ファイルで、主に追加・置換するだけなら、私はCryptomatorを試すことを強くお勧めします。電子スキャン、画像、スプレッドシートなどのリソースを保存するのに適しています。

しかし、macOSでObsidianなどのソフトウェアを使って知識ベースを管理し、頻繁に編集する必要がある場合、Cryptomatorで復号化した後のテキストファイルの編集は非常に不便です。問題を避けるために、プレーンテキストファイルを編集するときは、コピーして編集した後、元のファイルを置き換える必要がありました。これはかなり面倒です。

偶然、Resticについて知りました。ObsidianなどのノートソフトウェアのVaultを暗号化してバックアップし、クラウドドライブやS3などのクラウドプラットフォームにアップロードしたい場合、Resticが最適です。

クイックスタート

Resticのインストール

macOS

$ brew install restic

主要なオペレーティングシステムをサポートしています。詳細は:https://restic.readthedocs.io/en/latest/020_installation.html

ローカルリポジトリの初期化

リポジトリは簡単に言えば、暗号化されたファイルを保存するためのフォルダです。初期化プロセスでは、いくつかのメタデータが生成されます。

$ restic init --repo ~/Documents/NoteE2EE
enter password for new repository:
enter password again:
created restic repository 0a40262533 at /Users/xxxxx/Documents/NoteE2EE

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

パスワードを覚えておいてください。一度忘れると、暗号化されたデータを復号化する方法はなくなります。

データのバックアップ

コマンドを実行して、~/Noteフォルダを~/Documents/NoteE2EEリポジトリにバックアップします。

$ restic -r ~/Documents/NoteE2EE backup ~/Documents/Note

初回実行時には、バックアップされたファイルとディレクトリの数が表示され、「スナップショット」IDがエコーされます。

コマンドは複数回実行できます(実行するたびに新しいスナップショットが作成されます)。

増分バックアップなので、スナップショットが大量のスペースを占めることを心配する必要はありません。

以下のコマンドを使用して、リポジトリ内のスナップショットリストを表示できます。

$ restic -r ~/Documents/NoteE2EE snapshots

このリポジトリフォルダ「NoteE2EE」は暗号化されたコンテンツです。3-2-1原則に従って、ローカルディスク、外部ディスク、クラウドドライブに安全に保存でき、データ漏洩を心配する必要はありません。

バックアップコマンドパラメータの最適化

$ restic -r ~/Documents/NoteE2EE backup ~/Documents/Note \
    --pack-size 32 \
    --exclude="*.tmp" \
    --iexclude="*.LOG" \
    --limit-upload 1024 \
    --json

--pack-sizeパラメータを上手く使用すると、ターゲットファイルの数を効果的に制御でき、大きなファイルが多くの小さなファイルに分割されるのを防ぎます。履歴ファイルは影響を受けず、現在の増分バックアップにのみ影響します。

--limit-uploadに対応して、ダウンロード速度を制限するための--limit-downloadパラメータもあります。

Resticをベースに小さなツールを開発する場合は、--jsonパラメータが非常に重要です。

{"message_type":"status","percent_done":0,"total_files":29,"total_bytes":204482794}
{"message_type":"status","percent_done":0,"total_files":41,"total_bytes":333776710}
{"message_type":"status","percent_done":0,"total_files":41,"total_bytes":333776710}
{"message_type":"status","percent_done":0,"total_files":41,"total_bytes":333776710}
{"message_type":"status","percent_done":0,"total_files":41,"total_bytes":333776710}
{"message_type":"status","percent_done":0,"total_files":41,"total_bytes":333776710}
{"message_type":"status","percent_done":0,"total_files":41,"total_bytes":333776710}
{"message_type":"status","percent_done":0.2808864315308279,"total_files":41,"files_done":13,"total_bytes":333776710,"bytes_done":93753349}
{"message_type":"status","percent_done":1,"total_files":41,"files_done":41,"total_bytes":333776710,"bytes_done":333776710}
{"message_type":"summary","files_new":0,"files_changed":0,"files_unmodified":41,"dirs_new":0,"dirs_changed":2,"dirs_unmodified":8,"data_blobs":0,"tree_blobs":2,"data_added":756,"data_added_packed":608,"total_files_processed":41,"total_bytes_processed":333776710,"total_duration":5.552792709,"backup_start":"2025-04-02T18:30:04.949151+08:00","backup_end":"2025-04-02T18:30:10.501995+08:00","snapshot_id":"74e465ed71f7fb5b7abb562d4cb9d067f20d89a1a9f3ed4ed32a0bc73e8abab1"}

このデータに基づいて、進捗バーを作成したり、バックアップファイルのデータ量を表示したりできます。

その他のバックエンドストレージタイプ

restic init --repo ~/Documents/NoteE2EEコマンドを使用して、ローカルリポジトリを作成しました。

以下はS3互換ストレージの例です。

# 環境変数の設定
$ export AWS_ACCESS_KEY_ID=id7O9M0H****tXJ2romrN
$ export AWS_SECRET_ACCESS_KEY=bFA0dL0u********ndnxVcrwPh31u
$ export AWS_DEFAULT_REGION=cn-east-1

# リポジトリの初期化とバックアップ
$ restic -r s3:https://s3.bitiful.net/note-e2ee init
$ restic -r s3:https://s3.bitiful.net/note-e2ee --verbose backup ~/Documents/NoteE2EE

注意:AWS_DEFAULT_REGION環境変数が設定されていない場合、デフォルトとしてus-east-1が使用されます。

Amazon S3、Backblaze B2、Google Cloudなどの他のプラットフォームとストレージについては、以下のドキュメントを参照してください:https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html

スナップショット管理

最近のスナップショットを保持する

定期的にbackupを実行してバックアップすることがありますが、バックアップが多すぎると煩わしくなります。以下のコマンドを実行すると、最新の7つのスナップショットのみを保持できます。

$ restic -r [リポジトリパス] forget --keep-last 7 --prune

スナップショットのタグ

バックアップ時に複数のタグを指定できます(--tag "v1.0" --tag "daily")。

$ restic -r ~/Documents/NoteE2EE backup --tag "v1.0" ~/Documents/Note

既存のスナップショットのタグを変更することもできます。

# タグを追加
$ restic -r ~/Documents/NoteE2EE tag --add "important" 8c5c9d50

# タグを削除
$ restic -r ~/Documents/NoteE2EE tag --remove "important" 43547193

# 複数のタグを設定
$ restic -r ~/Documents/NoteE2EE tag --set "important,project2" a1ff1a78

注目すべきは、変更するたびにスナップショットIDが変わることです。

バックアップの整合性チェック

クラウドに保存されたバックアップは、ファイルが100%失われないことや損傷しないことを保証できません。checkコマンドを使用して検証できます。

$ restic -r ~/Documents/NoteE2EE check

04.jpg

ここで「損傷」をシミュレートしてみましょう。例えば、NoteE2EEディレクトリ内のdataディレクトリにあるファイルを見つけ、ファイル名を変更して、先頭にアンダースコアを追加し、ファイルの損傷/損失をシミュレートします。

checkコマンドを再度実行すると、リポジトリが異常であり、修復が必要であることが表示されます。これは予想通りです。

06.jpg

スナップショットを特定のディレクトリに復元する

既存のスナップショットを表示:

$ restic -r ~/Documents/NoteE2EE snapshots

特定のスナップショットをエクスポート:

$ restic -r ~/Documents/NoteE2EE restore 5fcd966f --target ~/Downloads/NoteRestore/

5fcd966fはスナップショットIDで、snapshotsコマンドで確認できます。また、NoteRestoreディレクトリが存在しない場合は自動的に作成されます。

リポジトリが大きく、特定のファイルやディレクトリのみをエクスポートしたい場合は、次のコマンドを使用します。

$ restic -r ~/Documents/NoteE2EE restore 5fcd966f --target ~/Downloads/NoteRestore/ --include Epub电子书

ここでの「--include Epub电子书」は、リポジトリのルートディレクトリにあるフォルダを指します。

「copy」を使用して「backup」の代わりに

暗号化されたリポジトリが1つしかない場合は、毎回backupを使用すれば問題ありません。しかし、3-2-1原則に従ってバックアップし、複数の暗号化リポジトリがある場合、異なるリポジトリに対して複数回backupを実行するのは効率的ではありません。

この場合、copyを使用する必要があります。これにより、データの厳密な一貫性が保証され、パフォーマンスも優れています。

$ restic init --repo ~/Documents/NoteE2EE-copy

$ restic -r ~/Documents/NoteE2EE-copy copy --from-repo ~/Documents/NoteE2EE

AIからの要約(私は良いと思います):

複数のResticリポジトリ間でデータを同期する必要がある場合、copyは常に最適な選択です—それはリポジトリ間のプロフェッショナルな「データ移動者」のように機能し、backupは元のデータの「コレクター」のようなものです。

Restic Browserを試してみる

コマンドライン操作が好きでない場合は、このオープンソースツールを試してみることができます:emuell/restic-browser

07.jpg

Rust + TypeScriptで開発され、サイズは数メガバイトしかなく、読み取り専用機能しかありません。「Browser」という名前が示すように、暗号化されたリポジトリを閲覧でき、スナップショット内のファイルを探すのに便利です。

Autoresticも必要かもしれません

ドキュメント:Autorestic クイックスタート

Autorestic is a wrapper around the amazing restic. While being amazing the restic cli can be a bit overwhelming and difficult to manage if you have many different location that you want to backup to multiple locations. This utility is aimed at making this easier 🙂

Autoresticは、優れたresticツールを基に開発されたラッパーです。resticコマンドラインツール自体は素晴らしいですが、複数の異なる場所からのバックアップデータを複数のストレージターゲットに同期する必要がある場合、その操作は複雑で管理が難しくなる可能性があります。このツールは、このプロセスを簡素化し、マルチターゲットバックアップ管理をより簡単で便利にすることを目的としています。

インストール

$ brew install autorestic

設定ファイル

以下の内容で設定ファイルを作成します:

version: 2
backends:
  note_primary:
    type: local
    path: "~/Documents/NoteE2EE"
    env:
      RESTIC_PASSWORD: "your-restic-vault-passowrd"
  note_backup:
    type: local
    path: "~/Documents/NoteE2EE-copy"
    env:
      RESTIC_PASSWORD: "your-restic-vault-passowrd"

locations:
  notes:
    from: "~/Documents/Note"
    to:
      - note_primary
      - note_backup
    options:
      forget:
        keep-last: 7

設定ファイルのパーミッションを変更(推奨):

$ chmod 600 ~/.autorestic.yml

LocationとBackend

Autoresticでは、Locationはバックアップのコンテンツとターゲット(from / to)を記述し、Backendはバックアップの宛先を定義します。

設定の検証

$ autorestic check

Everything is fine.

手動バックアップの実行

完全バックアップ:

$ autorestic backup -a

特定のLocationバックアップ:

$ autorestic backup -l notes

出力:

現在、このソリューションは私のニーズに完全に合っており、使いやすいです。しばらく使用した後、追加情報があれば更新します。

参考