先日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>" | 長辺2048px | 2048px以下の画像はそのまま(拡大しない) |
-quality 60 | JPEG品質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 | 写真+動画+DB | sync(差分) | 原本 |
| Amazonフォト | 写真のみ | copy(追記のみ) | 原本(無制限) |
| Googleフォト | 写真のみ | copy(追記のみ) | 低画質(長辺2048px・品質60%) |
これで、OneDriveはImmichと同じ状態、Amazonフォトは高画質写真を全て、Googleフォトは低画質写真を出来るだけ全て(容量次第)となり、かなり安心になるのではないでしょうか。さらに、可能であればローカルにも完全コピーが保存出来ると完璧でしょう。
