ImmichからOneDrive + Amazonフォト + Googleフォトにバックアップ

先日ImmichからOneDriveにバックアップする方法を紹介しましたが、GoogleフォトやAmazonフォトがあるので、これらも合わせた設定で紹介します。

項目GoogleフォトAmazonフォト
無料容量15GB(Gmail等と共有)写真は無制限※・動画5GB
画質元の画質で保存元の画質で保存
動画容量消費あり5GBまで無料
API制限1日あたりのアップロード数に上限あり比較的寛容

※ AmazonプライムまたはAmazon Photos会員が条件

特にAmazonフォトは、プライム会員限定にはなりますが、写真を無制限に保存出来るのは最もコスパが良いです。そこで、OneDriveはImmichの完全クローン(Immich環境が壊れた時にはここから復元)、Amazonフォトは元の画質で写真のみ保存、Googleフォトは低画質で出来るだけ保存、という構成で行ってみます。
作業はすべてrcloneを使って行います。


1. rcloneのインストール

まずはrcloneのインストールから。

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

2. ImageMagickのインストール

Googleフォトへ低画質で保存するために、ImageMagickをインストールします。

sudo apt install imagemagick -y

3. rclone リモート設定(3つ)

OneDrive

rclone config
n) New remote
name> onedrive
Storage> onedrive # 現時点は41
client_id>
client_secret>
region> 1
Edit advanced config? n
Use auto config? y
Your choice> 1
Chose drive> 0
Is that okay? y
q) Quit config

Amazonフォト

rclone config
n) New remote
name> amazondrive
Storage> amazon cloud drive # 現時点は4
client_id>
client_secret>
Use auto config? y
q) Quit config

Googleフォト

rclone config
n) New remote
name> gphotos
Storage> google photos # 現時点は25
client_id>
client_secret>
read_only> false
Use auto config? y
q) Quit config

4. 接続確認

rcloneの設定を終えたら、接続確認です。

rclone lsd onedrive:
rclone lsd amazondrive:
rclone lsd gphotos:

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

OneDriveにはバックアップ先のフォルダをあらかじめ作成しておきます。

rclone mkdir onedrive:ImmichBackup
rclone mkdir onedrive:ImmichBackup/library
rclone mkdir onedrive:ImmichBackup/db-dumps

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

3ドライブの設定を含めたスクリプトを作成します。

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

# === Immich 完全バックアップスクリプト ===
# バックアップ先:OneDrive(写真+DB)/ Amazonフォト(写真のみ高画質)/ Googleフォト(低画質)

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"
GPHOTOS_TEMP="$IMMICH_DIR/gphotos-temp"
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"
}

mkdir -p "$DB_DUMP_DIR" "$GPHOTOS_TEMP"

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

# --- 1. PostgreSQL ダンプ ---
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

find "$DB_DUMP_DIR" -name "immich-db-*.sql.gz" -mtime +7 -delete
log "古いDBダンプを削除(7日以上前)"

# --- 2. OneDrive:写真+DB同期 ---
log "OneDrive 写真ライブラリ同期開始..."
rclone sync "$LIBRARY_SRC" "$DEST_LIBRARY" \
  --transfers 4 --checkers 8 \
  --log-file "$LOG" --log-level INFO
[ $? -eq 0 ] && log "OneDrive 写真同期完了" || log "OneDrive 写真同期失敗"

log "OneDrive DBダンプ同期開始..."
rclone sync "$DB_DUMP_DIR" "$DEST_DB" \
  --transfers 2 \
  --log-file "$LOG" --log-level INFO
[ $? -eq 0 ] && log "OneDrive DBダンプ同期完了" || log "OneDrive DBダンプ同期失敗"

# --- 3. Amazonフォト:写真のみ高画質コピー(削除しない)---
log "Amazonフォト コピー開始(写真のみ高画質)..."
rclone copy "$LIBRARY_SRC" amazondrive:ImmichBackup \
  --include "*.{jpg,jpeg,png,gif,heic,heif,raw,cr2,nef,arw,dng}" \
  --transfers 4 --checkers 8 \
  --log-file "$LOG" --log-level INFO
[ $? -eq 0 ] && log "Amazonフォト コピー完了" || log "Amazonフォト コピー失敗"

# --- 4. Googleフォト:低画質リサイズ→アップロード ---
log "Googleフォト用リサイズ開始(長辺2048px・品質60%)..."

find "$LIBRARY_SRC" -type f \
  \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | \
while read -r SRC_FILE; do
  REL_PATH="${SRC_FILE#$LIBRARY_SRC/}"
  DEST_FILE="$GPHOTOS_TEMP/$REL_PATH"
  mkdir -p "$(dirname "$DEST_FILE")"

  if [ -f "$DEST_FILE" ] && [ "$DEST_FILE" -nt "$SRC_FILE" ]; then
    continue
  fi

  convert "$SRC_FILE" \
    -resize "2048x2048>" \
    -quality 60 \
    "$DEST_FILE"
done

log "リサイズ完了"

log "Googleフォト アップロード開始..."
rclone copy "$GPHOTOS_TEMP" gphotos:album/ImmichBackup \
  --transfers 4 \
  --log-file "$LOG" --log-level INFO
[ $? -eq 0 ] && log "Googleフォト アップロード完了" || log "Googleフォト アップロード失敗"

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

リサイズ設定の意味

設定意味
-resize "2048x2048>"長辺2048px2048px以下の画像はそのまま(拡大しない)
-quality 60JPEG品質60%ファイルサイズ約1/3〜1/4に圧縮
>(大なり記号)縮小のみ小さい画像を拡大しない

画質や解像度を変えたい場合は数値を調整してください(品質80%なら高画質寄り、50%ならより圧縮)。

スクリプトを作成したら権限を付与します。

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

7. 手動テスト(dry-run)

まずは動作チェックをしましょう。

# OneDrive確認(実際にはコピーしない)
rclone sync /home/user/immich/library/library onedrive:ImmichBackup/library \
  --dry-run --progress

# Amazonフォト確認(実際にはコピーしない)
rclone copy /home/user/immich/library/library amazondrive:ImmichBackup \
  --include "*.{jpg,jpeg,png,gif,heic,heif,raw,cr2,nef,arw,dng}" \
  --dry-run --progress

# Googleフォト確認(実際にはコピーしない)
rclone copy /home/user/immich/gphotos-temp gphotos:album/ImmichBackup \
  --dry-run --progress

ただし、Googleフォトのdry-runはリサイズ済みの一時ファイルがgphotos-tempに存在する場合のみ確認できます。まだリサイズを実行していない場合は先にリサイズだけ手動で走らせてください。

# リサイズのみ実行(アップロードはしない)
find /home/user/immich/library/library -type f \
  \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | \
while read -r SRC_FILE; do
  REL_PATH="${SRC_FILE#/home/user/immich/library/library/}"
  DEST_FILE="/home/user/immich/gphotos-temp/$REL_PATH"
  mkdir -p "$(dirname "$DEST_FILE")"
  convert "$SRC_FILE" -resize "2048x2048>" -quality 60 "$DEST_FILE"
done

# その後dry-run
rclone copy /home/user/immich/gphotos-temp gphotos:album/ImmichBackup \
  --dry-run --progress

8. cronでスケジュール設定(毎日午前3時)

動作に問題がないようなら、スケジュール実行させます。

crontab -e

末尾に追加してください。

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

内容を確認します。

crontab -l

9. ログ確認

ログの確認は下記です。

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

バックアップ構成まとめ

バックアップ先内容方式画質
OneDrive写真+動画+DBsync(差分)原本
Amazonフォト写真のみcopy(追記のみ)原本(無制限)
Googleフォト写真のみcopy(追記のみ)低画質(長辺2048px・品質60%)

これで、OneDriveはImmichと同じ状態、Amazonフォトは高画質写真を全て、Googleフォトは低画質写真を出来るだけ全て(容量次第)となり、かなり安心になるのではないでしょうか。さらに、可能であればローカルにも完全コピーが保存出来ると完璧でしょう。