Continuando la discussione da Spostare la tua istanza Discourse su un server diverso:
Un problema nella migrazione di un’istanza Discourse su un nuovo server, o anche nel ripristino di un backup su un’istanza appena creata, è che tutte le sessioni degli utenti collegati potrebbero andare perse, costringendo gli utenti a effettuare nuovamente l’accesso. A seconda della comunità, ciò potrebbe essere indesiderabile perché:
- Alcuni utenti potrebbero essere scoraggiati dal partecipare se hanno difficoltà a riaccedere.
- Alcuni utenti potrebbero aver bisogno di aiuto per recuperare le proprie password.
- Alcuni utenti potrebbero creare nuovi account, separandosi dalla loro cronologia dei post e dalle Note Utente, lasciando dietro di sé un account “zombie”.
La perdita delle sessioni può verificarsi perché i cookie di sessione di Discourse sono crittografati con una chiave segreta generata casualmente, che viene memorizzata in Redis per impostazione predefinita. I dati di Redis non sono inclusi nel backup, quindi viene generata una nuova chiave segreta quando si ripristina il sito su un nuovo host.
Il vantaggio di questo approccio è che un file di backup compromesso non contiene la chiave necessaria per compromettere le sessioni degli utenti, il che potrebbe avere conseguenze molto gravi.
Tuttavia, durante la migrazione di un’istanza Discourse, questo problema può essere aggirato seguendo questi passaggi per copiare la chiave segreta, consentendo la migrazione dell’host mantenendo le sessioni degli utenti.
Passaggio 1: Recuperare la chiave segreta
Accedi alla tua istanza Discourse esistente, avvia una console rails e ottieni la chiave segreta:
admin@host:/var/discourse$ ./launcher enter app
root@host:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"
Annota il valore stampato nell’ultima riga e mantienilo al sicuro.
Passaggio 2: Impostare la chiave segreta nella nuova istanza
Supponendo di avere già pronta un’istanza Discourse per ricevere un backup al fine di migrare l’installazione, modifica il file app.yml per impostare la chiave segreta appena ottenuta. Aggiungila alla sezione env:
env:
DISCOURSE_SECRET_KEY_BASE: "90.......fed"
Dopo aver aggiunto questo, ricostruisci l’istanza:
admin@newhost $ launcher rebuild app
Passaggio 3: Verificare la chiave segreta nella nuova istanza
Questo è lo stesso del Passaggio 1, ma esegui i comandi sul nuovo host:
admin@newhost:/var/discourse$ ./launcher enter app
root@newhost:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"
La chiave segreta stampata deve essere esattamente la stessa di quella del Passaggio 1.
Passaggio 4: Procedi con la migrazione
Imposta l’istanza Discourse di origine come sola lettura, esegui un backup, copialo sulla destinazione Discourse e ripristina. Aggiorna i record DNS (o usa una modifica del file hosts per i test) in modo che gli utenti vengano reindirizzati al nuovo sito.
Le sessioni precedentemente attive dovrebbero ora persistere sul nuovo host.
Avvertenza
Non dovresti assolutamente condividere la chiave segreta tra più istanze di Discourse. Chiunque possieda la chiave segreta potrebbe decrittografare e modificare il proprio cookie di sessione su un sito, con gravi conseguenze per la sicurezza.
Come sempre, prova e verifica i passaggi sopra descritti su un’istanza sandbox o su installazioni di test prima di lavorare su un’istanza Discourse reale. Preparati al successo!
Infine, ma non meno importante, molti ringraziamenti a @david per aver descritto questo metodo: io ho solo testato e documentato qui (e sentiti libero di modificare o migliorare!).