إعداد Discourse - بيئة AWS Linux 2 AMI و Apache2 (httpd)

مرحباً بالجميع

لقد راجعت الوثائق وقرأت إعدادات التوصيات والنصائح المنشورة، وحاولت تعديلها لتناسب وضعي الفريد.

بالنسبة لأمر يبدو بسيطاً للغاية، فمن المحبط جداً أن لا أحد من الحلول المقترحة قد نجح.

بيئتنا:

  • ندير مثيل 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 سيكون الخيار الثاني.

مع أطيب التحيات
ماثيو لوكاس

هذا معقد جدًا بالنسبة لي لفهمه تمامًا، لذا اعتبر هذا تخمينًا جريئًا بدلاً من كونه حلاً. إذا كانت المشكلة هي أنك لا تحصل على شيء ما للاتصال بالحاوية التي تعمل لديك عبر localhost، فقد تحاول استخدام عنوان IP الخاص بـ Docker. قد يكون من الممكن أيضًا استخدام قالب WebSocket واستخدام المقبس بدلاً من المنفذ. يجادل البعض بأن هذا مفضل لعدد من الأسباب.

قد يكون MKJ’s Opinionated Discourse Deployment Configuration مفيدًا للقراءة.

@pfaffman@Matthew_Lucas يستخدم بالفعل القالب ذو المقابس، على الرغم من ذلك…

أنا بالتأكيد أستخدم localhost للوكيل الخارجي الخاص بي، ويجب أن يعمل هذا مع إعداد expose. لا أتوقع أن يحتاج إلى استخدام عنوان IP الخاص بـ docker. ولا أتوقع أن يفشل هذا فقط مع Apache أمام حاوية docker لهذا السبب.

قد تحتاج إلى تكوين الرأس - انظر Add an offline page to display when Discourse is rebuilding or starting up - #2 by codinghorror

لقد كنت أبذل قصارى جهدي لنسيان تكوين Apache، ولكن هذا القسم من تكوين nginx هو شيء سترغب في معرفة كيفية تكراره باستخدام Apache، أعتقد.

    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;

على وجه الخصوص، لا أعتقد أنه يعمل بشكل صحيح بدون رأس Host.

نظرًا لأنك لا تقوم بتشفير HTTPS، يجب أن تكون قادرًا على استخدام tcpdump لالتقاط تتبعات الحزم لمعرفة ما يحدث بالضبط بشكل خاطئ.

ولكن لماذا تضع Apache هناك على الإطلاق؟ إنها مجرد عقبة إضافية. إذا كنت أحاول شيئًا كهذا، فسأقوم بتعيين موازن التحميل الخاص بـ Amazon للتحدث مباشرة إلى المنفذ 8000 على مثيل EC2. أفترض أنك تقوم بإنهاء HTTPS على ELB على أي حال. أشك في أن موازن التحميل الخاص بهم يعرف الرؤوس العادية لإضافتها دون الحاجة إلى تحديدها، ولكن إذا لم يكن الأمر كذلك، فقم بتعيينها بوضوح. فقط تأكد من أن المنفذ يمكن الوصول إليه عبر جدار الحماية.

أشك في أن لدي الكثير مما هو ذو قيمة للمساهمة هنا، ولكن آمل أن يساعدك بعض ذلك في تكوينك. حظا سعيدا.

تثبيت Docker و Discourse على AWS EC2 Linux مع وجود عكسي HTTPD

مرحباً بالجميع

لقد تمكنت من حل المشكلة. عدت إلى نقطة الصفر وبدأت من جديد بتثبيت Docker و Discourse نظيفين. تفصيل عمليتي أدناه:

الافتراضات

• لديك بالفعل مثيل AWS EC2 يعمل بنظام Linux
• يمكنك الوصول إلى مثيل EC2 الخاص بك باستخدام SSH
• تم تكوين Apache 2 وتشغيله بالفعل على الخادم الخاص بك

الوصول إلى مثيل EC2 الخاص بك باستخدام SSH

  1. افتح موجه الأوامر (CMD) أو الطرفية (Terminal)

  2. اتصل بمثيل AWS EC2 عبر SSH

مثال على الشاشة بمجرد الاتصال بمثيل EC2

إجراء تحديثات النظام

  1. قم بإجراء تحديثات النظام بتشغيل الأمر التالي في وحدة التحكم / الطرفية

$ sudo yum update

تثبيت Docker

  1. ابحث عن حزمة Docker الخاصة بـ AWS بتشغيل الأمر التالي في وحدة التحكم / الطرفية

$ sudo yum search docker

  1. احصل على معلومات الإصدار بتشغيل الأمر التالي في وحدة التحكم / الطرفية

$ sudo yum info docker

  1. قم بتثبيت Docker بتشغيل الأمر التالي في وحدة التحكم / الطرفية

$ sudo yum install docker

  1. أضف عضوية المجموعة لمستخدم ec2-user الافتراضي حتى تتمكن من تشغيل جميع أوامر Docker دون استخدام الأمر sudo بتشغيل الأمر التالي في وحدة التحكم / الطرفية
$ sudo usermod -a -G docker ec2-user
$ id ec2-user

# إعادة تحميل تعيينات مجموعة مستخدم Linux إلى Docker دون تسجيل الخروج

$ newgrp docker
  1. قم بتثبيت docker-compose بتشغيل الأمر التالي في وحدة التحكم / الطرفية
# 1. احصل على pip3 (حزمة تثبيت بايثون)
$ sudo yum install python3-pip
 
# 2. ثم قم بتشغيل أيًا من الأوامر التالية
$ sudo pip3 install docker-compose # مع وصول الجذر (root)
 
# أو
 
$ pip3 install --user docker-compose # بدون وصول الجذر لأسباب أمنية

# التحقق من الأذونات
$ sudo chmod -v +x /usr/local/bin/docker-compose
  1. فعّل خدمة Docker لتبدأ تلقائيًا عند التشغيل بتشغيل الأمر التالي في وحدة التحكم / الطرفية

$ sudo systemctl enable docker.service

  1. ابدأ خدمة Docker بتشغيل الأمر التالي في وحدة التحكم / الطرفية

$ sudo systemctl start docker.service

  1. تحقق من تشغيل خدمة Docker بتشغيل الأمر التالي في وحدة التحكم / الطرفية، سيبدو المخرج مشابهًا لهذا

أوامر Docker الأساسية التي من الجيد معرفتها:

# إصدار Docker
$ docker version

# إصدار Docker Compose
$ docker-compose version

# بدء خدمة Docker
$ sudo systemctl start docker.service

# إيقاف خدمة Docker
$ sudo systemctl stop docker.service

# إعادة تشغيل خدمة Docker
$ sudo systemctl restart docker.service

# حالة خدمة Docker
$ sudo systemctl status docker.service

تثبيت Discourse

  1. أنشئ مجلد Discourse

$ sudo mkdir /var/discourse

  1. استنسخ صورة Docker الخاصة بـ Discourse إلى الدليل الذي تم إنشاؤه حديثًا

$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

  1. انسخ ملف standalone.yml إلى مجلد containers

$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml

  1. قم بتحرير ملف discourse.yml الجديد على النحو التالي (الأجزاء المهمة هي المنافذ المكشوفة لـ HTTP وتفاصيل البريد الإلكتروني لـ SMTP؛ قم بالتعديل في الملف ولا تنسخ والصق)

خيارات التحرير:

1. يمكنك استخدام nano والتحرير عبر سطر الأوامر / الطرفية
2. على AWS إذا كنت تستخدم MATE مع PLUMA، يمكنك استخدام PLUMA لتحرير الملف
3. يمكنك استخدام WINSCP للاتصال عبر SSH بالآلة وتحرير الملف عبر واجهة Windows الرسومية (GUI)

## هذا هو قالب حاوية 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"
  ## قم بإلغاء التعليق عن السطر التالي لتفعيل مستمع IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.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:
  - "8080:80"   # http (تعمل على المنفذ المحلي 8080، منفذ Docker 80)
  #- "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: 'faq.mobiloan.io'

  ## قم بإلغاء التعليق إذا كنت تريد أن تبدأ الحاوية بنفس اسم النطاق
  ## (-h option) كما هو محدد أعلاه (الافتراضي "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: قائمة عناوين البريد الإلكتروني المفصولة بفواصل والتي سيتم تعيينها كمسؤول ومطور
  ## مثال على التسجيل الأولي 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'أدخل البريد الإلكتروني هنا'

  ## TODO: خادم البريد SMTP المستخدم للتحقق من الحسابات الجديدة وإرسال الإشعارات
  # عنوان SMTP واسم المستخدم وكلمة المرور مطلوبة
  # تحذير: قد يسبب حرف '#' في كلمة مرور SMTP مشاكل!
  DISCOURSE_SMTP_ADDRESS: أدخل SMTP هنا
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: أدخل اسم المستخدم هنا
  DISCOURSE_SMTP_PASSWORD: أدخل كلمة المرور هنا
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (اختياري، الافتراضي true، نستخدم Amazon SES)

 

  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (مطلوب من بعض المزودين)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (العنوان المرسل منه الإشعارات)

  ## إذا أضفت قالب 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
  ## راجع 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 "بداية الأوامر المخصصة"
  ## إذا كنت تريد تعيين عنوان البريد الإلكتروني 'من' لتسجيلك الأول، قم بإلغاء التعليق وتغييره:
  ## بعد الحصول على بريد التسجيل الأول، قم بإعادة التعليق على السطر. يجب تشغيله مرة واحدة فقط.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "نهاية الأوامر المخصصة"
  1. بمجرد تحرير الملف وحفظه، أعد بناء تطبيق Discourse باستخدام الأمر التالي في الطرفية

$ /var/discourse/launcher rebuild discourse

ملاحظة: إذا كان اسم ملف yaml الخاص بك شيئًا آخر، فستستبدل discourse باسم ملف yaml الخاص بك

ملاحظة أن عملية إعادة البناء تستغرق وقتًا.

  1. بمجرد إعادة بناء التطبيق، يجب أن يعمل التطبيق على المنفذ 8080. للتحقق من ذلك، قم بتشغيل الأمر التالي في الطرفية

$ sudo lsof -i -P -n | grep LISTEN

مثال على مخرجات المنافذ

لاحظ أن Docker يستمع على المنفذ 8080، بينما يستمع httpd (Apache) على المنفذ 80.

من حيث توجيه حركة المرور، سيستقبل Apache طلب الويب وسيتم توجيهه عند الحاجة إلى حاوية Discourse على المنفذ 8080.

لضمان حدوث التوجيه، يجب عليك تكوين المضيف الافتراضي في ملف تكوين Apache.

تكوين المضيف الافتراضي لـ Apache

  1. يقع ملف تكوين Apache في /etc/httpd/conf.d/00-virtualhosts.conf. httpd / apache / apache2 هي إصدارات مختلفة من Apache. قد تكون ملفاتك في مواقع مختلفة إذا لم تكن تستخدم خدمة httpd، لكن تكوين المضيف الافتراضي في هذه الحالة سيكون نفسه.

خيارات التحرير:

1. يمكنك استخدام nano والتحرير عبر سطر الأوامر / الطرفية
2. على AWS إذا كنت تستخدم MATE مع PLUMA، يمكنك استخدام PLUMA لتحرير الملف
3. يمكنك استخدام WINSCP للاتصال عبر SSH بالآلة وتحرير الملف عبر واجهة Windows الرسومية (GUI)

قم بتحرير ملف /etc/httpd/conf.d/00-virtualhosts.conf بإضافة ما يلي:

# FAQ (توجيهات Discourse)

<VirtualHost *:80>
  	ServerName  sub.domain.com
  	ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
  1. تحتاج إلى إنشاء سجل CNAME DNS ذي الصلة بحيث يشير النطاق الفرعي إلى خادم AWS / موزع الأحمال الخاص بك.

إعدادنا معقد قليلاً لأن لدينا مزود النطاق الذي يوجه جميع حركة المرور إلى موزع أحمال AWS.

يتعامل موزع الأحمال مع SSL/TLS الخاص بنا من خلال شهادة مقدمة من AWS.

كما يقوم موزع الأحمال بتوجيه حركة المرور إلى مثيل AWS.

تم تثبيت Apache على مثيل AWS ويقوم بتوجيه حركة المرور إلى:

  • تطبيقات Node express
  • تطبيق Docker / Discourse.

الخلاصة

هذه مجرد حل واحد، لكنها الحل الذي نجح مع إعدادنا الحالي.

شكرًا كبيرًا لـ:

@Kane York لمقاله عن Discourse،
@Axel Fernandes لمقاله على Medium وملاحظاته حول تنزيل ملفات Discourse اللازمة، و
@Vivek Gite من nixCraft ومقاله على cyberciti حول تثبيت Docker على AWS Linux 2.