🐾 claw-stack

最終更新: 2026年3月 · ソース: openclaw-backup

暗号化状態アーカイブ

OpenClaw ワークスペースとローカルプロジェクトを Google Drive へ自動で暗号化・重複排除バックアップ — 暗号化とスナップショット管理に restic、トランスポートに rclone、暗号化パスワードは macOS キーチェーンに保管。

← モジュール概要

概要

openclaw-backup は OpenClaw ワークスペースとローカルプロジェクトディレクトリの増分・暗号化・時点スナップショットを作成し、Google Drive に保存します。各バックアップ実行で新しいスナップショットが追加され、変更されていないブロックは重複排除されるため、変更されたデータのみがアップロードされます。保持ポリシーにより古いスナップショットは自動的に削除されます。暗号化パスワードはディスクに触れることなく、実行のたびに macOS キーチェーンから取得されます。

目的

エージェントシステムは再構築が難しい状態を蓄積します:数ヶ月のセッションで構築されたメモリファイル、進行中のプロジェクトコード、チューニングに時間を要した設定。バックアップなしのディスク障害・誤削除・ワークスペース破損は、その状態の完全な喪失を意味します。

標準のクラウド同期ツール(iCloud、Dropbox)はアップロード前に暗号化せず、スナップショット履歴を追跡せず、重複排除も行いません。「3 日前のワークスペースの状態」に復元することはできず、現在の同期済み状態にしか戻れません。restic はこの 3 つの問題を全て解決します:クライアントサイド暗号化(Google Drive が見るのは暗号文のみ)、コンテンツアドレス型重複排除(高速な増分)、設定可能な保持ポリシーを持つ不変の時点スナップショット。

アーキテクチャ

各バックアップ実行で 2 つのレイヤーが協調します:

restic — 暗号化 + 重複排除 + スナップショット管理

restic はコンテンツアドレス型の暗号化スナップショットを作成します。変更されたブロックのみが保存され、変更されていないブロックは既存データを参照します。暗号化パスワードは実行のたびに macOS キーチェーンから読み込まれ、ディスクに書き込まれることはありません。

rclone — Google Drive トランスポート

rclone は restic が書き込むバックエンドを提供します。Google Drive の OAuth とファイル転送レイヤーを処理します。OAuth トークンは git から除外された設定ファイルに保存されます。

~/.openclaw/  ──┐
               ├──▶ restic(暗号化 + 重複排除)──▶ rclone ──▶ Google Drive
~/projects/   ──┘

バックアップ対象:

パス 概算サイズ 内容
~/.openclaw/ 約 2.9 GB 設定、ワークスペース、メモリファイル、ログ、メディア
~/projects/ 約 1.3 GB ソースコード、実験

除外対象(バックアップ対象外):

  • node_modules/ — package.json から再インストール可能
  • .venv/ — 再作成可能な Python 環境
  • browser/ — Chromium バイナリキャッシュ
  • .git/objects — 既に GitHub 上にある

保持ポリシー:

期間 保持数
日次 直近 7 日分
週次 直近 4 週分

古いスナップショットは各バックアップ実行の最後に自動的に削除されます。

主要な設計上の決定

tar/zip ではなく restic — コンテンツアドレス型重複排除

restic はファイルを可変サイズのチャンクに分割し、コンテンツハッシュで識別します。リポジトリに存在しないチャンクのみがアップロードされます。これにより増分バックアップが高速になります — メモリファイルのみが変更されたセッションでは、4 GB のワークスペース全体ではなくそのチャンクのみがアップロードされます。

macOS キーチェーン — パスワードはディスクに保存しない

restic の暗号化パスワードはサービス/アカウントキーペアでキーチェーンに保存されます。バックアップスクリプトは実行時に security CLI を使って取得します。プレーンテキストのパスワードは設定ファイル、環境変数のエクスポート、シェル履歴のどこにも現れません。

test.sh でのアクティブなシークレットスキャン

テストスクリプトは git 管理下の全ファイルをシークレットらしきパターン(API キー、トークン、パスワード)でスキャンします。これはバックアップの前に実行され、バックアップインフラコードと共に誤って認証情報をコミットすることを防ぎます。

不変スナップショット — 上書きではなく常に削除

各バックアップ実行はリポジトリに新しいスナップショットを追加します。古いスナップショットは保持ポリシーの削除ステップによってのみ削除され、上書きはありません。保持ウィンドウ内の任意のスナップショットにいつでも復元できます — 最新のものだけでなく。

自分でビルドする方法

1. rclone 対応バックエンドで restic を使う

同じアーキテクチャが任意の rclone バックエンドで動作します:S3、Backblaze B2、Azure Blob、SFTP。Google Drive は無料で 15 GB まで使え、クレジットカードも不要なためここで使用しています。バックエンドを変更するにはバックアップスクリプトの rclone リモート名を変更するだけです。

2. 暗号化パスワードをシステムのシークレットマネージャーに保存する

macOS ではキーチェーンが正しい選択です。Linux では pass(GPG バック)を使用するか、実行時にシークレットマネージャーが設定する RESTIC_PASSWORD 環境変数を使用します。ドットファイルにパスワードを保存しないこと。

3. 包括的な除外リストを構築する

node_modules、Python 仮想環境、ブラウザキャッシュ、コンパイル済み出力は完全に再インストール可能で、容易に数 GB を追加します。除外しましょう。良いルール:コミットされたソース(package.json、requirements.txt など)から再作成できるディレクトリは除外する。

4. 必要になる前にリストアプロセスをテストする

一度もテストされていないバックアップはバックアップではありません。テストチェックリストにドライランリストアを含めてください。一時ディレクトリにリストアし、重要なファイルが存在して完全であることを確認します。壊れたリストアプロセスを発見する最悪のタイミングは実際の復旧時です。

5. バックアップ失敗時にシステムイベント通知を送信する

サイレントなバックアップ失敗が最も危険です。バックアップスクリプトは失敗時に通知(OpenClaw システムイベント、メール、または実際に確認するその他のチャネル経由)を送信すべきです。バックアップ成功は静かにログに記録し、失敗は大きく通知すべきです。

セキュリティ

  • ハードコードされたシークレットなし — 全認証情報は macOS キーチェーンまたは環境変数を使用
  • restic はアップロード前に全データを暗号化;Google Drive が保存するのは暗号文のみ
  • rclone 設定の OAuth トークンは .gitignore で git から除外
  • test.sh が git 管理下の全ファイルをシークレットスキャン

よくある質問

restic の暗号化パスワードはどこに保存されますか?

macOS キーチェーンのサービス名 openclaw-backup、アカウント restic-password に保存されます。セットアップスクリプトが自動的に生成して保存します。RESTIC_PASSWORD 環境変数でオーバーライドすることもできます。

バックアップは互いに上書きされますか?

いいえ。restic は不変スナップショットを作成します。各バックアップ実行で新しいスナップショットが追加され、古いものは保持ポリシーが削除する時のみ削除されます。保持ウィンドウ内の任意の過去スナップショットに復元できます。

Linux でも動作しますか?

キーチェーン統合は macOS 固有です。Linux では別のシークレットストア(例: pass)を代替するか、RESTIC_PASSWORD 環境変数を直接使用する必要があります。restic と rclone のコマンド自体はクロスプラットフォームです。

Authors: Qiushi Wu & Orange 🍊