Discourse لا يعمل مع Apache وإعادة توجيه الوكيل

لقد قضيت الأيام القليلة الماضية في محاولة إيجاد طريقة لربط Discourse مع Apache على نفس خادم DigitalOcean، لكن الدروس المتاحة هنا على Discourse إما قديمة أو لا تنطبق عليّ. يستخدم أحد الدروس CentOS وHAProxy (أنا أستخدم Ubuntu)، بينما يستخدم الآخر Nginx (أنا أستخدم Apache).

صادفت تعليقًا في موضوع على DigitalOcean واتبعت التعليمات المذكورة هناك على خادم تجريبي: Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean

يبدو أن كل شيء سار بسلاسة، بما في ذلك شهادة SSL من Let’s Encrypt. تعمل صفحتي الرئيسية وبعض مستندات HTML الثابتة بشكل ممتاز. أما Discourse، رغم تثبيته دون أخطاء، فلا يظهر. عند التصفح إلى community.mysite.com، أرى فقط صفحتي الرئيسية مع HTTPS غير مؤمن في عنوان URL. نعم، إعدادات DNS دقيقة وتوجه إلى الخادم الصحيح.

هذا هو ملف mysite.com.conf الخاص بي:

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.mysite.com [OR]
RewriteCond %{SERVER_NAME} =mysite.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
	</VirtualHost>

وهذا هو ملف mysite.com-le-ssl.conf:

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
	</VirtualHost>
</IfModule>

وهذا هو ملف community.mysite.com.conf:

<VirtualHost *:80>
  ServerName community.mysite.com
  ServerAlias www.community.mysite.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>

وأخيرًا، إليك ملف 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"
## قم بإلغاء التعليق عن هذين السطرين إذا كنت ترغب في إضافة Let's 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"   # توجيه منفذ المضيف 8080 إلى منفذ الحاوية 80 (http)
      - "8443:443"   # توجيه منفذ المضيف 8443 إلى منفذ الحاوية 443 (http)

params:
  db_default_text_search_config: "pg_catalog.english"

  ## قم بتعيين db_shared_buffers إلى أقصى 25% من إجمالي الذاكرة.
  ## سيتم تعيينها تلقائيًا بواسطة bootstrap بناءً على ذاكرة الوصول العشوائي المكتشفة، أو يمكنك تجاوزها
  db_shared_buffers: "128MB"

  ## يمكن أن يحسن أداء الفرز، لكنه يزيد من استخدام الذاكرة لكل اتصال
  #db_work_mem: "40MB"

  ## أي إصدار Git يجب أن تستخدم هذه الحاوية؟ (الافتراضي: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## كم عدد طلبات الويب المتزامنة المدعومة؟ يعتمد على الذاكرة وأنوية المعالج.
  ## سيتم تعيينها تلقائيًا بواسطة bootstrap بناءً على المعالجات المكتشفة، أو يمكنك تجاوزها
  UNICORN_WORKERS: 2

  ## TODO: اسم النطاق الذي ستستجيب له هذه النسخة من Discourse
  ## مطلوب. لن يعمل Discourse مع عنوان IP مجرد.
  DISCOURSE_HOSTNAME: community.mysite.com

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

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

  ## TODO: خادم البريد SMTP المستخدم للتحقق من الحسابات الجديدة وإرسال الإشعارات
  ## مطلوب عنوان SMTP واسم مستخدم وكلمة مرور
  ## تحذير: قد يتسبب الحرف '#' في كلمة مرور SMTP في حدوث مشاكل!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: my-smtp-username
  DISCOURSE_SMTP_PASSWORD: "my-smtp-password"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (اختياري، الافتراضي true)

  ## إذا أضفت قالب Let's Encrypt، قم بإلغاء التعليق أدناه للحصول على شهادة SSL مجانية
  LETSENCRYPT_ACCOUNT_EMAIL: myemail

  ## عنوان CDN http أو https لهذه النسخة من Discourse (مُعد للاستخراج)
  ## راجع https://meta.discourse.org/t/14857 للحصول على التفاصيل
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

## حاوية 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"

هل يمكن لأي شخص إخباري أين أخطأت في هذا أو ما الذي قد يكون مفقودًا؟ شكرًا!

ستحظى بنجاح أكبر عند تجربة nginx كوكيل عكسي.

إذا كان نظامك يسمح بذلك، ففكر في استخدام nginx بدلاً من apache2.

إذن، المجتمع لا يعيد التوجيه إلى نطاقك بل يشير إلى عنوان IP الخاص بك، هل الرمز الرمزي (symlink) موجود في /etc/apache2/sites-enabled/؟

هل تم تحميل وحدة proxy_module؟
apache2ctl -M

لا يوجد رابط رمزي.

نعم. لحسن الحظ، هذه إحدى الخطوات في البرنامج التعليمي الذي ربطت به.

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests

قد لا تكون الخطوة

a2ensite community.yoursite.com

قد تمت بنجاح، وقد تحتاج إلى استخدام sudo.

sudo ln -s /etc/apache2/sites-available/community.yoursite.com.conf /etc/apache2/sites-enabled/

يجب أن تفعل الأمر أيضًا.
ثم

sudo apachectl configtest

ثم نصلي للحظ

sudo systemctl restart apache2

عزيزي @OrbitStorm،

لقد ألقيت نظرة سريعة على إعدادات الاستضافة الافتراضية في Apache2 الخاصة بك، وملف yml الخاص بـ Discourse، ويبدو أنها ليست مُهيأة بشكل صحيح.

إليك بعض التلميحات:

أولاً، عند تشغيل Discourse خلف وكيل عكسي (reverse proxy)، لا تقوم بتفعيل SSL LETSENCRYPT في إعدادات ملف yml الخاص بـ Discourse (انظر المثال العامل أدناه). يحتاج Discourse فقط إلى منفذ واحد للتواصل مع الوكيل العكسي، وهذا الاتصال ليس مشفرًا بـ SSL.

ثانيًا، إذا نظرت إلى إعدادات الاستضافة الافتراضية الرئيسية لديك، وهي المنفذ 443 على الوكيل العكسي:

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

       Include /etc/letsencrypt/options-ssl-apache.conf
       SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
       SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

تفتقر الإعدادات أعلاه إلى جميع معلومات الوكيل العكسي الضرورية (انظر إعدادات العمل المرفقة أدناه).

إليك إعداد عامل يعمل بالنسبة لك، وهو في الأساس نفس ما تم شرحه في الدروس المختلفة على meta (مُوثق جيدًا في هذا الموقع في منشورات أخرى، لذا فإن هذا يكرر بشكل أساسي وثائق أخرى هنا على meta):

<VirtualHost *:80>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On
        ErrorLog ${APACHE_LOG_DIR}/discourse_errors.log
        CustomLog ${APACHE_LOG_DIR}/discourse.log combined
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =discourse.your-great-web-site.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

لاحظ أنه في إعدادات المنفذ 80، تشمل التعليمات الأساسية المطلوبة ServerName, RewriteEngine, وقواعد إعادة الكتابة لإعادة التوجيه إلى المنفذ 443.

أيضًا، إذا كنت تشغل Apache2 mod_pagespeed, فيجب عليك تعطيله، حيث لم أتمكن بعد من جعل mod_pagespeed يعمل مع Discourse (ولا أرى سببًا للقيام بذلك).

إليك الإعداد الرئيسي، حيث يتم إنجاز “العمل الفعلي”:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        SSLProxyEngine on      # قم بتفعيل هذا فقط بعد إعداد let's encrypt وجعله يعمل
  	    RewriteEngine on
  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/           # لا نستخدم المنفذ، نستخدم sockets الخاصة بـ your-great-web-site
        #ProxyPassReverse / http://127.0.0.1:8888/    # لا نستخدم المنفذ، نستخدم sockets الخاصة بـ your-great-web-site
        ProxyPass / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        ErrorLog ${APACHE_LOG_DIR}/discourse_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/discourse_ssl.log combined   #تم تعطيل سجل الوصول للإنتاج

        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/discourse.your-great-web-site.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/discourse.your-great-web-site.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

تستخدم جميع إعدادات Discourse لدينا منافذ نطاق يونكس (unix domain sockets)، لذا ستحتاج إلى تعديل الإعدادات لتتناسب مع إعداداتك المطلوبة.

النقطة الرئيسية التي يجب فهمها (باختصار) هي أنه يجب عليك تعطيل LETSENCRYPT في إعدادات بناء Discourse (ملف yml) وكشف نقطة دخول واحدة فقط إلى Discourse، في حالتنا منفذ نطاق يونكس، وفي حالتك منفذ TCP/IP واحد.

ثم تقوم بإجراء الوكيل العكسي إلى نقطة الدخول هذه من ملف الاستضافة الافتراضية للمنفذ 443 (وليس من الاستضافة الافتراضية للمنفذ 80). يقوم الوكيل الافتراضي للمنفذ 80 فقط بإعادة التوجيه إلى 443. يتم تنفيذ SSL الخاص بالمنفذ 443 بالكامل بواسطة LETSENCRYPT في الوكيل العكسي. لا يوجد حاجة لـ SSL في ملف yml الخاص بـ Discourse (انظر المثال العامل أدناه).

إليك أحد ملفات yml العاملة لدينا (للإعداد أعلاه) لمراجعتها:

/var/discourse/containers$ cat socket-only.yml
# IMPORTANT: SET A SECRET PASSWORD in Postgres for the Discourse User
# TODO: change SOME_SECRET in this template

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
#  - "templates/sshd.template.yml"
## Uncomment these two lines if you wish to add Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## which TCP/IP ports should this container expose?
## If you want Discourse to share a port with another webserver like Apache or nginx,
## see https://meta.discourse.org/t/17247 for details
expose:
#  - "80:80"   # http
#  - "443:443" # https

# Use 'links' key to link containers together, aka use Docker --link flag.
links:
  - link:
      name: data
      alias: data

# any extra arguments for Docker?
# docker_args:

params:
  ## Which Git revision should this container use? (default: tests-passed)
  #version: latest
  db_shared_buffers: "4GB"

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  # DISCOURSE_DEFAULT_LOCALE: en

  ## How many concurrent web requests are supported? Depends on memory and CPU cores.
  ## will be set automatically by bootstrap based on detected CPUs, or you can override
  #UNICORN_WORKERS: 3
  UNICORN_WORKERS: 8

  ## TODO: The domain name this Discourse instance will respond to
  DISCOURSE_HOSTNAME: 'discourse.your-great-web-site.com'

  ## Uncomment if you want the container to be started with the same
  ## hostname (-h option) as specified above (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: List of comma delimited emails that will be made admin and developer
  ## on initial signup example 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'tim@discourse.your-great-web-site.com'

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  DISCOURSE_SMTP_ADDRESS: smtp.gmail.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: not_for_reply@discourse.your-great-web-site.com
  DISCOURSE_SMTP_PASSWORD: my_super_secret_cool_password
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)

  ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## TODO: configure connectivity to the databases
  DISCOURSE_DB_SOCKET: ''
  #DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: another_super_secret_cool_password
  DISCOURSE_DB_HOST: data
  DISCOURSE_REDIS_HOST: data

  DISCOURSE_MAXMIND_LICENSE_KEY: my_max_mind_key
  ## The http or https CDN address for this Discourse instance (configured to pull)
  ## see https://meta.discourse.org/t/14857 for details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

volumes:
  - volume:
      host: /var/discourse/shared/socket-only
      guest: /shared
  - volume:
      host: /var/discourse/shared/socket-only/log/var-log
      guest: /var/log

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-bbcode.git
          - git clone https://github.com/discourse/discourse-sitemap.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/unixneo/legacy-info.git

## Remember, this is YAML syntax - you can only have one block with a name
run:
  - exec: echo "Beginning of custom commands"

  ## If you want to configure password login for root, uncomment and change:
  ## Use only one of the following lines:
  #- exec: /usr/sbin/usermod -p 'PASSWORD_HASH' root
  #- exec: /usr/sbin/usermod -p "$(mkpasswd -m sha-256 'RAW_PASSWORD')" root

  ## If you want to authorized additional users, uncomment and change:
  #- exec: ssh-import-id username
  #- exec: ssh-import-id anotherusername

  - exec: echo "End of custom commands"
  #- exec: awk -F\# '{print $1;}' ~/.ssh/authorized_keys | awk 'BEGIN { print "Authorized SSH keys for this container:"; } NF>=2 {print $NF;}'

إن الأمر سهل حقًا بمجرد فهم الأساسيات؛ وفهم الأساسيات يساعد كثيرًا :slight_smile:

يرجى تذكر أنه في إعدادات Discourse لدينا، لا نقوم بتشغيل حاوية واحدة (في الواقع، نادرًا ما نعمل في وضع الحاوية الواحدة)، لذا فإن ملف yml الخاص بنا لن يعمل في إعداد حاوية واحدة (مستقلة). أقدمه لك كمرجع لمساعدتك، من خلال إظهار ما يبدو عليه إعداد عامل كامل خلف Apache2.

نقوم بتشغيل Discourse خلف وكلاء عكسيين من Apache2 و nginx. في الواقع، نستخدم الوكلاء العكسيين فقط لعدة أسباب. أحد الأسباب هو أنه يمكننا استخدام الوكيل العكسي لتصفية البوتات السيئة، وما إلى ذلك (موضوع مختلف تمامًا).

لا يوجد شيء صعب في تشغيل Discourse المُعبأ في Docker (بمقدار المواقع التي تريدها، واحدة أو 100) خلف وكيل عكسي على موقع يستخدم Apache2؛ لكن فهم المفاهيم الأساسية يساعد.

آمل أن يكون تزويدي لك بالمفاهيم الأساسية وملفات إعدادات العمل العامل قد ساعدك في المضي قدمًا وجعل Discourse يعمل.

مع خالص التحية…

@neounix، أقدر ردك المفصل للغاية، لكن يبدو أن معظم المشاكل التي أواجهها ناتجة عن عدم قدرتي على العثور على دليل محدّث مناسب. تشير عدة أدلة هنا إلى ضرورة تمكين SSL لـ Discourse في ملف yml، ويذكر أحد هذه الأدلة أنني لا أحتاج إلى إضافة معلومات الوكيل (proxy) إلى ملفات VirtualHost الخاصة بي لأن Let’s Encrypt ينبغي أن يفعل ذلك تلقائيًا. أمثالك تختلف اختلافًا كبيرًا حتى عن الإعدادات الافتراضية لدي، مما يجعلها محيرة بقدر محاولة دمج إعدادات CentOS مع Ubuntu.

أنت محق تمامًا في قولك إن فهم الأساسيات يقطع شوطًا طويلاً، لكن المشكلة تكمن في أن الأساسيات غير مغطاة بشكل صحيح، وعندما تُغطّى، فإنها قديمة منذ ثلاث سنوات ولا تأخذ في الاعتبار أن شخصًا ما يستخدم Apache بدلاً من Nginx أو Ubuntu بدلاً من CentOS. وتجدر الإشارة أيضًا إلى أن Discourse هو السبب الوحيد الذي يجعل لدي أي استخدام لـ Docker.

بعد قضاء أربعة أيام فقط في محاولة تثبيت التطبيق جنبًا إلى جنب مع Apache، لقد توقفت. سواء كان مجانيًا أم لا، فهذا لا يستحق كل هذا العناء، ولن أستمر في تصفح المنتديات فقط لأجد روابط منسوخة ولصقها لنفس الدليلين القديمين وغير المكتملين. لم أواجه تجربة محبطة مع مجرد تثبيت برمجيات المنتديات حتى جاء Discourse. هذا يقول الكثير. فـ XenForo و Invision منصتان لديّ خبرة هائلة فيهما، وتثبيتهما واستخدامهما أمر سهل جدًا.

أقدر حقًا الجهد الذي بذلته في ردك، لكنني لن أطلب منك القيام بالعمل نيابة عني، ولا ينبغي أن أكون مضطرًا لذلك إذا كانت هناك توثيقية مناسبة. إنه لأمر مذهل بالنسبة لي أن ظروفي المحددة، والتي ليست خاصة بي لدرجة الاستثناء، لم يتم تسليط الضوء عليها في دليل جديد يجعل هذه العملية أسهل للمستخدمين الجدد.

بغض النظر عن الأمر، أتمنى لك التوفيق.

رغم أنني كنت أعتزم تمامًا التخلي عن Discourse نظرًا لغياب تام للوثائق الحالية التي لا تركز بشكل مفرط على CentOS/Nginx، إلا أن فردًا كريمًا للغاية وصبورًا في DigitalOcean ردّ على موضوع أنشأته هناك، وبعد بعض المحاولات والأخطاء، ساعد في إعداد دليل بسيط وواضح للمستخدمين المحتملين لـ Discourse الذين يواجهون نفس الظروف التي واجهتها.

كمرجع سريع، تلك الظروف هي:

تثبيت Discourse على نفس الخادم مع Apache | باستخدام Ubuntu 18.04 | DigitalOcean

شكرًا لـ Bobbyiliev @ DigitalOcean
Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean (الإجابة الأولى)

المتطلبات المسبقة

  • لضمان السلامة، تأكد من عمل نسخة احتياطية من Droplet الخاص بك، حتى تتمكن في حال حدوث أي خطأ من العودة إلى نسخة عاملة
  • اتصل عبر SSH بدروبلتك
  • تثبيت Apache، ويمكنك اتباع الخطوات حول كيفية القيام بذلك هنا:

الخطوة 1 - تثبيت Docker

لتثبيت Docker، يرجى اتباع الخطوات هنا:

الخطوة 2 - تحميل Discourse

أولاً، أنشئ مجلدًا لتخزين ملفات Discourse فيه:

mkdir /var/discourse

بعد ذلك، استنسخ صورة Docker الرسمية لـ Discourse إلى /var/discourse.

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

الخطوة 3 - تكوين Discourse للاستماع على المنفذ 8080

سنستخدم قالب standalone.yml الذي يتضمن جميع الخدمات الضرورية مثل PostgreSQL و Redis وغيرها.

انسخ ملف العينة باستخدام الأمر التالي:

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

بعد ذلك، عدّل الملف باستخدام محررك المفضل. افتح /var/discourse/containers/app.yml وحدّث المنافذ في السطرين 23 و24:

## which TCP/IP ports should this container expose?
expose:
  - "8080:80"   # fwd host port 8080   to container port 80 (http)
  - "8443:443"   # fwd host port 8443 to container port 443 (http)

أيضًا، إذا لم تكن لديك شهادة SSL بعد، تأكد من التعليق على السطر 16:

  #- "templates/web.ssl.template.yml"

فقط أضف رمز # في بداية السطر - "templates/web.ssl.template.yml، وإلا فلن يبدأ Discourse.

الخطوة 4 - إعداد Discourse

تغيير المجلد:

cd /var/discourse

ثم، ابدأ Discourse (وبما أن هذه هي المرة الأولى التي تبدأ فيها الخدمة، فسيتم تهيئة التطبيق مع التغييرات الجديدة الموجودة في ملف app.yml):

./discourse-setup

ملاحظة: تأكد من تقديم إعدادات خادم البريد الصالحة، وإلا فقد يفشل الإعداد.

الخطوة 5 - إعداد Apache

في /etc/apache2/sites-available/، أنشئ ملفًا جديدًا باسم forum.example.com.conf وأضف محتوى Vhost التالي:

<VirtualHost *:80>
  ServerName forum.example.com
  ServerAlias www.forum.example.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>
  • فعّل Vhost باستخدام الأمر التالي:
a2ensite forum.example.com
  • فعّل Mod Proxy:
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests
  • أعد تشغيل Apache:
systemctl restart apache2

وبعد ذلك، ستكون قادرًا على الوصول إلى Discourse مباشرة عبر اسم النطاق الخاص بك.


ملاحظة 1: عند تثبيت Discourse، قد يتم الكتابة فوق ملف app.yml وسيتم إلغاء التعليق على السطرين 16/17 (SSL). ستحتاج إلى تعليق هذين السطرين مرة أخرى ثم إعادة بناء التطبيق (لا تنسَ تغيير المجلد): ./launcher rebuild app

ملاحظة 2: SSL غير مفعّل لـ Discourse مع هذا الدليل. ومن غير المستغرب أنه لا يبدو أن هناك أي وثائق حول تمكين SSL من Let’s Encrypt إذا كان لديك بالفعل مفعّل في Apache. إذا صادف أحد ما حلاً لهذه المشكلة، يرجى التواصل معنا.