L'installazione di Discourse è davvero facile quando si tratta di una sola istanza di Discourse sul server. Le cose si complicano quando vuoi installare più istanze di Discourse sullo stesso server per ridurre i costi.
L'installazione ufficiale di Discourse non segue le normali pratiche Docker. Il programma di installazione di Discourse esegue prima qualcosa chiamato bootstrap, che ti apparirà come una procedura di installazione dell'host. Al termine del processo di bootstrap, il programma di avvio avvia un contenitore denominato "app" in base al feedback ricevuto durante la prima installazione.
Tale procedura di installazione ibrida è diversa quando si tratta di configurarla con altri servizi Web e applicazioni come WordPress.
In questo tutorial, ti mostrerò come installare più installazioni di Discourse insieme ad altre app basate su docker su un singolo server Linux. Non è affatto difficile se hai familiarità con le basi di Docker e della riga di comando di Linux.
Installazione di più forum Discourse sullo stesso server
In generale, una configurazione a discorsi multipli è intesa come una configurazione multisito e il processo è stato illustrato qui.
Ufficialmente, Discourse non fornisce alcuna documentazione per installazioni multiple di Discourse su un singolo server. Ma non preoccuparti. Ti mostrerò il processo di installazione per 3-5 contenitori singoli autonomi in esecuzione su Nginx con ciascun contenitore autonomo corrispondente al rispettivo dominio.
Sto usando Ubuntu 18.04 in questo tutorial. Assicurati di avere Docker installato su Ubuntu o su qualsiasi distribuzione Linux in uso.
Suggerisco di utilizzare un provider di server cloud come Linode per distribuire rapidamente un server Linux nel cloud.
Ho usato domain.com come nome di dominio di esempio nel tutorial. Assicurati di modificarlo in base ai tuoi domini o sottodomini.
1. Modifica i record DNS del tuo dominio
Nel pannello dei record DNS del tuo provider di nomi di dominio, assicurati che sia il dominio che i sottodomini (incluso www) puntino all'indirizzo IP del tuo server.
Ad esempio, per il dominio principale, mantieni il campo del nome host vuoto (o @) e per i sottodomini, utilizza un carattere jolly "*" durante l'impostazione dell'IP del server.
2. Scambia spazio
Per assicurarti che tutte le tue app container siano a proprio agio e non esauriscano mai la memoria dopo averle distribuite, è essenziale che tu disponga dello spazio di scambio necessario sul tuo sistema.
Puoi sempre regolare lo scambio in base alla RAM disponibile sul tuo sistema. Puoi decidere lo spazio di scambio in base al pacchetto di contenitori di app sul singolo server e stimando il loro utilizzo cumulativo della RAM. Il discorso controlla e configura anche lo scambio per te.
3. Crea una rete Docker
Questa rete Docker consentirà ai contenitori di comunicare tra loro come richiesto. Chiamiamola catena per una più facile comprensione.
Utilizzerai questa rete durante la configurazione di tutti i tuoi container.
docker network create chain
4. Imposta proxy inverso Nginx
Ora procedi con la configurazione di Nginx Reverse Proxy. Nota che questo funge da interfaccia che mapperà tutte le diverse porte del contenitore su se stessa in modo che tu possa accedervi tramite gli URL. Puoi anche chiamarlo "contenitore madre".
docker run --name nginx-proxy --net chain -p 80:80 -p 443:443 -v ~/certs:/etc/nginx/certs -v /etc/nginx/vhost.d -v /usr/share/nginx/html -v /var/run/docker.sock:/tmp/docker.sock:ro --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy -d --restart always jwilder/nginx-proxy
5. Configurazione Let's Encrypt Nginx Proxy Companion
Nota che diciamo a docker di usare i volumi che sono già dichiarati sul primo contenitore nginx-proxy. Utilizza la stessa rete "a catena" che hai creato nel passaggio 3.
docker run --name letsencrypt-nginx-proxy-companion --net chain -v ~/certs:/etc/nginx/certs:rw -v /var/run/docker.sock:/var/run/docker.sock:ro --volumes-from nginx-proxy -d --restart always jrcs/letsencrypt-nginx-proxy-companion
Questo contenitore complementare per nginx-proxy si occupa della configurazione dei certificati SSL con Let's Encrypt. Lo vedrai durante la configurazione dei contenitori Discourse.
6. Reindirizzamento WWW tramite Nginx (CNAME non richiesto, passaggio facoltativo per l'utilizzo dei sottodomini)
Per garantire il reindirizzamento delle richieste di dominio.com a www.dominio.com come qualsiasi altro sito, devi eseguire un passaggio aggiuntivo.
Inserisci il contenitore proxy nginx:
docker exec -ti nginx-proxy /bin/bash
Ora vedrai un prompt di root come questo:
[email protected]:/app#
Ricordi la posizione /etc/nginx/vhost.d che ho menzionato nel passaggio 4? Crea qui un nuovo file che sarà lo stesso del tuo nome di dominio principale. Non hai vim o nano qui. Invece di installare Vim o Nano, usa il cat comando.
cat >> /etc/nginx/vhost.d/domain.com
Al prompt successivo, qualunque cosa tu scriva modificherà il file. Quindi assicurati di sostituire www.domain.com con il tuo dominio nella riga successiva:
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
Premi Invio e poi Ctrl+D per salvarlo. Entra in uscita per uscire dal container.
[email protected]:/app# exit
Fermiamo tutti i contenitori sopra (nell'ordine indicato) che hai creato fino ad ora. Non utilizzerai il riavvio, ma riavviali semplicemente perché non vuoi che altri contenitori siano in ascolto quando riavvii ciascuno di essi.
docker stop nginx-proxy
docker stop letsencrypt-nginx-proxy-companion
docker start nginx-proxy
docker start letsencrypt-nginx-proxy-companion
7. Clona l'immagine ufficiale di Discourse Docker
Come per la guida ufficiale, clona l'immagine della finestra mobile del discorso ufficiale nella directory /var/discourse. È qui che Discourse può archiviare tutti i suoi volumi Docker appartenenti ai rispettivi contenitori dopo l'installazione.
sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
8. Copia la configurazione Standalone
Ora il passaggio successivo è assicurarti di copiare il file /var/discourse/standalone.yml in /var/discourse/containers/ come app.yml prima di modificarlo in base alle tue esigenze.
cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml
Un tipico file standalone.yml ha questo aspetto.
9. Prepara la configurazione Standalone
Ora devi modificare questo file perché la tua configurazione sarà basata su nginx.
Le porte 80 e 443 sono già utilizzate dalla stessa. Hai anche già il nostro contenitore Letencrypt e devi mostrare a Discourse la tua rete Docker esistente in cui vuoi inserirla.
Mentre imposti il tuo dominio qui, avrai anche bisogno di un server di posta per configurare le email di notifica del tuo forum (ho usato Sendgrid qui).
Tieni presente che LETSENCRYPT_EMAIL (per la notifica degli aggiornamenti SSL) e DISCOURSE_DEVELOPER_EMAILS (per l'amministratore) possono essere diversi se necessario.
nano /var/discourse/containers/app.yml
10. Personalizza la configurazione autonoma
Di seguito è riportato il mio file modificato rinominato app.yml a scopo dimostrativo. Si consiglia di modificare il proprio file yml per evitare problemi di allineamento.
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"
Uncomment these two lines if you wish to add Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"
which TCP/IP ports should this container expose?
If you want Discourse to share a port with another webserver like Apache or nginx,
see https://meta.discourse.org/t/17247 for details
expose:
- "80"
#- "80:80" # http
#- "443:443" # https
docker_args:
- "--net chain"
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: "256MB"
## 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:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## 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
#db_shared_buffers: "256MB"
## 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:
LANG: en_US.UTF-8
# DISCOURSE_DEFAULT_LOCALE: en
## 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: 3
## TODO: The domain name this Discourse instance will respond to
## Required. Discourse will not work with a bare IP number.
DISCOURSE_HOSTNAME: 'domain.com'
VIRTUAL_HOST: 'domain.com,www.domain.com'
LETSENCRYPT_HOST: 'domain.com,www.domain.com'
LETSENCRYPT_EMAIL: '[email protected]'
## 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 '[email protected],[email protected]'
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
## 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.sendgrid.net
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: apikey
DISCOURSE_SMTP_PASSWORD: yourpassword
DISCOURSE_SMTP_ENABLE_START_TLS: true # (optional, default true)
## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate
#LETSENCRYPT_ACCOUNT_EMAIL: [email protected]
## 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 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='[email protected]'"
exec: echo "End of custom commands"
Ricontrolla i seguenti dettagli:
La configurazione della porta dovrebbe essere:
expose:
- "80"
# - "80:80" # http
# - "443:443" # https
Nome di rete esistente correttamente configurato nel file come mostrato sopra.
docker_args:
- "--net chain"
In caso contrario, vedrai una pagina vuota quando controlli il tuo dominio dopo l'installazione.
12. Bootstrap e lancio
Dopo aver salvato il file sopra, esegui i seguenti comandi:
cd /var/discourse
./launcher bootstrap app
Ciò richiederà una notevole quantità di tempo. Al termine del processo di bootstrap, ti verrà chiesto di:
./launcher start app
Nota che se avessi chiamato il file come xyz.yml, il comando sarebbe stato modificato di conseguenza (./launcher start xyz).
È il nome del contenitore in esecuzione che puoi controllare con "docker ps “. Ora quando visiti il dominio nel tuo browser, vedrai la seguente pagina:
13. Impostazioni SSL
Da questo momento in poi, il processo di registrazione è abbastanza semplice. Una volta completata la registrazione, nella dashbaird di amministrazione Docker, vai su impostazioni>sicurezza e abilita "forza https".
Dopo averlo salvato, ferma il contenitore e riavvialo:
./launcher stop app
./launcher start app
Dopo pochi istanti SSL inizierà a funzionare sul tuo forum. Assicurati di occuparti anche delle dipendenze per https.
14. Installa più istanze Discourse in contenitori più autonomi
Per più contenitori Discourse, devi ripetere nuovamente la stessa procedura dal passaggio 8 .
Inizialmente, hai utilizzato l'app. Ora dovresti usare altri nomi come app2, app3 ecc.
cp /var/discourse/samples/standalone.yml /var/discourse/containers/app2.yml
Sarebbe inoltre necessario un passaggio aggiuntivo per ciascuno di essi per specificare una nuova posizione (ad esempio standalone2, standalone3 e così via) nei rispettivi file yml per i volumi Docker (controlla il passaggio 10). Ovviamente dovrai cambiare anche il nome del dominio.
## The Docker container is stateless; all data is stored in /shared
volumes:
volume:
host: /var/discourse/shared/standalone2
guest: /shared
volume:
host: /var/discourse/shared/standalone2/log/var-log
guest: /var/log
Con questo, segui il resto dei passaggi e avrai più Discourse installati sullo stesso server.
Spero che questo articolo ti sia utile per configurare più di un forum Discourse con i rispettivi contenitori Docker.
Se hai domande o suggerimenti, non esitare a lasciare un commento qui sotto.