ITSkillsCenter
تطوير الويب

النسخ الاحتياطية التلقائية لـ Immich مع Restic إلى MinIO و B2 (2026)

2 min de lecture

📍 المقالة الرئيسية: Immich 2026: الدليل الكامل.

مكتبة من 30,000 صورة عائلية دون نسخة احتياطية مُختبَرة هي قنبلة موقوتة. هذا الدرس يفصل الإجراء الكامل لنسخ Immich (قاعدة Postgres + الملفات الفيزيائية + البيانات الوصفية) وفقاً لقاعدة 3-2-1، مع restic للإزالة المكررة والتشفير، نحو Backblaze B2 (offsite) و MinIO (محلي)، مع اختبار استعادة شهري إلزامي.

المتطلبات

Immich في الإنتاج مع بيانات حقيقية. حساب Backblaze B2 + bucket خاص. اختياري: MinIO على VPS ثانوي للنسخة الاحتياطية المضاعفة. المستوى: متوسط (cron، bash، restic). الوقت: ساعة للإعداد + 30 دقيقة للاختبار الشهري.

الخطوة 1 — استراتيجية 3-2-1 المطبقة على Immich

3 نسخ: الإنتاج (Hetzner Storage Box) + نسخة احتياطية MinIO محلية + نسخة احتياطية Backblaze B2 offsite. 2 وسيطين: NFS Storage Box + S3 بعيد. 1 خارج الموقع: Backblaze EU Central. هذه القاعدة تحمي من: عطل القرص (نادر مع Hetzner)، حذف عرضي، ransomware، كارثة datacenter، خطأ بشري إداري.

الخطوة 2 — تحديد العناصر للنسخ

  • قاعدة Postgres (البيانات الوصفية، الألبومات، المستخدمون، كلمات السر المُجزَّأة).
  • الملفات الفيزيائية على /mnt/photos/immich-upload.
  • التكوين: .env الخاص بـ Coolify، شهادات Let’s Encrypt.
  • نماذج ML المخصصة (إذا كنت قد دربت تعرفات وجوه محددة).

الخطوة 3 — تثبيت restic و rclone

apt install -y restic rclone
restic version
rclone version

الخطوة 4 — تكوين repository restic Backblaze

المتغير RESTIC_PASSWORD أساسي. خزن هذه العبارة السرية في 3 أماكن: Vaultwarden (مجموعة Infrastructure)، ورق في خزنة فيزيائية، YubiKey لمسؤول رئيسي. ثلاث نسخ فيزيائية كحد أدنى.

export RESTIC_REPOSITORY="s3:s3.eu-central-003.backblazeb2.com/immich-backups-prod"
export AWS_ACCESS_KEY_ID="votre-keyID-B2"
export AWS_SECRET_ACCESS_KEY="votre-applicationKey-B2"
export RESTIC_PASSWORD="passphrase-très-très-forte"
restic init

الخطوة 5 — سكربت نسخ Postgres

هذا السكربت ينشئ dump متناسق من Postgres (التنسيق -F c يضمن الاتساق حتى مع كتابات متزامنة)، ثم يدفعه إلى B2 عبر restic. retention يحفظ آخر 7 يوم، 4 أسابيع، 12 شهر.

#!/bin/bash
set -euo pipefail
TS=$(date +%Y%m%d-%H%M%S)
TMP=/tmp/immich-pg-$TS

docker exec immich-postgres pg_dump -U immich -d immich -F c -f /tmp/immich-$TS.dump
docker cp immich-postgres:/tmp/immich-$TS.dump $TMP.dump
docker exec immich-postgres rm /tmp/immich-$TS.dump

export RESTIC_REPOSITORY="s3:s3.eu-central-003.backblazeb2.com/immich-backups-prod"
export RESTIC_PASSWORD_FILE="/root/.restic-password"
export AWS_ACCESS_KEY_ID="..."
export AWS_SECRET_ACCESS_KEY="..."

restic backup $TMP.dump --tag immich-db --tag prod
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
rm -f $TMP.dump

curl -s "https://ntfy.sh/votre-topic" -d "Immich DB backup OK $TS"

الخطوة 6 — سكربت نسخ الملفات

للملفات، نستبعد الميزات والفيديوهات المُحوَّلة (قابلة للتجدد من الأصل). توفير 30-40% من الحجم.

#!/bin/bash
set -euo pipefail

restic backup /mnt/photos/immich-upload \
  --tag immich-files --tag prod \
  --exclude "*/encoded-video/*" \
  --exclude "*/thumbs/*"

restic forget --keep-daily 14 --keep-weekly 8 --keep-monthly 24 --prune
curl -s "https://ntfy.sh/votre-topic" -d "Immich files backup OK"

الخطوة 7 — جدولة النسخ

chmod +x /srv/scripts/immich-backup-*.sh

crontab -e
# DB كل 6 ساعات
0 */6 * * * /srv/scripts/immich-backup-db.sh >> /var/log/immich-backup.log 2>&1
# الملفات كل 12 ساعة
0 4,16 * * * /srv/scripts/immich-backup-files.sh >> /var/log/immich-backup.log 2>&1
# تحقق سلامة أسبوعي
0 5 * * 0 restic check --read-data-subset=10% >> /var/log/immich-backup.log 2>&1

الخطوة 8 — اختبار استعادة شهري

الاختبار ليس اختيارياً. إجراء شهري على VPS staging:

restic snapshots --tag immich-db | tail -5
restic restore latest --tag immich-db --target /tmp/restore

# استعادة في Postgres اختبار
docker run -d --name pg-test postgres:16
sleep 10
docker cp /tmp/restore/tmp/immich-*.dump pg-test:/tmp/
docker exec pg-test pg_restore -U postgres -d postgres /tmp/immich-*.dump

# عدّ الـ assets
docker exec pg-test psql -U postgres -c "SELECT COUNT(*) FROM assets;"

الأخطاء الشائعة

الخطأ الحل
Restic password مفقودة 3 نسخ مستقلة إلزامي
Backup مقطوع تحقق df قبل كل run
زمن استجابة upload عالٍ جدولة 2h-5h بالتوقيت المحلي
اختبار استعادة لم يُجرَ cron شهري مع تنبيه

التكيف مع السياق

ثلاث توضيحات. تكلفة Backblaze B2: لـ 200 جيجابايت (15,000-30,000 صورة)، احسب 1.20 دولار/شهرياً. Egress مجاني Cloudflare: Backblaze + Cloudflare Bandwidth Alliance يسمحان بالاستعادة دون رسوم. اختبار على بنية تحتية محلية: تنفيذ الاختبار الشهري على Raspberry Pi 5 في منزل المسؤول يُصادق على أن الإجراء يعمل خارج البنية التحتية الرئيسية.

دروس الإخوة

الأسئلة المتكررة

لماذا Backblaze بدلاً من AWS S3؟ التكلفة (6 USD/تيرابايت vs 23 USD)، egress مجاني عبر Cloudflare، البساطة.

Restic vs Borgbackup vs Duplicati؟ Restic يفوز على S3 native + إزالة التكرار + متعدد OS.

ماذا أفعل إذا تعطل خادم Immich كلياً؟ أعد تثبيت Immich نظيفاً، استعد Postgres + الملفات من restic. احسب 4-8 ساعات لـ 100 جيجابايت.

للاستزادة

Besoin d'un site web ?

Confiez-nous la Création de Votre Site Web

Site vitrine, e-commerce ou application web — nous transformons votre vision en réalité digitale. Accompagnement personnalisé de A à Z.

À partir de 250.000 FCFA
Parlons de Votre Projet
Publicité