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 の挙動 | 転送元にないファイルは転送先からも削除される。削除したくない場合は sync → copy に変更 |
| 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
