على الرغم من أن تعدد المواقع (multisite) مدعوم في تطبيق Discourse، إلا أن هذا إعداد متقدم لمسؤول النظام. إذا لم تكن تعرف ما تفعله، فلا تقم بإعداد تعدد المواقع. فريق Discourse غير قادر على تقديم دعم لإعداد تعدد المواقع.
إذا كنت ترغب في استضافة نطاقات متعددة على إعداد Docker واحد، فستحتاج إلى إعداد تعدد المواقع. فيما يلي اللبنات الأساسية لذلك.
فهم الخطافات (Hooks)
تعدد المواقع موضوع متقدم إلى حد ما. قبل محاولة بناء تعدد المواقع، اقضِ بعض الوقت في تعلمها.
تستخدم قوالب Discourse pups؛ وقواعدها بسيطة وقوية.
كل قاعدة تقوم بتشغيلها قد تُعرّف خطافًا (hook):
run:
exec:
cd: some/path
hook: my_hook
cmd:
- echo 1
لاحقًا في الحاوية الخاصة بك، يمكنك إدراج قواعد قبل أو بعد خطاف:
hooks:
before_my_hook:
- exec: echo "I ran before"
after_my_hook:
- exec: echo "I ran after"
لذا في المثال أعلاه، سترى مخرجات مثل ما يلي:
I ran before
1
I ran after
يمكنك قراءة القوالب في /var/discourse/templates لمعرفة الخطافات المتاحة لديك.
تعديل حاوية التثبيت المستقلة لتوفير مستأجر الموقع الثاني
استبدل قسم الخطافات بأكمله بما يلي:
hooks:
after_postgres:
- exec: sudo -u postgres createdb b_discourse || exit 0
- exec:
stdin: |
grant all privileges on database b_discourse to discourse;
cmd: sudo -u postgres psql b_discourse
raise_on_fail: false
- exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "alter schema public owner to discourse;"'
- exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists hstore;"'
- exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists pg_trgm;"'
after_code:
- exec:
cd: $home/plugins
cmd:
- mkdir -p plugins
- git clone https://github.com/discourse/docker_manager.git
before_bundle_exec:
- file:
path: $home/config/multisite.yml
contents: |
secondsite:
adapter: postgresql
database: b_discourse
pool: 25
timeout: 5000
db_id: 2
host_names:
- b.discourse.example.com
after_bundle_exec:
- exec: cd /var/www/discourse && sudo -H -E -u discourse bundle exec rake multisite:migrate
هناك 3 خطافات قيد الاستخدام:
-
after_postgresيضمن أنه بعد تثبيت postgres يتم إنشاء قاعدة بيانات إضافية تسمىb_discourseمع الأذونات المناسبة. -
before_bundle_execيضمن وجودdocker_managerوأن ملفmultisite.ymlموجود (والذي يحدد مكان العثور على قواعد البيانات) -
after_bundle_execيشغل مهمة ترحيل قاعدة البيانات المخصصةrake multisite:migrateوهذا يضمن تحديث جميع قواعد البيانات.
ملاحظة حول التكوين
يمكن تقسيم العينة المذكورة أعلاه إلى حاوية بيانات / حاوية تطبيق إذا لزم الأمر. فقط قم بتشغيل الخطاف after_postgres في حاوية البيانات والباقي في حاوية الويب.
يمكن توسيع العينة المذكورة أعلاه لتوفير المزيد من قواعد البيانات. للقيام بذلك، قم بتوفير المزيد من قواعد البيانات عن طريق تكرار استدعاءات إنشاء قاعدة البيانات وما إلى ذلك، وتأكد من إضافة مواقع إضافية في multisite.yml.
تأكد من تعديل عقدة host_names في multisite.yml لتتوافق مع اسم المضيف الفعلي الذي ترغب في استضافته.
أيضًا، إذا كنت تخطط لتشغيل HTTPS، فستحتاج إلى وكيل (proxy) أمام الموقع للتعامل معه لأن وظيفة letsencrypt المضمنة لن تعمل في سيناريو تعدد المواقع.