دليل النشر

مركزة المصادقة باستخدام Authentik على خادم VPS

انشر على VPS Cloud ←

دليل عملي

الأمان والمراقبة

مركزة المصادقة باستخدام Authentik على خادم VPS

إدارة كلمة مرور لكل تطبيق لا تصمد على مستوى وكالة أو مختبر منزلي جادّ. Authentik هو مزوّد هوية مفتوح المصدر يركّز تسجيل الدخول الموحّد SSO والمصادقة متعددة العوامل MFA وإدارة المستخدمين. وبنشره على خادمك VPS، يصبح نقطة المصادقة الوحيدة لكامل منظومتك ذاتية الاستضافة.

9 دقائق للقراءةعدد الخطوات: 10
المحتويات· لماذا تركّز المصادقة على خادمك VPS1/13
  1. 01لماذا تركّز المصادقة على خادمك VPS
  2. 02ما تكسبه مع Authentik
  3. 03المتطلبات بالأرقام قبل البدء
  4. 04قائمة تحقق قبل أول docker compose up
  5. 05نشر Authentik باستخدام Docker Compose
  6. 06الوكيل العكسي وTLS
  7. 07حماية تطبيق بـ forward auth على nginx
  8. 08النسخ الاحتياطي واستعادة Authentik
  9. 09ما الذي يجب نسخه احتياطيًا
  10. 10الترقية دون كسر تسجيل الدخول الموحّد
  11. 11لم يعد Redis جزءًا من الحزمة
  12. 12استكشاف الأخطاء: حلقة إعادة التشغيل مع AUTHENTIK_POSTGRESQL__USE_POOL
  13. 13أعطال شائعة أخرى

لماذا تركّز المصادقة على خادمك VPS

عندما تتراكم لديك الأدوات ذاتية الاستضافة (Grafana، Nextcloud، Gitea، لوحة معلومات داخلية)، يأتي كل منها بقاعدة مستخدمين خاصة وسياسة كلمات مرور خاصة. إنه كابوس في الصيانة وسطح هجوم متضاعف. يحلّ Authentik ذلك بالقيام بدور مزوّد الهوية (IdP): فهو يدعم OAuth2/OIDC و SAML و LDAP وقبل كل شيء forward auth، الذي يتيح حماية أي تطبيق خلف وكيل عكسي، حتى تلك التي لا تملك أي مفهوم لتسجيل الدخول. تضمن الاستضافة الذاتية على خادم VPS ألّا تمرّ بيانات اعتمادك أبدًا عبر خدمة طرف ثالث وأن تبقى متحكّمًا في شجرة المستخدمين وسياسات MFA.

ما تكسبه مع Authentik

  • مجموعة واحدة من بيانات الاعتماد لجميع تطبيقاتك، مع تسجيل خروج مركزي.
  • مصادقة متعددة العوامل MFA (TOTP، WebAuthn/مفاتيح FIDO2، رموز احتياطية) مطبّقة بشكل موحّد وفق سياسة.
  • ‎forward auth لحماية التطبيقات "بلا تسجيل دخول"، وهو أمر متعذّر مع مزوّد هوية تقليدي.
  • ‎flows قابلة للتخصيص بالكامل (التسجيل، الاسترجاع، captcha، شروط الوصول).
  • موصّلات OAuth2/OIDC و SAML و LDAP لربط التطبيقات الحديثة والقديمة على حدّ سواء.
  • توفير الوصول وإلغاؤه فورًا عند مغادرة أحد الموظفين.

المتطلبات بالأرقام قبل البدء

تطلب وثائق Authentik الرسمية حدًّا أدنى من نواتَي معالج و2 غيغابايت من الذاكرة RAM، مع Docker Compose v2 (أو Podman). على خادم VPS حقيقي نوصي بمعالجَي vCPU و4 غيغابايت من RAM: فالخادم و worker و PostgreSQL تتشارك الجهاز نفسه، ولا يترك 2 غيغابايت أي هامش بمجرد ظهور ذروة اتصالات أو إضافة outpost. خصّص أيضًا نحو عشرين غيغابايت من القرص الحر للصور وقاعدة البيانات وبعض النسخ الاحتياطية المحلية (تقدير إرشادي وليس رقمًا رسميًا). Authentik دليل مقدَّم على قالب VPS: لا تدعمه ServOrbit، وتبقى إدارته بيدك.

قائمة تحقق قبل أول docker compose up

  • خادم VPS بنظام Linux 64 بت مع Docker Engine وإضافة Compose v2: يُنصح بمعالجَي vCPU و4 غيغابايت من RAM، والحد الأدنى الرسمي الصارم نواتان و2 غيغابايت.
  • نطاق فرعي مخصّص، مثل ‎auth.example.com، مع سجل A (وسجل AAAA إن كان لديك IPv6) يشير إلى عنوان IP الخاص بالخادم.
  • المنفذان 80 و443 مفتوحان نحو الوكيل العكسي؛ أما المنفذان 9000 و9443 للحاوية server فلا يُكشفان علنًا أبدًا.
  • وكيل عكسي (nginx أو Caddy أو Traefik) قادر على الحصول على شهادة Let's Encrypt.
  • وسيلة لاسترجاع حساب المسؤول إذا فقدت العامل الثاني: رموز احتياطية محفوظة في مدير كلمات مرور.
  • مكان للنسخ الاحتياطي خارج الخادم VPS.

نشر Authentik باستخدام Docker Compose

  1. إنشاء المجلد والحصول على ملف compose الرسمي

    أنشئ مجلدًا مخصصًا (‎mkdir -p /opt/authentik && cd /opt/authentik) ثم نزّل الملف المرجعي بالأمر ‎wget https://docs.goauthentik.io/compose.yml. يعلن الملف الحالي ثلاث خدمات: ‎postgresql و ‎server و ‎worker. وهو يشير إلى الإصدار المتاح وقت التنزيل، لذا يجب إعادة تنزيله عند كل ترقية.

  2. توليد الأسرار في ملف ‎.env

    نفّذ ‎echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env ثم ‎echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env. تذكر الوثائق أن كلمات مرور PostgreSQL التي تتجاوز 99 حرفًا غير مدعومة. احمِ الملف (‎chmod 600 .env) ولا تضعه أبدًا في نظام التحكم بالإصدارات ولا تُعِد استخدام مفتاح من الأمثلة.

  3. ربط المنافذ بـ localhost فقط

    افتراضيًا ينشر ملف compose المنفذين 9000 (HTTP) و9443 (HTTPS) على كل الواجهات. أضف إلى ‎.env السطرين ‎COMPOSE_PORT_HTTP=127.0.0.1:9000 و ‎COMPOSE_PORT_HTTPS=127.0.0.1:9443: فلا يصل إليهما سوى وكيلك العكسي المحلي، وتمرّ حركة المرور العامة حتمًا عبر HTTPS.

  4. تشغيل الحزمة

    شغّل ‎docker compose pull ثم ‎docker compose up -d. تحقق عبر ‎docker compose ps من أن الحاويات الثلاث تعمل وأن ‎postgresql في حالة ‎healthy، ثم تابع التهيئة بالأمر ‎docker compose logs -f server. قد تستغرق ترحيلات قاعدة البيانات بضع دقائق عند أول تشغيل.

  5. إنهاء التثبيت عبر /if/flow/initial-setup/

    عند أول تشغيل، انتقل إلى ‎https://auth.example.com/if/flow/initial-setup/ لتحديد كلمة مرور الحساب ‎akadmin. إنه مسؤولك الأعلى: احمِه فورًا بـ MFA، ثم أنشئ حساب مسؤول باسم شخصي للاستخدام اليومي.

  6. إنشاء provider وتطبيق

    في لوحة الإدارة، أنشئ Provider (من نوع OIDC لتطبيق حديث، أو Proxy لـ forward auth) ثم Application المرتبط به. بالنسبة إلى OIDC، احصل على ‎client_id / ‎client_secret وعنوان ‎.well-known/openid-configuration لإدخالها في التطبيق العميل.

الوكيل العكسي وTLS

يجب أن يُقدَّم Authentik عبر HTTPS حتى تعمل كوكيز الجلسة و WebAuthn. مع nginx، ينفّذ vhost الخاص بـ ‎auth.example.com الأمر ‎proxy_pass http://127.0.0.1:9000; ويمرّر الترويسات ‎Host و ‎X-Forwarded-For و ‎X-Forwarded-Proto، إضافةً إلى ‎Upgrade و ‎Connection لدعم WebSockets. تُحصل الشهادة عبر ‎certbot --nginx -d auth.example.com؛ ويقوم Caddy و Traefik بذلك تلقائيًا. إذا مرّ النطاق عبر Cloudflare في الوضع المُمرَّر، فاضبط وضع SSL/TLS للمنطقة على Full (strict): ففي وضع Flexible يعيد nginx التوجيه من HTTP إلى HTTPS فتحصل على حلقة إعادة توجيه لا نهائية.

حماية تطبيق بـ forward auth على nginx

  1. إنشاء Proxy Provider

    أنشئ Proxy Provider بوضع forward auth لتطبيق واحد، مع العنوان العام للتطبيق (‎https://app.example.com) كـ External host. اربطه بـ Application ثم بالـ outpost المدمج في قسم Outposts.

  2. ربط auth_request في vhost التطبيق

    داخل ‎location / أضف ‎auth_request /outpost.goauthentik.io/auth/nginx; ثم ‎error_page 401 = @goauthentik_proxy_signin;. انسخ أيضًا كوكيز الـ outpost عبر ‎auth_request_set $auth_cookie $upstream_http_set_cookie; و ‎add_header Set-Cookie $auth_cookie;. انسخ الكتلة الكاملة من صفحة nginx في الوثائق المطابقة لإصدارك.

  3. إتاحة مسار الـ outpost دون مصادقة

    أضف ‎location /outpost.goauthentik.io تنفّذ ‎proxy_pass نحو ‎http://127.0.0.1:9000، مع ضبط ‎Host على المضيف الأصلي و ‎X-Original-URL على العنوان الكامل، و ‎proxy_pass_request_body off; و ‎Content-Length فارغ. يجب أن يبقى هذا المسار متاحًا دون تسجيل دخول، وإلا لن تعمل إعادة التوجيه أبدًا.

  4. معالجة إعادة التوجيه والترويسات الكبيرة

    عرّف ‎location @goauthentik_proxy_signin معلَّمة بـ ‎internal تعيد 302 نحو ‎/outpost.goauthentik.io/start?rd= متبوعًا بالعنوان الأصلي. إذا ظهر الخطأ "upstream sent too big header" فأضف ‎proxy_buffers 8 16k; و ‎proxy_buffer_size 32k;. تصل الهويات بعد ذلك إلى التطبيق في الترويسات ‎X-authentik-username و ‎X-authentik-groups و ‎X-authentik-email.

النسخ الاحتياطي واستعادة Authentik

قاعدة بيانات PostgreSQL هي أهم جزء في النسخة الاحتياطية: فهي تحوي المستخدمين والسياسات والـ flows والإعدادات. بالأسماء الافتراضية في compose (المستخدم والقاعدة ‎authentik)، يُنجَز التفريغ بالأمر ‎docker compose exec -T postgresql pg_dump -U authentik -d authentik -Fc > /var/backups/authentik-$(date +%F).dump. وللاستعادة أوقف أولًا حاويات التطبيق بالأمر ‎docker compose stop server worker، ثم نفّذ ‎docker compose exec -T postgresql pg_restore -U authentik -d authentik --clean --if-exists < file.dump وأعد التشغيل. الترتيب الذي توصي به الوثائق: القاعدة أولًا، ثم التحقق، ثم المجلدات الثابتة، ثم التشغيل. النسخة التي لم تُستعَد قط مجرد فرضية: اختبرها على جهاز مؤقت.

ما الذي يجب نسخه احتياطيًا

  • قاعدة PostgreSQL: لا غنى عنها، فبدونها لا يمكن إعادة Authentik إلى العمل.
  • المجلد ‎./data (الأيقونات وخلفيات الـ flows والملفات المرفوعة وتقارير CSV)، ما لم تستخدم تخزين S3.
  • المجلد ‎./certs إذا كنت تعتمد على شهادات من نظام الملفات؛ أما الشهادات المستوردة سابقًا فهي في القاعدة.
  • المجلد ‎./custom-templates إذا غيّرت المظهر، والـ blueprints المخصصة إن وُجدت.
  • الملف ‎.env (المفتاح السري وكلمة مرور PostgreSQL)، مشفّرًا ومحفوظًا خارج الخادم VPS.
  • نسخة من التفريغات على تخزين بعيد، وليس فقط على الجهاز الذي يستضيف القاعدة.

الترقية دون كسر تسجيل الدخول الموحّد

لا يدعم Authentik الرجوع إلى إصدار أقدم: انسخ القاعدة احتياطيًا قبل كل ترقية واقرأ ملاحظات إصدار الهدف. رقِّ بالتسلسل مرورًا بآخر تصحيح لكل إصدار major.minor دون تخطي أي منها. أعد تنزيل ملف compose (‎wget -O compose.yml https://docs.goauthentik.io/compose.yml) ثم ‎docker compose pull و ‎docker compose up -d. رقِّ جميع الـ outposts في الوقت نفسه: يجب أن يطابق إصدارها إصدار الخادم. ثم تحقق من الإصدار في Dashboards > Overview؛ وإذا لم يتغير وظهر ‎migration inconsistency في السجلات فاستعد النسخة الاحتياطية وارتقِ إصدارًا بعد إصدار.

لم يعد Redis جزءًا من الحزمة

كثير من الدروس القديمة، ومنها النسخة الأولى من هذا المقال، تصف حزمة من أربع حاويات مع Redis. تذكر ملاحظات إصدار 2025.10 أن Authentik لم يعد يستخدم Redis إطلاقًا: فقد انتقلت الذاكرة المؤقتة والـ outpost المدمج و WebSockets إلى PostgreSQL، بينما انتقلت المهام قبل ذلك في 2025.8. لذا لا يحوي compose الحالي سوى ‎postgresql و ‎server و ‎worker. نتيجتان: توقّع نحو 50 % اتصالات إضافية بـ PostgreSQL، وإذا كان PostgreSQL لديك يفرض TLS فإن Authentik يتطلب TLS 1.3 أو الامتداد Extended Master Secret. احذف أي إعدادات Redis متبقية في إعدادك.

استكشاف الأخطاء: حلقة إعادة التشغيل مع AUTHENTIK_POSTGRESQL__USE_POOL

العَرَض المُبلَّغ عنه في المسألة رقم 14320 لمستودع goauthentik/authentik، والمفتوحة في مايو 2025 على الإصدار 2025.4.0: مع ‎AUTHENTIK_POSTGRESQL__USE_POOL=true يعيد الخادم التشغيل في حلقة، مع أخطاء SSL مثل "decryption failed or bad record mac" أو "SSL SYSCALL error: EOF detected"، ثم يخرج worker من gunicorn بالرمز 3 ("Worker failed to boot"). عطّل الإصدار 2025.4.1، الصادر في مايو 2025، الخيار احترازيًا لأن السبب الجذري لم يُعثر عليه. الحالة الفعلية للمسألة كما قُرئت في 30 أكتوبر 2026: ما تزال مفتوحة، وموسومة كخلل مؤكَّد، دون طلب دمج إصلاح مرتبط بها، مع معلَم 2026.11.0 موسوم Required منذ 23 أكتوبر 2026. فرضية أحد المشرفين: سياق SSL غير المتزامن يُشارَك بين الخيوط مع أنه غير آمن للخيوط. مسار مُبلَّغ عنه وغير رسمي: أفاد مستخدم في سبتمبر 2026 بأن ‎AUTHENTIK_WEB__WORKERS=1 و ‎AUTHENTIK_WEB__THREADS=1 أزالا المشكلة؛ وبحسب اختبارات أحد المشرفين يعمل worker واحد بخيط واحد دون مشكلة، بينما يعيد 2 أو أكثر من الـ workers إنتاجها. هذا ليس إصلاحًا ولا ضمانًا، ويحدّ من سعة الواجهة. الأسلم ألّا تفعّل الـ pool (احذف المتغير من ‎.env) وأن تعيد قراءة المسألة قبل أي ترقية.

أعطال شائعة أخرى

  • حلقة إعادة توجيه خلف Cloudflare: وضع SSL/TLS للمنطقة هو Flexible؛ انتقل إلى Full (strict) وتأكد من تمرير ‎X-Forwarded-Proto.
  • رفض WebAuthn أو الكوكيز: الواجهة تُقدَّم عبر HTTP أو تحت اسم مضيف آخر؛ افرض HTTPS على نطاق Authentik نفسه.
  • خطأ 502 في التطبيق المحمي: ابحث عن "upstream sent too big header" في سجلات nginx وزِد ‎proxy_buffer_size.
  • لا يبدأ ‎server و ‎worker: حاوية ‎postgresql ليست ‎healthy؛ اقرأ ‎docker compose logs postgresql وتذكّر أن ‎PG_PASS و ‎AUTHENTIK_SECRET_KEY إلزاميان.
  • تعذّر الوصول إلى outpost بعد الترقية: لم يعد إصداره يطابق إصدار الخادم؛ رقِّه.
  • حاويات تُقتل دون رسالة: مع 2 غيغابايت من RAM يتدخل OOM killer؛ تحقق عبر ‎dmesg | grep -i oom وانتقل إلى 4 غيغابايت.

فعّل Outpost مدمجًا واستفد من "property mappings" لحقن ترويسات (‎X-authentik-username، ‎X-authentik-groups) نحو تطبيقاتك المحمية بـ forward auth: تستطيع تطبيقات كثيرة (Grafana مثلًا) قراءة هذه الترويسات للقيام بتوفير المستخدمين تلقائيًا وإسناد الأدوار. تحصل بذلك ليس فقط على SSO، بل أيضًا على ربط تلقائي بالكامل للمجموعات بالأدوار، دون إعداد يدوي في كل أداة.

مركّز وصولك على خادمك VPS الخاص

يوفّر خادم ServOrbit Cloud VPS مع قالب Docker مُعدّ مسبقًا ما يلزم من RAM وتخزين لحزمة Authentik (server، worker، PostgreSQL، Redis) الجاهزة لاستقبال تطبيقاتك.