스크립트
00:00:00بوكيت بيس (PocketBase) هو بديل مفتوح المصدر لـ سوبربيس (Supabase) أو فايربيس (Firebase) وربما يكون أبسط
00:00:04خلفية يمكنك تشغيلها على الإطلاق، ملف واحد فقط يمنحك قاعدة بيانات في الوقت الفعلي، ومصادقة، و
00:00:11تخزين ملفات. هذا يتناقض تماماً مع مدى التعقيد الجنوني الذي أصبحت عليه تطوير الويب الحديث
00:00:16لذا في فيديو اليوم، سنختبر بوكيت بيس ونرى ما إذا كانت بنيته البسيطة
00:00:21تصمد حقاً عند بناء أي شيء يتجاوز مجرد تطبيق بسيط
00:00:29بوكيت بيس هو ملف تنفيذي (binary) واحد بلغة جو (Go) مع قاعدة بيانات إس كيو لايت (SQLite) مدمجة، لكن البرمجة بلغة جو نفسها هي في الواقع
00:00:35اختيارية لأن الخلفية يمكن توسيعها باستخدام كل من جافا سكريبت وتايب سكريبت، وستحصل أيضاً على
00:00:40وصول إلى واجهة مستخدم إدارية أساسية حيث يمكنك تكوين جميع مجموعاتك تماماً كما يعمل سوبربيس
00:00:46الآن بالانتقال إلى البنية وكيفية استخدامها فعلياً بمجرد تشغيل بوكيت بيس، يمكنك
00:00:51الاتصال به من الواجهة الأمامية عبر حزمة تطوير البرامج (SDK) الخاصة بجافا سكريبت. هذا مرة أخرى يشبه إلى حد كبير كيفية تصميم
00:00:57فايربيس وسوبربيس، حيث يمكنك الوصول إلى قاعدة بياناتك مباشرة من الواجهة الأمامية ولا
00:01:02تقلق، فبوكيت بيس لديه قواعد واجهة برمجة تطبيقات (API) ومصادقة للحفاظ على أمان كل هذه القواعد. ولكن دعنا ننتقل مباشرة إلى
00:01:08عرض توضيحي لإظهار تطبيق حقيقي مع مصادقة، وقاعدة بيانات، وتخزين ملفات. وإذا كنت تستمتع بهذا
00:01:13الفيديو، اشترك في بيتر ستاك (Better Stack) حيث نغطي قدراً هائلاً من محتوى المطورين على هذه القناة
00:01:18إذاً لدينا تطبيقنا هنا، لدينا بوكيت بيس في الخلفية، ولدينا واجهة ويب
00:01:22مكتوبة بلغة رياكت (React). أهم ملف داخل واجهة الويب هو ملف pb.ts هذا هنا لأنه
00:01:30بداخل هذا الملف نقوم بالاستيراد من بوكيت بيس، لذا لدينا فئة بوكيت بيس ونقوم بإنشاء مثيل جديد من
00:01:36ذلك، ثم يمكننا الاتصال بخدمة الخلفية الخاصة بنا، والآن يمكننا استخدام pb في بقية
00:01:42التطبيق. التطبيق نفسه عبارة عن متتبع أخطاء بسيط، يمكننا سحب العناصر بين الأعمدة، ويمكننا
00:01:48إنشاء مشكلات جديدة تماماً. لذا إذا نظرنا داخل الخطاف (hook) الذي يتحكم في المستخدم المسجل دخوله، يمكنك رؤية
00:01:53أننا نضبط الحالة في البداية باستخدام pb.authStore.record، وهذا سيجلب المستخدم المصادق عليه حالياً
00:01:59من بوكيت بيس، ثم نضبط مستمعاً أيضاً فنقول إذا تغير مخزن المصادقة عبر
00:02:05حدث التغيير (onChange)، فسنقوم ببساطة بتعيين المستخدم الجديد في الحالة. إذاً الأمر بسيط حقاً بذلك
00:02:11يمكننا الوصول إلى الحالة، ويمكننا الاشتراك فيها، وينطبق الشيء نفسه على مشكلاتنا أيضاً
00:02:16لذا داخل خطاف استخدام المشكلات، نقوم مرة أخرى بتهيئة بعض الحالة، ولكن في هذه الحالة سنتركها فارغة
00:02:21ثم لدينا useEffect ونقول إننا سنجلب جميع المشكلات، ونحصل على القائمة الكاملة، ثم
00:02:27سنضبط المشكلات بتلك القائمة، مما سيؤدي في البداية إلى ملء البيانات مسبقاً، ثم يمكننا
00:02:32أيضاً مرة أخرى الاشتراك في المشكلات، لذا إذا قمت بسحب المشكلات بين الأعمدة أو إنشاء أو حذف مشكلة
00:02:38يمكننا حينئذٍ القول pb.collection(“issues”).subscribe، وفي أي وقت يأتي سجل جديد يمكننا حينئذٍ
00:02:44إضافته إلى حالتنا. هذا يعني أنه عندما نتفاعل مع قاعدة بيانات بوكيت بيس مباشرة
00:02:49مثل عندما نقوم بسحب بطاقة هنا، سيتم تحديث الحالة تلقائياً. في حالة إنشاء
00:02:54مشكلة جديدة تماماً، يمكننا أيضاً إرفاق لقطة شاشة بها. دعنا نلتقط لقطة شاشة للتطبيق
00:02:59نفسه، ثم ننقر على “تقديم مشكلة” وبعد ذلك تظهر المشكلة الجديدة هنا. في كود الواجهة الأمامية، يتم التعامل مع هذا
00:03:05من خلال وظيفة إرسال (submit)، ونقوم بإلحاق جميع بيانات النموذج، وأخيراً نستدعي pb
00:03:11collection(“issues”).create ونمرر البيانات. ما لدينا في الخلفية هو قواعد
00:03:17واجهة برمجة تطبيقات المجموعة لمنع إساءة استخدام هذه الواجهات، لذا سيعطيك بوكيت بيس واجهة الإدارة هذه افتراضياً
00:03:24وهنا يمكنك أن ترى أن لدينا مجموعة المستخدمين ولدينا أيضاً مجموعة المشكلات
00:03:27حيث تعيش جميع مشكلاتنا. إذا نظرنا داخل مجموعة المستخدمين وضغطنا على الإعدادات هنا في الأعلى
00:03:32فإن لدينا علامة تبويب “قواعد واجهة برمجة التطبيقات” (API rules)، وهذه هي جميع القواعد التي تقيد الوصول إلى هذه المجموعة
00:03:37المحددة. لذا نقول في حالة المستخدمين، لا يمكن أن يكون معرف المصادقة للطلب سلسلة فارغة، وعند
00:03:43تحديث أو حذف المستخدمين، يجب أن يطابق المعرف معرف المستخدم المصادق عليه، ويمكننا الوصول إلى ذلك
00:03:50باستخدام هذه السلسلة الخاصة هنا، حرف @ ثم request.auth.id. إذا كنت قد استخدمت سوبربيس
00:03:56في الماضي، ستجد هذا النوع من النمط مألوفاً جداً. الآن ماذا يحدث إذا كانت الخلفية لا
00:04:02تقوم بكل ما تحتاجه؟ حسناً، لحسن الحظ يمكنك توسيعها عبر الخطافات باستخدام لغة جو بالطبع، ولكن أيضاً جافا سكريبت
00:04:08وتايب سكريبت. لذا يمكننا الربط بأحداث مثل onBootstrap عند بدء التطبيق أو onRecord
00:04:15Create عند إنشاء سجل في قاعدة البيانات. هناك 82 خطافاً فريداً في وقت التصوير، لذا تقريباً
00:04:21كل ما تحتاجه سيكون مغطى. الآن دعنا نوسع خدمة بوكيت بيس الخاصة بنا لنرى كيف يعمل كل ذلك
00:04:27إذا نظرنا داخل مجلد pb يمكنك رؤية أن لدينا ملف بوكيت بيس التنفيذي، وهذا الملف هو حرفياً
00:04:32كل ما تحتاجه لتشغيل الإصدار الافتراضي من بوكيت بيس. في حالتي، كتبت جميع الخطافات
00:04:38بلغة تايب سكريبت، لذا لدي بعض الإعدادات لتجميع تلك الخطافات في مجلد pb_hooks كجافا سكريبت لأن
00:04:44بوكيت بيس يدعم في الواقع جافا سكريبت فقط أصلياً، لذا إذا كنت تستخدم تايب سكريبت فأنت بحاجة إلى تجميعه
00:04:50إذا نظرنا داخل ملف الخطاف الرئيسي يمكننا أن نرى أن لدينا خطافاً هنا يقول onRecordCreate
00:04:55وهذا يستهدف تحديداً متى ننشئ مشكلات، وما نقوم به هنا هو أننا نقول
00:05:00في كل مرة يتم فيها إنشاء سجل، سنرسل بريداً إلكترونياً إلى المستخدم، ويمكننا القيام بذلك عن طريق استدعاء
00:05:05e.app.newMailClient().send وتمرير كائن الرسالة الذي قمنا بإنشائه هنا
00:05:10يمكنك بالطبع الربط بطن من الميزات المختلفة داخل بوكيت بيس، لذا أي وظيفة مخصصة
00:05:15قد تحتاجها ستكون مدعومة دائماً بـ 82 خطافاً إضافياً متاحة بالفعل في بوكيت
00:05:21بيس. نظراً لأن هذا يشغل إس كيو لايت، فهذا يعني أننا بحاجة إلى تخزين دائم، لذا المنصات السابقة مثل هيروكو (Heroku) أو رندر (Render)
00:05:28أو ريلواي (Railway) ستكون في الواقع خياراً سيئاً بسبب أنظمة ملفاتها المؤقتة، وبشكل أساسي ستفقد بياناتك
00:05:33في كل مرة تعيد فيها نشر تطبيقك. لتجنب ذلك، يمكنك إرفاق نظام ملفات دائم، ولكن الخيار الأفضل و
00:05:39الأرخص سيكون مجرد الاستضافة على خادم افتراضي خاص (VPS)، وتلك البيانات تعيش داخل مجلد pb_data، لذا إذا
00:05:45ألقينا نظرة هنا يمكنك رؤية أن لدينا مجلد تخزين، وهذا سيحتوي على جميع
00:05:50الصور التي قمنا بتحميلها مقابل مشكلاتنا، فهي ببساطة مخزنة في مجلد التخزين، لذا
00:05:55داخل هذا المعرف العشوائي هنا على سبيل المثال، يمكنك رؤية الصورة التي حملتها مقابل المشكلة
00:05:59سابقاً. ملفات قاعدة البيانات نفسها سيتم أيضاً الاحتفاظ بها داخل هذا المجلد، لذا data.db هنا، هذا
00:06:05سيحتوي على جميع كود إس كيو لايت الخاص بنا، لذا إذا قمت بحذف هذا الملف، فسأفقد كل البيانات في
00:06:11التطبيق. لذا من الواضح أنك تحتاج إلى استراتيجية نسخ احتياطي جيدة بدلاً من مجرد تركها كملف واحد
00:06:16على القرص. مقارنة بأدوات مثل سوبربيس التي يمكن أن تبدأ بسعر 25 دولاراً للمستوى الأساسي، بوكيت بيس هو
00:06:22مجاني أساساً، عليك فقط دفع تكاليف الخادم الافتراضي الخاص بك (VPS) والتي يمكن أن تصل إلى أربعة دولارات، وتسمح
00:06:28لك بتشغيل العديد من المشاريع كما تريد، ولكن بالطبع سترغب في توسيع نطاق ذلك مع الاستخدام
00:06:33يأتي بوكيت بيس أيضاً مع كل ما تحتاجه لتطبيقات الإنتاج مثل عمليات الترحيل (migrations)، وجدولة المهام، و
00:06:38السجلات (logging). يمكنك أيضاً تقديم ملفات ثابتة مباشرة باستخدام بوكيت بيس عن طريق وضعها في مجلد pb_public
00:06:44وهذا سيكون مفيداً لشيء مثل واجهة رياكت الأمامية. بدلاً من ذلك، يمكنك أيضاً استضافة
00:06:49مسارات ديناميكية مع عرض القوالب، وهذا سيكون مثالياً لأشياء مثل قوالب البريد الإلكتروني. لذا إذا كنت
00:06:54تريد حقاً إعداد صندوق واحد فقط، فهذه هي الطريقة التي تقوم بها بذلك. الآن السؤال الكبير، هل هذا جاهز للإنتاج؟
00:06:59حسناً، إنه يتضمن جميع الميزات التي ستحتاجها لبناء تطبيق برمجيات كخدمة (SaaS) حديث، ولا سيما
00:07:04ميزات مستوى الإنتاج مثل عمليات الترحيل والسجلات، كما أنه قابل للتوسيع بالكامل، لذا فأنت لست عالقاً
00:07:09فقط بالاعدادات الافتراضية. ولكن العقبة الكبيرة هي أن هذا قبل الإصدار الأول (pre-v1)، لذا فهم يقولون صراحةً أن تستخدمه فقط
00:07:15إذا كنت لا تمانع في قراءة سجلات التغيير وإجراء عمليات الترحيل يدوياً من وقت لآخر. ولكن إذا كان هذا
00:07:20أنت، فامض قدماً، يمكنك فقط بناء تطبيقك الأول بملف واحد. يمكنك معرفة المزيد عن بوكيت
00:07:25بيس عن طريق التحقق من الروابط ذات الصلة في الوصف، وإذا كنت تحب البدائل مفتوحة المصدر
00:07:29فراجع الفيديو الخاص بنا حول أوبن كود (OpenCode)، البديل مفتوح المصدر لـ كلود كود (Claude Code). لقد كنت معكم وارن من
00:07:35بيتر ستاك، شكراً للمشاهدة، وبالطبع سأراكم في المرة القادمة