rcloneを使ってImmichの写真をクラウドにバックアップ

Immichはかなり強力なセルフホストの写真管理サービスで、速度や機能から、既存サービスから完全に乗り換えられると思います。ただ、ローカルだけだと万が一の時にデータを失ってしまいかねないので、クラウドにも保存したほうが安心です。ここではrcloneを使ってImmichのデータをOneDriveにバックアップする手順を示します。


1. rcloneのインストール

sudo -v && curl https://rclone.org/install.sh | sudo bash

2. OneDriveの認証設定

初期設定を行います。

rclone config

対話形式で以下を入力しています。大半がデフォルトのままEnterでいけるはずです。

n) New remote
name> onedrive
Storage> onedrive # "Microsoft OneDrive" を選択(番号で入力、現時点は30)
client_id> # 空白のままEnter
client_secret> # 空白のままEnter
region> 1 # global (デフォルト)
Edit advanced config? n
Use auto config? y # ブラウザが開くので認証する
```
ブラウザでMicrosoftアカウントにログインして認証後、ターミナルに戻って:
```
Your choice> 1 # OneDrive Personal or Business
Chose drive> 3 # 表示されたドライブを選択
Is that okay? y
y) Yes this is OK
q) Quit config

3. 認証確認

設定が終了したら認証確認します。

rclone lsd onedrive:

OneDriveのフォルダ一覧が表示されれば成功です。


4. バックアップ先フォルダの作成

OneDriveにバックアップ先のフォルダを作成します。

rclone mkdir onedrive:ImmichBackup

5. 手動バックアップのテスト(dry-run)

まずは何が転送されるかをシミュレーションして表示するだけで、ファイルの読み書きは一切行わず実施します。確認後に --dry-run を外して実行すれば実際のバックアップが始まります。

rclone sync /home/user/immich/library/library onedrive:ImmichBackup/library \
  --progress \
  --dry-run

--dry-run を外して実際に実行:

rclone sync /home/user/immich/library/library onedrive:ImmichBackup/library \
  --progress \
  --transfers 4 \
  --checkers 8 \
  --log-file /home/user/immich/rclone-backup.log \
  --log-level INFO

6. バックアップスクリプトの作成

なお、PostgreSQL DBも含めた完全バックアップを行いたい場合は後述します。

cat > /home/user/immich/backup-to-onedrive.sh << 'EOF'
#!/bin/bash

# === Immich → OneDrive バックアップスクリプト ===
DATE=$(date '+%Y-%m-%d %H:%M:%S')
LOG="/home/user/immich/rclone-backup.log"
SRC="/home/user/immich/library/library"
DEST="onedrive:ImmichBackup/library"

echo "[$DATE] バックアップ開始" >> "$LOG"

rclone sync "$SRC" "$DEST" \
  --transfers 4 \
  --checkers 8 \
  --log-file "$LOG" \
  --log-level INFO

EXIT_CODE=$?

if [ $EXIT_CODE -eq 0 ]; then
  echo "[$DATE] バックアップ完了(正常終了)" >> "$LOG"
else
  echo "[$DATE] バックアップ失敗(終了コード: $EXIT_CODE)" >> "$LOG"
fi
EOF

作成したシェルスクリプトファイルに実行権限(実行可能な許可)を与えます。

chmod +x /home/user/immich/backup-to-onedrive.sh

7. cronでスケジュール設定(毎日午前3時に実行)

crontab -e

エディタが開いたら末尾に追加します。

0 3 * * * /home/user/immich/backup-to-onedrive.sh

内容は次の通りです。

cron式の構造

0 3 * * * /home/user/immich/backup-to-onedrive.sh
│ │ │ │ │
│ │ │ │ └── 曜日(0=日曜〜6=土曜、* =毎日)
│ │ │ └──── 月(1〜12、* =毎月)
│ │ └────── 日(1〜31、* =毎日)
│ └──────── 時(0〜23)
└────────── 分(0〜59)

つまり 0 3 * * * は「毎日3時0分」に実行という意味です。

よく使うスケジュール例

0 3 * * *          # 毎日 午前3時
0 3 * * 0          # 毎週日曜 午前3時
0 3 1 * *          # 毎月1日 午前3時
0 3 * * 1-5        # 平日のみ 午前3時
0 */6 * * *        # 6時間おき(0時/6時/12時/18時)
30 2 * * *         # 毎日 午前2時30分

設定確認:

crontab -l

8. ログの確認

一度スクリプトを実行してみると良いでしょう。

/home/user/immich/backup-to-onedrive.sh

実行したらログも確認してみましょう。

tail -f /home/user/immich/rclone-backup.log

補足・注意事項

項目内容
rclone sync の挙動転送元にないファイルは転送先からも削除される。削除したくない場合は synccopy に変更
OneDriveの容量無料は5GB。大量写真の場合はMicrosoft 365(1TB)を推奨
DBのバックアップ写真ファイルに加えてPostgreSQLのDBもバックアップしたい場合は別途 pg_dump が必要
初回実行時間写真の量によっては初回同期に数時間かかる場合あり

PostgreSQL DB込みの完全バックアップスクリプト

こちらはDB込みの完全スクリプトです。

cat > /home/user/immich/backup-to-onedrive.sh << 'EOF'
#!/bin/bash

# === Immich 完全バックアップスクリプト(写真 + PostgreSQL DB) ===

LOG="/home/user/immich/rclone-backup.log"
IMMICH_DIR="/home/user/immich"
LIBRARY_SRC="$IMMICH_DIR/library/library"
DB_DUMP_DIR="$IMMICH_DIR/db-dumps"
DEST_LIBRARY="onedrive:ImmichBackup/library"
DEST_DB="onedrive:ImmichBackup/db-dumps"
DATE=$(date '+%Y-%m-%d_%H-%M-%S')
DB_FILE="$DB_DUMP_DIR/immich-db-$DATE.sql.gz"

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG"
}

# --- 1. DBダンプ用ディレクトリ作成 ---
mkdir -p "$DB_DUMP_DIR"

log "===== バックアップ開始 ====="

# --- 2. PostgreSQL ダンプ(Dockerコンテナ経由) ---
log "PostgreSQL ダンプ開始..."

docker exec immich_postgres pg_dumpall -U postgres | gzip > "$DB_FILE"

if [ $? -eq 0 ]; then
  log "PostgreSQL ダンプ完了: $DB_FILE"
else
  log "PostgreSQL ダンプ失敗 - バックアップを中断します"
  exit 1
fi

# --- 3. 古いダンプファイルを削除(7日以上前のものを削除) ---
find "$DB_DUMP_DIR" -name "immich-db-*.sql.gz" -mtime +7 -delete
log "古いDBダンプを削除しました(7日以上前)"

# --- 4. 写真ライブラリを OneDrive へ同期 ---
log "写真ライブラリの同期開始..."

rclone sync "$LIBRARY_SRC" "$DEST_LIBRARY" \
  --transfers 4 \
  --checkers 8 \
  --log-file "$LOG" \
  --log-level INFO

if [ $? -eq 0 ]; then
  log "写真ライブラリの同期完了"
else
  log "写真ライブラリの同期失敗"
fi

# --- 5. DBダンプを OneDrive へ同期 ---
log "DBダンプの同期開始..."

rclone sync "$DB_DUMP_DIR" "$DEST_DB" \
  --transfers 2 \
  --log-file "$LOG" \
  --log-level INFO

if [ $? -eq 0 ]; then
  log "DBダンプの同期完了"
else
  log "DBダンプの同期失敗"
fi

log "===== バックアップ完了 ====="
EOF

作成したら権限を与えます。

chmod +x /home/user/immich/backup-to-onedrive.sh

cronへの登録(毎日午前3時)

先ほどと同様にスケジュール登録します。

crontab -e

末尾に追記します。

0 3 * * * /home/user/immich/backup-to-onedrive.sh

OneDrive上のバックアップ構成は次の通りです。

ImmichBackup/
├── library/          # 写真・動画ファイル(rclone syncで常に最新状態)
└── db-dumps/         # DBスナップショット(7日分保持)
    ├── immich-db-2026-03-06_03-00-00.sql.gz
    ├── immich-db-2026-03-05_03-00-00.sql.gz
    └── ...

リストア手順(万が一の際)

DBの復元:

gunzip -c /home/user/immich/db-dumps/immich-db-YYYY-MM-DD_HH-MM-SS.sql.gz | \
  docker exec -i immich_postgres psql -U postgres

写真の復元:

rclone sync onedrive:ImmichBackup/library /home/user/immich/library/library --progress