Installa Discourse su 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 Mi Piace

Dovresti eliminare questi passaggi e creare app.yml senza generare questo errore. È confusionario.

(Se stai per sostituire l’intero file, perché copiare l’esempio?) La cosa migliore da fare è dire cosa deve essere modificato dall’esempio esistente. Sembra che si tratti del modello socket e di forzare https.

Questo ti dà due copie di postgres, che utilizza più RAM di quanto farebbe un singolo postgres. Funziona, ma non è una best practice.

Ci sono una serie di cose che rendono questo un cattivo esempio da seguire e sarà molto difficile da supportare. Sono felice che tu abbia trovato una soluzione per te, ma non penso che questo sia un buon percorso da consigliare alle persone.

3 Mi Piace

Grazie @pfaffman

Hai ragione. Fa il suo lavoro, ma la procedura è troppo disordinata. È nell’ordine sbagliato. Apprezzo i tuoi suggerimenti e la sistemerò.

Potresti chiarire perché la pensi così?

Perché è complicato ed è una buona idea solo per le persone che riescono a capirlo da sole. È piuttosto dispendioso e, se l’obiettivo è solo eseguire due discorsi, due VM separate sono una soluzione più economica e semplice nella maggior parte dei casi.

2 Mi Piace

Grazie ancora @pfaffman – ho semplificato la procedura e rimosso la sezione sull’aggiunta di un secondo sito Discourse sullo stesso server.

1 Mi Piace

Ho ricevuto questo messaggio

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

Perché?

Ciao Antonio. Benvenuto.

Questo sembra un problema di Docker e non di Discourse. Probabilmente otterrai risultati migliori cercando con il tuo sistema operativo e aggiornando docker-ce piuttosto che chiedere qui.

Stai cercando di usare Discourse? O CloudPanel?

1 Mi Piace

Ho appena seguito la guida qui. Ho eseguito il primo comando, per l’installazione di docker, e il server ha risposto questo
il comando è:

1 Mi Piace

Non dovrebbero esserci barre rovesciate alla fine di ciascuna di quelle righe. La barra rovesciata annulla il carattere di nuova riga, il che significa che la shell considera la riga successiva come una continuazione della stessa riga.

In questo caso, ciò comporterà il tentativo di eseguire questo come un singolo comando, che è la causa dell’errore:
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\"

Basta rimuovere quelle barre rovesciate alla fine delle righe per risolvere il problema:

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 Mi Piace

grazie, ora funziona bene

2 Mi Piace

Grazie @Simon_Manning – ho rimosso le barre rovesciate nello snippet di codice nel post del tutorial in cima.

2 Mi Piace

Mi dispiace, ora ho questo errore: 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

Non conosco CloudPanel, ma i messaggi di errore sembrano autoesplicativi:

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

Sembra che la tua email non sia stata configurata durante ./discourse-setup o all’interno di app.yml (puoi modificarlo manualmente in qualsiasi momento). :thinking:

2 Mi Piace

Mi scusi tutti, sono un professore della scuola superiore Fermi e sto cercando di installare la community di Discourse per la nostra scuola. Dato che utilizziamo pannelli cloud, ho seguito questa guida ma apparentemente manca qualcosa. È possibile ricevere aiuto e una guida più dettagliata da seguire? Mille grazie

1 Mi Piace

Penso che l’uso di un’installazione avanzata potrebbe non essere quello che stai cercando se non hai molta conoscenza di sysadmin. Un altro punto importante da considerare è che tale installazione ricadrà sotto unsupported-install, rendendo meno probabile ricevere aiuto qui in caso di problemi.

Se hai il budget e a seconda delle dimensioni della tua community, potrebbe essere meglio ospitare Discourse su un altro server e seguire l’installazione standard.

1 Mi Piace

Mi dispiace e a cosa servirebbe un servizio come questo? A mio parere, forse la guida non è molto dettagliata, è fatta per amministratori di sistema, basterebbe indicare semplicemente i vari passaggi. Da dove vengo si dice: nessuno nasce già istruito. Grazie per il tuo aiuto e il tuo tempo.

1 Mi Piace

Esatto. Ecco perché è stata raccomandata l’installazione standard.

E questo, @denvergeeks, è il motivo per cui non pensavo che creare una guida del genere fosse una buona idea in primo luogo. È difficile da scrivere, difficile da mantenere e tu sei l’unica persona che può verificarla.

4 Mi Piace

Mi dispiace ma non sono d’accordo. Uso già il pannello cloud con vari domini, inoltre la community di discourse andrebbe su un sottodominio e quindi la premessa dell’autore è fin troppo chiara (la guida è per chi usa Cloud Panel con diversi servizi installati su VPS). Basta un piccolo sforzo per dettagliare meglio tutto. Dopotutto, la condivisione della conoscenza è la base delle community, altrimenti avrei acquistato un software già installato e pronto all’uso. Comunque non voglio infastidire nessuno, se è possibile avere un aiuto allora grazie altrimenti non vi disturberò più.

1 Mi Piace

@denvergeeks L’impostazione dell’email è fondamentale per il normale funzionamento e, sebbene ci sia un link all’installazione standard, il modo in cui la guida è attualmente scritta aggira l’impostazione dell’email e altre informazioni varie che potrebbero essere importanti per determinate configurazioni.

Mi chiedo se potrebbe valere la pena sostituire le sezioni Install Discourse fino a Bootstrap the App con qualcosa di più simile a:

Installa e configura Discourse

Segui l’installazione standard fino ai passaggi 1-6

Ricostruisci Discourse:

./launcher rebuild app

Quindi, nella sezione Congratulazioni!, aggiungi una riga dopo lo screenshot per dire qualcosa come “Continua con il resto della documentazione di installazione standard”. In sostanza, rielaborare la guida per fornire passaggi aggiuntivi che integrino l’installazione standard anziché fornire istruzioni di installazione alternative.

Penso che le informazioni che hai fornito su CloudPanel siano molto utili e le istruzioni siano chiare, il lato Discourse potrebbe solo beneficiare di una minore divergenza dall’installazione standard per renderla più sicura, così come il tag unsupported-install per rendere chiaro (più chiaro) che qui ci sono draghi.

2 Mi Piace

[quote=“Antonio Cirillo, post:18, topic:266422, username:Antonio_Cirillo”]
Dopo tutto, la condivisione della conoscenza è la base delle comunità, altrimenti avrei acquistato un software già installato e pronto all’uso. Comunque non voglio infastidire nessuno, se è possibile avere un aiuto allora grazie altrimenti non vi disturberò più.
[/quote]La discussione si allontana un po’ dall’argomento originale, ma ti assicuriamo che siamo felici di aiutarti. :slight_smile:

Per riassumere:

Se hai conoscenze informatiche di base, puoi seguire l’installazione standard. Avrai anche bisogno di un nome di dominio e di configurare un servizio di invio email come Mailgun (tutorial qui: Configure Mailgun for email when using Digital Ocean for DNS).

Nota che di solito non aiutiamo in questioni che esulano dall’ambito di questo forum. Ad esempio, la domanda “Come si registra un nome di dominio?” non rientrerebbe qui.

Se non hai conoscenze informatiche di base e a seconda del tuo budget, puoi chiedere supporto a pagamento su Marketplace.

Infine, puoi anche dare un’occhiata ai piani a pagamento gestiti da Discourse, dove praticamente tutto sarà gestito da noi e avrai accesso al nostro team di supporto.

Inoltre, sappi che offriamo sconti per scopi educativi, dato che menzioni che è per la tua scuola:

Ci sono sconti per istituti educativi o non profit?

Sì! Se sei legalmente riconosciuto come istituto educativo, offriamo uno sconto dell’85%. Se sei legalmente riconosciuto come organizzazione non profit esente da tasse federali, offriamo uno sconto del 50%. Questi sconti si applicano solo ai nostri piani basic, pro e business, non possono essere combinati con altri sconti e devono essere pagati tramite carta di debito/credito mensilmente o annualmente. Contattaci dopo aver avviato la tua prova e aggiungeremo lo sconto al tuo account.

4 Mi Piace