GNU/Linux >> Linux Esercitazione >  >> Linux

Come installare più contenitori di discorsi sullo stesso server

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.


Linux
  1. Ospita più siti Web su contenitori Docker

  2. Come installare Discourse su Ubuntu 20.04 LTS

  3. Come installare R 3.3.1 nella propria directory?

  4. Come installare Docker ed eseguire Docker Container in Ubuntu

  5. Come installare il server Web Apache su Ubuntu

Come installare Docker Portainer per gestire i container

Come ospitare autonomamente più siti WordPress sullo stesso server con Docker

Come installare OpenLDAP su Ubuntu Server 22.04

Come installare Lighttpd su Ubuntu Server

Come installare il server FTP su Ubuntu?

Come installare Docker su Ubuntu 18.04