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

These instructions should be considered beta and for those familiar with a standard setup

But right now (2023.02.11) these instructions do not work!! (See Set up Let’s Encrypt with multiple domains / redirects for how to update the letsencrypt setting to add the fullpath part. I’ll update this to reflect those changes Real Soon Now.)

I developed this howto a couple weeks ago but need someone to test and see if this works for someone else. Please reply if you try and let me know whether it works and if anything is unclear.

And on with the show. . .

This howto documents broadly how to set up a multisite setup with 2 additional hosts (3 total).

It assumes that you have a working Discourse official Standard Installation or 2-container installation (Move from standalone container to separate web and data containers).

Domain name for primary site

subdomain for the 2nd site

Suddomain for the 3rd site

Database password (same as DISCOURSE_DB_PASSWORD) or discourse in app.yml

For the sake of simplicity, this is for a main site called =domain=, with two additional sites =two=.=domain= and =three=.=domain=. You can use whatever names you want, but for the sake of this template, not having a different short name (for the database name and title for the sub-forum) and full hostname is a bit easier.

add in hooks after the plugins in app.yml or 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:
   # tell letsencrypt what additional certs to get
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /-d =domain= /
        to: "-d =domain= -d =two=.=domain= -d =three=.=domain="
        global: true
   # do not redirect all hosts back to the main domain name
    - replace:
        filename: "/etc/nginx/conf.d/discourse.conf"
        from: /if \(\$http_host[^\}]*\}/m
        to: ""

Add to the after_postgres section in app.yml or 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;"'

After that,

./launcher rebuild app

or

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

I just tried it out, in fact I tried it twice because I couldn’t believe it just worked without any problems the first time already :smile: All I did was copying, adjusting the domains and password and then pasting into the respective files of a fresh installation with 2 containers. :ok_hand:

Regards feedback whether anything is unclear, I only had to mull a bit over this paragraph:

It seems to suggest a 2-container setup is necessary to follow along, but then it isn’t. And I didn’t understand why it links to post 48 of the topic, rather than the initial post.

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

Thanks! I’ll take a look. Those both seem like the kind of careless things I was hoping you’d let me know about!

EDIT: Thanks! I’d carelessly copied my current location in the 2-container topic, so I fixed that, and changed the language to say that it’ll work with any working installation.

Thanks!

إعجابَين (2)

Hi
I started with a standard Discourse install (at DigitalOcean), then setup nginx (using these instructions) because I wanted a couple of Drupal sites on the same droplet
If I want to have another instance of Discourse should I follow the above?

Or would this guide be better?

Thanks!
/Sifaan

These instructions are for not using a reverse proxy. I’d recommend that you follow Multisite configuration with Docker. The instructions that you linked might work, but I’d recommend that you first follow what’s here.

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

Thanks; I notice that with that both sites would use the same SMTP config :frowning:
is there a way to bypass that?
or would the other guide be better (looks like it might require some work to put the existing site on the docker network)

alternately, is it possible to install another codebase, say /var/discourse2 ?
(it will cost me ~500MB but worth it if it saves me the brain damage)

Yes.

Don’t use multisite.

Yes, but you just need to create a 2-container installation and then have a web_only2.yml. (I think that you can have 2 app.yml-style files, but then you’re needlessly running two postgres instances). I think, though, that you do need two redis instances.

3 إعجابات

Thanks; because I am not too familiar with splitting the data and web container I just created another standalone container following these guidelines (and certificates created by certbot seem to be working). However currently there seems to be an issue with mailgun config - it sends activation emails to gmail but anything mail hosted at my registrar (dreamhost) is failing :frowning:

How much of a extra load would the extra Postgres instance causing?
I looked at your post about splitting and will try it if the savings were significant.

Probably not that much. Just a bit of RAM. I have little idea how much.

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

Recently I’ve been giving this a try, but I’m having trouble with a couple of things in the guide:

  1. I can’t seem to find the Database password (or what it is even used for in the file)
  2. My app.yml file did not originally contain an after_postgres section, so I added one under hooks to match the others (after_ssl, after_db_migrate, etc.). If this is placed in the wrong section, please let me know, I’m completely new to working with this type of stuff.
  3. When I check the syntax of the YAML file on http://www.yamllint.com/ I get (<unknown>): did not find expected key while parsing a block mapping on the line where I put the after_postgres section under the hooks section.

If you could clarify the steps for editing the app.yml file, that would be greatly appreciated.

إعجابَين (2)

Maybe you don’t need a password if you’re using a single container setup (an earlier post suggests that).

Adding the section as you suggest should work.

I can’t quite the what might be wrong. I’ll try to take a closer look on a couple of days.

إعجاب واحد (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، يتم الآن إعادة توجيهي إلى الموقع الأساسي كلما أدخلت نطاقًا فرعيًا.

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