أريد تشغيل منتدى Discourse الخاص بي جنبًا إلى جنب مع خادم WordPress الخاص بي، ولكن بالطبع يعمل كلاهما على المنفذ 80 و 443 بشكل افتراضي. للتغلب على هذه المشكلة، أخطط لاستخدام وكيل عكسي NGINX لتحويل النطاقات الفرعية الظاهرة أمام المستخدم إلى تطبيقات تعمل على منافذ مختلفة في الخلفية. فيما يلي الخطوات التي اتخذتها لتثبيت Discourse:
mkdir /var/discourse
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
# إنشاء ملف الإعدادات
cat <<-"EOF" > /var/discourse/containers/discourse
## هذا قالب حاوية 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"
## قم بإلغاء التعليق عن هذين السطرين إذا كنت ترغب في إضافة 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:
- "10080:80" # http
- "10443: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_GB.UTF-8
LANG: en_GB.UTF-8
LANGUAGE: en_GB.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## كم عدد طلبات الويب المتزامنة التي يتم دعمها؟ يعتمد على الذاكرة ونوى المعالج.
## سيتم تعيينها تلقائيًا بواسطة bootstrap بناءً على وحدات المعالجة المركزية المكتشفة، أو يمكنك تجاوزها
#UNICORN_WORKERS: 3
## TODO: اسم النطاق الذي ستستجيب له هذه النسخة من Discourse
## مطلوب. لن يعمل Discourse مع عنوان IP مجرد.
DISCOURSE_HOSTNAME: 'forum.example.com'
## قم بإلغاء التعليق إذا كنت تريد بدء الحاوية بنفس اسم النطاق
## (-h option) المحدد أعلاه (الافتراضي "$hostname-$config")
#DOCKER_USE_HOSTNAME: true
## TODO: قائمة عناوين البريد الإلكتروني المفصولة بفواصل سيتم تعيينها كمسؤول ومطور
## عند التسجيل الأولي مثال 'user1@example.com,user2@example.com'
DISCOURSE_DEVELOPER_EMAILS: 'webmaster@example.com'
## TODO: خادم البريد SMTP المستخدم للتحقق من الحسابات الجديدة وإرسال الإشعارات
# عنوان SMTP واسم المستخدم وكلمة المرور مطلوبة
# تحذير: قد يسبب حرف '#' في كلمة مرور SMTP مشاكل!
DISCOURSE_SMTP_ADDRESS: smtp-relay.example.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: info@example.com
DISCOURSE_SMTP_PASSWORD: password
DISCOURSE_SMTP_ENABLE_START_TLS: true # (اختياري، الافتراضي true)
#DISCOURSE_SMTP_DOMAIN: discourse.example.com # (مطلوب من بعض المزودين)
DISCOURSE_NOTIFICATION_EMAIL: no-reply@example.com # (العنوان المرسل منه الإشعارات)
## إذا أضفت قالب Lets Encrypt، قم بإلغاء التعليق أدناه للحصول على شهادة SSL مجانية
LETSENCRYPT_ACCOUNT_EMAIL: webmaster@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"
EOF
# إعداد Discourse مع ملف الإعدادات
./launcher bootstrap discourse
يمكنني تأكيد أن Discourse يستمع على المنافذ الصحيحة:
root@ubuntu-server:~# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:10080 0.0.0.0:* LISTEN 185948/docker-proxy
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 150667/docker-proxy
tcp 0 0 0.0.0.0:9000 0.0.0.0:* LISTEN 150655/docker-proxy
tcp 0 0 0.0.0.0:10443 0.0.0.0:* LISTEN 185937/docker-proxy
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 169991/nginx: maste
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 519/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1465/sshd: /usr/sbi
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 169991/nginx: maste
tcp6 0 0 :::22 :::* LISTEN 1465/sshd: /usr/sbi
إذا قمت بطلب URL ورقم المنفذ باستخدام curl، سأحصل على 301 Moved permanently:
root@ubuntu-server:~# curl forum.example.com:10080
<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.18.0</center>
</body>
</html>