2026-0523 Obsidian Vault の Google Drive 日次バックアップ設定マニュアル
2026-0523 Obsidian Vault の Google Drive 日次バックアップ設定マニュアル
Obsidian Sync と干渉しない形で、Google Drive に日次 zip バックアップを作成するための公開用手順です。
この文書では公開用に、個人名、メールアドレス、ローカルユーザー名、実際のパス、組織名などを ****** で伏せています。実際に設定する際は、自分の環境に合わせて置き換えてください。
1. この方式の目的
Obsidian Vault を iPhone や別端末と同期している場合、同期エンジンを複数併用するとファイル衝突やデータ破損の原因になります。
そのため、リアルタイム同期は Obsidian Sync だけに任せ、Google Drive には日次の zip スナップショットを保存する構成にします。
役割 |
推奨する手段 |
理由 |
リアルタイム同期 |
Obsidian Sync |
Vault の同期エンジンを 1 つに限定し、競合を避けるため。 |
オフサイトバックアップ |
Google Drive に日次 zip 保存 |
同期ではなくスナップショットとして保存するため、Obsidian Sync と干渉しにくい。 |
ローカル世代管理 |
Time Machine など |
Mac 側で過去状態へ戻しやすくするため。 |
2. Google Drive 同期と併用しない理由
Google Drive デスクトップアプリで Vault フォルダそのものを同期対象にすると、Obsidian Sync と Google Drive の 2 つの同期エンジンが同じファイルを同時に扱います。
特に .obsidian/workspace.json のような頻繁に更新されるファイルは、競合ファイルの増加や状態不整合の原因になります。
安全な考え方は「リアルタイム同期は 1 つだけ」「バックアップは別系統のスナップショット」です。
3. 前提条件
項目 |
内容 |
対象 OS |
macOS |
シェル |
bash または zsh |
Obsidian Vault |
/Users/******/path/to/your-vault |
Google Drive 保存先 |
/Users/******/Library/CloudStorage/GoogleDrive-******/マイドライブ/_Obsidian_BAK |
実行頻度 |
毎日 3:00 AM |
保持期間 |
直近 30 日分 |
4. バックアップスクリプトを作成する
次のスクリプトを ~/.local/bin/obsidian-backup.sh として保存します。
#!/bin/bash
set -euo pipefail
VAULT_DIR="/Users/******/path/to/your-vault"
BACKUP_DIR="/Users/******/Library/CloudStorage/GoogleDrive-******/マイドライブ/_Obsidian_BAK"
RETENTION_DAYS=30
LOG_FILE="${HOME}/Library/Logs/obsidian-backup.log"
DATE=$(date +%Y-%m-%d)
ZIP_PATH="${BACKUP_DIR}/obsidian-${DATE}.zip"
mkdir -p "$BACKUP_DIR"
mkdir -p "$(dirname "$LOG_FILE")"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
log "Backup start -> ${ZIP_PATH}"
if [ ! -d "$VAULT_DIR" ]; then
log "ERROR: Vault directory not found: ${VAULT_DIR}"
exit 1
fi
# 同じ日に再実行した場合は、その日の zip を作り直す
rm -f "$ZIP_PATH"
cd "$(dirname "$VAULT_DIR")"
zip -rq "$ZIP_PATH" "$(basename "$VAULT_DIR")" \
-x "*/.git/*" \
-x "*/.DS_Store" \
-x "*/.obsidian/workspace.json" \
-x "*/.obsidian/workspace.json.bak" \
-x "*/.obsidian/cache/*" \
-x "*/.trash/*" \
-x "*/.temp/*"
SIZE=$(du -h "$ZIP_PATH" | cut -f1)
log "Created ${ZIP_PATH} (${SIZE})"
DELETED_LIST=$(find "$BACKUP_DIR" -name "obsidian-*.zip" -type f -mtime +${RETENTION_DAYS} -print -delete || true)
if [ -n "$DELETED_LIST" ]; then
DELETED_COUNT=$(printf '%s\n' "$DELETED_LIST" | wc -l | tr -d ' ')
log "Pruned ${DELETED_COUNT} old backup(s) older than ${RETENTION_DAYS} days"
else
log "No old backups to prune (retention ${RETENTION_DAYS} days)"
fi
log "Backup done"
保存後、実行権限を付けます。
chmod +x ~/.local/bin/obsidian-backup.sh
除外している主なファイル
除外パターン |
理由 |
*/.git/* |
Git の内部データ。バックアップ zip には通常不要です。 |
*/.DS_Store |
macOS の表示用メタデータです。 |
*/.obsidian/workspace.json |
ペイン配置などの作業状態で、頻繁に更新されます。 |
*/.obsidian/cache/* |
Obsidian のキャッシュです。 |
*/.trash/* |
Obsidian のゴミ箱です。 |
*/.temp/* |
一時ファイルです。 |
5. 手動でテスト実行する
まずは自動化せず、手動でバックアップを実行します。
~/.local/bin/obsidian-backup.sh
ログを確認します。
tail -50 ~/Library/Logs/obsidian-backup.log
Google Drive の保存先に obsidian-YYYY-MM-DD.zip が作成されていれば成功です。
6. launchd で毎日自動実行する
macOS の LaunchAgent を使って、毎日 3:00 AM にバックアップを実行します。
次のファイルを ~/Library/LaunchAgents/com.******.obsidian-backup.plist として保存します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.******.obsidian-backup</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/Users/******/.local/bin/obsidian-backup.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>3</integer>
<key>Minute</key>
<integer>0</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/******/Library/Logs/obsidian-backup.stdout.log</string>
<key>StandardErrorPath</key>
<string>/Users/******/Library/Logs/obsidian-backup.stderr.log</string>
<key>RunAtLoad</key>
<false/>
</dict>
</plist>
plist の構文を確認します。
plutil -lint ~/Library/LaunchAgents/com.******.obsidian-backup.plist
問題なければ LaunchAgent を読み込みます。
launchctl load -w ~/Library/LaunchAgents/com.******.obsidian-backup.plist
登録状態を確認します。
launchctl list | grep obsidian-backup
RunAtLoad を false にしているため、読み込み直後に即実行はされません。指定時刻になったら実行されます。
7. 運用コマンド
やりたいこと |
コマンド |
今すぐ手動バックアップ |
~/.local/bin/obsidian-backup.sh |
実行ログを確認 |
tail -50 ~/Library/Logs/obsidian-backup.log |
LaunchAgent の登録確認 |
launchctl list | grep obsidian-backup |
一時的に無効化 |
launchctl unload ~/Library/LaunchAgents/com.******.obsidian-backup.plist |
再有効化 |
launchctl load -w ~/Library/LaunchAgents/com.******.obsidian-backup.plist |
バックアップ一覧を確認 |
ls -lh /Users/******/Library/CloudStorage/GoogleDrive-******/マイドライブ/_Obsidian_BAK/ |
8. 設定変更のポイント
変更したい内容 |
編集箇所 |
実行時刻を変える |
plist の Hour と Minute |
保持期間を変える |
スクリプトの RETENTION_DAYS=30 |
保存先を変える |
スクリプトの BACKUP_DIR="..." |
除外ファイルを追加する |
zip コマンドの -x オプション |
plist を変更した場合は、必ず unload してから load し直してください。読み込み直さないと変更が反映されないことがあります。
9. 復元方法
- Google Drive を開き、バックアップ保存先フォルダに移動します。
- 復元したい日付の obsidian-YYYY-MM-DD.zip をダウンロードします。
- zip を解凍します。
- 必要なファイルだけ取り出すか、解凍した Vault を別の場所に置いて Obsidian で開きます。
現在使用中の Vault を直接上書きする前に、必ず現状のフルコピーを別場所に保存してください。Obsidian Sync が動作している状態で Vault 全体を置き換えると、同期状態が乱れる可能性があります。
10. 改善候補
- Time Machine を併用して、Mac 側でも世代バックアップを持つ。
- GitHub などに、暗号化または適切に除外設定したうえで別系統のバックアップを作る。
- バックアップ失敗時に macOS 通知を出す。
- 機密性が高い Vault の場合は、zip の暗号化や保存先のアクセス制御を検討する。
11. 公開前チェックリスト
- 実名、メールアドレス、組織名、ユーザー名が残っていないか。
- ローカルパスに個人名や固有のフォルダ名が残っていないか。
- Google Drive アカウント名やドメイン名が残っていないか。
- API キー、トークン、パスワードなどが含まれていないか。
- コマンド内の ****** を、読者が自分の環境に置き換えられる説明になっているか。