لماذا تستضيف PocketBase ذاتيًا على VPS
PocketBase هو نظام backend-as-a-service مفتوح المصدر يُوزَّع كملف تنفيذي واحد: لا Postgres منفصل، لا Redis، لا بنية معقدة. يعتمد كليًا على SQLite مما يجعله مثاليًا لخادم VPS متواضع.
باستضافته ذاتيًا، تحتفظ بالسيطرة الكاملة على بيانات مستخدميك وملفاتهم، دون الاعتماد على Firebase أو Supabase المُدار مع الحصص والتأخير. يمنحك VPS عنوان IP ثابتًا ونطاقًا مخصصًا ونسخًا احتياطية تتحكم فيها.
نظرًا لأن PocketBase يكتب في مجلد pb_data واحد، تتلخص استراتيجية النسخ الاحتياطي في نسخ هذا المجلد، مما يبسط التشغيل كثيرًا مقارنة بمجموعة قواعد البيانات التقليدية.
الفوائد العملية لاستضافة PocketBase ذاتيًا
- ملف تنفيذي واحد للنشر: يبدأ في ثوانٍ، بصمة ذاكرة ضئيلة (أقل من 100 ميجابايت عادةً).
- قاعدة بيانات SQLite مدمجة: لا خدمة قاعدة بيانات لإدارتها، النسخ الاحتياطي بنسخ مجلد
pb_data. - مصادقة كاملة (بريد إلكتروني/كلمة مرور، OAuth2، OTP، LDAP) وقواعد وصول دقيقة لكل مجموعة.
- واجهة برمجية فورية عبر Server-Sent Events لمزامنة العملاء تلقائيًا.
- لوحة إدارة ويب كاملة لإدارة المجموعات والمستخدمين والصلاحيات والملفات.
- سيادة البيانات: مستخدموك وملفاتهم على بنيتك التحتية، خلف نطاقك.
- تكلفة يمكن التنبؤ بها: سعر VPS لا يتغير بالحركة، على عكس الفوترة لكل طلب.
المتطلبات الدقيقة: VPS والنظام والبرمجيات
PocketBase خفيف جدًا. إليك ما تحتاجه حسب الحمل:
الحد الأدنى المطلق: 1 vCPU، 512 ميجابايت RAM. كافٍ لمشروع تطوير أو تطبيق صغير بأقل من 1000 مستخدم نشط.
موصى به في الإنتاج: 1 vCPU، 1 جيجابايت RAM. يتعامل PocketBase مع مشروع صغير إلى متوسط بهذا الإعداد بسهولة.
للأحجام الكبيرة: 2 vCPU، 2 جيجابايت RAM. القيد عادةً الكتابة المتزامنة على SQLite لا المعالج.
للتخزين، خطط لـ 20 إلى 40 جيجابايت SSD NVMe حسب حجم الملفات. تجنب أنظمة ملفات الشبكة (NFS) التي قد تتلف القاعدة.
البرمجيات المطلوبة: Docker 24+ وDocker Compose v2، نطاق يشير إلى عنوان IP عبر سجل A، بروكسي عكسي (Caddy أو Nginx) لإدارة TLS.
نشر PocketBase على VPS خطوة بخطوة
إعداد VPS وDNS
اتصل عبر SSH، حدّث النظام بـ
apt update && apt upgrade -y، ثم ثبّت Docker عبر السكريبت الرسمي:curl -fsSL https://get.docker.com | sh. أضف مستخدمك لمجموعة Docker بـusermod -aG docker $USER.أنشئ سجل DNS من النوع A يوجّه
app.your-domain.comإلى عنوان IP العام للخادم. تحقق بـdig app.your-domain.com.إنشاء هيكل الملفات
أنشئ مجلدًا مخصصًا وملف التكوين:
mkdir -p /opt/pocketbase && cd /opt/pocketbaseأنشئ ملف
docker-compose.ymlبالمحتوى التالي:services: pocketbase: image: ghcr.io/muchobien/pocketbase:latest restart: unless-stopped volumes: - ./pb_data:/pb_data expose: - "8090"لا تنشر المنفذ
8090مباشرة على الإنترنت — دع البروكسي العكسي يتولى الأمر.إعداد HTTPS مع Caddy
يحصل Caddy تلقائيًا على شهادات Let's Encrypt ويجددها. أنشئ
/opt/pocketbase/Caddyfile:app.your-domain.com { reverse_proxy pocketbase:8090 }أضف خدمة Caddy في
docker-compose.yml:caddy: image: caddy:2-alpine restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./Caddyfile:/etc/caddy/Caddyfile - caddy_data:/data depends_on: - pocketbase volumes: caddy_data:يُفعّل Caddy WebSockets تلقائيًا. إذا فضّلت Nginx، أضف رؤوس
UpgradeوConnectionفيlocation /.التشغيل والتحقق
شغّل البنية بـ
docker compose up -dثم تابع السجلات:docker compose logs -f pocketbaseيجب أن ترى سطرًا يشير إلى أن PocketBase يستمع على
0.0.0.0:8090. تحقق من HTTPS بـcurl -I https://app.your-domain.com/_/— يجب أن يعيدHTTP/2 200.إنشاء حساب المشرف الأول
افتح
https://app.your-domain.com/_/في متصفحك. عند أول وصول، يطلب PocketBase إنشاء حساب مشرف أعلى (بريد + كلمة مرور). افعل هذا فورًا بعد التشغيل — قبل إتاحة الرابط للعموم — لأن أي شخص يصل/_/يمكنه إنشاء هذا الحساب على نسخة جديدة.
إعداد مصادقة OAuth (Google وGitHub وGitLab)
يدعم PocketBase OAuth2 بشكل أصلي مع عدة موفرين: Google وGitHub وGitLab وDiscord وTwitter/X وMicrosoft وApple وغيرهم. يتم الإعداد كليًا من لوحة الإدارة.
لـ Google OAuth:
1. افتح Google Cloud Console، أنشئ مشروعًا وفعّل "OAuth consent screen".
2. في "Credentials"، أنشئ "OAuth 2.0 Client ID" من نوع "Web application".
3. أضف https://app.your-domain.com/api/oauth2-redirect كـ URI إعادة توجيه مصرح به.
4. انسخ Client ID وClient secret.
5. في PocketBase /_/، اذهب إلى Settings → Auth providers → Google، فعّله والصق بياناتك.
لـ GitHub OAuth:
1. في GitHub، اذهب إلى Settings → Developer settings → OAuth Apps → New OAuth App.
2. عيّن https://app.your-domain.com كـ Homepage URL وhttps://app.your-domain.com/api/oauth2-redirect كـ Authorization callback URL.
3. انسخ Client ID وأنشئ Client Secret.
4. فعّل GitHub في Settings → Auth providers في PocketBase.
يظهر كل موفر مفعّل تلقائيًا في صفحة تسجيل الدخول. يحتاج الفرونت إند فقط إلى استدعاء pb.collection('users').authWithOAuth2({ provider: 'google' }) عبر SDK JavaScript.
النسخ الاحتياطي التلقائي: SQLite والملفات
يخزن PocketBase كل شيء في مجلد pb_data: قاعدة البيانات (pb_data/data.db)، الملفات المرفوعة (pb_data/storage/) والسجلات. النسخ الاحتياطي الكامل هو مجرد أرشفة هذا المجلد.
الطريقة 1 — cron بسيط: أضف هذا السطر إلى crontab (crontab -e) لنسخة احتياطية يومية الساعة 3 صباحًا:
0 3 * * * tar czf /var/backups/pocketbase-$(date +\%F).tar.gz /opt/pocketbase/pb_data && find /var/backups -name 'pocketbase-*.tar.gz' -mtime +7 -deleteالطريقة 2 — نسخ PocketBase المدمجة: من /_/، اذهب إلى Settings → Backups. يمكن لـ PocketBase إنشاء أرشيفات pb_data من الإدارة أو عبر API (POST /api/backups).
الطريقة 3 — rclone إلى S3: للنسخ خارج الموقع تلقائيًا:
0 4 * * * rclone sync /opt/pocketbase/pb_data your-remote:pocketbase-backup/احتفظ دائمًا بنسخة خارج الخادم — إذا تعطل القرص، لا تُجدي النسخة المحلية.
وضع WAL في SQLite والأداء
يُفعّل PocketBase وضع WAL (Write-Ahead Logging) في SQLite بشكل افتراضي في الإصدارات الحديثة. يتيح هذا الوضع القراءة المتزامنة أثناء الكتابة. إذا واجهت مهلة انتهاء في ظل الضغط العالي، تحقق بـ PRAGMA journal_mode; في مشرف SQL — يجب أن تكون الإجابة wal.
للحركة العالية، ضع pb_data على مجلد NVMe وتجنب أي نظام ملفات شبكي.
استكشاف الأخطاء: الأخطاء الشائعة
المنفذ مستخدم بالفعل: إذا فشل docker compose up بـ bind: address already in use، تحقق بـ ss -tlnp | grep ':80' أي خدمة تشغل المنفذ. أوقفها (systemctl stop nginx) أو غيّر منافذها.
صلاحيات pb_data: يعمل PocketBase بالمستخدم nobody (UID 65534) في الحاوية الرسمية. إذا كان المجلد أُنشئ بـ root، فالعملية لا تستطيع الكتابة. صحّح بـ chown -R 65534:65534 /opt/pocketbase/pb_data.
/_/ غير متاحة بعد التشغيل: تحقق من أن البروكسي العكسي يشير إلى اسم الخدمة Docker (pocketbase:8090) وليس localhost:8090. في شبكة Docker Compose، تتواصل الخدمات بأسمائها.
تحديث PocketBase: غيّر وسم الصورة في docker-compose.yml ثم docker compose pull && docker compose up -d. يُطبّق PocketBase ترحيلات المخطط تلقائيًا. احتفظ بنسخة من pb_data قبل أي تحديث رئيسي.
شهادة Let's Encrypt لم تُحصل: يحتاج Caddy المنفذين 80 و443 متاحَين من الإنترنت. تحقق من جدار الحماية (ufw status).
للمضي قُدمًا: CLI الإدارة والمجموعات والخطافات
CLI الإدارة: يكشف PocketBase واجهة سطر أوامر للعمليات الشائعة. من الحاوية: docker exec -it pocketbase_pocketbase_1 /pb/pocketbase --help.
المجموعات المخصصة: في /_/، أنشئ مجموعاتك (ما يعادل الجداول) بتعريف حقول مكتوبة (نص، رقم، منطقي، تاريخ، ملف، علاقة، JSON). تُعبَّر قواعد API بصياغة PocketBase (@request.auth.id != "" للتقييد بالمستخدمين المسجلين).
الخطافات (JavaScript من جانب الخادم): منذ PocketBase v0.17، يمكنك توسيع الواجهة الخلفية بسكريبتات JavaScript تعمل من جانب الخادم (pb_hooks/*.pb.js). أمثلة: إرسال بريد عند إنشاء مستخدم، التحقق من بيانات معقدة، تشغيل webhook.
SDK JavaScript: يبسّط SDK الرسمي (npm install pocketbase) الاستدعاءات من React أو Vue أو التطبيقات المحمولة. يتولى المصادقة وتحديث التوكن والاشتراكات الفورية (pb.collection('tasks').subscribe('*', callback)).
PocketBase مقابل البدائل المستضافة ذاتيًا
مرّر الجدول أفقيًا
| المعيار | PocketBase | Supabase self-hosted | Appwrite |
|---|---|---|---|
| تعقيد التثبيت | منخفض جدًا (ملف واحد أو حاوية واحدة) | مرتفع (10+ خدمات) | متوسط (6 خدمات) |
| الحد الأدنى من RAM | 512 ميجابايت | 4 جيجابايت+ | 2 جيجابايت+ |
| قاعدة البيانات | SQLite مدمج | PostgreSQL | MariaDB |
| مصادقة OAuth | نعم (أصلي) | نعم (GoTrue) | نعم (أصلي) |
| الوقت الفعلي | Server-Sent Events | WebSocket | WebSocket |
| تخزين الملفات | نعم (محلي + S3) | نعم (S3 متوافق) | نعم (محلي + S3) |
| التوسع الأفقي | لا (SQLite ملف واحد) | نعم (PostgreSQL) | محدود |
التوثيق الرسمي
للإعداد المتقدم والخيارات الخاصة بالأداة، راجع التوثيق الرسمي لـ PocketBase. يغطي هذا الدليل النشر على VPS؛ توثيق الناشر هو المرجع للضبط الدقيق والتحديثات الرئيسية.
إذا أردت اختبار PocketBase دون Docker، نزّل الملف التنفيذي لـ Linux من github.com/pocketbase/pocketbase/releases، شغّل ./pocketbase serve --http=0.0.0.0:8090 وأنشئ خدمة systemd لإعادة التشغيل التلقائي.