إعداد تكوين Multisite مع Let's Encrypt وبدون وكيل عكسي

يجب اعتبار هذه التعليمات تجريبية وللأشخاص المعتادين على الإعداد القياسي

ولكن في الوقت الحالي (2023.02.11) هذه التعليمات لا تعمل!! (انظر Set up Let’s Encrypt with multiple domains / redirects لكيفية تحديث إعداد letsencrypt لإضافة جزء fullpath. سأقوم بتحديث هذا ليعكس تلك التغييرات قريبًا جدًا.)

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

ونستمر في العرض. . .

يوثق هذا الدليل بشكل عام كيفية إعداد إعداد متعدد المواقع مع مضيفين إضافيين (3 إجمالاً).

يفترض أن لديك تثبيت Discourse الرسمي القياسي أو تثبيت حاويتين (Move from standalone container to separate web and data containers) يعمل.

اسم النطاق للموقع الأساسي

اسم النطاق الفرعي للموقع الثاني

اسم النطاق الفرعي للموقع الثالث

كلمة مرور قاعدة البيانات (نفس كلمة مرور DISCOURSE_DB_PASSWORD) أو discourse في app.yml

لأغراض التبسيط، هذا للموقع الرئيسي المسمى =domain=، مع موقعين إضافيين هما =two=.=domain= و =three=.=domain=. يمكنك استخدام أي أسماء تريدها، ولكن من أجل هذا القالب، فإن عدم وجود اسم مختصر مختلف (لاسم قاعدة البيانات وعنوان المنتدى الفرعي) و اسم المضيف الكامل أسهل قليلاً.

أضف في hooks بعد الإضافات (plugins) في app.yml أو web_only.yml

  before_bundle_exec:
    - file:
        path: $home/config/multisite.yml
        contents: |
         =two=:
           adapter: postgresql
           database: =two=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =two=.=domain=
         =three=:
           adapter: postgresql
           database: =three=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =three=.=domain=

  after_db_migrate:
    - exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate

  after_ssl:
   # أخبر letsencrypt بالشهادات الإضافية التي يجب الحصول عليها
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /-d =domain= /
        to: "-d =domain= -d =two=.=domain= -d =three=.=domain="
        global: true
   # لا تقم بإعادة توجيه جميع المضيفين مرة أخرى إلى اسم النطاق الرئيسي
    - replace:
        filename: "/etc/nginx/conf.d/discourse.conf"
        from: /if \\(\\$http_host[^\\}]*\\}/m
        to: ""

أضف إلى قسم after_postgres في app.yml أو data.yml

  - exec: sudo -u postgres createdb =two= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =two= to discourse;
        cmd: sudo -u postgres psql =two=
        raise_on_fail: false

    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists pg_trgm;"'
    - exec: sudo -u postgres createdb =three= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =three= to discourse;
        cmd: sudo -u postgres psql =three=
        raise_on_fail: false
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists pg_trgm;"'

بعد ذلك،

./launcher rebuild app

أو

./launcher rebuild data
./launcher rebuild web_only
10 إعجابات

لقد جربته للتو، بل جربته مرتين لأنني لم أستطع تصديق أنه يعمل دون أي مشاكل من المحاولة الأولى :smile: كل ما فعلته هو النسخ، وتعديل النطاقات وكلمة المرور، ثم اللصق في الملفات المقابلة لتثبيت جديد يحتوي على حاويتين. :ok_hand:

أرجو تقديم ملاحظاتك إذا كان هناك أي شيء غير واضح. لقد احتجت فقط للتفكير قليلاً في هذا الفقرة:

يبدو أن النص يشير إلى أن إعداد الحاويتين ضروري لمتابعة الخطوات، لكنه في الواقع ليس كذلك. ولم أفهم سبب ربطه بالمنشور رقم 48 من الموضوع بدلاً من المنشور الأولي.

إعجابَين (2)

شكرًا لك! سألقِ نظرة. يبدو أن كلا الأمرين من النوع المتهور الذي كنت آمل أن تخبرني به!

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

شكرًا لك!

إعجابَين (2)

مرحبًا
بدأت بتثبيت قياسي لـ Discourse (على DigitalOcean)، ثم قمت بإعداد nginx (باستخدام هذه التعليمات) لأنني أردت إنشاء موقعي Drupal على نفس الـ droplet.
إذا أردت إنشاء مثيل آخر لـ Discourse، فهل عليّ اتباع ما ورد أعلاه؟

أم أن هذا الدليل أفضل؟

شكرًا لك!
/سيفان

هذه التعليمات مخصصة لحالة عدم استخدام وكيل عكسي. أوصي باتباع تكوين متعدد المواقع مع Docker. قد تعمل التعليمات التي ربطت بها، لكنني أوصي باتباع ما هو موجود هنا أولاً.

إعجابَين (2)

شكرًا؛ ألاحظ أنه مع ذلك ستستخدم كلتا الموقعين نفس إعدادات SMTP :frowning:
هل توجد طريقة لتجاوز ذلك؟
أم أن الدليل الآخر أفضل (يبدو أنه قد يتطلب بعض الجهد لنقل الموقع الحالي إلى شبكة Docker)؟

بدلاً من ذلك، هل من الممكن تثبيت قاعدة كود أخرى، مثل /var/discourse2؟
(سيكلفني حوالي 500 ميجابايت، لكنه يستحق ذلك إذا أنقذني من هذا التعقيد الذهني)

نعم.

لا تستخدم وضع الموقع المتعدد.

نعم، لكنك تحتاج فقط إلى إنشاء تثبيت يحتوي على حاويتين، ثم إنشاء ملف web_only2.yml. (أعتقد أنه يمكنك وجود ملفين من نمط app.yml، لكن ذلك سيتطلب تشغيل نسختين من PostgreSQL دون داعٍ). أعتقد، مع ذلك، أنك ستحتاج إلى نسختين من Redis.

3 إعجابات

شكرًا لك؛ لأنني لست على دراية كافية بفصل البيانات عن حاوية الويب، فقد قمت بإنشاء حاوية مستقلة أخرى تتبع هذه الإرشادات (ويبدو أن الشهادات التي أنشأها certbot تعمل بشكل صحيح). ومع ذلك، يبدو حاليًا أن هناك مشكلة في إعدادات Mailgun: حيث ترسل رسائل التفعيل إلى Gmail، لكن أي بريد مستضاف لدى مسجل النطاق الخاص بي (Dreamhost) يفشل :frowning:

ما مقدار الحمل الإضافي الذي سيسببه مثيل Postgres الإضافي؟
لقد قرأت منشورك حول الفصل وسأجرب ذلك إذا كانت الوفورات كبيرة.

على الأرجح ليس كثيرًا. مجرد كمية قليلة من ذاكرة الوصول العشوائي. لدي فكرة قليلة عن الكمية الدقيقة.

إعجاب واحد (1)

لقد جربت هذا مؤخرًا، لكنني أواجه بعض الصعوبات في الإرشادات:

  1. لا أستطيع العثور على كلمة مرور قاعدة البيانات (أو حتى معرفة الغرض منها في الملف).
  2. لم يكن ملف app.yml يحتوي في الأصل على قسم after_postgres، لذا أضفته تحت قسم hooks ليتوافق مع الأقسام الأخرى (مثل after_ssl و after_db_migrate وما إلى ذلك). إذا كان هذا القسم موضعًا في مكان خاطئ، أرجو إخباري، فأنا جديد تمامًا في التعامل مع هذا النوع من الأمور.
  3. عند التحقق من صحة ملف YAML على الموقع http://www.yamllint.com/، أتعرض للخطأ (<unknown>): did not find expected key while parsing a block mapping في السطر الذي أضفت فيه قسم after_postgres تحت قسم hooks.

إذا أمكنك توضيح خطوات تعديل ملف app.yml، فسأكون ممتنًا جدًا.

إعجابَين (2)

ربما لا تحتاج إلى كلمة مرور إذا كنت تستخدم إعداد حاوية واحدة (يشير منشور سابق إلى ذلك).

إضافة القسم كما اقترحت يجب أن يعمل.

لم أستطع تحديد ما قد يكون الخطأ. سأحاول إلقاء نظرة أوثق خلال بضعة أيام.

إعجاب واحد (1)

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

كنت أفكر في وضعها على نطاقات مختلفة، وأتفهم أن هذا قد يسبب بعض الارتباك حيث سيتلقى الأشخاص رسائل البريد الإلكتروني من عنوان SMTP الرئيسي فقط، ومع ذلك، هل تعرف ما إذا كانت النطاقات المنفصلة ستسبب أي مشاكل أخرى؟

لدى Discourse نطاق واحد لجميع عملائه من الشركات والعملاء القياسيين. يمكنك جعل عنوان البريد الإلكتروني للإشعارات أي شيء تريده مثل shortname@whatevermail.com.

إعجابَين (2)

يسعدني جداً سماع ذلك، شكراً لك!

إعجاب واحد (1)

مرحباً، أولاً وقبل كل شيء شكراً على هذا الدليل.

للأسف، لدي مشكلة في تشغيل منتديات ديسكورس إضافية على نفس الخادم/عنوان IP.
أولاً، اتبعت الوثائق لإنشاء موقع مستقل ونجح الأمر.
(على سبيل المثال: test.john.com - نطاق فرعي يعيد التوجيه إلى عنوان IP الفردي)
الآن عندما حاولت إضافة المزيد من منتديات ديسكورس (على سبيل المثال: test.joe.com و test.doe.com - نطاقات فرعية أخرى من مواقع مختلفة).
حاولت اتباع خطواتك ولكنها لم تنجح وأنا الآن تائه.

بعض الأسئلة:

  1. كيف سيتم تثبيت هذين الموقعين الإضافيين؟ مثل نسخ /standalone.yml إلى دليل containers وإعادة تسميته؟ ثم القيام بالتثبيت العادي؟ (على سبيل المثال: ./launcher rebuild joe)
  2. تشير تعليماتك إلى أن التغييرات يجب أن تكون في app.yml، وإلحاق كل التعليمات البرمجية أعلاه - والتي أفترض أنها ستضاف في الملف المثبت بنجاح أولاً (test.john.com

بخلاف تلك الموجودة في دليل container، قمت بإنشاء config/multisite.yml وهذا ما تبدو عليه التعليمات البرمجية الخاصة بي:

secondsite:
  adapter: postgresql
  database: b_discourse
  username: postgres
  password: postgres
  host: dbhost
  pool: 5
  timeout: 5000
  host_names:
    - test.joe.com
...
...
# وتكوين الموقع الثالث

لست متأكداً على الرغم من ذلك إذا كانت هناك أشياء أخرى أحتاج إلى تكوينها.

أقدر أي رد. شكراً لك!

لا. أنت تضيف الأشياء إلى app.yml كما هو موضح. سيؤدي ذلك إلى إنشاء mutlisite.yml داخل الحاوية. سيكون هناك مثيل واحد وسيعمل لجميع المجالات، نظرًا لأن نظام أسماء النطاقات (DNS) لجميعها يشير إلى هناك. هذا ليس لامتلاك حاويات Discourse متعددة، واحدة لكل اسم نطاق.

آخر مرة تحققت فيها، نجحت تلك التعليمات كما هي مكتوبة. فقط أضف الأسطر إلى ملف app.yml الخاص بك ويجب أن يعمل. لست بحاجة إلى لمس أي ملفات أخرى.

إعجاب واحد (1)

الإعداد القياسي لموقع ويب واحد يعمل بشكل مثالي. لا توجد مشكلة.
ولكنني جربت العديد من التوليفات للمواقع المتعددة. تكوين تطبيق واحد app.yml أو فصله بواسطة web_only.yml، data.yml، إلخ… جربت نصائح أخرى في تكوين المواقع المتعددة باستخدام Docker أو الانتقال من حاوية مستقلة إلى حاويات ويب وبيانات منفصلة.

فيما يتعلق بجزء الترحيل، فشلت جميع التوليفات دائمًا… >> bundle exec rake multisite:migrate

********************** الجزء الأخير من العملية**************************
2023-02-11 17:50:43.853 UTC [61] LOG: إيقاف التشغيل
162:M 11 Feb 2023 17:50:43.866 # طلب المستخدم الإيقاف...
162:M 11 Feb 2023 17:50:43.866 * حفظ لقطة RDB النهائية قبل الخروج.
162:M 11 Feb 2023 17:50:43.881 * تم حفظ قاعدة البيانات على القرص
162:M 11 Feb 2023 17:50:43.882 # Redis جاهز الآن للخروج، وداعًا...
2023-02-11 17:50:44.007 UTC [57] LOG: تم إيقاف تشغيل نظام قاعدة البيانات

فشل
--------------------
Pups::ExecError: cd /var/www/discourse & sudo -E -u discourse bundle exec rake multisite:migrate فشل مع العودة #<Process::Status: pid 582 exit 1>
موقع الفشل: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
فشل التنفيذ مع المعلمات "cd /var/www/discourse & sudo -E -u discourse bundle exec rake multisite:migrate"
فشل التمهيد برمز خروج 1
** فشل التمهيد ** يرجى التمرير لأعلى والبحث عن رسائل خطأ سابقة، قد يكون هناك أكثر من واحدة.
قد يساعد ./discourse-doctor في تشخيص المشكلة.

لقد تحققت مما تم إنشاؤه وما لم يتم إنشاؤه حتى الفشل.
تم إنشاء قواعد بيانات النطاقات الفرعية ولكن الترحيل فشل. لم يتم إنشاء تكوينات nginx للنطاقات الفرعية أو multisite.yml عندما تحققت من مجلدات overlay2 أو في أي مكان.

./launcher bootstrap، destroy، start، stop، rebuild أو إعداد جديد عدة مرات… جربت جميع الأوامر ولكن لم يحدث شيء… :slight_smile:

هل هذا البرنامج التعليمي لا يزال صالحًا لـ v3.1.0.beta 2 أم ماذا يمكن أن أكون قد فاتني؟
أي فكرة، من فضلك؟

إعجاب واحد (1)

لا. لقد تغير شيء ما بخصوص Let’s Encrypt في وقت ما. سأجعلك تلقي نظرة فاحصة على كل ما تحتاجه لتغييره داخل الحاوية للتعامل مع نطاقات متعددة.

إعجاب واحد (1)

أنا أستخدم هذه الطريقة وهي تعمل بشكل جيد. لا أملك https ممكّنًا حاليًا، لذلك لا يمكنني التعليق على صعوبات Let’s Encrypt.

لقد كنت أستخدم هذا الإعداد لسنوات مع خوادم الاختبار الخاصة بي. ومع ذلك، منذ التحديث إلى 3.5.0.beta5-dev، يتم الآن إعادة توجيهي إلى الموقع الأساسي كلما أدخلت نطاقًا فرعيًا.

لقد كنت سعيدًا جدًا لعدم الاضطرار إلى الدخول في كل أمور الشهادات. ولكن الآن أنا تائه تمامًا، هل هناك أدوات لتصحيح ما يحدث؟

إعجاب واحد (1)