تثبيت Docker و Discourse على AWS EC2 Linux مع وجود عكسي HTTPD
مرحباً بالجميع
لقد تمكنت من حل المشكلة. عدت إلى نقطة الصفر وبدأت من جديد بتثبيت Docker و Discourse نظيفين. تفصيل عمليتي أدناه:
الافتراضات
• لديك بالفعل مثيل AWS EC2 يعمل بنظام Linux
• يمكنك الوصول إلى مثيل EC2 الخاص بك باستخدام SSH
• تم تكوين Apache 2 وتشغيله بالفعل على الخادم الخاص بك
الوصول إلى مثيل EC2 الخاص بك باستخدام SSH
-
افتح موجه الأوامر (CMD) أو الطرفية (Terminal)
-
اتصل بمثيل AWS EC2 عبر SSH
مثال على الشاشة بمجرد الاتصال بمثيل EC2
إجراء تحديثات النظام
- قم بإجراء تحديثات النظام بتشغيل الأمر التالي في وحدة التحكم / الطرفية
$ sudo yum update
تثبيت Docker
- ابحث عن حزمة Docker الخاصة بـ AWS بتشغيل الأمر التالي في وحدة التحكم / الطرفية
$ sudo yum search docker
- احصل على معلومات الإصدار بتشغيل الأمر التالي في وحدة التحكم / الطرفية
$ sudo yum info docker
- قم بتثبيت Docker بتشغيل الأمر التالي في وحدة التحكم / الطرفية
$ sudo yum install docker
- أضف عضوية المجموعة لمستخدم ec2-user الافتراضي حتى تتمكن من تشغيل جميع أوامر Docker دون استخدام الأمر sudo بتشغيل الأمر التالي في وحدة التحكم / الطرفية
$ sudo usermod -a -G docker ec2-user
$ id ec2-user
# إعادة تحميل تعيينات مجموعة مستخدم Linux إلى Docker دون تسجيل الخروج
$ newgrp docker
- قم بتثبيت 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
- فعّل خدمة Docker لتبدأ تلقائيًا عند التشغيل بتشغيل الأمر التالي في وحدة التحكم / الطرفية
$ sudo systemctl enable docker.service
- ابدأ خدمة Docker بتشغيل الأمر التالي في وحدة التحكم / الطرفية
$ sudo systemctl start docker.service
- تحقق من تشغيل خدمة 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
- أنشئ مجلد Discourse
$ sudo mkdir /var/discourse
- استنسخ صورة Docker الخاصة بـ Discourse إلى الدليل الذي تم إنشاؤه حديثًا
$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
- انسخ ملف standalone.yml إلى مجلد containers
$ cp /var/discourse/samples/standalone.yml /var/discourse/containers/discourse.yml
- قم بتحرير ملف 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 "نهاية الأوامر المخصصة"
- بمجرد تحرير الملف وحفظه، أعد بناء تطبيق Discourse باستخدام الأمر التالي في الطرفية
$ /var/discourse/launcher rebuild discourse
ملاحظة: إذا كان اسم ملف yaml الخاص بك شيئًا آخر، فستستبدل discourse باسم ملف yaml الخاص بك
ملاحظة أن عملية إعادة البناء تستغرق وقتًا.
- بمجرد إعادة بناء التطبيق، يجب أن يعمل التطبيق على المنفذ 8080. للتحقق من ذلك، قم بتشغيل الأمر التالي في الطرفية
$ sudo lsof -i -P -n | grep LISTEN
مثال على مخرجات المنافذ
لاحظ أن Docker يستمع على المنفذ 8080، بينما يستمع httpd (Apache) على المنفذ 80.
من حيث توجيه حركة المرور، سيستقبل Apache طلب الويب وسيتم توجيهه عند الحاجة إلى حاوية Discourse على المنفذ 8080.
لضمان حدوث التوجيه، يجب عليك تكوين المضيف الافتراضي في ملف تكوين Apache.
تكوين المضيف الافتراضي لـ Apache
- يقع ملف تكوين 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>
- تحتاج إلى إنشاء سجل 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.


