أتمتة النسخ الاحتياطي لـ PostgreSQL إلى Cloudflare R2
المشكلة باختصار
أغلب المشاريع الصغيرة والمتوسطة عندها backup strategy من اتنين: إما cronjob بيعمل pg_dump على نفس السيرفر (وده بيموت مع السيرفر لو وقع)، أو خدمة مُدارة بتاخد 30 دولار شهريًا على قاعدة 10GB. الطريقتين غلط. الأولى هشة، والتانية مبالَغ فيها.
الحل اللي هنبنيه: سكربت bash واحد، بينسخ القاعدة، بيضغطها، بيشفّرها، بيرفعها على bucket في Cloudflare R2، بيتحقق من الـ checksum، وبيبعت تنبيه لو في مشكلة. التكلفة الكاملة لقاعدة 10GB مع 30 نسخة يومية محفوظة: أقل من 5 دولار شهريًا.
يعني إيه "نسخة احتياطية" أصلاً؟ — مثال للمبتدئ
تخيّل إنك بتكتب كراسة مذكرات كل يوم. في آخر اليوم بتصوّرها بالموبايل وبتبعت الصور لنفسك على Google Drive. لو الكراسة ضاعت، مش مشكلة، الصور موجودة. ده بالظبط اللي بيحصل مع الـ backup:
- الكراسة = قاعدة البيانات الحيّة (PostgreSQL).
- صورة الكراسة = ملف الـ dump (snapshot للحظة معينة).
- Google Drive = Cloudflare R2 (storage بعيد عن السيرفر الأصلي).
علميًا: pg_dump بيطلع ملف فيه كل الـ DDL (هيكل الجداول) والـ DML (البيانات نفسها) في صيغة يقدر pg_restore يعيدها كاملة. الملف ده consistent snapshot — حتى لو القاعدة شغالة وبيتكتب فيها أثناء الـ dump، النتيجة بتبقى متسقة على لحظة بداية العملية.
ليه Cloudflare R2 بالذات؟
التخزين السحابي ليه 3 تكاليف: الـ storage شهريًا، الـ requests، والـ egress (بتدفع لما تنزّل الملف برّه). الـ egress هو اللي بيوجع في AWS S3 — حوالي 9 سنت لكل GB.
R2 بيلغي الـ egress بالكامل. لما تيجي تسترجع نسخة احتياطية حجمها 10GB من S3، بتدفع 0.90 دولار مرة واحدة. من R2، بتدفع صفر. ده مش فرق صغير في سيناريو كارثة لما بتسترجع يوميًا عشرة نسخ لحد ما تلاقي السليمة.
- Storage: 1.5 سنت لكل GB شهريًا (أرخص من S3 Standard بحوالي 35%).
- Egress: صفر.
- API: S3-compatible، يعني أي tool بيشتغل مع S3 هيشتغل مع R2 من غير تغيير يُذكر.
السكربت الكامل — خطوة بخطوة
قبل ما تبدأ، هتحتاج 3 حاجات: postgresql-client، rclone (أداة المزامنة)، و R2 bucket متعمل + Access Key.