لماذا تستضيف واجهتك الخلفية BaaS بنفسك
توفّر عليك الواجهة الخلفية كخدمة (BaaS) إعادة كتابة المصادقة، والصلاحيات، وتخزين الملفات، وواجهات API الآنيّة لكل مشروع. لكن العروض السحابية لـ Supabase وAppwrite تحاسب على الاستخدام (الصفوف المقروءة، والتخزين، والمستخدمون النشطون شهرياً MAU) وتقيّد الوصول إلى قاعدة البيانات الأساسية. وباستضافتها ذاتياً على خادم VPS، تستعيد وصولاً مباشراً بلغة SQL، وتكاليف ثابتة يمكن توقّعها، وسيادة تامة على بيانات المستخدمين، وهو أمر حاسم للامتثال. يعتمد Supabase كلياً على PostgreSQL ويعرض واجهة REST/GraphQL مولَّدة تلقائياً إضافةً إلى الآنيّة عبر سجلات WAL. أما Appwrite فيجرّد الاستمرارية خلف واجهته الخاصة ويضمّ أصلاً دوالّ عديمة الخادم (serverless) متعددة بيئات التشغيل، ونظام صلاحيات دقيقاً حتى مستوى المستند، ومحرّك إعادة ترميز للصور.
مزايا استضافة BaaS ذاتياً
- وصول SQL مباشر إلى PostgreSQL (Supabase) للاستعلامات والعروض (views) والترحيلات دون وسيط.
- تكاليف ثابتة مرتبطة بخادم VPS، دون محاسبة على عدد الصفوف المقروءة أو المستخدمين النشطين.
- بيانات المستخدمين والملفات مستضافة محلياً: تحكّم في مكان إقامة البيانات.
- تخصيص الدوال عديمة الخادم ببيئات التشغيل والاعتماديات الخاصة بك.
- لا بدء بارد (cold start) ولا حصص تنفيذ مفروضة من سحابة خارجية.
- التكامل مع شبكة Docker الخاصة مع بقية خدماتك الداخلية.
| المعيار | Supabase | Appwrite |
|---|---|---|
| قاعدة البيانات | PostgreSQL أصلية (وصول SQL كامل) | تجريد خاص (MariaDB في الأساس) |
| الواجهة المعروضة | REST + GraphQL مولّدتان تلقائياً (PostgREST) | REST + GraphQL + SDK متعدد اللغات |
| الآنيّة | اشتراكات على تغيّرات PostgreSQL | قنوات آنيّة لكل مجموعة (collection) |
| الدوال عديمة الخادم | Edge Functions (Deno) | دوال متعددة بيئات التشغيل (Node، Python، PHP، Dart…) |
| الصلاحيات | Row Level Security في PostgreSQL | صلاحيات لكل مستند ولكل دور |
| بنية الحاويات | حزمة مركّبة (~10 خدمات) | حزمة مركّبة حول حاوية رئيسية |
| الذاكرة الموصى بها للاستضافة الذاتية | 4 غيغابايت كحد أدنى | 2 إلى 4 غيغابايت |
| الجمهور المستهدف | الفرق المرتاحة مع SQL | المطوّرون الباحثون عن واجهة موحّدة |
متطلبات نشر سليم
Supabase المستضاف ذاتياً حزمة مركّبة من نحو عشر حاويات (Postgres، GoTrue، PostgREST، Realtime، Storage، Kong، Studio…). جهّز خادم VPS بما لا يقل عن 2 vCPU و4 غيغابايت من الذاكرة، مع 20 غيغابايت من قرص SSD/NVMe لقاعدة البيانات والملفات. أما Appwrite فأكثر تواضعاً عند الإقلاع: 2 vCPU و2 غيغابايت من الذاكرة تكفي للبدء، لكن ارتقِ إلى 4 غيغابايت بمجرد أن تعمل الدوال عديمة الخادم، لأن كل تنفيذ يُطلق حاوية. في الحالتين: Docker Compose v2 إلزامي، ونطاق مخصّص (api.mydomain.com)، ووسيط عكسي يدير HTTPS وWebSockets (لا غنى عنهما للآنيّة).
انشر واجهتك الخلفية المستضافة ذاتياً
الحصول على الحزمة الرسمية
بالنسبة لـ Supabase: git clone --depth 1 https://github.com/supabase/supabase ثم انسخ docker/.env.example إلى .env. بالنسبة لـ Appwrite، يتم التثبيت عبر docker run لسكربت تهيئة يولّد docker-compose.yml و.env.
توليد الأسرار وتحصينها
هذه أكثر خطوة حرِجة. أعِد حتماً توليد POSTGRES_PASSWORD وJWT_SECRET وANON_KEY وSERVICE_ROLE_KEY لـ Supabase؛ فالمفاتيح الافتراضية علنية. بالنسبة لـ Appwrite، حدّد _APP_OPENSSL_KEY_V1 وكلمة مرور قوية للمدير.
إعداد النطاق والروابط العامة
املأ API_EXTERNAL_URL=https://api.mydomain.com وSITE_URL من جهة Supabase، أو _APP_DOMAIN و_APP_DOMAIN_TARGET من جهة Appwrite، كي تكون عمليات إعادة توجيه OAuth وروابط البريد الإلكتروني صحيحة.
تشغيل الحزمة
نفّذ docker compose up -d. راقب docker compose ps: يجب أن تنتقل جميع الخدمات إلى healthy. يُقدَّم Supabase Studio عبر Kong على المنفذ 8000، وواجهة Appwrite على 80/443 الداخلي.
وضع Kong/Appwrite خلف HTTPS
مع Traefik أو Caddy، وجّه api.mydomain.com نحو المنفذ المعروض وفعّل تمرير WebSockets (Upgrade/Connection) للآنيّة. افرض إعادة التوجيه من HTTP إلى HTTPS.
التهيئة والاختبار
أنشئ أول مشروع/مستخدم عبر Studio (Supabase) أو وحدة التحكم (Appwrite)، ثم اختبر المصادقة واستعلاماً من SDK للعميل. تحقّق من أن الاشتراكات الآنيّة تنقل التغييرات جيداً.
بالنسبة لـ Supabase في الإنتاج، لا تخزّن قاعدة البيانات على وحدة تخزين Docker الافتراضية أبداً: اربط وحدة تخزين مخصّصة وجدوِل عمليات pg_dump مشفّرة إلى تخزين خارجي، لأن الاستعادة من وحدة تخزين تالفة أمر لا يمكن إدارته. فعّل أيضاً Row Level Security على جميع جداولك منذ الإنشاء، وإلا فإن ANON_KEY يمنح وصولاً كاملاً. على صعيد Appwrite، قيّد زمن تشغيل الدوال وعدد حاويات التنفيذ المتزامنة عبر _APP_FUNCTIONS_* لمنع ذروة من الطلبات من إشباع خادم VPS.