تطوير الويب

النسخ الاحتياطي التلقائي Coolify إلى S3 و MinIO: دليل 2026

3 min de lecture

Coolify بديل مفتوح المصدر لـ Heroku/Vercel، يستضاف ذاتياً على VPS عادي. النسخ الاحتياطي التلقائي للقواعد إلى تخزين خارجي (S3 من AWS، أو MinIO على VPS آخر) هو خط الدفاع الأخير ضد فقدان البيانات. هذا الدرس يبني نظام نسخ احتياطي شامل لـ Coolify في 8 خطوات، مع مقارنة AWS S3 vs MinIO الذاتي.

المتطلبات

  • Coolify v4.0+ مثبّت على VPS
  • قاعدة بيانات واحدة على الأقل (PostgreSQL، MySQL، MongoDB)
  • حساب AWS أو خادم MinIO منفصل
  • الوقت المقدر: ساعتان

الخطوة 1 — اختيار وجهة التخزين

الخيار السعر الميزات
AWS S3 0.023 USD/GB/شهر موثوقية 11×9، عالمي، سهل
Backblaze B2 0.005 USD/GB/شهر أرخص بكثير، API S3-متوافق
Cloudflare R2 0.015 USD/GB، 0 USD egress egress مجاني (للاسترداد)
MinIO ذاتي تكلفة VPS فقط تحكم كامل، لا dependence

الاختيار الأمثل لـ 2026: Cloudflare R2 إن كنت تخطط لاسترداد متكرر (egress مجاني)، Backblaze B2 إن كان حجم البيانات كبيراً جداً، MinIO إن كنت تريد سيادة كاملة (مثل بيانات حساسة قانونياً). AWS S3 يبقى الافتراضي الآمن للمبتدئين.

الخطوة 2 — إعداد S3 bucket

# في AWS Console:
1. S3 → Create bucket
2. Name: coolify-backups-mon-projet
3. Region: eu-west-1 (Ireland) لـ MENA
4. Block all public access: ✓ (إلزامي)
5. Versioning: Enabled (لحفظ نسخ متعددة)
6. Encryption: Server-side AES-256

# IAM user مخصص:
7. IAM → Users → Add user
8. Name: coolify-backup-user
9. Permissions → AmazonS3FullAccess (أو policy أكثر تقييداً)
10. Save Access Key ID + Secret Access Key

Versioning ضروري: إذا أُتلفت قاعدة البيانات وأعادت Coolify رفع نسخة فاسدة، النسخ القديمة محفوظة. Lifecycle policy ينقل النسخ القديمة (> 30 يوم) إلى Glacier (أرخص) ويحذفها بعد سنة. هذا يقلل التكلفة دون فقدان حماية.

الخطوة 3 — إعداد MinIO ذاتي (بديل)

MinIO خادم تخزين متوافق مع S3 API. تنشره على VPS منفصل في موقع جغرافي مختلف عن سيرفر Coolify الأساسي.

# تثبيت MinIO عبر Docker على VPS منفصل:
docker run -d \
  --name minio \
  -p 9000:9000 -p 9001:9001 \
  -v /mnt/minio-data:/data \
  -e "MINIO_ROOT_USER=admin" \
  -e "MINIO_ROOT_PASSWORD=motdepasse-fort-32-caracteres" \
  --restart=unless-stopped \
  minio/minio server /data --console-address ":9001"

# الوصول:
# https://votre-vps.com:9001 (واجهة الإدارة)
# https://votre-vps.com:9000 (S3 API)

إنشاء bucket في MinIO عبر الواجهة، ثم Access Keys للنسخ الاحتياطي. MinIO يدعم نفس S3 API، فأي أداة تعمل مع S3 تعمل معه. الميزة: تحكم كامل في البيانات، لا فواتير شهرية متغيرة، خصوصية مطلقة. العيب: مسؤولية صيانة VPS إضافي.

الخطوة 4 — تكوين Coolify

Coolify v4 يدعم S3 backups أصلاً. الإعداد عبر الواجهة:

# في Coolify Dashboard:
1. Settings → S3 Storages → New S3 Storage
2. أدخل:
   - Name: production-backups
   - Endpoint: https://s3.eu-west-1.amazonaws.com
     (لـ MinIO: https://votre-vps.com:9000)
   - Region: eu-west-1
   - Bucket Name: coolify-backups-mon-projet
   - Access Key: AKIAxxxxxxxxxxxx
   - Secret Key: xxxxxxxxxxxxxxxxxxxxxxxx
3. Test Connection → ✓ OK
4. Save

Endpoint مهم: S3 الرسمي يستخدم النموذج s3.<region>.amazonaws.com. Backblaze B2 يستخدم s3.eu-central-003.backblazeb2.com. R2 يستخدم <account>.r2.cloudflarestorage.com. MinIO يستخدم endpoint سيرفرك المخصص. تحقق من الوثائق المحددة لكل مزوّد.

الخطوة 5 — تفعيل النسخ الاحتياطي للقواعد

بعد إضافة S3 storage، فعّل النسخ لكل قاعدة بيانات.

# في Coolify لكل قاعدة بيانات:
1. Database → Backups → Enable Backups
2. Schedule: cron مثل "0 3 * * *" (3 صباحاً يومياً)
3. Storage: production-backups (S3 الذي أضفته)
4. Retention: 30 days (يحذف النسخ الأقدم تلقائياً)
5. Save

# Coolify يخزن في bucket:
#   /database-name/backup-2026-05-06-03-00.sql.gz

cron syntax القياسي: دقيقة ساعة يوم شهر يوم-أسبوع. النسخ الاحتياطي يومياً بـ « 0 3 * * * » يعمل عند 3 صباحاً (الأقل ازدحاماً عادة). للمشاريع الحرجة، أضف نسخة كل 6 ساعات: 0 */6 * * *. التكلفة الإضافية محدودة لأن النسخ الاحتياطية مضغوطة.

الخطوة 6 — اختبار الاسترداد

نسخة احتياطية لم تُختبر = ليست نسخة احتياطية. اختبر شهرياً على بيئة staging.

# تنزيل آخر نسخة احتياطية يدوياً:
aws s3 cp s3://coolify-backups-mon-projet/postgres-prod/latest.sql.gz ./

# أو مع MinIO (mc CLI):
mc cp local/coolify-backups/postgres-prod/latest.sql.gz ./

# استرداد على PostgreSQL staging:
gunzip latest.sql.gz
psql -h staging-db.example.com -U postgres -d test_restore < latest.sql

# أو في Coolify staging:
# Database → Restore → Choose backup → Restore

اختبار شهري لمدة 30 دقيقة. اقرأ بضعة سجلات للتأكد أن البيانات سليمة. الفشل في هذه المرحلة يعني نسخ احتياطية مختلطة أو فاسدة — تكتشفها في المختبر، لا في الكارثة الحقيقية. وثّق وقت الاسترداد المتوقع (RTO) لتعرف كم ستتأخر استعادة الخدمة فعلياً.

الخطوة 7 — مراقبة وتنبيه

نسخة احتياطية صامتة تفشل ولا أحد ينتبه = نسخة لا توجد. أتمت تنبيهات على فشل النسخ.

# في Coolify:
Notifications → Add Discord/Slack/Email webhook
Events to notify:
  ✓ Backup failed
  ✓ Backup successful (يومياً)
  ✓ Database connection lost

# webhook بسيط على Slack:
curl -X POST -H "Content-type: application/json" \
  --data '{"text":"Backup ✓ : postgres-prod-2026-05-06"}' \
  https://hooks.slack.com/services/XXX/YYY/ZZZ

التنبيه على النجاح المتكرر يبدو مزعجاً، لكنه ضروري: عدم وصول التنبيه = شيء معطّل في النظام (السيرفر مات، Slack محجوب، الخ). « absence of expected message » مفيد. للأنظمة الحرجة، استخدم خدمة Dead Man’s Snitch — تنبهك إن لم يصلها heartbeat من سكريبت الـ backup.

الخطوة 8 — استراتيجية 3-2-1

القاعدة الذهبية للنسخ الاحتياطي: 3 نسخ، 2 وسائط مختلفة، 1 خارج الموقع.

النسخة الموقع الغرض
1. الإنتاج VPS Coolify الأساسي التشغيل اليومي
2. نسخة محلية قرص خارجي على نفس السيرفر استرداد سريع
3. خارج الموقع S3 / MinIO منفصل كارثة (حريق DC، اختراق)

للحالات الحرجة (تطبيقات مالية، صحية)، أضف نسخة رابعة في منطقة جغرافية مختلفة. مثال: VPS رئيسي في فرنسا، MinIO في كندا، S3 في سنغافورة. لا يحدث أبداً أن تتعطل ثلاث مناطق دفعة واحدة. التكلفة الإضافية: 5-15 USD شهرياً لتأمين كامل.

أخطاء شائعة

المشكلة السبب الحل
النسخ تتراكم بلا حدود غياب retention 30-90 يوم retention في Coolify
S3 bucket عام إعداد خاطئ « Block all public access » دائماً
credentials في git commit عرضي .env + gitignore + git-secrets
لم تختبر الاسترداد « سيعمل » اختبار شهري إلزامي
فشل صامت غياب التنبيه Slack/Email على كل نسخة
egress غير محسوب سحب نسخة من S3 R2 إن كنت تخطط لاسترداد متكرر

للمزيد

مقالات ذات صلة

Partager