تثبيت Discourse على CloudPanel

:warning: This installation method is not officially endorsed. Use at your own risk.

The Discourse team only recommend installation using the official install guide

:information_source: This is an unsupported install, appropriate for those who have experience with CloudPanel, are experienced system administrators, and comfortable with docker, reverse proxies, and have successfully completed a standard installation.

Why CloudPanel

Why might you want to install a Discourse Forum on a VPS or Dedicated Server running CloudPanel?

Here are my reasons:

I prefer to use a graphical interface for server and site administration. I’ve used most of the web hosting control panels at one time or another.

In comparison to the rest, CloudPanel is very slim and minimal and uncluttered. It has every feature I need, presented very simply and intuitively. And that’s it. It has nothing I don’t need.

I develop and host and manage many Ghost blogs, Wordpress sites, Drupal sites, and other types of sites in addition to Discourse forums. I really only need one server where I can host my Discourse forums right along side my Ghost Blogs and my Wordpress and Drupal sites. (I don’t want to pay for and maintain a separate server for each instance of Discourse.)

CloudPanel includes (right out-of-the-box) built-in Nginx and a simple interface for setting up and managing Reverse Proxies which are necessary in order to run one or more instances of Discourse on the same server or with other types of websites.

The Discourse team (and the Meta forum staff here) do not provide support for alternative server environments like Cpanel or Plesk or (as in this case) CloudPanel, or others that rise up out of the command line.

So I thought I’d share my setup and my process in case there are others who might find it useful.

[If anyone tries this method, please do let me know if/how it works out for you, or if I can improve this tutorial! :heart_eyes: ]

Install Docker

In Putty (or other terminal), from the root directory, run

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io

Create a Reverse Proxy Site in CloudPanel

→ We click the + Add Site button…

For my Discourse instance I am using my domain name noobish.me, so from now on wherever you see that in the rest of these instructions, replace noobish.me with your actual domain name (for example, yoursite.com)

→ We create a new “Reverse Proxy Site” in the CloudPanel for the domain where we want to host our Discourse forum (of course the DNS A record of the domain needs to be pointing to the same IP address as our CloudPanel.)

Prepare the Domain and Set up SSL

cloudflare-logo

For my site I’m using Cloudflare’s nameservers to point the domain. In Cloudflare I set the SSL to Full or Full (strict).

I also create a Cloudflare Page Rule. Visit this post to learn why.

I’m also using a free Cloudflare SSL Origin Certificate for my domain, which I “Import” into CloudPanel within the “SSL/TLS” site settings for that site (by simply pasting in both the Certificate and the Private Key I had downloaded for that domain name from my Cloudflare account.)

Install Discourse

Back in Putty (or other terminal), from the root directory (c d Enter to get back to the root) → Install the Discourse Standard Install using these commands…

git clone https://github.com/discourse/discourse_docker.git /var/discourse

Enter

cd /var/discourse

Enter

chmod 700 containers

Copy the Standalone Configuration

Now we copy the file /var/discourse/standalone.yml to /var/discourse/containers/ as app.yml before editing it according to our site settings.

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml

Edit the app.yml File

In addition to modifying the app.yml file according to our specific site settings, we need to change 3 more things in that file before we save it…

Under the section templates: we need to add

  - "templates/web.socketed.template.yml"

Because I’m using Cloudflare, under the section templates: I also add

  - "templates/cloudflare.template.yml"

Under the section expose: we need to comment out

  #- "80:80"   # http
  #- "443:443" # https

Under the section env: we need to add

   DISCOURSE_FORCE_HTTPS: true
For reference, you can Click Here to see the contents of my working app.yml on noobish.me where I'm using both Cloudflare and Mailgun...
## this is the all-in-one, standalone Discourse Docker container template
##
## After making changes to this file, you MUST rebuild
## /var/discourse/launcher rebuild app
##
## BE *VERY* CAREFUL WHEN EDITING!
## YAML FILES ARE SUPER SUPER SENSITIVE TO MISTAKES IN WHITESPACE OR ALIGNMENT!
## visit http://www.yamllint.com/ to validate this file as needed

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Set db_shared_buffers to a max of 25% of the total memory.
  ## will be set automatically by bootstrap based on detected RAM, or you can override
  db_shared_buffers: "4096MB"

  ## can improve sorting performance, but adds memory usage per-connection
  #db_work_mem: "40MB"

  ## Which Git revision should this container use? (default: 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

  DISCOURSE_FORCE_HTTPS: true

  ## How many concurrent web requests are supported? Depends on memory and CPU cores.
  ## will be set automatically by bootstrap based on detected CPUs, or you can override
  UNICORN_WORKERS: 8

  ## TODO: The domain name this Discourse instance will respond to
  ## Required. Discourse will not work with a bare IP number.
  DISCOURSE_HOSTNAME: 'noobish.me'

  ## Uncomment if you want the container to be started with the same
  ## hostname (-h option) as specified above (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: List of comma delimited emails that will be made admin and developer
  ## on initial signup example 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'admin@noobish.me'

  ## TODO: The SMTP mail server used to validate new accounts and send notifications
  # SMTP ADDRESS, username, and password are required
  # WARNING the char '#' in SMTP password can cause problems!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@noobish.me
  DISCOURSE_SMTP_PASSWORD:  pYdRLyQW
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
  #DISCOURSE_SMTP_DOMAIN: noobish.me    # (required by some providers)
  DISCOURSE_NOTIFICATION_EMAIL: noreply@noobish.me    # (address to send notifications from)

  ## The http or https CDN address for this Discourse instance (configured to pull)
  ## see https://meta.discourse.org/t/14857 for details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## The maxmind geolocation IP address key for IP address lookup
  ## see https://meta.discourse.org/t/-/137387/23 for details
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## The Docker container is stateless; all data is stored in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins go here
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Any custom commands to run after building
run:
  - exec: echo "Beginning of custom commands"
  ## If you want to set the 'From' email address for your first registration, uncomment and change:
  ## After getting the first signup email, re-comment the line. It only needs to run once.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "End of custom commands"

Then we save and exit the app.yml file…

CTRL-X

y

Enter

Next we set the permissions for the app.yml file…

chmod o-rwx containers/app.yml

then…

Bootstrap the App

cd /var/discourse
./launcher bootstrap app

This will take a considerable amount of time. In the end of the bootstrap process, you’ll be asked to:

./launcher start app

Edit the Vhost File

Now we go back into our CloudPanel and paste the below code into the “Vhost Editor” for our Discourse site (overwriting what is already there). Of course replace yoursite.com with your actual domain name.

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  {{ssl_certificate_key}}
  {{ssl_certificate}}
  server_name yoursite.com;
  {{root}}

  {{nginx_access_log}}
  {{nginx_error_log}}

  if ($scheme != "https") {
    rewrite ^ https://$host$uri permanent;
  }

  location ~ /.well-known {
    auth_basic off;
    allow all;
  }

  {{settings}}

  add_header Cache-Control no-transform;

  location / {
                proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
                proxy_set_header Host $http_host;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;

  }
}

Restart Nginx

Next we need to restart Nginx, which we can do by clicking a button in the Admin Area of the CloudPanel…

Congratulations!

Now, in our browser, we can go to our site’s URL and run the Discourse Setup Wizard…

Cohabitate Peacefully

Now I can self-host and manage my Discourse site right along side my Ghost, Wordpress, Drupal and other types of sites using a clean and lean management panel, with minimal need going forward to use the terminal/command line.


To Install Additional Discourse Instances…

3 إعجابات

يجب عليك حذف هذه الخطوات وإنشاء app.yml دون توليد هذا الخطأ. إنه مربك.

(إذا كنت ستستبدل الملف بأكمله، فلماذا تنسخ المثال؟) الشيء الأفضل الذي يجب فعله هو تحديد ما يجب تغييره من العينة الموجودة. يبدو أنه قالب المقبس وفرض https.

هذا يمنحك نسختين من postgres، والتي تستخدم ذاكرة وصول عشوائي أكثر مما تستخدمه نسخة واحدة من postgres. إنه يعمل، ولكنه ليس أفضل ممارسة.

هناك عدد من الأشياء التي تجعل هذا ليس مثالاً جيدًا يجب اتباعه وسيكون من الصعب جدًا دعمه. أنا سعيد لأنك توصلت إلى حل لك، لكنني لا أعتقد أن هذا مسار جيد لإرسال الناس إليه.

3 إعجابات

شكراً لك @pfaffman
أنت على حق. إنها تنجز المهمة، لكن الإجراء فوضوي للغاية. إنه بترتيب خاطئ. أقدر اقتراحاتك وسأقوم بإصلاحها.

هل يمكنك توضيح سبب اعتقادك هذا؟

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

إعجابَين (2)

شكراً مرة أخرى @pfaffman – لقد بسّطت الإجراء الآن وأزلت القسم الخاص بإضافة موقع Discourse ثانٍ على نفس الخادم.

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

لقد تلقيت هذه الرسالة

sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
usage: gpg [options] --dearmor [file]
curl: (23) Failed writing body

لماذا؟

أهلاً أنطونيو. مرحباً بك.

يبدو أن هذه مشكلة دوكر وليست مشكلة تتعلق بـ Discourse. من الأفضل لك البحث باستخدام نظام التشغيل الخاص بك وتحديث docker-ce بدلاً من السؤال هنا.

هل تحاول استخدام Discourse؟ أم CloudPanel؟

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

لقد اتبعت الدليل هنا للتو. قمت بتشغيل الأمر الأول، لتثبيت دوكر، واستجاب الخادم بهذا
الأمر هو:

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

لا ينبغي أن تكون هناك شرطات مائلة عكسية في نهاية كل سطر من هذه الأسطر. الشرطة المائلة العكسية تهرب من سطر جديد، مما يعني أن الصدفة تعامل السطر التالي على أنه استمرار لنفس السطر.

في هذه الحالة، سيؤدي ذلك إلى محاولة تشغيل هذا كأمر واحد وهو مصدر الخطأ:
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\"

مجرد إزالة هذه الشرطات المائلة العكسية في نهاية الأسطر سيحل هذه المشكلة:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
إعجابَين (2)

شكرا لك، الآن يعمل بشكل جيد

إعجابَين (2)

شكراً لك @Simon_Manning – لقد قمت بإزالة الشرطات المائلة العكسية في مقتطف الشفرة في البرنامج التعليمي للمنشور العلوي.

إعجابَين (2)

عذرًا، لقد واجهت هذا الخطأ الآن: FAILED

Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end' failed with return #<Process::Status: pid 112 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'"
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
214c73c4474ed59e7b6fb7f42143ce126d2b453022b08770da3af31ca2fdaaba

لا أعرف CloudPanel، ولكن رسائل الخطأ تبدو واضحة بذاتها:

'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end'
'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'\"

يبدو أن بريدك الإلكتروني لم يتم تكوينه أثناء ./discourse-setup أو داخل app.yml (يمكنك تعديله يدويًا في أي وقت). :thinking:

إعجابَين (2)

عذرًا للجميع، أنا أستاذ في مدرسة فيرمي الثانوية وأحاول تثبيت مجتمع “ديسكورس” لمدرستنا. نظرًا لأننا نستخدم لوحات سحابية، فقد اتبعت هذا الدليل ولكن يبدو أن هناك شيئًا مفقودًا. هل من الممكن الحصول على المساعدة ودليل أكثر تفصيلاً لأتبعه؟ ألف شكر.

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

أعتقد أن استخدام تثبيت متقدم قد لا يكون ما تبحث عنه إذا لم تكن لديك الكثير من المعرفة في إدارة الأنظمة. نقطة أخرى مهمة يجب مراعاتها هي أن مثل هذا التثبيت سيقع تحت #unsupported-install، مما يجعل من غير المرجح الحصول على المساعدة هنا إذا واجهت مشكلات.

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

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

عذرًا، ولماذا تُستخدم خدمة كهذه؟ في رأيي، ربما الدليل ليس مفصلاً للغاية، فهو مُعد لمسؤولي النظام، وسيكون كافياً ببساطة الإشارة إلى الخطوات المختلفة. حيثما أتيت، يُقال: لا أحد يولد متعلمًا. شكرًا لمساعدتك ووقتك.

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

هذا صحيح تمامًا. لهذا السبب تم التوصية بالتثبيت القياسي.

وهذا، @denvergeeks هو السبب في أنني لم أعتقد أن إنشاء دليل كهذا كانت فكرة جيدة في المقام الأول. من الصعب كتابته، ومن الصعب صيانته، وأنت الشخص الوحيد الذي يمكنه التحقق منه.

4 إعجابات

أنا آسف ولكنني لا أتفق. أنا أستخدم بالفعل لوحة التحكم السحابية مع نطاقات مختلفة، علاوة على ذلك، سيعمل مجتمع المناقشة على نطاق فرعي ثم يكون افتراض المؤلف واضحًا جدًا (الدليل مخصص لأولئك الذين يستخدمون لوحة التحكم السحابية مع خدمات مختلفة مثبتة على VPS). كل ما يتطلبه الأمر هو القليل من الجهد لتفصيل كل شيء بشكل أفضل. على أي حال، فإن مشاركة المعرفة هي أساس المجتمعات، وإلا لكنت قد اشتريت برنامجًا مثبتًا وجاهزًا للاستخدام بالفعل. على أي حال، لا أريد إزعاج أي شخص، إذا كان من الممكن الحصول على المساعدة، فشكرًا لك، وإلا فلن أزعجك مرة أخرى.

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

@denvergeeks إعداد البريد الإلكتروني أمر بالغ الأهمية للتشغيل العادي وعلى الرغم من وجود رابط للتثبيت القياسي، فإن الطريقة التي تمت بها كتابة الدليل حاليًا تتجاوز إعداد البريد الإلكتروني بالإضافة إلى معلومات أخرى متنوعة قد تكون مهمة لإعدادات معينة.

أتساءل عما إذا كان الأمر يستحق استبدال أقسام تثبيت ديسكورس حتى تهيئة التطبيق بشيء أقرب إلى:

تثبيت وتهيئة ديسكورس

اتبع التثبيت القياسي من خلال الخطوات 1-6

قم بتنفيذ الأشياء الموجودة حاليًا في تعديل ملف app.yml

إعادة بناء ديسكورس:

./launcher rebuild app

ثم في قسم تهانينا!، أضف سطرًا بعد لقطة الشاشة لتقول شيئًا مثل “تابع بقية وثائق التثبيت القياسي”. في الأساس، أعد صياغة الدليل لتقديم خطوات إضافية تعزز التثبيت القياسي بدلاً من تقديم تعليمات تثبيت بديلة.

أعتقد أن المعلومات التي قدمتها حول CloudPanel مفيدة للغاية والتعليمات واضحة، ويمكن أن يستفيد جانب Discourse فقط من وجود تباعد أقل عن التثبيت القياسي لجعله أكثر أمانًا بالإضافة إلى علامة #unsupported-install لتوضيح (بشكل أوضح) أن هنا توجد مخاطر.

إعجابَين (2)

ينحرف النقاش نوعًا ما عن الموضوع الأصلي، ولكن كن مطمئنًا بأننا سعداء بالمساعدة. :slight_smile:

لتلخيص الأمر:

إذا كانت لديك معرفة أساسية بتقنية المعلومات، يمكنك اتباع التثبيت القياسي. ستحتاج أيضًا إلى اسم نطاق، وتكوين خدمة إرسال البريد الإلكتروني مثل Mailgun (دليل هنا: Configure Mailgun for email when using Digital Ocean for DNS).

لاحظ أننا عادةً لا نساعد في الأمور التي تقع خارج نطاق هذا المنتدى. على سبيل المثال، سؤال “كيف أسجل اسم نطاق؟” لن يكون مناسبًا هنا.

إذا لم تكن لديك معرفة أساسية بتقنية المعلومات وتعتمد على ميزانيتك، يمكنك طلب الدعم المدفوع على Marketplace.

أخيرًا، يمكنك أيضًا إلقاء نظرة على خطط Discourse المُدارة والمدفوعة، حيث سيتم التعامل مع كل شيء تقريبًا من قبلنا وستحصل على وصول إلى دعم فريقنا.

أيضًا، اعلم أننا نقدم خصومات للأغراض التعليمية، بما أنك ذكرت أنها لمدرستك:

هل هناك خصومات تعليمية أو للمنظمات غير الربحية؟

نعم! إذا كنت معترفًا بك قانونيًا كمؤسسة تعليمية، فنحن نقدم خصمًا بنسبة 85٪. إذا كنت معترفًا بك قانونيًا كمنظمة غير ربحية معفاة من الضرائب الفيدرالية، فنحن نقدم خصمًا بنسبة 50٪. تنطبق هذه الخصومات فقط على خططنا الأساسية والاحترافية وخطط الأعمال، ولا يمكن دمجها مع خصومات أخرى، ويجب دفعها عبر بطاقة الخصم/الائتمان شهريًا أو سنويًا. اتصل بنا بعد بدء تجربتك وسنضيف الخصم إلى حسابك.

4 إعجابات