ATTENZIONE! Se il tuo database è molto grande, avrai bisogno di molto spazio su disco aggiuntivo (2x la dimensione del database) e dovresti prestare molta attenzione a questo aggiornamento!
Abbiamo appena apportato modifiche per aggiornare la nostra immagine Docker a PostgreSQL 15. Qualsiasi amministratore di sito che ricostruisce Discourse dalla riga di comando verrà aggiornato a PostgreSQL 15 dalla precedente versione di PostgreSQL 13. Tieni presente che se hai evitato l’aggiornamento quando è avvenuto l’aggiornamento a PostgreSQL 13 nel 2020, puoi saltare quell’aggiornamento e passare direttamente a PostgreSQL 15.
Se in precedenza avevi posticipato l’aggiornamento, modifica il template PostgreSQL in app.yml da templates/postgres.12.template.yml a templates/postgres.template.yml.
Come per ogni aggiornamento, è fortemente consigliato eseguire un backup prima di fare qualsiasi cosa.
Aggiornamento
Guida ufficiale all’installazione (container singolo)
Al tuo prossimo rebuild, vedrai questo messaggio alla fine:
-------------------------------------------------------------------------------------
AGGIORNAMENTO DI POSTGRES COMPLETATO
Il vecchio database 13 è memorizzato in /shared/postgres_data_old
Per completare l'aggiornamento, ricostruisci di nuovo usando:
./launcher rebuild app
-------------------------------------------------------------------------------------
Ciò significa che tutto è andato bene nell’aggiornamento! Devi solo emettere un nuovo rebuild per ripristinare il tuo sito e farlo funzionare.
Installazione con container dati
Se stai eseguendo una configurazione con un container dati dedicato basato sull’esempio fornito nel nostro repository discourse_docker, vorrai assicurarti di arrestare PostgreSQL in modo sicuro e pulito.
Oggigiorno, abbiamo processi in background che eseguono query che si estendono per diversi minuti, quindi l’arresto del container web aiuterà il container dati ad essere arrestato in modo sicuro.
./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only
Prima di emettere il primo rebuild per il container dati, puoi seguire il log di PostgreSQL per vedere se è stato arrestato correttamente.
Eseguire un tail -f shared/standalone/log/var-log/postgres/current dovrebbe darti il seguente log se è stato pulito:
2025-01-24 09:19:06.437 UTC [37] LOG: ricevuta richiesta di arresto intelligente
2025-01-24 09:19:06.444 UTC [37] LOG: worker in background "logical replication launcher" (PID 54) uscito con codice di uscita 1
2025-01-24 09:19:06.446 UTC [49] LOG: arresto in corso
2025-01-24 09:19:06.468 UTC [37] LOG: il sistema di database è arrestato
Esecuzione di un aggiornamento manuale / ambienti con spazio limitato
DEVI FARE IL BACKUP DI POSTGRES_DATA PRIMA DI PROVARE QUESTO
Se ti trovi in un ambiente con spazio limitato e senza possibilità di ottenere altro spazio, puoi provare quanto segue:
./launcher stop app #(o sia web_only che data se è il tuo caso)
mkdir -p /var/discourse/shared/standalone/postgres_data_new
docker run --rm \
--entrypoint=/bin/bash \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c "apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade"
mv /var/discourse/shared/standalone/postgres_data /var/discourse/shared/standalone/postgres_data_old
mv /var/discourse/shared/standalone/postgres_data_new /var/discourse/shared/standalone/postgres_data
docker run --rm -v /var/discourse/shared/standalone:/shared local_discourse/app \
chown -R postgres:postgres /shared/postgres_data #(o local_discourse/data)
./launcher rebuild app #(o prima data e poi web_only se è il tuo caso)
Nei miei test, questa procedura richiede meno di 1x la dimensione attuale del tuo database in spazio libero.
Se stai usando una locale non predefinita, puoi provare a sostituire il primo comando docker con questo:
# cambia 'en_US.UTF-8' con la tua locale
docker run --rm \
--entrypoint=/bin/bash \
-e LANG='en_US.UTF-8' \
-v /var/discourse/shared/standalone/postgres_data:/var/lib/postgresql/13/data \
-v /var/discourse/shared/standalone/postgres_data_new:/var/lib/postgresql/15/data \
tianon/postgres-upgrade:13-to-15 \
-c 'sed -i "s/^# $LANG/$LANG/" /etc/locale.gen && locale-gen &&
apt-get update && apt-get install -y postgresql-13-pgvector postgresql-15-pgvector &&
docker-upgrade'
Posticipare l’aggiornamento
Se hai bisogno di posticipare l’aggiornamento durante il tuo prossimo rebuild, puoi scambiare il template PostgreSQL nel tuo file app.yml cambiando "templates/postgres.template.yml" in "templates/postgres.13.template.yml".
Questo non è raccomandato, poiché alcuni amministratori di sito dimenticheranno di annullare la modifica in seguito.
Attività opzionali post-aggiornamento
Ottimizzazione delle statistiche di PostgreSQL
Dopo l’aggiornamento, il nuovo PostgreSQL non avrà a disposizione le statistiche delle tabelle. Puoi generarle usando:
docker exec -u postgres app \
/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages
Pulizia dei vecchi dati
Per un’installazione standard, puoi eliminare i vecchi dati in formato PG13 con il seguente comando:
cd /var/discourse
./launcher cleanup
Se hai un container dati separato, dovrai rimuovere la copia di backup in questo modo:
rm -fr /var/discourse/shared/data/postgres_data_old/
FAQ
Il cluster sorgente non è stato arrestato correttamente
Se ricevi un messaggio di errore di aggiornamento con il messaggio sopra, puoi provare un approccio più semplice per riportarlo in uno stato migliore.
Riavvia il vecchio container con ./launcher start app. Attendi qualche minuto finché non è di nuovo attivo.
Ora arrestalo di nuovo con ./launcher stop app. Dopodiché segui i log per vedere se è stato un arresto pulito:
tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG: ricevuta richiesta di arresto intelligente
2025-01-24 09:19:06.444 UTC [37] LOG: worker in background "logical replication launcher" (PID 54) uscito con codice di uscita 1
2025-01-24 09:19:06.446 UTC [49] LOG: arresto in corso
2025-01-24 09:19:06.468 UTC [37] LOG: il sistema di database è arrestato
Se i log non indicano che il database è arrestato, puoi riavviare il vecchio container, accedervi con ./launcher enter app, eseguire questi comandi e seguire nuovamente i log una volta terminato.
export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit
Se i log sono simili a quelli sopra, puoi ora provare ad aggiornare di nuovo usando ./launcher rebuild app.
I valori di lc_collate per il database “postgres” non corrispondono
Questo errore si verifica se stai utilizzando locali non predefinite per il tuo database. È stato segnalato che sono necessarie 3 variabili affinché vada a buon fine. Assicurati che la sezione env: del tuo file app.yml contenga le 3 righe:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
LANGUAGE: en_US.UTF-8
Modificando en_US.UTF-8 con la tua locale.
Ogni rebuild ripete l’aggiornamento, ovvero loop di aggiornamento
Quando ciò accade, i log di aggiornamento conterranno
mv: impossibile spostare '/shared/postgres_data' in '/shared/postgres_data_old/postgres_data': Directory non vuota
mv: impossibile spostare '/shared/postgres_data_new' in '/shared/postgres_data/postgres_data_new': Directory non vuota
Ciò significa che ci sono ancora file dall’ultimo aggiornamento in giro. Spostali altrove prima di continuare.
Script di suggerimento per il completamento dell’aggiornamento - devo fare qualcosa?
Una volta completato l’aggiornamento, vedrai l’output dal messaggio di pg_upgrade che dice:
Aggiornamento completato
----------------
Le statistiche dell'ottimizzatore non vengono trasferite da pg_upgrade.
Una volta avviato il nuovo server, considera l'esecuzione di:
/usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages
L'esecuzione di questo script eliminerà i file di dati del vecchio cluster:
./delete_old_cluster.sh
Puoi tranquillamente ignorare questo messaggio.
Ho saltato l’aggiornamento a PostgreSQL 13, cosa devo fare ora?
Puoi seguire le istruzioni standard all’inizio di questa guida e verranno aggiornate dalla tua versione alla 15 senza problemi.
Se stai seguendo le istruzioni per lo spazio limitato, adatta di conseguenza i numeri di versione.
La ricostruzione degli indici può farti risparmiare spazio su disco significativo. Segui i passaggi del nostro aggiornamento a PostgreSQL 13 dopo l’aggiornamento.