Configurazione Multisito con Let's Encrypt e senza Reverse Proxy

Queste istruzioni dovrebbero essere considerate beta e per coloro che hanno familiarità con una configurazione standard

Ma al momento (2023.02.11) queste istruzioni non funzionano!! (Vedi Set up Let’s Encrypt with multiple domains / redirects per come aggiornare l’impostazione letsencrypt per aggiungere la parte fullpath. Aggiornerò questo per riflettere tali modifiche Molto Presto.)

Ho sviluppato questa guida un paio di settimane fa ma ho bisogno che qualcuno la testi e veda se funziona per qualcun altro. Per favore, rispondi se provi e fammi sapere se funziona e se qualcosa non è chiaro.

E ora lo spettacolo…

Questa guida documenta in modo generale come impostare una configurazione multisito con 2 host aggiuntivi (3 in totale).

Presuppone che tu abbia una Installazione Standard Ufficiale di Discourse funzionante o un’installazione a 2 container (Move from standalone container to separate web and data containers).

Nome di dominio per il sito principale

Sottodominio per il 2° sito

Sottodominio per il 3° sito

Password del database (la stessa di DISCOURSE_DB_PASSWORD) o discourse in app.yml

Ai fini della semplicità, questo è per un sito principale chiamato =domain=, con due siti aggiuntivi =two=.=domain= e =three=.=domain=. Puoi usare i nomi che vuoi, ma ai fini di questo modello, non avere un nome breve (per il nome del database e il titolo del sotto-forum) e un hostname completo diversi è un po’ più facile.

Aggiungi in hooks dopo i plugin in app.yml o web_only.yml

  before_bundle_exec:
    - file:
        path: $home/config/multisite.yml
        contents: |
         =two=:
           adapter: postgresql
           database: =two=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =two=.=domain=
         =three=:
           adapter: postgresql
           database: =three=
           pool: 25
           timeout: 5000
           host: data
           password: NThmZTNjZjZhOTczNmVj
           host_names:
             - =three=.=domain=

  after_db_migrate:
    - exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate

  after_ssl:
   # dire a letsencrypt quali certificati aggiuntivi ottenere
    - replace:
        filename: "/etc/runit/1.d/letsencrypt"
        from: /-d =domain= /
        to: "-d =domain= -d =two=.=domain= -d =three=.=domain="
        global: true
   # non reindirizzare tutti gli host al nome di dominio principale
    - replace:
        filename: "/etc/nginx/conf.d/discourse.conf"
        from: /if \\(\\$http_host[^\\}]*\\}/m
        to: ""

Aggiungi alla sezione after_postgres in app.yml o data.yml

  - exec: sudo -u postgres createdb =two= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =two= to discourse;
        cmd: sudo -u postgres psql =two=
        raise_on_fail: false

    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =two= <<< "create extension if not exists pg_trgm;"'
    - exec: sudo -u postgres createdb =three= || exit 0
    - exec:
        stdin: |
          grant all privileges on database =three= to discourse;
        cmd: sudo -u postgres psql =three=
        raise_on_fail: false
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "alter schema public owner to discourse;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists hstore;"'
    - exec: /bin/bash -c 'sudo -u postgres psql =three= <<< "create extension if not exists pg_trgm;"'

Dopo di che,

./launcher rebuild app

o

./launcher rebuild data
./launcher rebuild web_only
10 Mi Piace

L’ho appena provata, anzi l’ho provata due volte perché non riuscivo a credere che funzionasse già senza problemi la prima volta :smile: Ho solo copiato, modificato i domini e la password, e poi incollato nei rispettivi file di una nuova installazione con 2 container. :ok_hand:

Fammi sapere se qualcosa non è chiaro. Ho dovuto riflettere un po’ su questo paragrafo:

Sembra suggerire che sia necessario un setup a 2 container per seguire la guida, ma in realtà non lo è. Inoltre, non ho capito perché si colleghi al post 48 del topic invece che al post iniziale.

2 Mi Piace

Grazie! Ci darò un’occhiata. Entrambe sembrano quelle distrazioni che speravo tu mi avresti fatto notare!

MODIFICA: Grazie! Avevo copiato in modo disattento la mia posizione attuale nel argomento a 2 contenitori, quindi l’ho corretta e ho modificato il testo per indicare che funzionerà con qualsiasi installazione funzionante.

Grazie!

2 Mi Piace

Ciao
Ho iniziato con un’installazione standard di Discourse (su DigitalOcean), poi ho configurato nginx (usando queste istruzioni) perché volevo ospitare alcuni siti Drupal sullo stesso droplet.
Se volessi avere un’altra istanza di Discourse, dovrei seguire le istruzioni sopra?

O sarebbe meglio questa guida?

Grazie!
/Sifaan

Queste istruzioni si riferiscono all’uso senza un reverse proxy. Ti consiglio di seguire la configurazione multisito con Docker. Le istruzioni a cui hai fatto riferimento potrebbero funzionare, ma ti suggerisco di seguire prima quanto riportato qui.

2 Mi Piace

Grazie; noto che con quella configurazione entrambi i siti utilizzerebbero le stesse impostazioni SMTP :frowning:
c’è un modo per evitarlo?
o sarebbe meglio seguire la guida alternativa (sembra che richiederebbe un po’ di lavoro per mettere il sito esistente sulla rete docker)

in alternativa, è possibile installare un altro codice sorgente, ad esempio in /var/discourse2?
(costerà circa 500 MB ma ne vale la pena se mi risparmia mal di testa)

Sì.

Non usare il multisito.

Sì, ma devi semplicemente creare un’installazione a due container e poi avere un file web_only2.yml. (Penso che tu possa avere due file di tipo app.yml, ma in quel caso avresti due istanze di Postgres in esecuzione inutilmente). Penso, però, che siano necessarie due istanze di Redis.

3 Mi Piace

Grazie; dato che non sono molto familiare con la separazione dei dati e del contenitore web, ho creato un altro contenitore autonomo seguendo queste linee guida (e i certificati generati da certbot sembrano funzionare). Tuttavia, attualmente sembra esserci un problema con la configurazione di Mailgun: invia email di attivazione a Gmail, ma qualsiasi email ospitata presso il mio registrar (DreamHost) fallisce :frowning:

Quanto carico aggiuntivo causerebbe l’istanza Postgres extra?
Ho letto il tuo post sulla separazione e proverò a implementarla se il risparmio fosse significativo.

Probabilmente non molto. Solo un po’ di RAM. Ho un’idea molto vaga di quanto.

1 Mi Piace

Recentemente ho provato a seguire questa guida, ma ho riscontrato delle difficoltà con alcuni punti:

  1. Non riesco a trovare la password del database (o a cosa serva esattamente nel file).
  2. Il mio file app.yml non conteneva inizialmente una sezione after_postgres, quindi l’ho aggiunta sotto hooks per allinearla alle altre (after_ssl, after_db_migrate, ecc.). Se è stata inserita nella sezione sbagliata, fammelo sapere: sono completamente nuovo a questo tipo di cose.
  3. Quando controllo la sintassi del file YAML su http://www.yamllint.com/, ricevo l’errore (<unknown>): did not find expected key while parsing a block mapping sulla riga in cui ho inserito la sezione after_postgres sotto la sezione hooks.

Se potessi chiarire i passaggi per modificare il file app.yml, ti sarei molto grato.

2 Mi Piace

Forse non hai bisogno di una password se stai utilizzando una configurazione a singolo container (un post precedente lo suggerisce).

Aggiungere la sezione come suggerisci dovrebbe funzionare.

Non riesco a capire esattamente cosa non vada. Cercherò di dare un’occhiata più da vicino tra un paio di giorni.

1 Mi Piace

Sto pensando di configurarlo, dato che io e il mio amico vogliamo testare alcuni forum diversi prima di decidere se investire di più su di essi, possibilmente avendo hosting separati e cose del genere.

Stavo pensando di metterli su domini diversi, capisco che possa creare un po’ di confusione dato che le persone riceveranno le email solo dall’indirizzo SMTP principale, tuttavia, sai se domini separati creerebbero altri grattacapi?

Discourse ha un unico dominio per tutti i suoi clienti aziendali e standard. Puoi impostare l’indirizzo email di notifica come preferisci, ad esempio shortname@whatevermail.com.

2 Mi Piace

Sono molto felice di sentirlo, grazie!

1 Mi Piace

Ciao, prima di tutto grazie per il tutorial.

Sfortunatamente, ho un problema nell’eseguire ulteriori discourse su un singolo server/IP.
Innanzitutto, ho seguito la documentazione per avviare un sito standalone ed è stato un successo.
(ad es. test.john.com - un sottodominio che reindirizza all’IP singolo)
Ora, quando ho provato ad aggiungere altri discourse (ad es. test.joe.com e test.doe.com - altri sottodomini da altri siti).
Ho provato a seguire i tuoi passaggi ma non ci sono riuscito e ora sono perso.

Alcune domande:

  1. Come verranno installati questi altri due siti? Come copiare /standalone.yml nella directory containers e rinominarlo? E fare semplicemente l’installazione regolare? (ad es. ./launcher rebuild joe)
  2. Le tue istruzioni affermano che le modifiche dovrebbero essere in app.yml, aggiungendo tutto il codice sopra - che presumo debba essere aggiunto nel primo file installato con successo (test.john.com)?

Oltre a quelli nella directory container, ho creato un config/multisite.yml e questo è il codice che ho:

secondsite:
  adapter: postgresql
  database: b_discourse
  username: postgres
  password: postgres
  host: dbhost
  pool: 5
  timeout: 5000
  host_names:
    - test.joe.com
...
...
# e la configurazione del terzo sito

Non sono sicuro, però, se ci siano altre cose che devo configurare.

Apprezzo qualsiasi risposta. Grazie!

No. Aggiungi le cose a app.yml come descritto. Questo creerà mutlisite.yml all’interno del container. Ci sarà una singola istanza e funzionerà per tutti i domini, dato che il DNS per tutti punta lì. Questo non serve ad avere più container di Discourse, uno per ogni nome di dominio.

Per quanto ne so, quelle istruzioni funzionavano così come erano scritte. Aggiungi solo le righe al tuo app.yml e dovrebbe funzionare. Non è necessario toccare nessun altro file.

1 Mi Piace

La configurazione di un singolo sito funziona perfettamente. Nessun problema.
Ma ho provato molte combinazioni per il multisito. Configurazione singola app.yml o separata da web_only.yml, data.yml ecc… Ho provato altri suggerimenti su Configurazione multisito con Docker o Spostamento da container standalone a container web e dati separati.

Per quanto riguarda la migrazione, tutte le combinazioni sono sempre fallite… >> bundle exec rake multisite:migrate

********************** ultima parte del processo**************************
2023-02-11 17:50:43.853 UTC [61] LOG:  spegnimento in corso
162:M 11 Feb 2023 17:50:43.866 # Richiesta di spegnimento dall'utente...
162:M 11 Feb 2023 17:50:43.866 * Salvataggio dello snapshot RDB finale prima dell'uscita.
162:M 11 Feb 2023 17:50:43.881 * DB salvato su disco
162:M 11 Feb 2023 17:50:43.882 # Redis è ora pronto per uscire, arrivederci...
2023-02-11 17:50:44.007 UTC [57] LOG:  sistema di database spento


FALLITO
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate fallito con ritorno #&lt;Process::Status: pid 582 exit 1&gt;
Posizione del fallimento: /usr/local/lib/ruby/gems/3.1.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec fallito con i parametri "cd /var/www/discourse &amp;&amp; sudo -E -u discourse bundle exec rake multisite:migrate"
bootstrap fallito con codice di uscita 1
** FALLITO IL BOOTSTRAP ** si prega di scorrere verso l'alto e cercare messaggi di errore precedenti, potrebbero essercene più di uno.
./discourse-doctor potrebbe aiutare a diagnosticare il problema.

Ho controllato cosa è stato creato e cosa non è stato creato fino al fallimento.
I database dei sottodomini sono stati creati ma la migrazione è fallita. Le configurazioni nginx dei sottodomini o multisite.yml non sono state create quando ho controllato le cartelle overlay2 o altrove.

./launcher bootstrap,destroy,start,stop,rebuild o fresh setup molte volte… Ho provato tutti i comandi ma non è successo nulla… :slight_smile:

Questo tutorial è ancora valido per v3.1.0.beta 2 o cosa potrei star missing?
Qualche idea, per favore?

1 Mi Piace

No. Qualcosa riguardo a Let’s Encrypt è cambiato a un certo punto. Ti farò dare un’occhiata più da vicino a tutto ciò che deve essere modificato all’interno del container per gestire più domini.

1 Mi Piace

Sto usando questo metodo e funziona bene. Al momento non ho https abilitato, quindi non posso commentare le difficoltà di Let’s Encrypt.

Utilizzo questa configurazione da anni con i miei server di staging. Tuttavia, dopo l’aggiornamento a 3.5.0.beta5-dev, vengo reindirizzato al sito principale ogni volta che inserisco un sottodominio.

Ero così felice di non dovermi occupare di tutte le questioni relative alle certificazioni. Ma ora sono piuttosto perso, ci sono strumenti per eseguire il debug di ciò che sta accadendo?

1 Mi Piace