SafeGrd について
SafeGrdはデータベース、ディレクトリツリー、IMAPメールボックスをバックアップし、復元テストを行います。復元可能性の確認やバックアップ削除の防止が必要な運用担当者向けで、MCPツールからバックアップを削除することはできません。
主な機能
- 01圧縮・暗号化バックアップ
- 02定期的な復元訓練と検証
- 03データベース、ディレクトリ、IMAP対応
- 04破壊的コマンド前のロック済みスナップショット
- 05データベースや個別ファイルの復元
活用シーン
- 01最新のバックアップを復元できるか確認
- 02データベース変更前にデータを保護
- 03ディレクトリバックアップから特定ファイルを復元
MCP 対応
ローカルのstdio MCP サーバーとリモートのHTTP MCP サーバーを提供します。ローカルサーバーはホストの設定と鍵を使って状態確認、バックアップ、検証、復元、エクスポートを実行し、リモートサーバーはバックアップと訓練記録を読み取り、即時のバックアップや訓練を依頼できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://safegrd.dev/mcpclaude mcp add --transport http dev-safegrd-safegrd https://safegrd.dev/mcp{"mcpServers":{"dev-safegrd-safegrd":{"type":"http","url":"https://safegrd.dev/mcp"}}}Cursor で開く{"servers":{"dev-safegrd-safegrd":{"type":"http","url":"https://safegrd.dev/mcp"}}}VS Code で開く{"mcpServers":{"dev-safegrd-safegrd":{"type":"http","url":"https://safegrd.dev/mcp"}}}{"mcpServers":{"dev-safegrd-safegrd":{"serverUrl":"https://safegrd.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://safegrd.dev/mcp認証が必要ghcr.io/safegrd/cli:0.0.29stdioツール
詳細
SafeGrd CLI(safegrd)
safegrd は、PostgreSQL、MySQL、MariaDB、MongoDB、SQLite のデータベース、ディレクトリツリー、
IMAP メールボックスをバックアップします。各バックアップは、実行するホスト上で zstd により圧縮され、
age で暗号化された後、Object Lock が設定された S3 互換ストレージに書き込まれます。すべてのテーブル、
行、ファイルが復元されたことを確認するため、スケジュールに従って復元されます。
これは SafeGrd の CLI とデーモンです。ドキュメントは safegrd.dev/docs にあり、すべてのコマンドとフラグは コマンドリファレンスに記載されています。
- バックアップはホストからストレージへ直接送られます。 リモートサーバーに送信されるのは、各バックアップの記録 (実行時刻、サイズ、ダイジェスト、ロックの終了日)と、各復元テストの署名済み結果です。 データがリモートサーバーを経由することはありません。
- 鍵を誰が保有するかは自分で選べます。 デフォルトでは、リモートサーバーが鍵を封印して保管し、
登録済みのホストにのみ引き渡すため、ホストを失った後でも復元できます。
enroll --key-custody localを 指定すると、バックアップを復号できるのは自分だけになります。 - 復元はテストされます。 Fire Drill は最新のバックアップを一時的なデータベースまたはディレクトリに復元し、 バックアップ時のテーブル、行、ダイジェストと比較して、結果に署名します。
- エージェントはバックアップを削除できません。
safegrd guardは破壊的なコマンドの実行前にロック済みの スナップショットを作成します。また、個人用アクセストークンでバックアップを削除したり、ロック期間を短縮したりすることはできません。
インストール
インストールスクリプト(Linux および macOS)
curl -fsSL https://safegrd.dev/install.sh | sh
OS とアーキテクチャを検出し、該当するリリースアーカイブをダウンロードして、
リリースの checksums.txt と照合し、safegrd を /usr/local/bin
(sudo を使用できない場合は ~/.local/bin)にインストールします。このリポジトリ内の
スクリプトは install.sh です。https://raw.githubusercontent.com/safegrd/cli/main/install.sh
からも同じファイルを取得できます。
ターミナルで実行すると、続いてマシンをリモートサーバーに接続するための手順が表示されます。
ブラウザーでログインし、暗号化鍵を誰が保有するかを選択してから、safegrd enroll を実行します。
ログインすると URL とコードが表示されます。これを任意のデバイスのブラウザーで開けるため、
SSH や PuTTY で接続したサーバーでも同じように使えます。ターミナルがない場合(CI、
cloud-init、cron)は、インストールのみを行って終了します。
オプションは環境変数で指定し、パイプの後の sh に渡します。curl の前に記述すると、
それらは curl に適用され、スクリプトには渡されません。
curl -fsSL https://safegrd.dev/install.sh | VERSION=v0.0.3 sh # pin a release
curl -fsSL https://safegrd.dev/install.sh | SAFEGRD_INSTALL_DIR=~/.local/bin sh # no sudo
curl -fsSL https://safegrd.dev/install.sh | SAFEGRD_NO_SETUP=1 sh # install only
| 変数 | 効果 |
|---|---|
VERSION | インストールするリリースタグです。デフォルトは最新のリリースです。 |
SAFEGRD_INSTALL_DIR | バイナリのインストール先です。 |
SAFEGRD_NO_SETUP=1 | インストールのみを行い、ログインと登録を促しません。 |
SAFEGRD_FORCE_INSTALL=1 | 指定したリリースがすでにインストールされていても、ダウンロードしてインストールします。 |
SAFEGRD_PROJECT | このマシンを登録するプロジェクトの ID またはスラッグです。 |
SAFEGRD_STORAGE | プロジェクトにバケットがない場合のバックアップ先です。hosted または local を指定します。 |
SAFEGRD_CLAIM | コンソールに表示される、このマシンのクレームコードです。プロジェクト、バックアップ先、保護するサーフェスが含まれるため、登録時に設定へ書き込まれ、質問は表示されません。enroll が --claim に対応するリリースが必要です。古いリリースでは停止して、その旨が表示されます。 |
SAFEGRD_NODE_NAME | マシンの表示名です。 |
SAFEGRD_KEY_CUSTODY | local を指定すると、このホストの鍵をホスト上に保持します。指定しない場合、リモートサーバーが鍵を封印して保管し、登録済みのホストにのみ引き渡します。 |
SAFEGRD_SERVER_URL | ログインと登録に使用するリモートサーバーです。デフォルトは https://safegrd.dev です。 |
Homebrew(macOS および Linux)
brew install safegrd/tap/safegrd
この formula は、スクリプトと同じリリースアーカイブをインストールします。
Go
go install github.com/safegrd/cli/cmd/safegrd@latest
コンテナーイメージ
ghcr.io/safegrd/cli は linux/amd64 と linux/arm64 で動作し、pg_dump、mysqldump
、mongodump と PostgreSQL 18 サーバーを含んでいます。これにより、ドリルでデータベースをボリューム上の
使い捨てクラスターに復元できます。タグは Postgres クライアントを示します。<version>-pg18 は
Postgres 18 と、それ以前のすべてのサーバーを読み取ります。リリースは cosign で署名されています(キーレス方式。このリポジトリのリリース
ワークフローから署名):
cosign verify ghcr.io/safegrd/cli:<version>-pg18 \
--certificate-identity-regexp 'https://github.com/safegrd/cli/.github/workflows/release.yml@.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
packaging/compose はデータベースの隣でデーモンを実行し、
packaging/kubernetes は CronJob として daemon run --once を実行し、
packaging/helm/safegrd は Deployment としてデーモンを実行します。
それぞれに、ghcr.io/safegrd/cli:0.0.10 のような、ビルド時のリリースが指定されています。アップグレードするには
タグを変更してください。
リリースアーカイブ、またはソースからのビルド
Linux と macOS(amd64、arm64)向けの静的バイナリと SHA-256 チェックサムは、
リリースページにあります。ビルドするには:
git clone https://github.com/safegrd/cli.git && cd cli
make build
クイックスタート
1. 設定ファイルとキーを作成する
インストールスクリプトでマシンを接続した場合は、この手順を省略してください。キー
ペアと ~/.safegrd/config.yaml はすでに作成されており、init は上書きを拒否します。
# writes an age X25519 keypair and ~/.safegrd/config.yaml
safegrd init \
--database-url "postgres://postgres:password@localhost:5432/myapp_prod" \
--storage local \
--local-path ./backups \
--retention-days 14
2. リモートサーバーに接続する(任意)
# Prints a URL and a code: open it in a browser on any device, including over SSH
safegrd login
# Register this machine, generating its encryption key if it has none.
# --key-custody decides whether the server keeps a copy (safegrd) or not (local)
safegrd enroll --key-custody local
# A host that should encrypt but never decrypt: make the key pair on your laptop,
# then put only the printed public key in the host's encryption.public_key
safegrd keygen --out ~/.safegrd/keys/prod.key
# Headless / CI: a Personal Access Token instead of the browser
safegrd enroll --token "sg_pat_..."
# Or with the claim code the console's setup shows: the project, where backups go and
# the surfaces are written into ~/.safegrd/config.yaml, and the key stays on this machine
safegrd enroll --claim <code>
safegrd doctor # every surface opens from this host; the console shows the result
safegrd daemon run --once
# Later, on an enrolled host: add the surfaces named for it in the console
# (Add surface on its row). Only adds; the old config is kept as config.yaml.bak
safegrd claim
safegrd daemon restart
# Verify the active session
safegrd whoami
3. バックアップする
# dumps, compresses, encrypts with age on this host, and writes to locked storage
safegrd backup
4. Fire Drill を実行する
# restores into an empty database and checks every table's row count
safegrd verify \
--snapshot snap-20260919-01 \
--sandbox-target "postgres://postgres:password@localhost:5432/ephemeral_test_db"
5. 復元する
safegrd restore \
--snapshot snap-20260919-01 \
--target "postgres://postgres:password@localhost:5432/myapp_recovered"
6. 1 台のホスト上で複数の対象を自動で保護する
~/.safegrd/config.yaml の surfaces: 以下にある各項目が保護対象となり、
safegrd daemon install がそれぞれのスケジュールに従って実行します。surface の credential ブロックでは、
シークレットの取得元を指定します。シークレットが設定ファイルに保存されることはありません。
surfaces:
- id: app-primary
type: postgres
schedule: "@daily"
credential:
from: env # or: command (with run), file (with path),
name: APP_DATABASE_URL # or safegrd: the remote server holds it for this host
- id: user-uploads
type: files
schedule: "6h"
roots: ["/var/www/uploads"]
safegrd.example.yaml は注釈付きのバージョンです。デーモンは起動時に
設定ファイルを読み込むため、変更後は safegrd daemon restart を実行してください。
7. 破壊的なコマンドを実行する前にロック済みスナップショットを取得する
safegrd guard は 1 つの surface をバックアップし、スナップショットがアップロードされてロックされるまで待ってから、
コマンドを実行します。バックアップに失敗した場合、またはスナップショットがロックされていない場合、
コマンドは実行されず、guard は終了コード 3 で終了します。
safegrd guard --surface app-primary -- psql "$APP_DATABASE_URL" -c 'DROP TABLE sessions'
safegrd guard -- terraform destroy
# The commands a hook treats as destructive, and a check that takes no backup
safegrd guard --list
safegrd guard --matches "npx prisma migrate reset" # exit 0: it matches
ホスト自身のディスク上のストレージ、または worm_mode: NONE のバケットではスナップショットをロックできないため、
--allow-unlocked を指定しない限り、guard はそこでの実行を拒否します。
--max-age より新しい surface のロック済みスナップショットがあれば、新たなバックアップの代わりになります。そのため、
破壊的なコマンドを続けて複数実行するエージェントも、バックアップは 1 回で済みます。--check-only はバックアップを一切取得せず、
そのようなスナップショットが存在しない場合はコマンドの実行を拒否します。
safegrd guard --max-age 30m -- psql "$APP_DATABASE_URL" -c 'TRUNCATE sessions'
safegrd guard --max-age 1h --check-only -- terraform destroy
safegrd list --json は、ロック日を含むすべてのスナップショットをスクリプト向けに出力します。
8. ディレクトリーツリーをバックアップし、ファイルを 1 つ復元する
ファイルのバックアップは増分方式です。毎月の初回実行ではすべてのファイルをアップロードし、 それ以降の実行では変更されたチャンクだけをアップロードします。保持されている各ファイルのすべてのバージョンを検索でき、 ファイルを 1 つだけ復元することもできます。
safegrd backup --files /srv/app --exclude '*.tmp,node_modules/*'
# every kept version of a file, numbered from the oldest
safegrd find etc/nginx/nginx.conf
# one version of one file, or a directory as it was in one snapshot
safegrd restore --path etc/nginx/nginx.conf --version 2 --target-dir ./out
safegrd restore --snapshot snap-20260919-01 --path 'var/www/**' --target-dir ./out
# every pack present and every listing consistent, without restoring anything
safegrd check --all
# a bucket over the S3 API (Supabase Storage, or any S3-compatible store)
safegrd backup --files s3://avatars --source-endpoint https://PROJECT.storage.supabase.co/storage/v1/s3 \
--source-region eu-central-1 --source-access-key env:S3_KEY --source-secret-key env:S3_SECRET
# and back into the bucket, each object with the content type it had
safegrd restore --snapshot snap-20261012-01 --target s3://avatars --source-endpoint https://PROJECT.storage.supabase.co/storage/v1/s3 \
--source-region eu-central-1 --source-access-key env:S3_KEY --source-secret-key env:S3_SECRET
--format tar を指定すると、バックアップごとに 1 つのアーカイブが保持されます。ロックされる内容、ロック期間、
復元される内容については、safegrd.dev/docs/surfaces/files をご覧ください。
AI エージェント(MCP)
safegrd には 2 つの MCP サーバーがあります。どちらにも、バックアップを削除したり、バックアップの保存先を変更したり、秘密鍵を取得したりするツールはありません。
ローカルサーバーの safegrd mcp は、ホスト上で標準入出力を介して動作し、そのホストの設定と鍵を使用します。ツールは status、list、doctor、backup、verify、restore、export で、それぞれ同名のコマンドを実行します。restore は、新規または空のディレクトリ、あるいは空のデータベースにのみ書き込みます。
claude mcp add safegrd-local -- safegrd mcp
# a host that runs the container image: mount the volume it enrolled with
claude mcp add safegrd-local -- docker run -i --rm \
-v safegrd:/home/safegrd/.safegrd ghcr.io/safegrd/cli mcp
リモートサーバーの https://safegrd.dev/mcp は、すべてのホストのバックアップと Fire Drills を読み取り、各プランのたびにバックアップまたはドリルを今すぐ実行するか尋ねます。ヘッダーなしで追加し、Claude Code で /mcp を実行して Authenticate を選択します。ブラウザーで SafeGrd にサインインし、承認します。
claude mcp add --transport http safegrd https://safegrd.dev/mcp
safegrd/agent-plugins の Claude Code プラグインは、同じ方法でサインインする同じサーバーと、リスクの高い変更の前にバックアップと Fire Drill を実行するスキルを追加します。
/plugin marketplace add safegrd/agent-plugins
/plugin install safegrd@safegrd
CI など、サインインできないクライアントは、コンソールの Tokens ページで発行した個人用アクセストークンを Authorization: Bearer sg_pat_... として送信します。
両方のサーバーは MCP Registry に dev.safegrd/safegrd として登録されており、リモートサーバーは Smithery にも登録されています。Cursor と VS Code の設定、および各ツールの引数については、safegrd.dev/docs/mcp をご覧ください。
バックアップ対象
- PostgreSQL(増分): スキーマは
pg_dumpから取得し、行データは同じスナップショットからバイナリCOPYでストリーミングするため、配列、列挙型、外部キー、ビュー、トリガー、シーケンスの位置もすべて復元されます。各実行では、変更された各テーブルのチャンクのみをアップロードします。restore --tableは指定したテーブルを稼働中のデータベースに読み込み、--change-logは前回の実行以降に書き込みがなかったテーブルの読み取りをスキップします。--format tarはバックアップごとに 1 つのアーカイブを保持します。ホストには、サーバーと同じかそれ以降のバージョンのpg_dumpが必要です。 - SQLite(増分): SQLite のオンラインバックアップを 1 つの読み取りトランザクション内で実行してコピーするため、WAL 内の未確定トランザクションも含まれ、書き込み処理も継続できます。コピーではデータベースのページ配置が維持されるため、各実行で変更されたページのチャンクのみをアップロードします。
--format tarはバックアップごとに 1 つのアーカイブを保持します。ホストへのインストールは不要です。 - MySQL と MariaDB は
mysqldump --single-transactionで、MongoDB はmongodump --archiveでバックアップし、それぞれバックアップごとに 1 つのアーカイブを作成します。 - ディレクトリツリー(増分): 各実行で変更されたチャンクのみをアップロードし、各オブジェクトは書き込み時に 1 回ロックされます。
safegrd findは、restore --path --versionで使用できる、ファイルの保持済みバージョンをすべて一覧表示します。 - IMAP メールボックス: すべてのメッセージを RFC 5322 形式のメールとして保存し、各ドリルで SHA-256 による検証を行います。
- ロックされたストレージ: コンプライアンスモードの S3 Object Lock、またはロック解除が必要になる場合のあるガバナンスモードに対応します。ホスト自身のディスク上のストレージと、
worm_mode: NONEのバケットでは、ロックなしでバックアップを保持します。 - Fire Drills: スケジュールに従ってバックアップを復元し、復元できた内容を数え、各テストの記録に署名します。
開発
Go 1.25 以降が必要です。引数なしで make を実行すると、すべてのターゲットが一覧表示されます。
make build # compile bin/safegrd
make test # unit and integration tests, race detector
make ci # the exact gate CI runs: gofmt check, tidy check, vet, race tests
make dist # cross-compile release archives + checksums into dist/
make fmt tidy # the developer-facing fixers (these rewrite files; `ci` never does)
CI はプッシュとプルリクエストのたびに make ci を実行するため、ローカルで正常に完了すれば、パイプラインも正常に完了します。v* のタグを付けると make dist VERSION=<tag without v> が実行され、アーカイブと checksums.txt が GitHub Release として公開されます。
ライセンス
追加利用許諾付きの Business Source License 1.1 です。LICENSE をご覧ください。
概要:自由に閲覧、変更、ビルドでき、どこでも評価に使用できます。どのプランでも SafeGrd アカウントがあれば本番環境での使用が可能で、無料プランも対象です。アカウントの有無にかかわらず、バックアップの一覧表示、検証、復元、エクスポートは常に許可されています。各バージョンは公開から 4 年後に GPL-3.0-or-later になります。商用ライセンスについては、[email protected] までお問い合わせください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。