Configura Discourse - Ambiente AWS Linux 2 AMI e Apache2 (httpd)

INSTALLAZIONE DI DOCKER E DISCOURSE SU AWS EC2 LINUX CON UN REVERSE PROXY HTTPD ESISTENTE

Ciao a tutti,

l’ho risolto. Sono tornato alla lavagna e ho ricominciato da capo con un’installazione pulita di Docker e Discourse. Di seguito riporto il mio processo:

Assunzioni

• Hai già un’istanza Linux AWS EC2
• Puoi accedere alla tua istanza EC2 tramite SSH
• Apache 2 è già configurato ed eseguito sul tuo server

ACCEDI ALLA TUA ISTANZA EC2 TRAMITE SSH

  1. Apri CMD / Terminale

  2. Esegui l’accesso SSH all’istanza AWS EC2

Esempio di schermata dopo la connessione all’istanza EC2

ESEGUI AGGIORNAMENTI DI SISTEMA

  1. Esegui gli aggiornamenti di sistema eseguendo il seguente comando nella console / terminale

$ sudo yum update

INSTALLA DOCKER

  1. Cerca il pacchetto Docker di AWS eseguendo il seguente comando nella console / terminale

$ sudo yum search docker

  1. Ottieni le informazioni sulla versione eseguendo il seguente comando nella console / terminale

$ sudo yum info docker

  1. Installa Docker eseguendo il seguente comando nella console / terminale

$ sudo yum install docker

  1. Aggiungi l’utente al gruppo predefinito ec2-user in modo da poter eseguire tutti i comandi Docker senza usare il comando sudo, eseguendo il seguente comando nella console / terminale
$ sudo usermod -a -G docker ec2-user
$ id ec2-user

# Ricarica le assegnazioni di gruppo di un utente Linux a Docker senza disconnettersi

$ newgrp docker
  1. Installa docker-compose eseguendo il seguente comando nella console / terminale
# 1. Ottieni pip3 (pacchetto di installazione di Python)
$ sudo yum install python3-pip
 
# 2. Esegui quindi uno dei seguenti comandi
$ sudo pip3 install docker-compose # con accesso root
 
# OPPURE
 
$ pip3 install --user docker-compose # senza accesso root per motivi di sicurezza

# Verifica i permessi
$ sudo chmod -v +x /usr/local/bin/docker-compose
  1. Abilita il servizio Docker per l’avvio automatico all’accensione eseguendo il seguente comando nella console / terminale

$ sudo systemctl enable docker.service

  1. Avvia il servizio Docker eseguendo il seguente comando nella console / terminale

$ sudo systemctl start docker.service

  1. Verifica che il servizio Docker sia in esecuzione eseguendo il seguente comando nella console / terminale; l’output sarà simile a questo

Comandi Docker di base utili da conoscere:

# Versione di Docker
$ docker version

# Versione di Docker Compose
$ docker-compose version

# Avvia il servizio Docker
$ sudo systemctl start docker.service

# Ferma il servizio Docker
$ sudo systemctl stop docker.service

# Riavvia il servizio Docker
$ sudo systemctl restart docker.service

# Stato del servizio Docker
$ sudo systemctl status docker.service

INSTALLA DISCOURSE

  1. Crea la cartella Discourse

$ sudo mkdir /var/discourse

  1. Clona l’immagine Docker di Discourse nella directory appena creata

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

  1. Copia il file standalone.yml nella cartella containers

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

  1. Modifica il nuovo file discourse.yml come segue (le parti importanti sono le porte esposte per HTTP e i dettagli per l’email SMTP; modifica il file, non copiare e incollare)

Opzioni di modifica:

1. Puoi usare nano e modificare tramite riga di comando / terminale
2. Su AWS, se stai usando MATE con PLUMA, puoi usare PLUMA per modificare il file
3. Puoi usare WINSCP per connetterti via SSH alla macchina e modificare il file tramite l’interfaccia grafica di Windows

## Questo è il template del container 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 MOLTO, MOLTO SENSIBILI A ERRORI NELLO SPAZIATURA O NELL'ALLINEAMENTO!
## Visita http://www.yamllint.com/ per convalidare questo file quando necessario

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## Rimuovi il commento dalla riga successiva per abilitare l'ascolto IPv6
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## Rimuovi il commento da 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:
  - "8080:80"   # http (eseguito sulla porta locale 8080, porta Docker 80)
  #- "443:443" # https (assicurati che questo sia commentato)

params:
  db_default_text_search_config: "pg_catalog.english"

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

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

  ## Quale revisione Git dovrebbe usare questo container? (predefinito: 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

  ## Quante richieste web concorrenti 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

  ## TODO: Il nome di dominio a cui risponderà questa istanza di Discourse
  ## Obbligatorio. Discourse non funzionerà con un indirizzo IP grezzo.
  DISCOURSE_HOSTNAME: 'faq.mobiloan.io'

  ## Rimuovi il commento se vuoi che il container venga avviato con lo stesso
  ## hostname (opzione -h) specificato sopra (predefinito "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Elenco di email separate da virgola che diventeranno amministratori e sviluppatori
  ## durante la registrazione iniziale, esempio 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: ‘ inserisci qui l'email ’

  ## TODO: Il server di posta 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: INSERISCI SMTP QUI
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: INSERISCI NOME UTENTE QUI
  DISCOURSE_SMTP_PASSWORD: INSERISCI PASSWORD QUI
  DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opzionale, predefinito true, usiamo Amazon SES)

 

  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (richiesto da alcuni provider)
  #DISCOURSE_NOTIFICATION_EMAIL: noreply@discourse.example.com    # (indirizzo da cui inviare le notifiche)

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

  ## L'indirizzo CDN http o https per questa istanza di Discourse (configurato per il recupero)
  ## vedi https://meta.discourse.org/t/14857 per i dettagli
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## La chiave IP di geolocalizzazione Maxmind per la ricerca degli indirizzi IP
  ## vedi https://meta.discourse.org/t/-/137387/23 per i dettagli
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Il container Docker è stateless; tutti i dati sono archiviati 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 costruzione
run:
  - exec: echo "Inizio dei comandi personalizzati"
  ## Se desideri impostare l'indirizzo email 'From' per la tua prima registrazione, rimuovi il commento e modifica:
  ## Dopo aver ricevuto la prima email di registrazione, 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"
  1. Una volta modificato e salvato il file, ricostruisci l’app Discourse eseguendo il seguente comando nel terminale

$ /var/discourse/launcher rebuild discourse

Nota: se il tuo file YAML ha un nome diverso, sostituisci discourse con il nome del tuo file YAML.

Nota che la ricostruzione richiede del tempo.

  1. Una volta ricostruita l’app, questa dovrebbe essere in esecuzione sulla porta 8080. Per verificare, esegui il seguente comando nel terminale

$ sudo lsof -i -P -n | grep LISTEN

Esempio di output delle porte

Noterai che Docker ascolta sulla porta 8080, mentre httpd (Apache) ascolta sulla porta 80.

Per quanto riguarda l’instradamento del traffico, Apache riceverà la richiesta web e, quando appropriato, la instraderà al container Discourse sulla porta 8080.

Per garantire che l’instradamento avvenga, devi configurare l’host virtuale nel file di configurazione di Apache.

CONFIGURAZIONE DELL’HOST VIRTUALE APACHE

  1. Il file di configurazione di Apache si trova in /etc/httpd/conf.d/00-virtualhosts.conf. httpd / apache / apache2 sono diverse versioni di Apache. I tuoi file potrebbero trovarsi in posizioni diverse se non stai usando il servizio httpd, ma la configurazione dell’host virtuale in questo caso sarà la stessa.

Opzioni di modifica:

1. Puoi usare nano e modificare tramite riga di comando / terminale
2. Su AWS, se stai usando MATE con PLUMA, puoi usare PLUMA per modificare il file
3. Puoi usare WINSCP per connetterti via SSH alla macchina e modificare il file tramite l’interfaccia grafica di Windows

Modifica il file /etc/httpd/conf.d/00-virtualhosts.conf aggiungendo quanto segue:

# FAQ (INSTRADAMENTI DISCOURSE)

<VirtualHost *:80>
  	ServerName  sub.domain.com
  	ProxyPreserveHost On
    ProxyPass "/" "http://localhost:8080/"
    ProxyPassReverse "/" "http://localhost:8080/"
</VirtualHost>
  1. Devi creare il record DNS CNAME corrispondente, facendo puntare il sottodominio al tuo server AWS / load balancer.

La nostra configurazione è un po’ complessa, poiché abbiamo un provider di domini che instrada tutto il traffico verso un load balancer AWS.

Il load balancer gestisce il nostro SSL/TLS tramite un certificato fornito da AWS.

Il load balancer instrada anche il traffico all’istanza AWS.

Apache è installato sull’istanza AWS e instrada il traffico verso:

  • Applicazioni Node Express
  • Applicazione Docker / Discourse.

CONCLUSIONE

Questa è solo una soluzione, ma è quella che ha funzionato con la nostra configurazione esistente.

Un grande ringraziamento a:

@Kane York per il suo articolo su Discourse,
@Axel Fernandes per il suo articolo su Medium e le sue note sul download dei file necessari di Discourse e
@Vivek Gite da nixCraft e il suo articolo su cyberciti sull’installazione di Docker su AWS Linux 2.