مرحباً بالجميع
لقد راجعت الوثائق وقرأت إعدادات التوصيات والنصائح المنشورة، وحاولت تعديلها لتناسب وضعي الفريد.
بالنسبة لأمر يبدو بسيطاً للغاية، فمن المحبط جداً أن لا أحد من الحلول المقترحة قد نجح.
بيئتنا:
- ندير مثيل AWS EC2، وتحديداً صورة AWS Linux 2 AMI؛
- لدينا Apache2 يعمل ومُهيأ؛
- المثيل جزء من مجموعة أهداف AWS (Target Group) يتم الرجوع إليها بواسطة موازن حمل AWS (Load Balancer)؛
- شهادة SSL/TLS الخاصة بنا مقدمة من AWS ومرتبطة بموازن الحمل؛
- موفّر النطاق لدينا هو
name.com؛ - كجزء من إعدادنا، لدينا عدة نطاقات فرعية يتم توجيهها باستخدام سجلات CNAME تشير جميعها إلى موازن حمل AWS الذي يدير بدوره حركة المرور إلى مثيل EC2؛
- جميع حركة المرور الموجهة إلى موازن الحمل والمقدمة للمستخدم عبر الويب آمنة؛
- على خادمنا، ندير ثلاث تطبيقات Node Express منفصلة؛
- يتم تعريف المنافذ في Express كجزء من إعداد خادم Express، حالياً المنافذ 3000 و 4000 و 5000؛
- يتم توجيه حركة المرور بواسطة Apache باستخدام النطاق الفرعي إلى تطبيق الويب ذي الصلة، على سبيل المثال:
<VirtualHost *:80>
ServerName subdomain.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:4000/"
ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
-
وعلى الرغم من عدم أهميته بشكل خاص، فإننا نستخدم PM2 لإدارة تطبيقات Express لدينا بحيث تبدأ تلقائياً عند إعادة تشغيل الخادم.
-
على نفس الخادم، قمنا بتثبيت Docker؛
-
ثم قمنا أيضاً بتثبيت Discourse باستخدام ملف app.yaml (باستخدام Run other websites on the same machine as Discourse - #182 by angus كدليل).
الحالة الحالية:
- Docker يعمل
- تطبيق Discourse (الحاوية) يعمل
- تطبيقات Express تعمل جميعها ويتم توجيهها بشكل صحيح بواسطة Apache
ملاحظات:
- حاولت بناء التطبيق في البداية دون تعريض المنافذ وفقاً للوثائق، وعندما لم ينجح ذلك قمت بتعريض المنفذ 8000 فوق منفذ HTTP 80؛
- في فهمي البسيط، Docker يشبه المنزل، والحاويات المختلفة هي الغرف. يحدد Docker كيفية الوصول إلى التطبيق، أي أي غرفة للوصول إليها. كان تفكيري في تعريض المنفذ 8000 هو أنه يمكنني بعد ذلك الإشارة إلى المنفذ 8000 كما أفعل مع تطبيقات Express الأخرى الآن بعد أن تم تعريض 8000. لكن هذا لا يعمل، وفيما يلي مثال لما حاولت فعله في Apache:
# أسئلة وأجوبة (توجيهات DISCOURSE)
<VirtualHost *:80>
ServerName discourse.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:8000/"
ProxyPassReverse "/" "http://localhost:8000/"
</VirtualHost>
- كانت الاختبار البسيط هو محاولة إدخال localhost:8000 في المتصفح على الخادم واختباره. الخادم هو مثيل AWS مع تثبيت Chromium. حقيقة أن هذا لا يحل فوراً تخبرني بأن هناك مشكلة وأن فهمي ينقصه شيء أساسي. تطبيقات الويب الخاصة بي تعمل ومتاحة على المنافذ التي حددتها في إعدادات Express، وتوقعي كان أن يكون الأمر نفسه مع حاوية Docker.
ملاحظات إضافية:
- أدرك أن هناك حلاً محتملاً بوضع NGINX “أمام” Apache و Docker لتوجيه حركة المرور من
discourse.domain.ioإلى مثلاً المنفذ 8000 على الخادم المحلي، أي المنفذ المعروض لحاوية Docker، وتوجيه جميع حركة المرور الأخرى من *.domain.io إلى Apache على مثلاً المنفذ 9000، ثم تغيير إعدادات VirtualHost الخاصة بي لتوجيه حركة المرور من المنفذ 9000 وفقاً لذلك، أي:
# توجيه تطبيقات EXPRESS في APACHE
<VirtualHost *:9000>
ServerName other_sub_domains.domain.io
ProxyPreserveHost On
ProxyPass "/" "http://localhost:4000/"
ProxyPassReverse "/" "http://localhost:4000/"
</VirtualHost>
- بالنسبة لي، يبدو هذا غير ضروري تماماً. إذا تم توجيه النطاق
discourse.domain.ioإلى Apache واستقبل Apache الطلب ثم حاول توجيهه، فيجب أن يكون الأمر بسيطاً مثل توجيهه إلى المنفذ المعروض لحاوية Docker. - أيضاً، إذا كان localhost:8000 على الخادم نفسه لا يحل، فلن يعمل هذا على أي حال.
حالياً، أحصل على خطأ 502 في Chrome عندما أحاول التنقل إلى حاوية Discourse الخاصة بي. (انظر لقطة الشاشة أعلاه).
مقتطف من app.yml
## هذا هو قالب حاوية Docker لـ Discourse المستقل والشامل
##
## بعد إجراء تغييرات على هذا الملف، يجب عليك إعادة البناء
## /var/discourse/launcher rebuild app
##
## كن حذراً للغاية عند التعديل!
## ملفات YAML حساسة جداً للأخطاء في المسافات البيضاء أو المحاذاة!
## قم بزيارة http://www.yamllint.com/ للتحقق من صحة هذا الملف حسب الحاجة
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/web.socketed.template.yml"
## قم بإلغاء التعليق عن هذين السطرين إذا كنت ترغب في إضافة Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
## ما هي منافذ TCP/IP التي يجب أن تعرضها هذه الحاوية؟
## إذا كنت تريد لـ Discourse مشاركة منفذ مع خادم ويب آخر مثل Apache أو nginx،
## راجع https://meta.discourse.org/t/17247 للحصول على التفاصيل
expose:
- "8000:80" # http
#- "443:443" # https
params:
db_default_text_search_config: "pg_catalog.english"
## قم بتعيين db_shared_buffers إلى الحد الأقصى لـ 25% من إجمالي الذاكرة.
## سيتم تعيينه تلقائياً بواسطة bootstrap بناءً على الذاكرة المكتشفة، أو يمكنك التعديل
#db_shared_buffers: "256MB"
## يمكن أن يحسن أداء الفرز، لكنه يزيد من استخدام الذاكرة لكل اتصال
#db_work_mem: "40MB"
## أي إصدار Git يجب أن تستخدمه هذه الحاوية؟ (الافتراضي: tests-passed)
#version: tests-passed
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## كم عدد طلبات الويب المتزامنة المدعومة؟ يعتمد على الذاكرة وأنوية المعالج.
## سيتم تعيينه تلقائياً بواسطة bootstrap بناءً على المعالجات المكتشفة، أو يمكنك التعديل
#UNICORN_WORKERS: 3
## TODO: اسم النطاق الذي ستستجيب له هذه النسخة من Discourse
## مطلوب. لن يعمل Discourse مع عنوان IP عاري.
DISCOURSE_HOSTNAME: 'discourse.domain.io'
## قم بإلغاء التعليق إذا كنت تريد بدء الحاوية بنفس اسم المضيف (-h option) المحدد أعلاه (الافتراضي "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: قائمة عناوين البريد الإلكتروني المفصولة بفواصل والتي سيتم تعيينها كمسؤولين ومطورين
## عند التسجيل الأولي، مثال 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'user@domain.io'
## TODO: خادم البريد SMTP المستخدم للتحقق من الحسابات الجديدة وإرسال الإشعارات
## مطلوب عنوان SMTP واسم مستخدم وكلمة مرور
## تحذير: قد يسبب حرف '#' في كلمة مرور SMTP مشاكل!
DISCOURSE_SMTP_ADDRESS: email-smtp.us-east-1.amazonaws.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: ******
DISCOURSE_SMTP_PASSWORD: ******
#DISCOURSE_SMTP_ENABLE_START_TLS: true # (اختياري، الافتراضي true)
#DISCOURSE_SMTP_DOMAIN: ****** # (مطلوب من بعض المزودين)
#DISCOURSE_NOTIFICATION_EMAIL: ****** # (العنوان المرسل منه الإشعارات)
## إذا أضفت قالب Lets Encrypt، قم بإلغاء التعليق أدناه للحصول على شهادة SSL مجانية
#LETSENCRYPT_ACCOUNT_EMAIL: me@example.com
## عنوان CDN http أو https لهذه النسخة من Discourse (مُعد للاستخراج)
## راجع https://meta.discourse.org/t/14857 للحصول على التفاصيل
#DISCOURSE_CDN_URL: https://discourse-cdn.example.com
## مفتاح عنوان IP الخاص بـ Maxmind للبحث عن عناوين IP
## راجع https://meta.discourse.org/t/-/137387/23 للحصول على التفاصيل
#DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456
## حاوية Docker عديمة الحالة؛ يتم تخزين جميع البيانات في /shared
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
## تذهب الإضافات هنا
## راجع https://meta.discourse.org/t/19157 للحصول على التفاصيل
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
## أي أوامر مخصصة للتشغيل بعد البناء
run:
- exec: echo "Beginning of custom commands"
## إذا كنت تريد تعيين عنوان البريد الإلكتروني 'From' لأول تسجيل، قم بإلغاء التعليق وتغيير:
## بعد الحصول على أول بريد إلكتروني للتسجيل، قم بإعادة التعليق على السطر. يجب تشغيله مرة واحدة فقط.
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
- exec: echo "End of custom commands"
نطاقنا وعنوان بريدنا الإلكتروني وإعدادات البريد الإلكتروني صحيحة. كما ذُكر، لا أحتاج إلى إعداد SSL/TLS.
الطلب:
- هل حل NGINX هو الطريقة الوحيدة لجعل هذا الإعداد يعمل، وإذا كان الأمر كذلك، هل هناك شرح أوضح متاح فيما يتعلق بخطوات الإعداد؟ أنا لست في وضع يسمح لي بالبدء من الصفر مع الخادم فقط لجعل Discourse يعمل وبدون ضمانات.
- في Discourse behind reverse proxy and https - #2 by itsbhanusharma قدم @Dark Matter الحل التالي لـ apache2، لكنني لا أعتقد أن هذا الحل يأخذ في الاعتبار بيئة Node Express، ومع عدم حل localhost:8000 لدي، لست متأكداً مما إذا كان هذا سيعمل:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName discourse.example.com
DocumentRoot /website/discourse
RewriteEngine On
ProxyPreserveHost On
ProxyRequests Off
ProxyPass / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
ProxyPassReverse / unix:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
ErrorLog /var/log/apache2/discourse.error.log
LogLevel warn
CustomLog /var/log/apache2/discourse.access.log combined
RewriteCond %{SERVER_NAME} =discourse.example.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
- هل المشكلة هنا في إعدادات Discourse الخاصة بي؟ هل المشكلة ربما في توجيه Apache (أشتبه في ذلك)؟ أم أنني أفتقد شيئاً أكثر أساسية هنا؟
- أعتقد أن حل هذا سيساعد الكثير من المستخدمين في المستقبل.
- الخيار الأول سيكون التوجيه إلى Discourse محلياً على الخادم.
- ثم التوجيه عبر URL سيكون الخيار الثاني.
مع أطيب التحيات
ماثيو لوكاس



