Discourse non si carica con Apache e reindirizzamento proxy

Ho passato gli ultimi giorni a cercare un modo per integrare Discourse con Apache sullo stesso droplet DigitalOcean, ma i tutorial disponibili qui su Discourse sono o obsoleti o non applicabili al mio caso. Un tutorial utilizza CentOS e HAProxy (io uso Ubuntu) e un altro utilizza Nginx (io uso Apache).

Ho trovato un commento su un thread di DigitalOcean e ho seguito le istruzioni lì riportate su un droplet di prova: Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean

Tutto sembra essere andato liscio, incluso il certificato SSL di Let’s Encrypt. La mia homepage e alcuni documenti HTML statici funzionano perfettamente. Discourse, nonostante l’installazione senza errori, non viene visualizzato. Quando navighi su community.mysite.com, vedi solo la mia homepage con HTTPS non sicuro nell’URL. Sì, le mie impostazioni DNS sono corrette e puntano al server giusto.

Questo è il mio file mysite.com.conf:

<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =www.mysite.com [OR]
RewriteCond %{SERVER_NAME} =mysite.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Questo è il mio file mysite.com-le-ssl.conf:

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

Questo è il mio file community.mysite.com.conf:

<VirtualHost *:80>
  ServerName community.mysite.com
  ServerAlias www.community.mysite.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>

E infine, ecco il mio file app.yml (ovviamente modificato):

## questo è il template del contenitore Docker Discourse all-in-one, standalone
##
## Dopo aver apportato modifiche a questo file, DEVI ricostruire
## /var/discourse/launcher rebuild app
##
## FAI *MOLTA* ATTENZIONE DURANTE LA MODIFICA!
## I FILE YAML SONO SUPER SUPER SENSIBILI A ERRORI NELLO SPAZIAMENTO O NELL'ALLINEAMENTO!
## visita http://www.yamllint.com/ per convalidare questo file se necessario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Scommenta queste due righe se desideri aggiungere Lets Encrypt (https)
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"

## quali porte TCP/IP deve esporre questo contenitore?
## Se vuoi che Discourse condivida una porta con un altro server web come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
      - "8080:80"   # inoltra la porta host 8080 alla porta del contenitore 80 (http)
      - "8443:443"   # inoltra la porta host 8443 alla porta del contenitore 443 (http)

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Imposta db_shared_buffers al massimo al 25% della memoria totale.
  ## verrà impostato automaticamente da bootstrap in base alla RAM rilevata, oppure puoi sovrascrivere
  db_shared_buffers: "128MB"

  ## può migliorare le prestazioni di ordinamento, ma aumenta l'utilizzo della memoria per connessione
  #db_work_mem: "40MB"

  ## Quale revisione Git dovrebbe utilizzare questo contenitore? (default: tests-passed)
  #version: tests-passed

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Quante richieste web simultanee sono supportate? Dipende dalla memoria e dai core della CPU.
  ## verrà impostato automaticamente da bootstrap in base alle CPU rilevate, oppure puoi sovrascrivere
  UNICORN_WORKERS: 2

  ## TODO: Il nome di dominio a cui risponderà questa istanza di Discourse
  ## Obbligatorio. Discourse non funzionerà con un indirizzo IP nudo.
  DISCOURSE_HOSTNAME: community.mysite.com

  ## Scommenta se vuoi che il contenitore venga avviato con lo stesso
  ## hostname (opzione -h) specificato sopra (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Elenco di email separate da virgola che diventeranno amministratori e sviluppatori
  ## all'iscrizione iniziale, esempio 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'myemail'

  ## TODO: Il server SMTP utilizzato per validare nuovi account e inviare notifiche
  ## Indirizzo SMTP, nome utente e password sono obbligatori
  ## ATTENZIONE: il carattere '#' nella password SMTP può causare problemi!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: my-smtp-username
  DISCOURSE_SMTP_PASSWORD: "my-smtp-password"
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opzionale, default true)

  ## Se hai aggiunto il template Lets Encrypt, scommenta qui sotto per ottenere un certificato SSL gratuito
  LETSENCRYPT_ACCOUNT_EMAIL: myemail

  ## L'indirizzo CDN http o https per questa istanza di Discourse (configurato per il pull)
  ## vedi https://meta.discourse.org/t/14857 per i dettagli
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

## Il contenitore Docker è senza stato; tutti i dati sono memorizzati in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## I plugin vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Qualsiasi comando personalizzato da eseguire dopo la compilazione
run:
  - exec: echo "Inizio dei comandi personalizzati"
  ## Se vuoi impostare l'indirizzo email 'From' per la tua prima registrazione, scommenta e modifica:
  ## Dopo aver ricevuto la prima email di iscrizione, rimetti il commento alla riga. Deve essere eseguito solo una volta.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Fine dei comandi personalizzati"

Qualcuno può dirmi dove ho sbagliato o cosa potrei aver trascurato? Grazie!

Avrai molta più fortuna provando nginx come reverse proxy.

Se il tuo sistema lo consente, considera l’uso di nginx invece di apache2.

Quindi la community non reindirizza al tuo dominio ma punta al tuo IP; il symlink è presente in /etc/apache2/sites-enabled/?

Il modulo proxy_module è caricato?
apache2ctl -M

Nessun symlink.

Sì. Fortunatamente, è uno dei passaggi del tutorial a cui ho fatto riferimento.

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests

il passaggio

a2ensite community.yoursite.com

potrebbe non essere andato a buon fine, potrebbe essere necessario usare sudo.

sudo ln -s /etc/apache2/sites-available/community.yoursite.com.conf /etc/apache2/sites-enabled/

dovrebbe funzionare anch’esso.
poi

sudo apachectl configtest

e incrociamo le dita

sudo systemctl restart apache2

Gentile @OrbitStorm,

Ho dato un’occhiata veloce alla tua configurazione dei virtual host Apache2 e al tuo file yml per Discourse, e sembra che non siano configurati correttamente.

Ecco alcuni suggerimenti:

Innanzitutto, quando esegui Discourse dietro un reverse proxy, non devi abilitare SSL LETSENCRYPT nella configurazione yml di Discourse (vedi esempio funzionante sotto). Discourse ha bisogno di una sola porta per comunicare con il reverse proxy, e questa connessione non è crittografata con SSL.

In secondo luogo, se guardi la tua configurazione principale del virtual host, che è la porta 443 sul reverse proxy:

<IfModule mod_ssl.c>
<VirtualHost *:443>
	ServerAdmin webmaster@localhost
	ServerName mysite.com
	ServerAlias www.mysite.com
	DocumentRoot /var/www/mysite.com
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

       Include /etc/letsencrypt/options-ssl-apache.conf
       SSLCertificateFile /etc/letsencrypt/live/mysite.com/fullchain.pem
       SSLCertificateKeyFile /etc/letsencrypt/live/mysite.com/privkey.pem
</VirtualHost>
</IfModule>

La configurazione sopra riportata manca di tutte le informazioni necessarie per il reverse proxy (vedi le configurazioni funzionanti allegate sotto).

Ecco una configurazione funzionante per te, che è sostanzialmente la stessa descritta nei vari tutorial su meta (ben documentata su questo sito in altri post, quindi si tratta in pratica di duplicare altra documentazione qui su meta):

<VirtualHost *:80>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        ProxyPreserveHost On
        ErrorLog ${APACHE_LOG_DIR}/discourse_errors.log
        CustomLog ${APACHE_LOG_DIR}/discourse.log combined
        ModPagespeed Off
        RewriteEngine on
        RewriteCond %{SERVER_NAME} =discourse.your-great-web-site.com
        RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>

Nota che nella configurazione della porta 80, le direttive principali richieste sono ServerName, RewriteEngine e le regole di riscrittura per reindirizzare alla porta 443.

Inoltre, se stai eseguendo Apache2 mod_pagespeed, dovresti disabilitarlo, poiché non sono ancora riuscito a far funzionare mod_pagespeed con Discourse (e non vedo alcun motivo per farlo).

Ecco la configurazione principale, dove viene svolta il “lavoro vero e proprio”:

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerName discourse.your-great-web-site.com
        ServerAdmin webmaster@localhost
        SSLProxyEngine on      # abilita questo solo dopo che Let's Encrypt è configurato e funzionante
  	    RewriteEngine on
  	    ProxyPreserveHost On
  	    ProxyRequests Off
  	    RequestHeader set X-Forwarded-Proto expr=%{REQUEST_SCHEME}
 	    RequestHeader set X-Real-IP expr=%{REMOTE_ADDR}

        #ProxyPass / http://127.0.0.1:8888/           # non usiamo la porta, usiamo i socket your-great-web-site
        #ProxyPassReverse / http://127.0.0.1:8888/    # non usiamo la porta, usiamo i socket your-great-web-site
        ProxyPass / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/
        ProxyPassReverse  / your-great-web-site:/var/discourse/shared/socket-only/nginx.http.sock|http://localhost/

        ErrorLog ${APACHE_LOG_DIR}/discourse_errors_ssl.log
        #CustomLog ${APACHE_LOG_DIR}/discourse_ssl.log combined   #log di accesso disabilitato per la produzione

        ModPagespeed Off
        SSLCertificateFile /etc/letsencrypt/live/discourse.your-great-web-site.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/discourse.your-great-web-site.com/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

Tutte le nostre configurazioni Discourse utilizzano socket di dominio Unix, quindi dovrai modificare la configurazione per adattarla alla tua configurazione desiderata.

Il punto principale da comprendere (in sintesi) è che dovresti disabilitare LETSENCRYPT nella configurazione di build di Discourse (yml) ed esporre un unico punto di ingresso in Discourse, nel nostro caso un socket di dominio Unix, nel tuo caso un singolo socket TCP/IP.

Poi esegui il reverse proxy verso quel punto di ingresso dal file del virtual host per la porta 443 (non dal virtual host della porta 80). Il virtual host della porta 80 si limita a reindirizzare alla 443. Il tuo SSL sulla 443 è gestito interamente da LETSENCRYPT nel reverse proxy. Non è richiesto alcun SSL nel file yml di Discourse (vedi esempio funzionante sotto).

Ecco uno dei nostri file yml funzionanti (per la configurazione sopra) da esaminare:

/var/discourse/containers$ cat socket-only.yml
# IMPORTANTE: IMPOSTA UNA PASSWORD SEGRETA IN Postgres PER L'UTENTE Discourse
# TODO: cambia SOME_SECRET in questo template

templates:
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
#  - "templates/sshd.template.yml"
## Scomenta queste due righe se desideri aggiungere Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## quali porte TCP/IP dovrebbe esporre questo container?
## Se desideri che Discourse condivida una porta con un altro server web come Apache o nginx,
## vedi https://meta.discourse.org/t/17247 per i dettagli
expose:
#  - "80:80"   # http
#  - "443:443" # https

# Usa la chiave 'links' per collegare i container, ovvero usa il flag Docker --link.
links:
  - link:
      name: data
      alias: data

# eventuali argomenti extra per Docker?
# docker_args:

params:
  ## Quale revisione Git dovrebbe usare questo container? (default: tests-passed)
  #version: latest
  db_shared_buffers: "4GB"

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

  # DISCOURSE_DEFAULT_LOCALE: en

  ## Quanti richieste web simultanee sono supportate? Dipende dalla memoria e dai core della CPU.
  ## verrà impostato automaticamente da bootstrap in base alle CPU rilevate, oppure puoi sovrascrivere
  #UNICORN_WORKERS: 3
  UNICORN_WORKERS: 8

  ## TODO: Il nome di dominio a cui risponderà questa istanza di Discourse
  DISCOURSE_HOSTNAME: 'discourse.your-great-web-site.com'

  ## Scomenta se desideri che il container venga avviato con lo stesso
  ## hostname (-h option) specificato sopra (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Elenco di email separate da virgola che diventeranno amministratori e sviluppatori
  ## alla prima registrazione, ad esempio 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'tim@discourse.your-great-web-site.com'

  ## TODO: Il server SMTP utilizzato per validare nuovi account e inviare notifiche
  # INDIRIZZO SMTP, nome utente e password sono obbligatori
  # ATTENZIONE: il carattere '#' nella password SMTP può causare problemi!
  DISCOURSE_SMTP_ADDRESS: smtp.gmail.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: not_for_reply@discourse.your-great-web-site.com
  DISCOURSE_SMTP_PASSWORD: my_super_secret_cool_password
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opzionale, default true)

  ## Se hai aggiunto il template di Lets Encrypt, scomenta sotto per ottenere un certificato SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## TODO: configura la connettività ai database
  DISCOURSE_DB_SOCKET: ''
  #DISCOURSE_DB_USERNAME: discourse
  DISCOURSE_DB_PASSWORD: another_super_secret_cool_password
  DISCOURSE_DB_HOST: data
  DISCOURSE_REDIS_HOST: data

  DISCOURSE_MAXMIND_LICENSE_KEY: my_max_mind_key
  ## L'indirizzo http o https CDN per questa istanza di Discourse (configurato per il pull)
  ## vedi https://meta.discourse.org/t/14857 per i dettagli
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

volumes:
  - volume:
      host: /var/discourse/shared/socket-only
      guest: /shared
  - volume:
      host: /var/discourse/shared/socket-only/log/var-log
      guest: /var/log

## I plugin vanno qui
## vedi https://meta.discourse.org/t/19157 per i dettagli
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-bbcode.git
          - git clone https://github.com/discourse/discourse-sitemap.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-whos-online.git
          - git clone https://github.com/unixneo/legacy-info.git

## Ricorda, questa è sintassi YAML: puoi avere solo un blocco con un nome
run:
  - exec: echo "Inizio dei comandi personalizzati"

  ## Se desideri configurare l'accesso con password per root, scomenta e modifica:
  ## Usa solo una delle seguenti righe:
  #- exec: /usr/sbin/usermod -p 'PASSWORD_HASH' root
  #- exec: /usr/sbin/usermod -p "$(mkpasswd -m sha-256 'RAW_PASSWORD')" root

  ## Se desideri autorizzare utenti aggiuntivi, scomenta e modifica:
  #- exec: ssh-import-id username
  #- exec: ssh-import-id anotherusername

  - exec: echo "Fine dei comandi personalizzati"
  #- exec: awk -F\# '{print $1;}' ~/.ssh/authorized_keys | awk 'BEGIN { print "Chiavi SSH autorizzate per questo container:"; } NF>=2 {print $NF;}'

È davvero facile una volta compresi i concetti di base; e comprendere i concetti di base aiuta moltissimo :slight_smile:

Tieni presente che nelle nostre configurazioni Discourse non eseguiamo un singolo container (in realtà, raramente operiamo in modalità container singolo), quindi il nostro file yml non funzionerà in una configurazione a container singolo (standalone). Te lo fornisco come riferimento per aiutarti, mostrandoti come appare una configurazione completamente funzionante dietro Apache2.

Eseguiamo Discourse dietro entrambi i reverse proxy Apache2 e nginx. In effetti, utilizziamo solo reverse proxy per molte ragioni. Una di queste è che possiamo usare il reverse proxy per filtrare bot dannosi, ecc. (un argomento completamente diverso).

Non c’è nulla di difficile nell’eseguire Discourse containerizzato (quanti siti desideri, uno o 100) dietro un reverse proxy su un sito con Apache2; ma aiuta a comprendere i concetti di base.

Spero che fornirti sia i concetti di base sia i file di configurazione funzionanti ti aiuti a procedere e a far funzionare Discourse.

Cordiali saluti…

@neounix Apprezzo moltissimo la tua risposta così approfondita, ma sembra che la maggior parte dei problemi che sto incontrando derivi dall’incapacità di trovare un tutorial aggiornato adeguato. Diversi tutorial qui indicano di abilitare SSL per Discourse nel file yml, e uno di essi afferma che non è necessario aggiungere informazioni sul proxy ai file VirtualHost, poiché Let’s Encrypt dovrebbe farlo automaticamente. I tuoi esempi sono estremamente diversi persino dalle mie impostazioni predefinite, rendendoli altrettanto confusi che tentare di mescolare una configurazione CentOS con Ubuntu.

Hai assolutamente ragione nel dire che comprendere le basi fa la differenza, ma il problema è che le basi non sono adeguatamente trattate e, quando lo sono, sono datate di tre anni e non tengono conto del fatto che qualcuno utilizza Apache invece di Nginx o Ubuntu invece di CentOS. Va inoltre notato che Discourse è l’unico motivo per cui uso Docker.

Dopo aver trascorso quattro giorni solo per cercare di installare l’applicazione insieme ad Apache, ne ho abbastanza. Gratis o meno, non ne vale la pena e non continuerò a setacciare i forum solo per trovare link copiati e incollati agli stessi due tutorial datati e incompleti. Non ho mai avuto un’esperienza così frustrante con la semplice installazione di un software per forum fino a Discourse. Questo dice molto. XenForo e Invision sono due piattaforme con cui ho un’esperienza immensa e sono un gioco da ragazzi da installare e utilizzare.

Apprezzo davvero lo sforzo che hai messo nella tua risposta, ma non ti chiederò di fare il lavoro al posto mio, né dovrei doverlo fare se esistesse una documentazione adeguata. Mi sembra semplicemente incredibile che le mie circostanze specifiche, che non sono così specifiche solo per me, non siano state evidenziate in un nuovo tutorial che renderebbe questo processo più semplice per i nuovi utenti.

Comunque sia, in bocca al lupo.

Nonostante avessi ogni intenzione di abbandonare Discourse a causa della totale mancanza di documentazione attuale che non sia iper-focalizzata su CentOS/Nginx, una persona incredibilmente generosa e paziente di DigitalOcean ha risposto a un thread che avevo creato lì e, dopo alcuni tentativi ed errori, ha aiutato a mettere insieme un tutorial semplice da seguire per i futuri utenti di Discourse nelle stesse circostanze mie.

Come promemoria, queste circostanze sono:

Installare Discourse sullo stesso server di Apache | Utilizzando Ubuntu 18.04 | DigitalOcean

credito a Bobbyiliev @ DigitalOcean
Install Discourse on a droplet with WordPress served by Apache ? | DigitalOcean (prima risposta)

Prerequisiti

  • Per stare sul sicuro, assicurati di eseguire il backup del tuo Droplet, così in caso di problemi potrai tornare a una versione funzionante
  • Connettiti via SSH al tuo Droplet
  • Apache installato; puoi seguire le istruzioni su come farlo qui:

Passo 1 - Installare Docker

Per installare Docker, segui le istruzioni qui:

Passo 2 - Scaricare Discourse

Per prima cosa, crea una directory dove memorizzare i file di Discourse:

mkdir /var/discourse

Successivamente, clona l’immagine Docker ufficiale di Discourse in /var/discourse.

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

Passo 3 - Configurare Discourse per ascoltare sulla porta 8080

Utilizzeremo il modello standalone.yml che include tutti i servizi necessari come PostgreSQL, Redis, ecc.

Copia il file di esempio con il seguente comando:

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

Quindi modifica il file con il tuo editor preferito. Apri /var/discourse/containers/app.yml e aggiorna le porte alle righe 23 e 24:

## quali porte TCP/IP dovrebbe esporre questo contenitore?
expose:
  - "8080:80"   # inoltra la porta host 8080 alla porta del contenitore 80 (http)
  - "8443:443"   # inoltra la porta host 8443 alla porta del contenitore 443 (https)

Inoltre, se non hai ancora un certificato SSL, assicurati di commentare la riga 16:

  #- "templates/web.ssl.template.yml"

Aggiungi semplicemente il simbolo # davanti alla riga - "templates/web.ssl.template.yml", altrimenti Discourse non si avvierà.

Passo 4 - Configurare Discourse

Cambia directory:

cd /var/discourse

Quindi avvia Discourse (poiché è la prima volta che avvii il servizio, verrà eseguito il bootstrap dell’applicazione con le nuove modifiche presenti nel file app.yml):

./discourse-setup

Nota: Assicurati di fornire impostazioni valide per il server di posta, altrimenti la configurazione potrebbe fallire.

Passo 5 - Configurare Apache

Nella directory /etc/apache2/sites-available/, crea un nuovo file chiamato forum.example.com.conf e aggiungi il seguente contenuto Vhost:

<VirtualHost *:80>
  ServerName forum.example.com
  ServerAlias www.forum.example.com

  <IfModule proxy_module>
    ProxyPreserveHost on
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
  </IfModule>
</VirtualHost>
  • Abilita il Vhost con il seguente comando:
a2ensite forum.example.com
  • Abilita Mod Proxy:
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_balancer
a2enmod lbmethod_byrequests
  • Riavvia Apache:
systemctl restart apache2

Dopo di che, potrai accedere a Discourse direttamente tramite il tuo nome di dominio.


Nota 1: Durante l’installazione di Discourse, app.yml potrebbe essere sovrascritto e le righe 16/17 (SSL) verranno decommentate. Dovrai commentare nuovamente quelle righe e poi ricompilare l’app (non dimenticare di cambiare directory): ./launcher rebuild app

Nota 2: SSL non è abilitato per Discourse con questa guida. Non sorprende che non esista documentazione per abilitare SSL Let’s Encrypt se lo hai già abilitato per Apache. Se qualcuno trova una soluzione per questo, si prega di contattare.