Discourse auf CloudPanel installieren

: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 „Gefällt mir“

Sie sollten diese Schritte löschen und app.yml erstellen, ohne diesen Fehler zu generieren. Es ist verwirrend.

(Wenn Sie die gesamte Datei ersetzen, warum das Beispiel kopieren?) Besser wäre es zu sagen, was sich vom vorhandenen Beispiel ändern muss. Es sieht so aus, als wären es die Socket-Vorlage und force https.

Dies gibt Ihnen zwei Kopien von Postgres, was mehr RAM verbraucht als ein einzelnes Postgres. Es funktioniert, aber es ist keine bewährte Methode.

Es gibt eine Reihe von Dingen, die dies kein gutes Beispiel machen und es wird sehr schwierig sein, dies zu unterstützen. Ich bin froh, dass Sie eine Lösung für sich gefunden haben, aber ich glaube nicht, dass dies ein guter Weg ist, den man Leuten empfehlen kann.

3 „Gefällt mir“

Vielen Dank @pfaffman

Sie haben Recht. Es erledigt die Arbeit, aber das Verfahren ist zu unordentlich. Es ist in der falschen Reihenfolge. Ich schätze Ihre Vorschläge und werde es korrigieren.

Könnten Sie bitte erläutern, warum Sie das denken?

Da es kompliziert ist und nur für Leute eine gute Idee ist, die es selbst herausfinden können. Es ist ziemlich verschwenderisch, und wenn das Ziel nur darin besteht, zwei Diskurse auszuführen, sind zwei separate VMs in den meisten Fällen eine günstigere und einfachere Lösung.

2 „Gefällt mir“

Vielen Dank nochmals @pfaffman – Ich habe das Verfahren nun vereinfacht und den Abschnitt über das Hinzufügen einer zweiten Discourse-Site auf demselben Server entfernt.

1 „Gefällt mir“

Ich habe diese Nachricht erhalten

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

Warum?

Hallo Antonio. Willkommen.

Das scheint ein Docker-Problem zu sein und nicht eines, das mit Discourse zu tun hat. Sie werden wahrscheinlich besser damit fahren, mit Ihrem Betriebssystem zu suchen und docker-ce zu aktualisieren, als hier zu fragen.

Versuchen Sie, Discourse zu verwenden? Oder CloudPanel?

1 „Gefällt mir“

Ich habe gerade die Anleitung hier befolgt. Ich habe den ersten Befehl zur Docker-Installation ausgeführt, und der Server hat dies geantwortet
Der Befehl lautet:

1 „Gefällt mir“

Am Ende jeder dieser Zeilen sollten keine Backslashes stehen. Der Backslash maskiert den Zeilenumbruch, was bedeutet, dass die Shell die nächste Zeile als Fortsetzung derselben Zeile behandelt.

In diesem Fall wird versucht, dies als einen einzigen Befehl auszuführen, was die Fehlerursache ist:
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\"

Allein das Entfernen dieser Backslashes am Ende der Zeilen wird das Problem lösen:

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 „Gefällt mir“

Danke, jetzt funktioniert es einwandfrei

2 „Gefällt mir“

Vielen Dank @Simon_Manning – Ich habe die Backslashes im Code-Snippet im obigen Tutorial-Post entfernt.

2 „Gefällt mir“

Entschuldigung, jetzt habe ich diesen Fehler: 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

Ich kenne CloudPanel nicht, aber die Fehlermeldungen scheinen selbsterklärend zu sein:

'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'\"

Es sieht so aus, als ob Ihre E-Mail während ./discourse-setup oder in app.yml nicht konfiguriert wurde (Sie können sie jederzeit manuell bearbeiten). :thinking:

2 „Gefällt mir“

Entschuldigen Sie, ich bin Professor an der Fermi High School und versuche, Discourse Community für unsere Schule zu installieren. Da wir Cloud-Panels verwenden, habe ich dieser Anleitung gefolgt, aber anscheinend fehlt etwas. Ist es möglich, Hilfe und eine detailliertere Anleitung zu erhalten? Tausend Dank

1 „Gefällt mir“

Ich glaube, eine erweiterte Installation ist vielleicht nicht das, wonach Sie suchen, wenn Sie nicht viel Sysadmin-Kenntnisse haben. Ein weiterer wichtiger Punkt ist, dass eine solche Installation unter unsupported-install fallen würde, was die Wahrscheinlichkeit verringert, hier Hilfe zu erhalten, wenn Probleme auftreten.

Wenn Sie das Budget haben und je nach Größe Ihrer Community, ist es vielleicht besser, Discourse auf einem anderen Server zu hosten und die Standardinstallation zu befolgen.

1 „Gefällt mir“

Entschuldigung, wofür wäre ein solcher Dienst? Meiner Meinung nach ist der Leitfaden vielleicht nicht sehr detailliert, er ist für Systemadministratoren gemacht, es würde genügen, einfach die verschiedenen Schritte anzugeben. Wo ich herkomme, sagt man: Niemand wird bereits gebildet geboren. Vielen Dank für Ihre Hilfe und Ihre Zeit.

1 „Gefällt mir“

Das ist genau richtig. Deshalb wurde die Standardinstallation empfohlen.

Und das, @denvergeeks, ist der Grund, warum ich von Anfang an nicht dachte, dass die Erstellung eines solchen Leitfadens eine gute Idee war. Er ist schwer zu schreiben, schwer zu pflegen, und Sie sind die einzige Person, die ihn überprüfen kann.

4 „Gefällt mir“

Es tut mir leid, aber ich stimme nicht zu. Ich benutze bereits das Cloud Panel mit verschiedenen Domains, außerdem würde die Discourse-Community auf einer Subdomain laufen und dann ist die Prämisse des Autors nur allzu klar (der Leitfaden ist für diejenigen, die das Cloud Panel mit verschiedenen auf dem VPS installierten Diensten verwenden). Es erfordert nur ein wenig Mühe, alles besser zu detaillieren. Schließlich ist das Teilen von Wissen die Grundlage von Gemeinschaften, sonst hätte ich eine Software gekauft, die bereits installiert und einsatzbereit ist. Ich möchte niemanden verärgern, wenn es möglich ist, Hilfe zu bekommen, dann danke, sonst störe ich Sie nicht mehr.

1 „Gefällt mir“

@denvergeeks Die Einrichtung von E-Mails ist für den normalen Betrieb von entscheidender Bedeutung, und obwohl es einen Link zur Standardinstallation gibt, umgeht die aktuelle Anleitung die Einrichtung von E-Mails sowie verschiedene andere Informationen, die für bestimmte Setups wichtig sein könnten.

Ich frage mich, ob es sich lohnen könnte, die Abschnitte Install Discourse bis Bootstrap the App durch etwas zu ersetzen, das eher dem Folgenden entspricht:

Discourse installieren und konfigurieren

Folgen Sie der Standardinstallation bis zu den Schritten 1-6

Die Inhalte aus „Edit the app.yml File“ hier einfügen

Discourse neu erstellen:

./launcher rebuild app

Fügen Sie dann im Abschnitt „Congratulations!“ nach dem Screenshot eine Zeile hinzu, wie z. B. „Fahren Sie mit dem Rest der Standardinstallationsdokumentation fort.“ Im Wesentlichen soll die Anleitung überarbeitet werden, um zusätzliche Schritte bereitzustellen, die die Standardinstallation ergänzen, anstatt alternative Installationsanweisungen zu geben.

Ich denke, die von Ihnen bereitgestellten Informationen zu CloudPanel sind sehr nützlich und die Anweisungen sind klar. Die Discourse-Seite könnte einfach davon profitieren, weniger von der Standardinstallation abzuweichen, um sie sicherer zu machen, sowie den Tag unsupported-install, um klarer zu machen, dass hier Drachen sind.

2 „Gefällt mir“

[quote=“Antonio Cirillo, post:18, topic:266422, username:Antonio_Cirillo”]
Schließlich ist das Teilen von Wissen die Grundlage von Gemeinschaften, sonst hätte ich eine Software gekauft, die bereits installiert und einsatzbereit ist. Jedenfalls will ich niemanden verärgern, wenn es möglich ist, Hilfe zu bekommen, dann danke, sonst werde ich Sie nicht mehr stören.
[/quote]Die Diskussion weicht zwar etwas vom ursprünglichen Thema ab, aber seien Sie versichert, dass wir Ihnen gerne helfen. :slight_smile:

Zusammenfassend lässt sich sagen:

Wenn Sie über grundlegende IT-Kenntnisse verfügen, können Sie die Standardinstallation durchführen. Sie benötigen außerdem einen Domainnamen und müssen einen E-Mail-Versanddienst wie Mailgun konfigurieren (Anleitung hier: Configure Mailgun for email when using Digital Ocean for DNS).

Beachten Sie, dass wir normalerweise keine Hilfe bei Angelegenheiten leisten, die außerhalb des Rahmens dieses Forums liegen. Die Frage „Wie registriere ich einen Domainnamen?“ wäre hier zum Beispiel nicht angebracht.

Wenn Sie keine grundlegenden IT-Kenntnisse haben und je nach Budget können Sie im Marketplace kostenpflichtige Unterstützung anfordern.

Schließlich können Sie sich auch die kostenpflichtigen Discourse-Managed-Pläne ansehen, bei denen so ziemlich alles von uns erledigt wird und Sie Zugang zu unserem Team-Support haben.

Wissen Sie auch, dass wir Rabatte für Bildungszwecke anbieten, da Sie erwähnen, dass es für Ihre Schule ist:

Gibt es Rabatte für Bildungseinrichtungen oder gemeinnützige Organisationen?

Ja! Wenn Sie rechtlich als Bildungseinrichtung anerkannt sind, bieten wir einen Rabatt von 85 %. Wenn Sie rechtlich als gemeinnützige Organisation anerkannt sind, die von der Bundeseinkommensteuer befreit ist, bieten wir einen Rabatt von 50 %. Diese Rabatte gelten nur für unsere Basis-, Pro- und Business-Pläne, können nicht mit anderen Rabatten kombiniert werden und müssen monatlich oder jährlich per Debit-/Kreditkarte bezahlt werden. Kontaktieren Sie uns, nachdem Sie Ihre Testversion gestartet haben, und wir werden den Rabatt Ihrem Konto hinzufügen.

4 „Gefällt mir“