أتمتة backup PostgreSQL على S3 بـ GitHub Actions
لو بتعتمد على cron داخل السيرفر علشان تاخد backup لـ PostgreSQL، أنت عندك single point of failure واضح. لو السيرفر وقع، الـ backup بتاعك وقع معاه. الحل: خلي GitHub Actions هو اللي يشغّل الـ backup يوميًا ويرفعه على S3، من غير ما تدفع لأي سيرفر إضافي، ومن غير ما تحتاج تدخل يدوي.
المشكلة باختصار
أغلب المشاريع الصغيرة والمتوسطة بتعمل backup بـ pg_dump داخل cron على نفس السيرفر اللي فيه الـ database. الإعداد ده بيخلق 3 مشاكل مترابطة: الـ backup بيتخزن على نفس القرص، لو السيرفر اتحرق أنت خسرت الـ backup مع الـ DB في نفس اللحظة، ولو الـ disk امتلأ الـ cron بيفشل بصمت من غير ما حد يلاحظ. GitHub Actions بيحل التلاتة دفعة واحدة لأنه معزول تمامًا عن الـ infrastructure اللي بتحميه.
تمثيل بسيط الأول
تخيّل إنك بتاخد نسخة من مفتاح بيتك كل يوم وبتسيبها على مكتبك في الشركة. كويس، بس لو حصل حريق في الشركة خسرت النسخة والمكتب في نفس اللحظة. لما تبدأ تبعت النسخة لصديق ساكن في حي تاني، أنت عملت off-site backup. ده بالظبط اللي بنعمله هنا: الـ S3 هو الصديق في الحي التاني، والـ GitHub Actions هو الساعي اللي بيوصل النسخة كل يوم الساعة 2 الفجر من غير ما تفتكره.
ليه GitHub Actions بالذات مش cron على السيرفر
فيه 3 أسباب عملية تخليك تفضّل الخيار ده:
- مجاني عمليًا. كل حساب GitHub مجاني بياخد 2000 دقيقة runners في الشهر. الـ backup job الواحد بياخد من دقيقة لـ 3 دقايق على DB بحجم 5GB. يعني 30 backup في الشهر ≈ 90 دقيقة. أنت لسه بعيد جدًا عن الحد المسموح.
- معزول عن الـ infrastructure. لو سيرفر الـ DB وقع أو اتغلق، الـ workflow لسه بيشتغل من GitHub runners تانية. الـ failure notification بيوصلك عبر GitHub نفسه على الإيميل، وتقدر توصله لـ Slack بخطوة واحدة.
- Secrets management جاهز. بتحط الـ AWS keys والـ DB password في GitHub Secrets، مش في ملف
.envعلى السيرفر أو سطر cron فيه password ظاهر.
المتطلبات قبل ما تبدأ
- Bucket على S3 مع versioning مفعّل علشان لو اتكتب فوق ملف بالغلط تقدر ترجع نسخة قديمة.
- IAM user بصلاحية
s3:PutObjectعلى الـ bucket ده بس، مش على كل S3 — principle of least privilege. - DB reachable من الـ internet، أو عبر bastion/VPN — هنتكلم على ده في قسم الـ trade-offs.
الـ workflow الكامل
حط الملف ده في المسار .github/workflows/postgres-backup.yml داخل الريبو بتاعك: