دليل النشر

استضافة Logto على خادم VPS: طبقة المصادقة عندك

انشر على VPS Cloud ←

دليل عملي

التطوير

استضافة Logto على خادم VPS: طبقة المصادقة عندك

تُفوتر خدمات المصادقة المستضافة بحسب المستخدم النشط شهرياً، وتحتفظ ببيانات تسجيل دخول مستخدميك على خوادمها. Logto هو البديل مفتوح المصدر: منصة مصادقة OIDC/OAuth 2.0 كاملة تنشرها على خادمك الخاص وتتحكم بها من الألف إلى الياء. ملف Docker Compose واحد، حاويتان (Logto وPostgreSQL 17)، وتصبح تطبيقاتك مجهّزة بمصادقة جاهزة للإنتاج — تسجيل، دخول اجتماعي، MFA، تحكم في الوصول حسب الأدوار — بلا تكلفة لكل مستخدم.

10 دقائق للقراءةعدد الخطوات: 10
المحتويات· ما هو Logto — وما ليس هو1/11
  1. 01ما هو Logto — وما ليس هو
  2. 02المتطلبات
  3. 03كيف يعمل Logto في الإنتاج
  4. 04ما يقدّمه Logto فور التثبيت
  5. 05النشر عبر Docker Compose خطوة بخطوة
  6. 06أول تسجيل دخول
  7. 07دمج Logto في تطبيق Next.js
  8. 08تفعيل الدخول عبر Google
  9. 09Logto وAuthentik وAuthelia وKeycloak — أيهم تختار؟
  10. 10استكشاف الأخطاء الشائعة
  11. 11استراتيجية النسخ الاحتياطي

ما هو Logto — وما ليس هو

Logto هو منصة مصادقة تُسلَّم كحزمة تطوير: تدمجها في شيفرة تطبيقك في نحو خمسة عشر سطراً، فتتكفّل بدورة حياة الحسابات كاملة على خادمك أنت. وهذا يختلف عن أداتَي المصادقة الأخريين في كتالوج ServOrbit:

- Authelia يضيف المصادقة الثنائية والدخول الموحّد *أمام* تطبيقات قائمة، عبر التفويض، من دون المساس بشيفرتها — فهو يحمي تطبيقات لا تملك شاشة دخول أصلاً.
- Authentik مزوّد هوية كامل، لتوحيد الدخول إلى أدواتك المستضافة ذاتياً (‎Grafana وGitea وNextcloud).
- Logto يحلّ محلّ خدمة مصادقة مستضافة: تستدعي حزمته من تطبيقك بلغة React أو Python أو Go، فيدير الحسابات والجلسات والموصلات الاجتماعية والرموز.

إن كنت تبني منتجاً ينشئ فيه المستخدمون حسابات، فـ Logto هو الأداة المناسبة.

المتطلبات

قبل نشر ‎Logto 1.19+، تحقّق من النقاط التالية على خادمك الافتراضي في ServOrbit:

- الذاكرة: ‏2 غيغابايت على الأقل (يُنصح بـ 4 غيغابايت إن كنت تتوقع أكثر من 5 000 مستخدم نشط). يعمل Logto على ‎Node.js 20 LTS ويتشارك النسخة نفسها مع ‎PostgreSQL 17.
- المعالج: يكفي ‎1 vCPU للبدء، لكن ‎2 vCPU يتجنّبان تأخيرات الدخول تحت الحمل.
- التخزين: احجز ‏10 غيغابايت على الأقل — يخصّص PostgreSQL سجلات WAL وتتراكم الجلسات النشطة بسرعة مع تسجيل التدقيق الافتراضي.
- ‏Docker ‏≥ 24.0 وDocker Compose ‏≥ 2.20 — مثبّتان مسبقاً في جميع باقات ServOrbit.
- ‏PostgreSQL 17 كحدّ أدنى (مضمّن في صورة Logto الرسمية) — الإصدارات الأقدم تفتقر إلى الامتدادات المطلوبة.
- اسم نطاق أو نطاق فرعي موجّه إلى خادمك ومُحلَّل علناً: يضمّن Logto هذا النطاق في كل رمز OIDC يصدره. يجب تحديده قبل أول تشغيل ولا يمكن تغييره دون إعادة تهيئة جميع بيانات المستخدمين.

كيف يعمل Logto في الإنتاج

يشغّل Logto حاويتين: ‎db (وهي ‎PostgreSQL 17 للمستخدمين والتطبيقات والجلسات وسجلّ التدقيق) و‎logto (وهي ‎Node.js التي تخدم نقطة OIDC على المنفذ ‎3001 ووحدة الإدارة على المنفذ ‎3002). ويحوّل الوكيل العكسي ‎nginx على خادمك حركة HTTPS القادمة إلى نطاقك نحو المنفذ ‎3001 — وهي النقطة التي تصادق عليها تطبيقاتك. أما المنفذ ‎3002 فمرتبط بالعنوان المحلي فقط، ولا يُبلغ إلا عبر نفق SSH، وهو ما يبقي إدارة قاعدة المستخدمين بعيداً عن الإنترنت العام.

ما يقدّمه Logto فور التثبيت

  • رموز مطابقة لـ OIDC/OAuth 2.0 — رموز JWT موقّعة تتحقّق منها أي مكتبة قياسية (‎passport.js أو ‎python-jose أو ‎go-oidc) من دون شيفرة خاصة.
  • موصلات تسجيل دخول اجتماعي — فعّل ‎Google وGitHub وApple وMicrosoft وDiscord ونحو ثلاثين مزوّداً آخر من وحدة الإدارة بنقرة واحدة.
  • مصادقة بلا كلمة مرور — روابط سحرية بالبريد أو رموز لمرة واحدة بالرسائل القصيرة (‎Twilio أو ‎SendGrid أو ‎Mailgun)، من دون صيانة خدمة إشعارات منفصلة.
  • المصادقة الثنائية — رموز TOTP (‎Google Authenticator وAuthy)، ومفاتيح عتادية بمعيار ‎WebAuthn/FIDO2، ورموز احتياطية، تُفرض بسياسة من وحدة الإدارة.
  • التحكّم بالوصول حسب الأدوار — عرّف الأدوار والصلاحيات في وحدة الإدارة، واستقبلها ضمن مطالبة ‎scope في رمز JWT، وطبّقها في واجهتك البرمجية بسطر وسيط واحد.
  • حزم تطوير لأكثر من عشرين إطاراً — React وNext.js وVue وAngular وReact Native وFlutter وPython وFastAPI وGo وPHP وLaravel و‎.NET وJava وSpring Boot وغيرها.

النشر عبر Docker Compose خطوة بخطوة

  1. إنشاء المجلد وملف Compose

    اتصل بخادمك عبر SSH ثم أنشئ مجلد العمل:

    mkdir -p /opt/logto && cd /opt/logto

    أنشئ ملف ‎docker-compose.yml بالمحتوى التالي. استبدل ‎auth.your-domain.com بنطاقك الخاص.

  2. توليد الأسرار وإنشاء ملف ‎.env

    ولّد كلمة مرور قاعدة بيانات قوية ومفتاح AES-256:

    DB_PASSWORD=$(openssl rand -hex 32)
    SECRET_VAULT_KEK=$(openssl rand -hex 32)
    printf "DB_PASSWORD=%s\nSECRET_VAULT_KEK=%s\n" "$DB_PASSWORD" "$SECRET_VAULT_KEK" > ‎.env
    chmod 600 ‎.env

    تأكد من أن ‎.env يحتوي على سطرين غير فارغَين قبل المتابعة.

  3. ضبط nginx كوكيل عكسي

    أنشئ المضيف الافتراضي ‎/etc/nginx/sites-available/logto وأعِد تشغيل ‎nginx بعد اختبار الإعداد:

    nginx -t && systemctl reload nginx
  4. تشغيل المكدّس والتحقّق منه

    شغّل الحاويتين:

    docker compose up -d

    تابع السجلات لمدة 60 ثانية للتأكد من أن PostgreSQL جاهز وأن Logto أتمّ ترحيلاته. يجب أن ترى السطر ‎App is running at https://auth.your-domain.com.

  5. التحقّق من وثيقة اكتشاف OIDC

    من جهازك المحلي، تحقّق من استجابة نقطة OIDC:

    curl -s https://auth.your-domain.com/.well-known/openid-configuration | python3 -m json.tool | head -10

    يجب أن تحتوي الاستجابة على ‎issuer و‎authorization_endpoint و‎jwks_uri. إن أعادت الأمر خطأ ‎502، فانتظر 30 ثانية وأعد المحاولة.

  6. إعداد النسخ الاحتياطية التلقائية

    أضف مهمة cron لتصدير قاعدة البيانات يومياً. للحصول على نسخ آلية مشفّرة نحو S3 أو Backblaze B2، اربط وحدة تخزين ‎logto_db بنسخة Backrest المتاحة في كتالوج ServOrbit.

أول تسجيل دخول

  1. فتح نفق SSH إلى وحدة الإدارة

    تستمع وحدة الإدارة على المنفذ ‎3002، المرتبط بالعنوان المحلي لأسباب أمنية. من جهازك، افتح النفق:

    ssh -L 3002:127.0.0.1:3002 root@ip-of-your-vps

    ابقِ هذه النافذة مفتوحة طوال جلسة الإدارة.

  2. إنشاء حساب المدير

    افتح ‎http://localhost:3002 في متصفحك. يظهر معالج أول تشغيل — لا توجد أي بيانات اعتماد افتراضية. أدخل عنوان بريد إلكتروني وكلمة مرور قوية، ثم انقر على ‎Create account. احفظ هذه البيانات في مدير كلمات المرور.

  3. استكشاف لوحة المعلومات

    بعد إنشاء الحساب، تصل إلى لوحة معلومات Logto. من هنا يمكنك الاطلاع على سجل التدقيق وإدارة المستخدمين وضبط الموصلات الاجتماعية وإنشاء تطبيقات — وهي الكيان في Logto الذي يمثّل أحد مشاريعك.

  4. إنشاء تطبيقك الأول

    في وحدة الإدارة: ‏Applications → Create application. اختر النوع المناسب لمشروعك (Traditional Web أو Single Page App أو Native أو Machine-to-machine). أعطِه اسماً، ثم أدخل ‏Redirect URI — العنوان الذي يعيد Logto التوجيه إليه بعد نجاح تسجيل الدخول. يولّد Logto عندئذ ‎App ID و‎App Secret اللذان ستستخدمهما في حزمة التطوير.

دمج Logto في تطبيق Next.js

ثبّت حزمة التطوير بالأمر ‎npm install @logto/next، ثم أنشئ ملف ‎logto.ts يصدّر ‎new LogtoClient({ … }) مضبوطاً بـ ‎endpoint (عنوان نسخة Logto لديك) و‎appId و‎appSecret (من وحدة إدارة Logto) و‎baseUrl (عنوان تطبيقك) و‎cookieSecret و‎cookieSecure.

ولحماية مسار، استدعِ ‎getLogtoContext({ getAccessToken: true }) المستورد من ‎@logto/next/server-component: فهو يعيد ‎isAuthenticated ومطالبات المستخدم. وإن كانت ‎isAuthenticated غير محقّقة فأعد التوجيه إلى ‎/api/logto/sign-in، وإلا فاعرض الصفحة اعتماداً على المطالبات الواردة.

تفعيل الدخول عبر Google

في وحدة تحكّم Google Cloud، أنشئ معرّف عميل OAuth 2.0 من نوع تطبيق ويب. اضبط عنوان إعادة التوجيه على ‎https://auth.your-domain.com/callback/google، ثم انسخ معرّف العميل وسرّه.

وفي وحدة إدارة Logto ← الموصلات ← الموصلات الاجتماعية ← ‏Google ← تفعيل. ألصق المعرّف والسرّ ثم احفظ. يظهر Google عندئذ خياراً للدخول في صفحة Logto لديك، من دون أي تعديل في شيفرة تطبيقك.

Logto وAuthentik وAuthelia وKeycloak — أيهم تختار؟

مرّر الجدول أفقيًا

الحلحالة الاستخدام الأساسيةالذاكرة الدنياتعقيد دمج حزمة SDK
**Logto**المصادقة لمنتج تبنيه (تسجيل، JWT، موصلات اجتماعية)‏2 غيغابايتمنخفض — حزمة SDK رسمية في 15 سطراً لـ React وNext.js وPython وGo وFlutter وأكثر من 15 إطاراً آخر
**Authentik**‏SSO مركزي لأدواتك المستضافة ذاتياً (Grafana وGitea وNextcloud وProxmox)‏2 غيغابايتمتوسط — الضبط عبر Providers في وحدة الإدارة، بلا SDK تطبيقية
**Authelia**‏MFA وبوابة دخول أمام تطبيقات قائمة دون تعديل شيفرتها‏256 ميغابايتمعدوم — تفويض مصادقة عبر ترويسة nginx، بلا دمج SDK
**Keycloak**‏SSO مؤسسي، تفحيد LDAP/AD، سيناريوهات متعددة المستأجرين المتقدمة‏4 غيغابايت كحدّ أدنىمرتفع — ضبط OIDC يدوي، مكتبات عميل تُعدّ لكل إطار

لمنتج SaaS قيد التطوير، Logto هو نقطة البداية الطبيعية. يناسب Keycloak المؤسسات التي تملك دليلاً مؤسسياً تريد دمجه. يلبّي Authelia وAuthentik احتياجات البنية التحتية لا التطبيقات.

استكشاف الأخطاء الشائعة

إليك المشكلات الأربع الأكثر شيوعاً عند أول تثبيت لـ Logto على خادم افتراضي وكيفية حلّها.

وحدة الإدارة غير متاحة (المنفذ ‎3002)

المنفذ ‎3002 مرتبط عمداً بـ ‎127.0.0.1 — فلا يمكن الوصول إليه مباشرة من الإنترنت. إن لم يستجب ‎http://localhost:3002، تحقّق أولاً من أن نفق SSH مفتوح. ثم افحص أن حاوية Logto تعمل: ‎docker compose ps. إن كانت الحاوية في حالة ‎Exit، راجع السجلات: ‎docker compose logs logto --tail=50.

خطأ 502 في اكتشاف OIDC

يُنفّذ Logto ترحيلات قاعدة البيانات عند أول تشغيل، وتستغرق بين 30 و90 ثانية. إن أعاد ‎/.well-known/openid-configuration خطأ ‎502، فـ nginx يُمرّر الطلبات قبل أن يكون Logto جاهزاً. انتظر 90 ثانية وأعد المحاولة. إن استمرّ الخطأ، تحقّق من سلامة PostgreSQL.

عدم تطابق Redirect URI

يتحقّق Logto من عنوان إعادة التوجيه بدقة: إن لم يطابق العنوان المُرسَل من تطبيقك ما هو مُعلَن في وحدة الإدارة، يفشل تسجيل الدخول بخطأ ‎redirect_uri_mismatch. تأكد من تسجيل العنوان الكامل بما فيه المخطط ‎(https://) والمسار الدقيق. عناوين التطوير ‎(http://localhost:3000/…) يجب إضافتها منفصلة.

Fatal: cannot connect to db

إن ظهر في سجلات Logto ‎Fatal: cannot connect to db، فـ PostgreSQL لم يكن جاهزاً لقبول الاتصالات حين حاول Logto الوصول إليه. أعد تشغيل حاوية Logto: ‎docker compose restart logto. ستُعاد المحاولة فور استعداد PostgreSQL.

استراتيجية النسخ الاحتياطي

يحفظ Logto حالته كلها في وحدة تخزين ‎PostgreSQL باسم ‎logto_db. انسخها احتياطياً بمهمة ‎pg_dump مجدولة، أو اربط الوحدة بنسخة Backrest (وهي أيضاً في كتالوج ServOrbit) للحصول على نسخ آلية مشفّرة ومزالة التكرار نحو S3 أو Backblaze B2 أو SFTP. فقدان وحدة ‎logto_db يعني فقدان كل حسابات المستخدمين وإعدادات التطبيقات وسجلّ التدقيق — انسخها قبل أي ترحيل للخادم.

طبقة المصادقة لديك، على خادمك

انشر Logto على خادم افتراضي من ServOrbit: احتفظ ببيانات مصادقة مستخدميك، وتخلّص من الفوترة لكل مستخدم، وادمج حزم التطوير الخاصة بـ React وNext.js وPython وGo وFlutter وغيرها.