📍 المقالة الرئيسية: 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 جيجابايت.
للاستزادة
- 🔝 المرجع: الدليل الكامل Immich 2026
- وثائق Restic: restic.readthedocs.io