أصبحت Supabase بديلاً قوياً ومحبوباً لـ Firebase، حيث توفر للمطورين قاعدة بيانات Postgres جاهزة، ونظام مصادقة، وتخزين ملفات، وواجهات برمجية تلقائية. ولكن، مع روعة الخطة المجانية التي تقدمها، تأتي معها مسؤولية كبيرة: الحفاظ على بياناتك. الخطة المجانية لا توفر نسخاً احتياطياً تلقائياً، وفقدان البيانات قد يكون كارثياً لأي مشروع.
في هذا الدليل المفصل، سنتعلم خطوة بخطوة كيف نقوم بإعداد نظام نسخ احتياطي تلقائي ومجاني بالكامل لقاعدة بيانات Supabase، باستخدام أداة قوية ومدمجة مع نظام عمل كل المطورين: GitHub Actions. في نهاية هذا المقال، سيكون لديك workflow يعمل يومياً لأخذ نسخة كاملة من قاعدة بياناتك وحفظها بأمان في مستودع GitHub الخاص بك.
القسم الأول: لماذا نحتاج إلى هذا الحل؟
- قيود الخطة المجانية: كما ذكرنا، لا توجد نسخ احتياطية مدمجة في الخطة المجانية لـ Supabase.
- الأمان ضد الأخطاء البشرية: قد تقوم بحذف جدول أو بيانات مهمة عن طريق الخطأ. النسخة الاحتياطية هي شبكة الأمان الخاصة بك.
- الأتمتة الكاملة: بمجرد إعداده، سيعمل النظام تلقائياً دون أي تدخل منك. “اضبطه وانسَه”.
- حل مجاني ومتكامل: نعتمد على أدوات مجانية (خطة GitHub المجانية) ومتكاملة مع بيئة التطوير.
القسم الثاني: المتطلبات الأساسية
قبل أن نبدأ، تأكد من أن لديك التالي:
- مشروع Supabase فعال: لديك قاعدة بيانات وبيانات تريد الحفاظ عليها.
- مستودع (Repository) على GitHub: حيث سيتم حفظ الكود وملفات النسخ الاحتياطي.
- 🔴 تنبيه هام جداً: يجب أن يكون هذا المستودع خاصاً (Private). حفظ نسخة من قاعدة بياناتك في مستودع عام يعرض جميع بياناتك للخطر.
- بيانات الاتصال بقاعدة البيانات: ستحتاج إلى معلومتين أساسيتين من لوحة تحكم Supabase:
- Project ID: تجده في
Project Settings > General. - Database Password: كلمة المرور التي قمت بتعيينها لقاعدة البيانات من
Project Settings > Database.
- Project ID: تجده في
القسم الثالث: إعداد أسرار المستودع (GitHub Secrets)
لأسباب أمنية، لا يجب أبداً كتابة كلمات المرور أو البيانات الحساسة مباشرة في ملفات الكود. سنستخدم ميزة GitHub Secrets لتخزين بيانات الاتصال بأمان.
- اذهب إلى مستودعك على GitHub.
- اضغط على تبويب Settings.

- من القائمة الجانبية، اختر Secrets and variables > Actions.
- اضغط على زر New repository secret وأنشئ السرين التاليين:

- السر الأول:
- Name:
PROJECT_ID - Secret: الصق هنا الـ Project ID الخاص بمشروعك في Supabase.
- Name:
- السر الثاني:
- Name:
SUPABASE_DB_PASSWORD - Secret: الصق هنا كلمة مرور قاعدة البيانات الخاصة بك.
- Name:
الآن أصبحت بياناتنا الحساسة مخزنة بأمان وجاهزة للاستخدام داخل الـ workflow.
القسم الرابع: إنشاء وإعداد ملف الـ Workflow
هذا هو قلب ومحرك نظامنا. سنقوم بإنشاء ملف يخبر GitHub بما يجب عليه فعله ومتى.
- في المستودع الخاص بك، على جهازك المحلي أنشئ المجلدات والملف التالي:
.github/workflows/supabase_backup.yml
تأكد ان اسم المجلد.githubيبدأ بنقطة والا لن يعمل التدفق - افتح ملف
supabase_backup.ymlوالصق الكود التالي بالكامل بداخله. هذا هو الكود النهائي والكامل الذي يعمل بعد تخطي جميع المشاكل.
YAML
name: Supabase DB Backup
on:
# يتيح لك تشغيل هذا الـ workflow يدوياً من صفحة Actions للاختبار
workflow_dispatch:
# جدولة للتشغيل التلقائي كل يوم الساعة 2 صباحاً بتوقيت UTC
schedule:
- cron: '0 2 * * *'
jobs:
backup:
runs-on: ubuntu-latest
# 🔴 الخطوة 1: منح صلاحيات الكتابة
# بشكل افتراضي، لا يمكن للـ workflow الدفع (push) إلى المستودع.
# هذا السطر يمنحه الإذن اللازم.
permissions:
contents: write
steps:
# الخطوة 2: سحب الكود من المستودع
- name: Checkout repository
uses: actions/checkout@v4
# الخطوة 3: تثبيت الأدوات اللازمة
# نحتاج إلى postgresql-client لتشغيل أمر pg_dump
- name: Install PostgreSQL Client
run: |
sudo apt-get update
sudo apt-get install -y postgresql-client
# الخطوة 4: إنشاء مجلد مخصص لحفظ النسخ الاحتياطية
- name: Create backup directory
run: mkdir -p supabase_backups
# الخطوة 5: أخذ نسخة احتياطية من قاعدة البيانات
# هذه هي الخطوة الأساسية في العملية
- name: Run Supabase DB Backup
env:
PGPASSWORD: ${{ secrets.SUPABASE_DB_PASSWORD }}
run: |
pg_dump \
--host "aws-0-eu-central-1.pooler.supabase.com" \
--port "6543" \
--username "postgres.${{ secrets.PROJECT_ID }}" \
--dbname "postgres" \
--file "supabase_backups/backup-$(date +%Y-%m-%d).sql" \
--verbose
# الخطوة 6: رفع النسخة الاحتياطية إلى المستودع
- name: Commit and Push Backup
run: |
git config --global user.name "GitHub Action"
git config --global user.email "action@github.com"
# استخدام -f لإجبار git على إضافة الملف حتى لو كان في .gitignore
git add -f supabase_backups/backup-*.sql
if git diff-index --quiet HEAD; then
echo "No changes to commit."
else
git commit -m "chore: Add Supabase DB backup for $(date +%Y-%m-%d)"
git push
fi
القسم الخامس: تشخيص المشاكل الشائعة (شرح الأخطاء التي واجهناها)
أثناء إعداد هذا النوع من الـ workflows، من الشائع مواجهة بعض العقبات. إليك شرح للمشاكل التي تغلبنا عليها وكيفية حلها، لتكون على دراية بها:
- المشكلة الأولى: “Network is unreachable”
- السبب: خوادم GitHub Actions قد تواجه صعوبة في الاتصال بخوادم Supabase عبر بروتوكول الإنترنت IPv6 (الاتصال المباشر).
- الحل: استخدمنا Connection Pooler الذي يوفره Supabase، لأنه يعمل عبر بروتوكول IPv4 المتوافق مع GitHub Actions. لهذا السبب تجد في الكود أن
hostوportوusernameتختلف عن بيانات الاتصال المباشر.
- المشكلة الثانية: “File is ignored by .gitignore”
- السبب: العديد من المطورين يضعون قاعدة في ملف
.gitignoreلتجاهل ملفات.sqlلمنع رفعها عن طريق الخطأ. - الحل: أضفنا علامة
-f(force) إلى أمرgit add. هذا يخبر Git بأننا نريد إضافة هذا الملف تحديداً في هذه العملية الآلية، متجاوزين قواعد التجاهل.
- السبب: العديد من المطورين يضعون قاعدة في ملف
- المشكلة الثالثة: “Write access to repository not granted (Error 403)”
- السبب: كإجراء أمني، GitHub Actions تمتلك صلاحيات القراءة فقط بشكل افتراضي. لا يمكنها تعديل الكود أو دفع تغييرات جديدة.
- الحل: أضفنا قسم
permissions: contents: writeفي ملف الـ workflow، والذي يمنح هذا الإجراء الإذن الصريح للكتابة في المستودع.
القسم السادس: التحقق من النجاح وماذا بعد؟
بعد رفع الملف، يمكنك الذهاب إلى تبويب Actions في مستودعك وتشغيل الـ workflow يدوياً عبر workflow_dispatch للتأكد من أنه يعمل. إذا نجحت جميع الخطوات، ستجد مجلداً جديداً اسمه supabase_backups في مستودعك، وبداخله ملف .sql يحمل تاريخ اليوم.
هذا الملف هو كنزك. إنه يحتوي على نسخة نصية من قاعدة بياناتك بالكامل، هيكلاً وبيانات. إذا حدث أي طارئ، يمكنك استخدام هذا الملف لاستعادة قاعدة بياناتك إلى حالتها السابقة باستخدام أداة psql القياسية في PostgreSQL.
خاتمة
تهانينا! لقد قمت ببناء نظام نسخ احتياطي قوي، تلقائي، ومجاني لبيانات مشروعك على Supabase. لم تعد بحاجة للقلق بشأن فقدان بياناتك بسبب خطأ غير مقصود. تذكر دائماً أن النسخ الاحتياطي ليس رفاهية، بل هو جزء أساسي من أي مشروع برمجي ناجح ومسؤول.
