لماذا تنشر Keycloak على خادمك VPS
حيث تسعى بعض مزوّدات الهوية (IdP) إلى البساطة، يسعى Keycloak إلى الشمولية: عزل متعدد المستأجرين عبر realms، واتحاد أدلة LDAP/Active Directory، والوساطة (brokering) نحو مزوّدين خارجيين (Google وGitHub أو OIDC آخر)، وتخصيص كامل لمظهر صفحات تسجيل الدخول، وتفويض دقيق (fine-grained authorization). وبالنسبة إلى وكالة تدير عدة عملاء أو نظام معلومات ذي متطلبات امتثال، فإن هذا المستوى من التحكّم حاسم. تجنّبك الاستضافة الذاتية على خادم VPS التكاليف لكل مستخدم في عروض IdP المُدارة، وتُبقي قاعدة الهويات بأكملها ضمن نطاق سلطتك القضائية، وهي نقطة بالغة الأهمية للبيانات الحساسة التي لا ترغب في تسليمها إلى طرف ثالث.
مزايا Keycloak المستضاف ذاتيًا
- realms متعددة لعزل عدة عملاء أو بيئات عزلًا كاملًا على نفس النسخة (instance) الواحدة.
- دعم أصلي وكامل لـ OpenID Connect وOAuth2 وSAML 2.0.
- اتحاد LDAP / Active Directory لإعادة استخدام دليل قائم دون عملية ترحيل.
- الوساطة في الهوية (Identity brokering): تسجيل الدخول عبر Google أو GitHub أو أي IdP خارجي ببضع نقرات.
- صفحات تسجيل دخول قابلة للتخصيص بالكامل (السمات، اللغات، الهوية البصرية لكل realm).
- سياسات مصادقة دقيقة: مصادقة متعددة العوامل (MFA) مشروطة، ومدة الجلسة، وقيود حسب الدور.
المتطلبات المسبقة لهذا النشر
يعمل Keycloak على الآلة الافتراضية لجافا JVM (على Quarkus منذ الإصدار v17+) ويظل أكثر استهلاكًا للموارد من مزوّد هوية خفيف. خصّص خادم VPS بـ 2 vCPU و4 غيغابايت من RAM كحدّ أدنى، ويُفضَّل 6 غيغابايت إذا كنت تتوقّع حِملًا أو عدة realms نشطة. يُوصى بشدّة باستخدام قاعدة PostgreSQL خارجية في بيئة الإنتاج (لا تستخدم أبدًا قاعدة H2 المدمجة خارج نطاق الاختبارات). ويكتمل ما يلزم بوجود Docker وDocker Compose ونطاق مخصّص (sso.mydomain.com) ووكيل عكسي (reverse proxy) يتولّى SSL، لأن Keycloak يحتاج إلى إعلامه بأنه يُقدَّم خلف وكيل HTTPS.
نشر Keycloak مع PostgreSQL
تعريف Keycloak وPostgreSQL في Compose
في ملف docker-compose.yml، عرّف خدمة postgres (الصورة postgres:16) وخدمة keycloak (الصورة quay.io/keycloak/keycloak). اربط Keycloak بقاعدة البيانات عبر KC_DB=postgres وKC_DB_URL وKC_DB_USERNAME وKC_DB_PASSWORD.
تهيئة وضع الإنتاج والوكيل
شغّل باستخدام الأمر start (وليس start-dev). عيّن KC_HOSTNAME=sso.mydomain.com وKC_PROXY_HEADERS=xforwarded حتى يُنشئ Keycloak عناوين URL صحيحة خلف الوكيل العكسي. وحدّد المسؤول الأولي عبر KC_BOOTSTRAP_ADMIN_USERNAME / KC_BOOTSTRAP_ADMIN_PASSWORD.
البدء وإتمام عملية البناء (build)
نفّذ docker compose up -d. عند التشغيل الأول، يُجري Keycloak عملية بناء Quarkus مُحسّنة ثم يُرحّل مخطّط PostgreSQL. تابِع docker compose logs -f keycloak حتى تظهر الرسالة التي تشير إلى أن الخادم في وضع الاستماع.
إعداد الوكيل العكسي مع SSL
وجّه sso.mydomain.com إلى المنفذ 8080 في حاوية Keycloak عبر Caddy أو Traefik أو Nginx، مع شهادة Let's Encrypt. واحرص على تمرير ترويسات X-Forwarded-* وإلا فستتعطّل عمليات إعادة التوجيه عند تسجيل الدخول.
إنشاء realm وعميل (client)
سجّل الدخول إلى وحدة تحكّم المسؤول، وأنشئ realm مخصّصًا (لا تستخدم أبدًا realm master لتطبيقاتك)، ثم عميل OIDC. اضبط قيمة Valid redirect URIs لتطبيقك، واحصل على Client ID والسرّ من تبويب Credentials.
ربط تطبيق واختبار التدفّق (flow)
هيّئ تطبيقك باستخدام عنوان الاكتشاف https://sso.mydomain.com/realms/mon-realm/.well-known/openid-configuration. أنشئ مستخدمًا تجريبيًا في الـ realm، وابدأ عملية تسجيل دخول، وتحقّق من إصدار الرمز (token) في قسم Sessions بوحدة التحكّم.
Keycloak أم Authentik: أيّهما تختار؟
| المعيار | Keycloak | Authentik |
|---|---|---|
| حالة الاستخدام المستهدفة | تسجيل دخول موحّد للمؤسسات، متعدد المستأجرين، الامتثال | الاستضافة الذاتية، المختبر المنزلي (homelab)، الوكالات |
| البروتوكولات | OIDC, OAuth2, SAML, LDAP | OIDC, OAuth2, SAML, LDAP, forward auth |
| Forward auth (الوكيل) | غير أصلي (عبر إضافات) | أصلي ومحوري في الأداة |
| استهلاك الموارد | مرتفع (JVM، 4 غيغابايت+ RAM) | معتدل (2-4 غيغابايت RAM) |
| realms / المستأجرون المتعددون | ممتاز (realms معزولة) | المستأجرون مدعومون، لكن بشكل أقل تطوّرًا |
| تخصيص التدفّقات (flows) | السمات وواجهة SPI بجافا | تدفّقات مرئية على شكل خطوات |
| منحنى التعلّم | حادّ، وشامل جدًا | أيسر منالًا |
| اتحاد الأدلة | ناضج (LDAP/AD) | جيّد (LDAP) |
في بيئة الإنتاج، لا تُشغّل Keycloak أبدًا بقاعدة H2 المدمجة ولا تُتِح realm master للعموم: أنشئ realm مخصّصًا لكل تطبيق أو لكل عميل، واحتفظ بـ master للإدارة فقط. ولتحصين النسخة، عطّل التسجيل الحرّ، وفعّل brute force detection في Realm Settings > Security Defenses، وهيّئ كل شيء عبر ملفات استيراد realm (--import-realm) كي تُخضع تهيئتك لإدارة الإصدارات بدلًا من النقر في واجهة المستخدم.