Il container discourse-app si avvia e poi si ferma silenziosamente

Gentile Community,

Ho provato a installare un’istanza privata di Discourse, seguendo le istruzioni ufficiali su https://github.com/discourse/discourse/blob/main/docs/INSTALL-cloud.md. Sebbene gli script sembrino estremamente complessi, ho dovuto modificare manualmente i file container.yml e discourse-setup per impostare le mie impostazioni…

1° problema: nonostante la sua complessità, lo script di installazione non consente la modifica delle porte esposte! Le porte 80/443 non possono essere utilizzate sul mio server, essendo già utilizzate da nginx. Quindi ho dovuto ancora una volta modificare lo script di configurazione per impostare le porte 3080/3443 come porte richieste per accedere a Discourse.

Quindi sono riuscito a far funzionare tutti i container. Guardando lo stack con Portainer, ho scoperto che l’applicazione si avvia e si arresta silenziosamente e i log non forniscono molte informazioni sul motivo. Poiché redis e postgres non pubblicano alcuna porta, l’app discourse potrebbe fallire perché non riesce a connettersi a questi componenti? Cosa mi sono perso o cosa ho sbagliato?

_discourse-app_logs.txt (10,4 Ko)

Grazie in anticipo per qualsiasi aiuto!

Causato da:

Errno::EADDRNOTAVAIL: Impossibile assegnare l'indirizzo richiesto - connect(2) per [::1]:6379

Quindi non è in grado di connettersi a Redis sull’indirizzo di loopback IPv6.

Ciao Richard, grazie per la rapida risposta! Non sono un professionista IT, mi piace solo giocare con gli strumenti: quale sarebbe la soluzione per questo problema?

Grazie in anticipo per il tuo consiglio!

Sembra che tu ti sia discostato dall’installazione standard impostando container separati per Redis e Postgres, quindi temo di non avere una risposta immediata per te. Come hai configurato le impostazioni di Redis all’interno di Discourse?

Un’altra cosa: vedo redis:4-alpine. Temo che dovrai passare a una versione più recente di Redis poiché Discourse richiede la versione 6.20 o superiore. Tuttavia, non credo che questa sia la causa del tuo problema.

2 Mi Piace

Lo script di configurazione funziona solo per una configurazione standard. Se stai facendo qualcosa di più complesso, devi modificare manualmente il file yml. È molto più semplice che modificare lo script.

Discourse non funzionerà su una porta non standard. Avrai bisogno di un reverse proxy davanti. Vedi argomenti come Esegui altri siti web sulla stessa macchina di Discourse.

Se non utilizzerai il postgres e redis forniti, dovrai cavartela da solo per capire perché i tuoi non funzionano. Ci sono troppe cose che potrebbero essere la causa e che non possiamo indovinare o dedurre. Ti consiglio un’installazione standard su una VM separata per vedere come funzionano le cose prima di provare una configurazione molto complessa.

3 Mi Piace

Non ho eseguito alcuna installazione “non standard”! Ho, come effettivamente descritto nella documentazione, scaricato tutto da Github, modificato solo le porte esposte ed eseguito lo script:

  • Non ho cambiato nulla nella configurazione di redis, né di postgres.
  • Non ho cambiato nulla per la versione di redis.
    Questi pezzi di software sono stati installati dallo script originale discourse-setup.

@pfaffman cosa intendi con “modificare lo yml a mano”? Di quale yml parli? Ci sono molti file .yml in “containers”…

Tra l’altro, ho effettivamente un reverse proxy sulla macchina, che sembra avere una configurazione semplice: più file subdomain.conf che definiscono la redirezione subdomain:80 → porta XXX. È questo che è richiesto?

Raccomando un’ installazione standard su una vm separata per vedere come funzionano le cose prima di provare una configurazione molto complessa.

Non voglio una configurazione complessa :blush:, ho solo bisogno di eseguire Discourse insieme ad altri container, che è ciò per cui Docker è progettato…

Grazie ancora per il tuo aiuto!

In generale discourse-setup non installa istanze postgres e redis separate e certamente non le versioni 12 e 4.

Puoi per favore pubblicare la tua configurazione e le modifiche apportate a container.yml e agli script? Assicurati di redigere eventuali impostazioni riservate.
Inoltre, facci sapere a quale commit del repository discourse_docker ti trovi.

3 Mi Piace

Hai modificato sia discourse-setup sia un file che verrà sovrascritto quando aggiornerai discourse-docker. Modificare qualsiasi cosa diversa da app.yml è decisamente non standard.

Perché? E qualunque cosa tu abbia dovuto cambiare lì, non è così che si fa. Dovrai inserire quelle modifiche nel tuo app.yml.

Discourse non funzionerà su una porta non standard, quindi questa non è un’installazione standard.

L’installazione standard include postgres e redis nello stesso container. Come sottolineato, stai utilizzando versioni non supportate di redis e postgres. Puoi anche fare un’installazione a due container come descritto qui Spostamento da container standalone a container web e dati separati (e puoi usare ./discourse-setup --two-container per far sì che discourse-setup crei container dati e web separati, anche se è un po’ più complicato da mantenere (devi sapere quando aggiornare il container dati).

1 Mi Piace

OK, allora devo:\n- cancellare tutto il software installato con gli script modificati (spero che sia facilmente reversibile).\n- scaricare nuovamente lo script. Ho usato git clone https://github.com/discourse/discourse_docker.git /var/discourse per l’installazione corrente: va bene?\n- modificare eventualmente alcune impostazioni solo nel file app.yml, prima di eseguire ./discourse-setup.\n- eseguire lo script di installazione per l’installazione standard (preferisco un unico container).\n- configurare il proxy nginx per instradare discourse.example.com:80/443 al container corretto. La documentazione fornisce suggerimenti per questa parte?\n\nPer favore, completa l’elenco se ho saltato qualche passaggio!\n\nGrazie ancora per il tuo aiuto!

:white_check_mark:

Vedi Run other websites on the same machine as Discourse

2 Mi Piace

L’unica cosa che installerà è docker.

Sembra a posto.

app.yml viene creato da discourse-setup. Non puoi eseguire discourse-setup se non può accedere alle porte, ma se leggi il codice sorgente vedrai che puoi eseguire ./discourse-setup --skip-connection-test ed eseguirlo comunque.

Il tuo nginx sarà responsabile di let’s encrypt, quindi vorrai commentare il template di let’s encrypt. Sospetto che ciò sia descritto nell’argomento del proxy inverso collegato sopra e sotto.

Vedi Utilizzo di Nginx Proxy Manager per gestire più siti con Discourse o Esegui altri siti web sulla stessa macchina di Discourse (che è già stato collegato).

1 Mi Piace

Ciao @pfaffman,

Leggendo la documentazione su Esegui altri siti web sulla stessa macchina di Discourse, ho bisogno di alcune conferme:

  • Il post dice

Non è possibile utilizzare ./discourse-setup per configurare Discourse se un altro server sta utilizzando la porta 80 o 443. Sarà necessario copiare e modificare samples/standalone.yml con il tuo editor di testo preferito.

e capisco che devo modificare app.yml prima di eseguire discourse-setup, come già detto nella premessa

Non è possibile utilizzare ./discourse-setup per configurare Discourse se un altro server sta utilizzando la porta 80 o 443. Sarà necessario copiare e modificare samples/standalone.yml con il tuo editor di testo preferito.

Puoi quindi confermare il seguente processo:

  • scaricare tutto da Github
  • eseguire discourse-setup una volta con l’opzione --skip-connection-test → questo creerà il file containers/app.yml
  • modificare app.yml come descritto nella documentazione sopra
  • aggiornare il software con /var/discourse/launcher rebuild app
  • creare il sito nginx per puntare al socket di Discourse e riavviare nginx
  • infine lanciare un browser per accedere a Discourse su https://discourse.mydomain.com, che punta semplicemente all’IP del server.

Grazie in anticipo per il tuo consiglio!

Aggiornamento:

  • scarica tutto da Github: FATTO
  • esegui discourse-setup una volta con l’opzione --skip-connection-test: tutto è andato bene fino alla fine, dove lo script è tornato
docker: Error response from daemon: driver failed programming external connectivity on endpoint app (784361985c928eb26b149d829f37882056562d9b1e77ef4ce71fbfe30c5d80b1): Error starting userland proxy: listen tcp4 0.0.0.0:443: bind: address already in use.

Questo mi sembra normale, dato che il container cerca di accedere alle stesse porte del webserver esistente. Tuttavia, dato che nessun container discourse è stato creato (come restituito da docker container ls), vorrei che tu lo confermassi prima di procedere con la configurazione di nginw…

Grazie in anticipo per il tuo aiuto!

Penso che tu debba commentare le porte.

Intendi “prima di eseguire discourse-setup”? In tal caso, quale file dovrei modificare, dato che app.yml non esiste prima che io esegua lo script? Voglio installare un’app a 1 container: dovrei eseguire di nuovo lo stesso script discourse-setup o il comando /var/discourse/launcher rebuild app?

A proposito, il mio processo sopra è corretto?

Modifica il file esistente con nano o un editor simile e commenta le porte. ./launcher rebuild app.

Probabilmente nel tuo caso, potresti anche usare --skip-rebuild, quindi eseguiresti

./discourse-setup --skip-connection-test --skeip-rebuild
nano containers/app.yml
./launcher rebuild app

Mi scusi il disturbo, ho bisogno di essere sicuro al 100% dato che non sono assolutamente un esperto :wink::

  • Eseguo ancora una volta ./discourse-setup --skip-connection-test --skip-rebuild (l’esecuzione precedente è stata senza l’opzione --skip-rebuild). Non ho bisogno di eliminare ciò che è stato installato dall’esecuzione precedente.
  • Quindi modifico il file app.yml esistente e commento le porte (sono già commentate)
  • Quindi eseguo ./launcher rebuild app

Grazie ancora per il tuo tempo!

Non dovrai più eseguire discourse-setup (a meno che, forse, tu non cambi la quantità di RAM che hai e desideri che aggiorni le impostazioni di memoria a quelle predefinite consigliate).\n\nBasta modificare le porte e ricostruire.

Ciao Jay,

Ecco il risultato della ricostruzione di stamattina:

  • ./launcher rebuild app = OK, alcuni avvisi, ma docker dice che local_discourse/up è attivo e funzionante.
  • Ho configurato un sito nginx secondo le istruzioni fornite in Run other websites on the same machine as Discourse e riavviato nginx = OK.
  • Ho configurato una voce DNS per far puntare discourse.mydomain.com all’indirizzo IP del server = OK.
  • Aprire un browser su discourse.mydomain.com mi porta a… l’istanza Nextcloud in esecuzione sul server. Sembra che la configurazione debba essere corretta, poiché il traffico non viene correttamente instradato al container discourse…

Non voglio installare NPM perché ho letto che non è uno strumento robusto e la configurazione per discourse comporta l’hard-coding degli IP: dovrei comunque farlo?

Grazie in anticipo per i tuoi consigli!

Quindi questo sembra un problema sul tuo proxy inverso nginx che hai davanti alla tua installazione di Discourse.

Aspetta…? Cosa? E perché dovresti installare NPM al di fuori del container?

2 Mi Piace