Installer Discourse sur 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 « J'aime »

Vous devriez supprimer ces étapes et créer app.yml sans générer cette erreur. C’est déroutant.

(Si vous allez remplacer tout le fichier, pourquoi copier l’exemple ?) La meilleure chose à faire est de dire ce qui doit être modifié par rapport à l’exemple existant. Il semble qu’il s’agisse du modèle de socket et de la force https.

Cela vous donne deux copies de postgres, ce qui utilise plus de RAM qu’un seul postgres. Cela fonctionne, mais ce n’est pas une bonne pratique.

Il y a un certain nombre de choses qui font que ce n’est pas un bon exemple à suivre et il sera très difficile de le supporter. Je suis heureux que vous ayez trouvé une solution pour vous, mais je ne pense pas que ce soit une bonne voie à suivre pour les gens.

3 « J'aime »

Merci @pfaffman

Vous avez raison. Cela fait le travail, mais la procédure est trop désordonnée. Elle est dans le mauvais ordre. J’apprécie vos suggestions et je vais corriger cela.

Pourriez-vous clarifier pourquoi vous pensez cela ?

Parce que c’est compliqué et que c’est une bonne idée seulement pour les personnes qui peuvent le comprendre par elles-mêmes. C’est assez coûteux, et si le but est juste d’exécuter deux discours, deux machines virtuelles séparées sont une solution moins chère et plus facile dans la plupart des cas.

2 « J'aime »

Merci encore @pfaffman – J’ai maintenant simplifié la procédure et supprimé la section sur l’ajout d’un deuxième site Discourse sur le même serveur.

1 « J'aime »

J’ai reçu ce message

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

Pourquoi ?

Salut Antonio. Bienvenue.

Cela ressemble à un problème de docker et non à un problème lié à Discourse. Vous feriez probablement mieux de chercher avec votre système d’exploitation et de mettre à jour docker-ce que de demander ici.

Essayez-vous d’utiliser Discourse ? Ou CloudPanel ?

1 « J'aime »

J’ai suivi le guide ici. J’ai exécuté la première commande, pour l’installation de Docker, et le serveur a répondu ceci
la commande est :

1 « J'aime »

Il ne devrait pas y avoir d’antislashs à la fin de chacune de ces lignes. L’antislash échappe au saut de ligne, ce qui signifie que le shell traite la ligne suivante comme une continuation de la même ligne.

Dans ce cas, cela se traduira par une tentative d’exécution de ceci comme une seule commande, d’où l’erreur :
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\"

Il suffit de supprimer ces antislashs à la fin des lignes pour résoudre ce problème :

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 « J'aime »

Merci, ça fonctionne maintenant correctement

2 « J'aime »

Merci @Simon_Manning – j’ai supprimé les barres obliques inverses dans l’extrait de code du didacticiel du message principal.

2 « J'aime »

Désolé, j’ai maintenant cette erreur : ÉCHEC

Pups::ExecError : /usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end' a échoué avec le retour #<Process::Status: pid 112 exit 1>
Emplacement de l'échec : /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec a échoué avec les paramètres « /usr/local/bin/ruby -e 'if ENV[\\\"DISCOURSE_SMTP_ADDRESS\\\"] == \\\"smtp.example.com\\\"; puts \\\"Aborting! Mail is not configured!\\\"; exit 1; end' »
bootstrap a échoué avec le code de sortie 1
** ÉCHEC DU BOOTSTRAP ** veuillez faire défiler vers le haut et rechercher les messages d'erreur précédents, il peut y en avoir plus d'un.
./discourse-doctor peut aider à diagnostiquer le problème.
214c73c4474ed59e7b6fb7f42143ce126d2b453022b08770da3af31ca2fdaaba

Je ne connais pas CloudPanel, mais les messages d’erreur semblent s’expliquer d’eux-mêmes :

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

Il semble que votre messagerie n’ait pas été configurée lors de ./discourse-setup ou à l’intérieur de app.yml (vous pouvez la modifier manuellement à tout moment). :thinking:

2 « J'aime »

Excusez-moi tous, je suis professeur au lycée Fermi et j’essaie d’installer Discourse Community pour notre école. Puisque nous utilisons des panneaux cloud, j’ai suivi ce guide mais apparemment il manque quelque chose. Est-il possible d’obtenir de l’aide et un guide plus détaillé à suivre ? Mille mercis

1 « J'aime »

Je pense qu’une installation avancée n’est peut-être pas ce que vous recherchez si vous n’avez pas beaucoup de connaissances en administration système. Un autre point important à considérer est qu’une telle installation tombera sous unsupported-install, ce qui rend moins probable d’obtenir de l’aide ici si vous rencontrez des problèmes.

Si vous avez le budget et en fonction de la taille de votre communauté, il pourrait être préférable d’héberger Discourse sur un autre serveur et de suivre l’installation standard.

1 « J'aime »

Désolé, et à quoi servirait un service comme celui-ci ? À mon avis, le guide n’est peut-être pas très détaillé, il est fait pour les administrateurs système, il suffirait de simplement indiquer les différentes étapes. D’où je viens, on dit : personne ne naît déjà éduqué. Merci pour votre aide et votre temps.

1 « J'aime »

C’est exactement ça. C’est pourquoi l’installation standard a été recommandée.

Et c’est, @denvergeeks, la raison pour laquelle je ne pensais pas que créer un guide comme celui-ci était une bonne idée en premier lieu. C’est difficile à écrire, difficile à maintenir, et vous êtes la seule personne qui peut le vérifier.

4 « J'aime »

Je suis désolé mais je ne suis pas d’accord. J’utilise déjà le panneau cloud avec divers domaines, de plus la communauté Discourse serait sur un sous-domaine et alors la prémisse de l’auteur est très claire (le guide s’adresse à ceux qui utilisent Cloud Panel avec différents services installés sur VPS). Il suffit d’un peu d’effort pour mieux détailler le tout. Après tout, le partage des connaissances est la base des communautés, sinon j’aurais acheté un logiciel déjà installé et prêt à l’emploi. Quoi qu’il en soit, je ne veux déranger personne, si une aide est possible alors merci, sinon je ne vous dérangerai plus.

1 « J'aime »

@denvergeeks La configuration de l’e-mail est essentielle au bon fonctionnement et bien qu’il existe un lien vers l’installation standard, la façon dont le guide est actuellement écrit contourne la configuration de l’e-mail ainsi que diverses autres informations qui pourraient être importantes pour certaines configurations.

Je me demande s’il serait utile de remplacer les sections Installer Discourse à Démarrer l'application par quelque chose de plus proche de :

Installer et configurer Discourse

Suivez l’installation standard jusqu’aux étapes 1 à 6

Reconstruire Discourse :

./launcher rebuild app

Ensuite, dans la section Félicitations !, ajoutez une ligne après la capture d’écran pour dire quelque chose comme « Continuez avec le reste de la documentation d’installation standard ». Essentiellement, retravaillez le guide pour fournir des étapes supplémentaires qui complètent l’installation standard au lieu de fournir des instructions d’installation alternatives.

Je pense que les informations que vous avez fournies sur CloudPanel sont très utiles et que les instructions sont claires. Le côté Discourse pourrait simplement bénéficier d’une moins grande divergence par rapport à l’installation standard pour la rendre plus sûre, ainsi que du tag unsupported-install pour indiquer clairement (ou plus clairement) que nous entrons en territoire inconnu.

2 « J'aime »

[quote=“Antonio Cirillo, post:18, topic:266422, username:Antonio_Cirillo”]
Après tout, le partage des connaissances est la base des communautés, sinon j’aurais acheté un logiciel déjà installé et prêt à l’emploi. Quoi qu’il en soit, je ne veux déranger personne, si c’est possible d’obtenir de l’aide alors merci, sinon je ne vous dérangerai plus.
[/quote]La discussion s’éloigne un peu du sujet d’origine, mais soyez assuré que nous sommes heureux de vous aider. :slight_smile:

Pour résumer :

Si vous avez des connaissances informatiques de base, vous pouvez suivre l’installation standard. Vous aurez également besoin d’un nom de domaine et de configurer un service d’envoi d’e-mails tel que Mailgun (tutoriel ici : Configure Mailgun for email when using Digital Ocean for DNS).

Notez que nous n’aidons généralement pas sur des questions qui sortent du cadre de ce forum. Par exemple, la question « Comment enregistrer un nom de domaine ? » ne conviendrait pas ici.

Si vous n’avez pas de connaissances informatiques de base et en fonction de votre budget, vous pouvez demander un support payant sur Marketplace.

Enfin, vous pouvez également consulter les plans payants gérés par Discourse, où à peu près tout sera géré par nous et vous aurez accès à notre équipe de support.

Sachez également que nous offrons des réductions à des fins éducatives, puisque vous mentionnez que c’est pour votre école :

Y a-t-il des réductions pour les établissements d’enseignement ou les organisations à but non lucratif ?

Oui ! Si vous êtes légalement reconnu comme un établissement d’enseignement, nous offrons une réduction de 85 %. Si vous êtes légalement reconnu comme une organisation à but non lucratif exonérée d’impôts fédéraux, nous offrons une réduction de 50 %. Ces réductions s’appliquent uniquement à nos plans de base, pro et business, ne peuvent pas être combinées avec d’autres réductions et doivent être payées par carte de débit/crédit mensuellement ou annuellement. Contactez-nous après avoir commencé votre essai et nous ajouterons la réduction à votre compte.

4 « J'aime »