Usa Nginx Proxy Manager per gestire più siti con Discourse

EDIT: @pfaffman ha riscritto questo come un argomento autonomo partendo da quanto scritto in precedenza da @tophee. Non è ancora stato testato da me e ho spostato le parole di Chris, quindi eventuali errori sono probabilmente di @pfaffman.

Ci sono motivi per non utilizzare NGINX Proxy Manager invece di farlo manualmente come descritto in Run other websites on the same machine as Discourse?

Io lo sto già utilizzando. Lo ho avuto sul mio server domestico per un po’ e quando ho migrato la mia istanza di Discourse su un nuovo server cloud, ho realized che avevo dimenticato la maggior parte della configurazione del reverse proxy NGINX che avevo fatto 4 anni fa sul vecchio server, quindi ho pensato: perché non farlo con NGINX Proxy Manager? A mia sorpresa, ho scoperto che è stato menzionato piuttosto raramente qui su Meta, così ho iniziato a chiedermi se ci fossero degli svantaggi che potessi aver trascurato…

Infatti, questo ha richiesto un po’ di tentativi ed errori, ma sono riuscito a farlo funzionare come segue (nessuna garanzia che questo sia il modo migliore per farlo - anzi, so che deve esserci un modo migliore - quindi correzioni e miglioramenti sono molto benvenuti):

Per iniziare, ci sono due modi per accedere alla tua istanza di Discourse: 1. esponendo una porta, 2. tramite websocket. Credo di aver letto da qualche parte su questo forum che il websocket è più veloce/più efficiente, quindi è quello che sto usando, ma esporre una porta dovrebbe essere molto più semplice, quindi se non riesci a far funzionare il socket, prova a esporre una porta. Quindi, per evitare confusione: per accedere a Discourse tramite una porta, segui i passaggi 0, 1, 2, 3, 4 e 8 riportati di seguito. Se vuoi usare un websocket, segui i passaggi 0, 1, 5, 6, 7, 8 e 9.

0. Punto di partenza

Quindi, supponiamo di aver completato l’installazione standard di 30 minuti e supponiamo che non hai ancora lasciato che Discourse acquisisse un certificato Let’s Encrypt - perché non ne hai bisogno quando usi un reverse proxy. NGINX Proxy Manager se ne occuperà. Non importa, comunque, se hai già un certificato. NGINX Proxy Manager ne otterrà semplicemente uno nuovo.

1. Installa NGINX Proxy Manager

Il prossimo passo è installare NGINX Proxy Manager in modo da avere due contenitori Docker in esecuzione in più (NGINX Proxy Manager e il suo contenitore del database).

Ora viene la parte difficile a cui stai chiedendo.

Il primo ostacolo è che Discourse viene eseguito sulla rete bridge predefinita di Docker, mentre NGINX Proxy Manager viene eseguito di default su una rete “creata dall’utente” (chiamata npm_default nel mio caso), il che significa che NGINX Proxy Manager non può vedere Discourse. :cry:

2. Porta tutti i contenitori nella rete bridge predefinita

Quindi, finché non so se e come Discourse possa essere spostato su una rete personalizzata, dobbiamo spostare NGINX Proxy Manager nella rete bridge predefinita. Possiamo farlo aggiungendo network_mode: bridge a entrambi i contenitori di NGINX Proxy Manager nel nostro file docker compose.

3. Usa l’indirizzo IP invece del nome del servizio

Il prossimo problema è che il file docker compose standard non funzionerà più se lo sposti semplicemente sulla rete bridge. NGINX Proxy Manager non sarà più in grado di trovare il suo contenitore del database. Questo perché la risoluzione DNS interna per i nomi dei servizi (su cui si basa il file docker-compose) è disponibile solo sulle reti create dall’utente, non sulle reti Docker predefinite. Quindi dobbiamo ricorrere a indirizzi IP codificati a mano (ed è per questo che questa non è certamente la soluzione ottimale, perché si romperà se gli indirizzi IP dei tuoi contenitori cambiano). Quindi devi avviare il contenitore anche se sai che non funzionerà, annota l’IP del contenitore del database di NGINX Proxy Manager e sostituisci DB_MYSQL_HOST: "db" nel tuo file docker compose con DB_MYSQL_HOST: "<ip_del_contenitore_db>".

Quindi ora tutti i contenitori dovrebbero essere sulla rete bridge predefinita in modo che NGINX Proxy Manager possa vedere sia Discourse che il suo database.

4. Rendi Discourse accessibile

Ma “vedere” Discourse e poterlo accedere non è la stessa cosa. Quindi devi assicurarti che Discourse accetti tutto il traffico che NGINX Proxy Manager inoltra ad esso. Se non ti importa di usare il websocket, suppongo che tu possa semplicemente puntare NGINX Proxy Manager alla porta 80 (non 443) dell’IP del tuo contenitore Discourse, così:

Non l’ho testato, però. Come ho detto, sto usando la configurazione websocket, che richiede alcuni passaggi aggiuntivi. Nota che il nome host/IP e la porta sopra verranno ignorati quando usi il websocket.

5. Configura app.yml per usare il websocket

Questo è spiegato nell’OP, quindi non entrerò nei dettagli.

6. Monta il websocket nel contenitore NGINX Proxy Manager

Dobbiamo dare a NGINX Proxy Manager accesso al websocket montandolo come volume: - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. Questa è l’ultima modifica al file docker compose predefinito di NGINX Proxy Manager, quindi ecco la versione finale che funziona per me:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. Configura NGINX Proxy Manager per usare il websocket

Ultimo passaggio: dì a NGINX Proxy Manager di usare il websocket. Per quanto ne ricordo, non era sufficiente attivare solo “Supporto Websockets”, quindi ho copiato la posizione NGINX dall’OP alla scheda “Avanzate”, così:

Non sono riuscito a farlo funzionare sotto la scheda “Posizioni personalizzate”.

8. Non dimenticare di attivare SSL

Non ho menzionato la configurazione SSL in NGINX Proxy Manager perché sembra abbastanza ovvia e non penso che importi in quale punto del processo la attivi. Quindi, se non l’hai ancora fatto, ecco com’è la mia:


9. Avviso

tl;dr Ogni volta che riavvii il contenitore Discourse, devi anche riavviare il contenitore principale di NGINX Proxy Manager (non c’è bisogno di riavviare il db).
Se stai accedendo a Discourse attraverso il websocket, devi essere consapevole che quando ricompili il tuo contenitore Discourse (come richiesto ogni pochi mesi per aggiornare l’immagine base), il websocket precedente verrà eliminato e ne verrà creato uno nuovo. Di conseguenza, NGINX Proxy Manager perderà il contatto con la tua istanza Discourse e restituirà un errore 502. Forse un futuro aggiornamento di NGINX Proxy Manager sarà in grado di trovare automaticamente il nuovo websocket, ma attualmente (gennaio 2022) NGINX Proxy Manager non troverà il tuo contenitore Discourse ricompilato a meno che tu non riavvii NGINX Proxy Manager.

Spiegazione

Se ti chiedi perché le istruzioni sopra combinano il websocket con le porte, la ragione semplice è che, mentre scrivevo questo post, mi è venuto in mente all’improvviso che NGINX Proxy Manager e Discourse probabilmente non hanno nemmeno bisogno di essere sulla stessa rete Docker quando usiamo il websocket. E quando ciò è stato confermato, nessuno si è sentito di riscrivere completamente le istruzioni.

Questo è l’aspetto più affascinante dei forum di supporto: fare un buon lavoro nel descrivere il tuo problema spesso ti porta alla soluzione senza nemmeno pubblicare la tua domanda. E in questo caso, stavo rispondendo alla domanda di qualcun altro, ma potrei aver trovato anche la risposta alla mia. :smiley:

9 Mi Piace

Discutere quale reverse proxy utilizzare è chiaramente al di fuori dell’ambito supportato. :wink: Ma dopo aver guardato NGINX Proxy Manager per 12 secondi o più, penso che farà il suo dovere. Esiste anche un’altra soluzione “automagica” per NGINX proxy di cui ho visto parlare in passato, ma con la mia estesa conoscenza di NGINX Proxy Manager, penso che questa possa essere migliore. Potrei darci un’occhiata, dato che sto perdendo interesse in Traefik.

EDIT: Ora l’ho esaminato per 3 minuti. Preferisco strumenti che facilitano l’automazione, quindi Traefik e jwilder/nginx-proxy - Docker Image (l’ho trovato), che permettono di aggiungere alcune etichette o variabili d’ambiente al contenitore Docker in modo da non dover cliccare in un’interfaccia web, sono più ciò che desidero. Sembra invece che per far funzionare quella soluzione sia necessario utilizzare l’interfaccia web o trovare un modo per aggiornare manualmente il database con gli host che si vogliono aggiungere. Ma se sei disposto a cliccare e interagire con un’interfaccia web come una Persona Normale (piuttosto che come un “personale” amministratore di sistema), allora sembra che quella soluzione possa essere proprio ciò che stai cercando.

4 Mi Piace

Ho provato a installare Nginx Proxy Manager, ma non riesco a capire come “collegare” (fare il proxy? scusa, sono ancora molto nuovo alla gestione dei sistemi) il contenitore Discourse per poter vedere Discourse quando accedo dal web.
Puoi darmi qualche consiglio? Il contenitore Discourse deve esporre le porte 80 e 443 o no, come suggerisce questo argomento del forum?

1 Mi Piace

In effetti, questo ha richiesto un po’ di prove ed errori, ma sono riuscito a farlo funzionare come segue (nessuna garanzia che questo sia il modo migliore per farlo - anzi, so che deve essercene uno migliore - quindi correzioni e miglioramenti sono molto graditi):

Istruzioni spostate nell'OP da @pfaffman

Per iniziare, ci sono due modi per accedere alla tua istanza di Discourse: 1. esponendo una porta, 2. tramite websocket. Credo di aver letto da qualche parte su questo forum che il websocket è più veloce/migliore, quindi è quello che sto usando, ma esporre una porta dovrebbe essere molto più semplice; quindi, se non riesci a far funzionare il socket, prova a esporre una porta (altro su questo più avanti).

Quindi, assumiamo di aver completato l’installazione standard di 30 minuti e di non aver ancora lasciato che Discourse acquisisse un certificato Let’s Encrypt, perché non è necessario quando si utilizza un proxy inverso. NPM se ne occuperà. Non importa comunque se hai già un certificato; NPM ne otterrà semplicemente uno nuovo.

1. Installa NPM

Il prossimo passo è installare NPM in modo da avere due contenitori Docker aggiuntivi in esecuzione (NPM e il suo contenitore di database).

Ora arriva la parte complicata su cui hai chiesto.

Il primo ostacolo è che Discourse viene eseguito sulla rete bridge predefinita di Docker, mentre NPM di default viene eseguito su una rete “creata dall’utente” (nel mio caso chiamata npm_default), il che significa che NPM non può vedere Discourse. :cry:

2. Portare tutti i contenitori nella rete bridge predefinita

Quindi, finché non so se e come Discourse possa essere spostato su una rete personalizzata, dobbiamo spostare NPM nella rete bridge predefinita. Possiamo farlo aggiungendo network_mode: bridge a entrambi i contenitori NPM nel nostro file docker compose.

3. Utilizzare l’indirizzo IP invece del nome del servizio

Il prossimo problema è che il file docker compose standard non funzionerà più se lo sposti semplicemente sulla rete bridge. NPM non sarà più in grado di trovare il suo contenitore di database. Questo perché la risoluzione DNS interna per i nomi dei servizi (su cui si basa il file docker-compose) è disponibile solo sulle reti create dall’utente, non sulle reti Docker predefinite. Quindi dobbiamo ricorrere a indirizzi IP codificati a mano (ed è per questo che questa non è sicuramente la soluzione ottimale, perché si romperà se gli indirizzi IP dei tuoi contenitori cambiano). Quindi devi avviare il contenitore anche se sai che non funzionerà, annotare l’IP del contenitore del database NPM e sostituire DB_MYSQL_HOST: "db" nel tuo file docker compose con DB_MYSQL_HOST: "<db_container_IP>".

Ora tutti i contenitori dovrebbero essere sulla rete bridge predefinita in modo che NPM possa vedere sia Discourse che il suo database.

4. Rendere Discourse accessibile

Ma “vedere” Discourse e poterlo accedere non è la stessa cosa. Quindi devi assicurarti che Discourse accetti tutto il traffico che NPM inoltra verso di esso. Se non ti importa di utilizzare il websocket, suppongo che tu possa semplicemente puntare NPM alla porta 80 (non 443) dell’IP del tuo contenitore Discourse, come questo:

Non l’ho ancora testato. Come ho detto, sto usando la configurazione websocket, che richiede alcuni passaggi aggiuntivi. Nota che il nome host/IP e la porta sopra verranno ignorati quando si utilizza il websocket.

5. Configurare app.yml per utilizzare il websocket

Questo è spiegato nell’OP, quindi non ci entrerò.

6. Montare il websocket nel contenitore NPM

Dobbiamo dare a NPM accesso al websocket montandolo come volume: - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock. Questa è l’ultima modifica al file docker compose NPM predefinito, quindi ecco la versione finale che funziona per me:

version: '3'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    network_mode: bridge
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    environment:
      DB_MYSQL_HOST: "172.17.0.6"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "my-super-safe-pwd"
      DB_MYSQL_NAME: "npm"
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
      - /var/discourse/shared/standalone/nginx.http.sock:/var/discourse/shared/standalone/nginx.http.sock
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    network_mode: bridge
    environment:
      MYSQL_ROOT_PASSWORD: 'my-super-safe-pwd'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'my-super-safe-pwd'
    volumes:
      - ./data/mysql:/var/lib/mysql

7. Configurare NPM per utilizzare il websocket

Ultimo passo: dire a NPM di utilizzare il websocket. Per quanto ricordo, non era sufficiente attivare semplicemente il “Supporto Websockets”, quindi ho copiato la posizione NGINX dall’OP alla scheda “Avanzate”, come questo:

Non sono riuscito a farlo funzionare sotto la scheda “Posizioni personalizzate”.

8. Non dimenticare di attivare SSL

Non ho menzionato la configurazione SSL in NPM perché sembra abbastanza ovvia e non penso che importi in quale punto del processo venga attivata. Quindi, se non l’hai ancora fatto, ecco come appare la mia:


9. Disclaimer finale

Mentre scrivevo questo post, mi è venuto in mente all’improvviso che NPM e Discourse probabilmente non hanno nemmeno bisogno di essere sulla stessa rete Docker quando utilizziamo il websocket. Non ho tempo di verificare questo al momento, ma se è vero, allora puoi dimenticare i passaggi 2, 3 e 4 sopra e dovrebbe funzionare.

Questo è l’aspetto più affascinante dei forum di supporto: fare un buon lavoro nel descrivere il tuo problema spesso ti porta alla soluzione senza nemmeno pubblicare la tua domanda. E in questo caso, stavo rispondendo alla domanda di qualcun altro ma potrei aver trovato anche la risposta alla mia. :smiley:

4 Mi Piace

Grazie mille per la risposta eccellente e ben articolata! Proverò i tuoi suggerimenti il prima possibile. A proposito, l’IP da inserire in NPM è quello del server (cioè l’IP esterno per raggiungere il server) o quello interno di Docker (ho notato che Docker usa indirizzi 172… per i container)?
Scusa se le mie domande sembrano banali, non conosco bene gli aspetti di rete.

1 Mi Piace

Ti consiglio di utilizzare il websocket. In tal caso, puoi inserire qualsiasi IP perché non verrà utilizzato. Altrimenti, si tratta dell’IP interno del container, non dell’IP pubblico dell’host.

A proposito: sembra che la tua risposta via e-mail non sia stata visualizzata correttamente. Forse vorresti modificare (accorciare) il tuo post qui sopra?

2 Mi Piace

Sì, l’ho visto. Ho usato “rispondi” dall’email e ha provato a includere tutto il messaggio originale, ma non riesco a trovare un modo per modificarlo. È possibile? Sono nuovo su Discourse, anche come utente… :pensive:

1 Mi Piace

Puoi modificare i tuoi post usando l’icona della matita in basso nel tuo messaggio. Tuttavia… il Livello di Fiducia 1 e inferiori hanno a disposizione solo 24 ore (predefinito), mentre il Livello di Fiducia 2 e superiori hanno 30 giorni (predefinito).

Sembra che al momento tu sia al Livello di Fiducia 1 Base, ma puoi scoprire di più su cosa devi fare per “salire di livello” in Livelli di Fiducia. :+1:

2 Mi Piace

Scusa se è passato molto tempo dalla tua precedente domanda, ma ho perso un sacco di tempo cercando di fare quanto suggerito, senza alcun successo. Quando ho modificato app.yml e ricompilato l’app con le tue modifiche, nei log ha iniziato a comparire “config/unicorn_launcher: riga 71: kill: (898) - Nessun processo”, quindi, nonostante tutto ciò che ho provato, non sono riuscito a fermare questo comportamento. Ho anche provato a ricompilare l’app nello stato originale (con le porte esposte, senza websocket), fermando npm, ma senza alcun risultato: “unicorn” non viene eseguito. Ho anche seguito tutto ciò che Google ha trovato a riguardo (sembra essere un problema diffuso), ma non sono riuscito in alcun modo a capire come ricompilare un container Discourse funzionante. Il problema ora è (uno dei peggiori, sono vicino a rinunciare a Discourse) che, per qualche motivo oscuro e confuso, il database Postgres interno è sempre in “riavvio”. Non so perché: ho semplicemente applicato le tue modifiche, ricompilato l’app e da allora “unicorn” :roll_eyes: è morto. Esiste un modo per risolvere questo problema di Postgres? Perché è successo? C’è la possibilità (temo di no!) di non perdere tutte le modifiche che ho apportato a Discourse quando funzionava? A proposito, è normale che ogni piccola modifica o tentativo di risolvere qualcosa finisca con qualcos’altro che smette di funzionare? :rage: Non sono arrabbiato con te; il problema è tutto Discourse, non i tuoi suggerimenti: ho dedicato molto tempo a cercare di far funzionare questo forum “apparentemente” bello, ma ogni volta c’è qualcosa che va storto, e la mia sensazione che Discourse sia poco affidabile sta diventando sempre più forte.

1 Mi Piace

Se avevi un’installazione standard funzionante, dovresti essere in grado di ripristinare tutto così com’era e far sì che continui a funzionare.

Il problema con PostgreSQL potrebbe essere legato all’aggiornamento a PostgreSQL 13?

Se hai creato un backup prima di iniziare, puoi installare su un server nuovo e ripristinare quel backup. Dovrebbe essere l’ultimo caso possibile.

2 Mi Piace

Come posso capire se il problema di PostgreSQL è legato all’aggiornamento alla versione 13? Non ho scelto di aggiornarlo; ho semplicemente digitato “./launcher rebuild app” e sono successe tutte queste cose.
Sì, è la versione 13. Dopo ore di ricerche su internet tra altre persone con lo stesso problema, ho scoperto che potrebbe essere questa la causa, ma non ho trovato un modo per far ripartire Discourse.

1 Mi Piace

Allora non è quello il problema. Scusa.

1 Mi Piace

Mi dispiace sentire che stai avendo questi problemi. Conosco la frustrazione di passare ore a cercare di risolvere qualcosa. Ma ogni volta si impara qualcosa, anche se il percorso verso la soluzione raramente è una linea retta…

Mi dispiace, ma non sono la persona giusta per aiutarti con questo. Non ho esperienza con postgres o unicorn. Ci sono tre modi in cui supero scenari del tipo “nulla funziona”: 1. fare un backup in modo da poter sempre tornare allo stato originale. 2. provare/cambiare una cosa alla volta e testarla prima su una macchina non di produzione (o su un forum meno importante). 3. investire ancora più ore per capire cosa sta succedendo.

A proposito: scrivere descrizioni dettagliate del problema o ticket di supporto più volte mi ha aiutato a risolvere il problema. Non ho nemmeno dovuto inviare il ticket. Scriverlo mi ha fatto vedere la soluzione.

Quindi, nel tuo caso, ciò che cercherei di capire è: in quali circostanze la modifica del file app.yml e il successivo ripristino allo stato originale possono portare a un risultato diverso rispetto all’esito originale. Esaminando questa situazione, o ti rendi conto di non aver effettivamente ripristinato l’esatto originale, o capisci cosa altro devi “resettare” per far funzionare tutto.

5 Mi Piace

Mi dispiace davvero, ma non capisco: prima mi hai chiesto se il problema di postgres potesse essere legato all’aggiornamento di PostgreSQL 13 e, quando ho risposto “sì, è la versione 13” (giuro che non sapevo quale fosse la versione precedente, sono passati molti mesi senza che ricostruissero l’app), hai risposto che non è quello il problema… quindi, perché postgres è sempre “in avvio” e Discourse non si avvia?

1 Mi Piace

Ciao @Wanderer. Non riesco a capire quale possa essere il tuo problema, quindi l’aggiornamento di Postgres è stato un tentativo azzardato. Sono quasi certo che, se stai eseguendo Postgres 13, il problema non sia legato a un blocco durante l’aggiornamento da 10 o 12; quindi, anche se potrebbe esserci qualche problema con Postgres, probabilmente non è correlato all’aggiornamento a Postgres 13.

Il mio consiglio migliore per chi non è esperto in queste materie è eseguire un’installazione pulita e ripristinare il backup più recente.

Se desideri ottenere assistenza più specifica per il tuo problema e hai un budget a disposizione, puoi contattarmi o pubblicare un messaggio in Marketplace.

Mi impegnerò a migliorare le istruzioni per Nginx Proxy Manager, ma il mio parere è che il tuo problema, sebbene emerso nel tentativo di passare a configurazioni complesse, probabilmente non sia dovuto a istruzioni errate. (Non ne sono certo, ma è la mia migliore ipotesi.)

2 Mi Piace

Ecco la mia versione di questo. Ho quasi rinunciato, ma @tophee ha linkato a un post che ho scritto io (!?) e che forniva la magia necessaria! Questo è ora un modo semplice per configurare Nginx Proxy Manager per Discourse. Penso che questo lo renda simile a Run other websites on the same machine as Discourse - #396.

Installa Nginx Proxy Manager seguendo le loro istruzioni su

Rimuovi i modelli SSL e Let’s Encrypt:

Assicurati che queste righe nel tuo file yml siano commentate o eliminate:

## Uncomment these two lines if you wish to add Lets Encrypt (https)
#- "templates/web.ssl.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"

Fai in modo che Discourse utilizzi la rete npm-default.

Se segui ciecamente le istruzioni di installazione di Nginx Proxy Manager, verrà creata una rete Docker chiamata npm_default.

Aggiungi questo blocco ai tuoi file yml. Se hai container separati web_only e data, dovrai aggiungerlo a ciascuno di essi (non ho testato il container mail-receiver). docker_args non è indentato.

docker_args: |
  --network npm_default

Non è necessario esporre alcuna porta

Commenta o rimuovi queste righe dal tuo file yml:

# expose:
#  - "80:80"   # http
#  - "443:443" # https

Puoi quindi ricostruire i tuoi container e configurare Nginx Proxy Manager in questo modo:

image

Un modo semplice (ma non necessariamente consigliato) per avviare un secondo sito Discourse sarebbe questo:

cd /var/discourse/containers
cp app.yml othersite.yml
# in qualche modo modifica, come minimo, il nome host in othersite.yml
./launcher rebuild othersite

Poi aggiungilo a NPM come sopra, usando othersite invece di app.

Ho testato questo con un app.yml più due container di tipo web_only e un singolo container data più un separato container othersite-redis che è una copia del container data contenente solo i modelli redis. (Ma una soluzione più semplice sarebbe mettere il redis extra nel container web_only).

2 Mi Piace

Quindi, dopo alcune difficoltà, sono riuscito a far funzionare tutto.

Devo fare una premessa: sebbene sia uno sviluppatore di “vecchia generazione” (nato nel 1980), ho sempre cercato le migliori e più moderne modalità di sviluppo e gestione, quindi nel 2021 detesto scrivere comandi strani pieni di opzioni criptiche come nei vecchi sistemi CP/M o DOS. Cerco sempre un’interfaccia che mi renda la vita più semplice e chiara.

Ad esempio, uso Portainer per gestire i container: mi permette di avviare, arrestare, modificare e duplicare tutti i container al volo, senza dover “bazzicare” su e giù nel filesystem alla ricerca di un file raro; ad esempio, per cambiare la rete del container basta sceglierne una da un elenco e fare un clic, lo stesso vale per aggiungere parametri o volumi come nell’esempio scritto da @tophee. Per questo motivo ho provato NPM, perché preferisco “contenere” il mio proxy Nginx e perché, apparentemente, con pochi clic, capendo bene cosa sto facendo, non devo ricordare un nuovo insieme di strani comandi e opzioni.

Tornando al mio container Discourse, ho dovuto eseguire di nuovo “discourse-setup”; tutto è andato bene, il “cattivo” Postgres è stato installato in versione 13, niente “unicorno ubriaco” (mi scuso, ma pensare a un “unicorno” che corre sul mio server mi fa ridere! :laughing:), insomma, tutto è andato per il verso giusto. Poi ho apportato le modifiche necessarie per far funzionare Discourse con i WebSocket: anche questa volta tutto è andato bene. Fortunatamente, la configurazione precedente di Discourse aveva eseguito backup automatici, quindi con pochi clic ho ripristinato tutto (più uso Discourse, più lo amo!).
Ho dovuto provare più volte le impostazioni per NPM; all’inizio ho avuto alcuni problemi con i certificati, ma alla fine anche questo ha funzionato correttamente.

Ho aggiunto un secondo proxy puntato al mio container WordPress (sì, sto “contenendo” tutto, mi piace l’idea di un server più pulito con tutti i pacchetti principali contenuti in un luogo gestito), e anche questo ha funzionato bene.

Quindi, alla fine, ho il mio server (un VPS) con il suo server di posta (ho anche provato a “contenerlo”, ma dopo settimane di aspra lotta ho rinunciato), Discourse puntato ad esso, WordPress in esecuzione in un altro container e NPM che gestisce entrambi: tutto sul mio server, senza dipendere da altri servizi (molto, molto più costosi) per il deployment, l’invio di email, ecc.

Prossimo passo: importare alcune centinaia di migliaia di post dal “vecchio e buono Phpbb”: preparatevi per altri post da parte mia! :grinning_face_with_smiling_eyes:

Un grande grazie a @tophee e @pfaffman per l’aiuto; posso capire quanto possa essere difficile aiutare le persone quando lavorano in modo non standard come me.

3 Mi Piace

Sono contento che tu sia riuscito a farlo funzionare con Websocket. Per chiunque altro abbia difficoltà con questo, segui le istruzioni di @pfaffman per farlo senza websocket qui sopra.

Non so cosa abbia causato il tuo problema, ma mi sembra utile chiarire un punto per chi è relativamente nuovo all’amministrazione di Discourse: devi capire come funziona il certificato Let’s Encrypt nell’installazione predefinita (senza alcun proxy esterno) rispetto a come funziona con NPM (e se ti chiedi perché sia chiamato proxy esterno, devi scoprirlo anche tu).

Poiché ho configurato manualmente il mio proxy esterno e anche Let’s Encrypt, ho compreso tutta la magia che Discourse e NPM fanno per te affinché HTTPS funzioni semplicemente, e quindi sono stato in grado di evitare varie insidie passando dai certificati gestiti da Discourse a quelli gestiti da NPM.

Non vedo davvero perché vorresti mettere il server di posta dietro NPM…

1 Mi Piace

No Christoph, non dietro NPM, solo in un container. Ho provato Zimbra, ma è stato un disastro. Poi ho provato un semplice Postfix “in contenitore”, ma senza successo. All’epoca ero all’inizio della mia esperienza con Linux (sono ancora un principiante, ma sto acquisendo sempre più sicurezza, almeno per quanto riguarda alcuni concetti di amministrazione), quindi ho rinunciato e ho provato direttamente sul server. Parte senza grossi problemi, quindi ho proseguito in quel modo, anche se è stato piuttosto difficile configurare Discourse per utilizzare il mio server di posta. Ma ora, sembra che tutto funzioni.

2 Mi Piace

Sembra buono con l’installazione finché non mi blocco con npm per comunicare con l’host di discourse; menzioni di inserire l’IP del data container all’interno dell’host mySQL del file compose di npm

 environment:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"

ma quando cambio (DB_MYSQL_HOST) in data container, mi mostra connection refused.

connect ECONNREFUSED 172.17.0.2:3306 <-- errore quando npm nella rete discours (network_mode: bridge).
getaddrinfo ENOTFOUND db <-- errore quando il mySQL nel file compose di npm è definito come "db".

suggerimenti per far funzionare il passo 3?

1 Mi Piace