Aggiornamento di PostgreSQL 15

:warning: 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

:warning::warning::warning:
DEVI FARE IL BACKUP DI POSTGRES_DATA PRIMA DI PROVARE QUESTO
:warning::warning::warning:

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.

28 Mi Piace
Cannot rebuild app because UPGRADE OF POSTGRES FAILED
Site offline after rebuild (4th Feb 2025)
Launcher upgrade failing
Update “3.4.0.beta4” failed
Admin dashboard not working after docker update
Specifically for 3.4.0.beta4 -- what are the system requirements?
Discourse rebuild fails due to unclean shutdown
Move from standalone container to separate web and data containers
Not receiving notifications for some replies
Hundreds of megabytes of apparently duplicate locale .js files
Upgrade failed spectacularily
Quote Callouts
502 Bad Gateway after updating to latest version
Discourse rebuild fails due to unclean shutdown
Rebuild fails: Data directory /shared/postgres_data must not be owned by root
Site Offline Since Update - pg15 upgrade failed
Failing update
Backup Failed error
Failing update
Let's Encrypt SSL certificates not renewing
Failing update
Long runtime moving posts / timeout errors
Upgrade failed. Database stopped. (multisite install)
Make (temporary) use of Network Storage for Restores, PSQL Update,
Error updating from 3.3 to 3.5
Unable to rebuild app / upgrade to 3.4.0.beta4
Upgrade fail unsupported Docker Version
Endlessly running Postgres processes & bad performance after Reinstall/restore
Unable to upgrade to PostgreSQL 15/
PostgreSQL update fails from China
Postgres doesn't seem to be running when running Discourse locally using Docker
Postgres doesn't seem to be running when running Discourse locally using Docker
Unable to upgrade to PostgreSQL 15/
My install is 16,359 commits behind! Advice?
Admin functions
Discourse rebuild process hangs at PostgreSQL initialization with "trust" authentication warning
Discourse update error with Terser
Getting white screen on admin page after update
Upgrade fails (again :) )
Update failure
I broke my site while updating it
Major upgrade -- best practices?
An upgrade knocked my site offline; how long until it's restored?
Upgrade failed. Database stopped. (multisite install)
Can't log into Digital Ocean--And they aren't replying. Advice?
Trouble updating discourse after some time - UPGRADE OF POSTGRES FAILED
Site Offline Since Update - pg15 upgrade failed
Site offline after rebuild (4th Feb 2025)
Can publishing "from" the `#staff` category prevent emails being sent?
Cannot rebuild app,
Upgrade from postgres 13 to 15 failing - currently means forum is unavailable
Unable to upgrade Kore Community Instance
Site upgrade insisting on database upgrade after manual db upgrade
Update v3.4.0.beta3 +21 to v3.4.0.beta4 +37 fails, unable to create a directory
Discourse Randomly Does Not run or Rebuild
PostgreSQL update fails from China
Hundreds of megabytes of apparently duplicate locale .js files
Site not working after upgrade

Quando visito https://community.ankihub.net/admin/update, vedo il seguente messaggio:

Stai eseguendo una versione obsoleta dell’immagine Discourse
Gli aggiornamenti tramite l’interfaccia web sono disabilitati finché non esegui l’immagine più recente. Per farlo, accedi al tuo server tramite SSH ed esegui:

cd /var/discourse
git pull
./launcher rebuild app

Dopo aver seguito queste istruzioni, ottengo UPGRADE OF POSTGRES FAILED:

invoke-rc.d: impossibile determinare il livello di esecuzione corrente
invoke-rc.d: policy-rc.d ha negato l'esecuzione di start.
Elaborazione dei trigger per postgresql-common (267.pgdg120+1) ...
Creazione dei dizionari PostgreSQL dai pacchetti myspell/hunspell installati...
Rimozione dei file di dizionario obsoleti:
Arresto del server di database PostgreSQL 13: main.
Arresto del server di database PostgreSQL 15: main.
Esecuzione dei controlli di coerenza
-----------------------------
Verifica delle versioni dei cluster                                   ok
Verifica che l'utente del database sia l'utente di installazione      ok
Verifica delle impostazioni di connessione del database               ok
Verifica delle transazioni preparate                                  ok
Verifica dei tipi compositi definiti dal sistema nelle tabelle utente ok
Verifica dei tipi di dati reg* nelle tabelle utente                   ok
Verifica di contrib/isn con discrepanza nel passaggio di bigint       ok
Verifica delle conversioni di codifica definite dall'utente           ok
Verifica degli operatori postfix definiti dall'utente                 ok
Verifica delle funzioni polimorfe incompatibili                       ok
Creazione del dump degli oggetti globali                              ok
Creazione del dump degli schemi del database
*errore*

Consulta le ultime righe di "/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log" per
la probabile causa dell'errore.
Errore, uscita
-------------------------------------------------------------------------------------
AGGIORNAMENTO DI POSTGRES FALLITO

Si prega di visitare https://meta.discourse.org/t/postgresql-15-update/349515 per assistenza.
Nel frattempo, puoi eseguire ./launcher start app per riavviare la tua app
-------------------------------------------------------------------------------------



FALLITO
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres già in esecuzione, arresta il contenitore ; exit 1
fi
 fallito con il codice di ritorno #<Process::Status: pid 18 exit 1>
Posizione dell'errore: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
esecuzione fallita con i parametri {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres già in esecuzione, arresta il contenitore ; exit 1\nfi\n"}
avvio fallito con codice di uscita 1

Né qui né in questo argomento parzialmente correlato viene affrontato il mio problema, per quanto ne so.

Ecco i log da /shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log:

command: "/usr/lib/postgresql/15/bin/pg_dump" --host /var/lib/postgresql --port 50432 --username postgres --schema-only --quote-all-identifiers --binary-upgrade --format=custom  --file="/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/dump/pg_upgrade_dump_16384.custom" 'dbname=discourse' >> "/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log" 2>&1
pg_dump: errore: query fallita: ERRORE: impossibile accedere al file "$libdir/vector": File o directory non esistente
pg_dump: dettaglio: La query era: SELECT t.tableoid, t.oid, i.indrelid, t.relname AS indexname, pg_catalog.pg_get_indexdef(i.indexrelid) AS indexdef, i.indkey, i.indisclustered, c.contype, c.conname, c.condeferrable, c.condeferred, c.tableoid AS contableoid, c.oid AS conoid, pg_catalog.pg_get_constraintdef(c.oid, false) AS condef, (SELECT spcname FROM pg_catalog.pg_tablespace s WHERE s.oid = t.reltablespace) AS tablespace, t.reloptions AS indreloptions, i.indisreplident, inh.inhparent AS parentidx, i.indnkeyatts AS indnkeyatts, i.indnatts AS indnatts, (SELECT pg_catalog.array_agg(attnum ORDER BY attnum)   FROM pg_catalog.pg_attribute   WHERE attrelid = i.indexrelid AND     attstattarget >= 0) AS indstatcols, (SELECT pg_catalog.array_agg(attstattarget ORDER BY attnum)   FROM pg_catalog.pg_attribute   WHERE attrelid = i.indexrelid AND     attstattarget >= 0) AS indstatvals, false AS indnullsnotdistinct FROM unnest('{16805,16813,16823,16835,16846,16858,16940,16948,16963,16973,16996,17006,17029,17061,17071,17085,17095,17101,17112,17136,17151,17159,17168,17266,17280,17321,17334,17345,17354,17368,17382,17398,17412,17420,17428,17519,17532,17543,17562,17570,17620,17687,17710,17724,17738,17754,17775,17788,17803,17824,17851,17864,17898,17917,17932,17944,17958,17980,17993,18006,18019,18030,18041,18055,18069,18092,18101,18134,18145,18166,18177,18214,18241,18263,18276,18298,18324,18338,18358,18368,18403,18426,18449,18458,18470,18496,18510,18525,18534,18543,18569,18596,18607,18625,18643,18655,18663,18676,18686,18698,18710,18719,18734,18742,18757,18768,18786,18798,18802,18806,18846,18864,18879,18891,18910,18920,18932,18946,18988,19003,19014,19039,19059,19073,19085,19097,19103,19116,19140,19192,19206,19227,19250,19266,19300,19309,19328,19343,19354,19367,19389,19402,19417,19430,19497,19521,19544,19559,19569,19597,19605,19637,19687,19703,19721,19742,19771,19807,19821,19830,19839,19862,19874,19890,19904,19917,19932,19942,19951,19960,19981,20005,20021,20044,20052,20061,20073,20082,20133,20146,20157,20178,20191,20203,20217,20231,20263,20276,20297,20309,20320,28805,28951,28964,28976,28986,28997,32824,32833,32843,32852,32862,32875,32887,32899,32910,32930,32967,35131,35141,38401,38413,38437,38445,38461,38482,38495,42870,46125,46138,130133,191445,191457,191471,191486,191497,191603,191637,243875,606663,606675,606693,606707,779182,779197,779213,779225,779237,779252,779265,968985,968993,969004,969017,969027,1004239,1004251,1004263,1004276,1004295,1091838,1091849,1091860,1336877,1336884,1336891,1566392,2169846,2169852,2169858,2169864,2169870,2169876,2169882,2169888,2169894,2169900,2169906,2169912,2169918,2169924,2169930,2169936,2169942,2169948,2169954,2169960,2169966,2169972,2169978,2169984}'::pg_catalog.oid[]) AS src(tbloid)
JOIN pg_catalog.pg_index i ON (src.tbloid = i.indrelid) JOIN pg_catalog.pg_class t ON (t.oid = i.indexrelid) JOIN pg_catalog.pg_class t2 ON (t2.oid = i.indrelid) LEFT JOIN pg_catalog.pg_constraint c ON (i.indrelid = c.conrelid AND i.indexrelid = c.conindid AND c.contype IN ('p','u','x')) LEFT JOIN pg_catalog.pg_inherits inh ON (inh.inhrelid = indexrelid) WHERE (i.indisvalid OR t2.relkind = 'p') AND i.indisready ORDER BY i.indrelid, indexname
/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log

Ecco l’output di ./discourse-doctor:

output di ./discourse-doctor
DISCOURSE DOCTOR mer 29 gen 2025 10:39:42 UTC
OS: Linux forum 5.4.0-48-generic #52-Ubuntu SMP Thu Sep 10 10:58:49 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux


Trovato containers/app.yml

==================== IMPOSTAZIONI YML ====================
DISCOURSE_HOSTNAME=community.ankihub.net
SMTP_ADDRESS=smtp.mailgun.org
DEVELOPER_EMAILS=REDACTED 
SMTP_PASSWORD=REDACTED 
SMTP_PORT=587
SMTP_USER_NAME=postmaster@mg.ankihub.net
LETSENCRYPT_ACCOUNT_EMAIL=REDACTED 

==================== INFORMAZIONI DOCKER ====================
VERSIONE DOCKER: Docker version 27.2.1, build 9e34c9b

PROCESSI DOCKER (docker ps -a)

CONTAINER ID   IMAGE                           COMMAND        CREATED         STATUS          PORTS                                                                      NAMES
37e2430e1014   local_discourse/app             "/sbin/boot"   4 mesi fa       Up 33 secondi   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   app
260f4c0ed417   local_discourse/mail-receiver   "/sbin/boot"   20 mesi fa      Up 4 mesi       0.0.0.0:25->25/tcp, :::25->25/tcp                                          mail-receiver


Il contenitore Discourse app è in esecuzione


==================== PLUGIN ====================
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-reactions.git
          - git clone https://github.com/discourse/discourse-chat-integration.git
          - git clone https://github.com/discourse/discourse-code-review.git
          - git clone https://github.com/discourse/discourse-topic-voting.git
          - git clone https://github.com/discourse/discourse-automation.git
          - git clone https://github.com/discourse/discourse-bbcode-color.git
          - git clone https://github.com/discourse/discourse-data-explorer.git
          - git clone https://github.com/discourse/discourse-docs.git
          - git clone https://github.com/discourse/discourse-ai.git
          - git clone https://github.com/discourse/discourse-jira.git

Nessun plugin non ufficiale rilevato.

Vedi https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb per l'elenco ufficiale.

========================================
Versione di Discourse su community.ankihub.net: Discourse 3.4.0.beta2 
Versione di Discourse su localhost: Discourse 3.4.0.beta2 


==================== INFORMAZIONI SULLA MEMORIA ====================
OS: Linux
RAM (MB): 4127

              total        used        free      shared  buff/cache   available
Mem:           3936        1567         158         274        2209        1802
Swap:          2047          67        1980

==================== CONTROLLO SPAZIO SU DISCO ====================
---------- Spazio su disco OS ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        78G   50G   28G  65% /

---------- Spazio su disco del contenitore ----------
Filesystem      Size  Used Avail Use% Mounted on
overlay          78G   50G   28G  65% /
/dev/vda1        78G   50G   28G  65% /shared
/dev/vda1        78G   50G   28G  65% /var/log

==================== INFORMAZIONI SUL DISCO ====================
Disk /dev/loop0: 55.68 MiB, 58363904 bytes, 113992 settori
Unità: settori da 1 * 512 = 512 byte
Dimensione settore (logica/fisica): 512 byte / 512 byte
Dimensione I/O (minima/ottimale): 512 byte / 512 byte


Disk /dev/loop1: 91.85 MiB, 96292864 bytes, 188072 settori
Unità: settori da 1 * 512 = 512 byte
Dimensione settore (logica/fisica): 512 byte / 512 byte
Dimensione I/O (minima/ottimale): 512 byte / 512 byte


Disk /dev/loop2: 63.71 MiB, 66789376 bytes, 130448 settori
Unità: settori da 1 * 512 = 512 byte
Dimensione settore (logica/fisica): 512 byte / 512 byte
Dimensione I/O (minima/ottimale): 512 byte / 512 byte


Disk /dev/loop3: 63.10 MiB, 67080192 bytes, 131016 settori
Unità: settori da 1 * 512 = 512 byte
Dimensione settore (logica/fisica): 512 byte / 512 byte
Dimensione I/O (minima/ottimale): 512 byte / 512 byte


Disk /dev/loop4: 44.45 MiB, 46596096 bytes, 91008 settori
Unità: settori da 1 * 512 = 512 byte
Dimensione settore (logica/fisica): 512 byte / 512 byte
Dimensione I/O (minima/ottimale): 512 byte / 512 byte


Disk /dev/loop5: 91.9 MiB, 96346112 bytes, 188176 settori
Unità: settori da 1 * 512 = 512 byte
Dimensione settore (logica/fisica): 512 byte / 512 byte
Dimensione I/O (minima/ottimale): 512 byte / 512 byte


Disk /dev/loop7: 44.3 MiB, 46448640 bytes, 90720 settori
Unità: settori da 1 * 512 = 512 byte
Dimensione settore (logica/fisica): 512 byte / 512 byte
Dimensione I/O (minima/ottimale): 512 byte / 512 byte


Disk /dev/vda: 80 GiB, 85899345920 bytes, 167772160 settori
Unità: settori da 1 * 512 = 512 byte
Dimensione settore (logica/fisica): 512 byte / 512 byte
Dimensione I/O (minima/ottimale): 512 byte / 512 byte
Tipo etichetta disco: gpt
Identificatore disco: 2ED04D82-BA1D-4A75-86B9-9553B7EA5228

Device      Start       End   Sectors  Size Type
/dev/vda1  227328 167772126 167544799 79.9G Linux filesystem
/dev/vda14   2048     10239      8192    4M BIOS boot
/dev/vda15  10240    227327    217088  106M Microsoft basic data

Le voci della tabella delle partizioni non sono in ordine sul disco.


Disk /dev/loop8: 55.37 MiB, 58052608 bytes, 113384 settori
Unità: settori da 1 * 512 = 512 byte
Dimensione settore (logica/fisica): 512 byte / 512 byte
Dimensione I/O (minima/ottimale): 512 byte / 512 byte

==================== FINE INFORMAZIONI SUL DISCO ====================

==================== TEST MAIL ====================
Per un test robusto, ottieni un indirizzo da http://www.mail-tester.com/
Test mail saltato.

==================== FINE! ====================

Spero che qualcuno possa indicarmi la strada giusta. Grazie!

1 Mi Piace

Ho lo stesso problema tuo e sto cercando una soluzione.

1 Mi Piace

Come posso verificare le dimensioni del database della mia istanza?

2 Mi Piace

Grazie per le segnalazioni, stiamo esaminando il problema could not access file \"$libdir/vector\".

Su un’installazione standard, penso che tu possa eseguire questo comando:

du -sh /var/discourse/shared/standalone/postgres_data

ad esempio, per il mio sito di test, il risultato è:

# du -sh /var/discourse/shared/standalone/postgres_data
237M	/var/discourse/shared/standalone/postgres_data

(@mwaniki per favore correggimi se c’è un modo migliore!)

4 Mi Piace

Certo, questo restituirebbe la dimensione totale di tutti i file di dati PostgreSQL su disco (inclusi i file WAL).

Se sei interessato solo alla dimensione del database discourse, puoi usare la funzione pg_database_size o il meta-comando \\list+.

docker exec -u postgres app psql -c "SELECT pg_size_pretty( pg_database_size('discourse') ) AS db_size;"

# oppure

docker exec -u postgres app psql -c "\list+ discourse"
6 Mi Piace

Per curiosità, qual è il vantaggio di utilizzare uno dei tuoi moduli di analisi del vuoto rispetto al comando suggerito da postgres?

Solo che non è necessario generare queste statistiche per qualsiasi cosa al di fuori del database discourse? Se è così, analyze-in-stages sarebbe un vantaggio per istanze molto grandi se questo venisse utilizzato invece:
/var/discourse/launcher run app "/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages"

Ciao @aas e @NKERIFAC_CLAUD_NBAPNON! :wave:

Non sono riuscito a riprodurre l’errore durante l’esecuzione di launcher rebuild per un sito in esecuzione sulla precedente immagine di base. I miei test hanno portato a un aggiornamento riuscito, anche con il plugin discourse-ai installato.

Poiché l’errore si verifica durante il dump dello schema dal vecchio database, abbiamo appena rilasciato un aggiornamento che sospetto possa risolvere il problema che hai riscontrato.

Puoi provare a seguire gli stessi passaggi e farci sapere come va.

cd /var/discourse
git pull
./launcher rebuild app

Se ancora non risolve il problema, potresti condividere maggiori dettagli sul tuo ambiente? Questi sarebbero particolarmente utili:

  • la tua attuale versione dell’immagine di base

    docker image inspect --format '{{ .Config.Image }}' local_discourse/app
    
  • plugin Discourse installati

    cat containers/app.yml | \
    docker run --rm -i -a stdout -a stdin local_discourse/app \
    ruby -e "require 'yaml'; puts YAML.load(STDIN.readlines.join)['hooks']"
    
  • estensioni PostgreSQL e le loro versioni

    docker exec -u postgres app psql discourse -c "SELECT
      name,
      default_version,
      installed_version
    FROM
      pg_catalog.pg_available_extensions
    WHERE
      installed_version IS NOT NULL;"
    
3 Mi Piace

Ho notato una riga preoccupante in postgres.template.yml:

La logica attuale fa sì che lo script termini immediatamente se il file /shared/postgres_run/.s.PGSQL.5432 esiste, indipendentemente dal fatto che PostgreSQL sia effettivamente in esecuzione. Ciò salta tutto il codice successivo in /root/install_postgres, incluso lo script di aggiornamento. Penso che il primo exit 0 debba essere rimosso.

1 Mi Piace

L’aggiornamento fallisce anche per me. L’errore che vedo sembra indicare un problema di localizzazione (il che è un po’ strano, dato che la localizzazione del sistema è sempre stata de_DE.UTF-8).

root@Ubuntu-2204-jammy-amd64-base /var/discourse # ./launcher rebuild app
x86_64 arch detected.
...
Launcher is up-to-date
Stopping old container
+ /usr/bin/docker stop -t 600 app
app
2.0.20250129-0720: Pulling from discourse/base
Digest: sha256:01b8516e5504c0e9bc3707773015ff4407be03a89154194ff3b5b8699291bc26
Status: Image is up to date for discourse/base:2.0.20250129-0720
docker.io/discourse/base:2.0.20250129-0720
/usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups.rb
/usr/local/bin/pups --stdin
/bin/bash: warning: setlocale: LC_ALL: cannot change locale (de_DE.UTF-8)
I, [2025-01-29T21:35:58.711630 #1]  INFO -- : Reading from stdin
I, [2025-01-29T21:35:58.721321 #1]  INFO -- : File > /etc/service/postgres/run  chmod: +x  chown:
I, [2025-01-29T21:35:58.726551 #1]  INFO -- : File > /etc/service/postgres/log/run  chmod: +x  chown:
I, [2025-01-29T21:35:58.732322 #1]  INFO -- : File > /etc/runit/3.d/99-postgres  chmod: +x  chown:
I, [2025-01-29T21:35:58.737436 #1]  INFO -- : File > /root/install_postgres  chmod: +x  chown:
I, [2025-01-29T21:35:58.742651 #1]  INFO -- : File > /root/upgrade_postgres  chmod: +x  chown:
I, [2025-01-29T21:35:58.742825 #1]  INFO -- : Replacing data_directory = '/var/lib/postgresql/15/main' with data_directory = '/shared/postgres_data' in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.743394 #1]  INFO -- : Replacing (?-mix:#?listen_addresses *=.*) with listen_addresses = '*' in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.743708 #1]  INFO -- : Replacing (?-mix:#?synchronous_commit *=.*) with synchronous_commit = $db_synchronous_commit in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.744003 #1]  INFO -- : Replacing (?-mix:#?shared_buffers *=.*) with shared_buffers = $db_shared_buffers in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.744441 #1]  INFO -- : Replacing (?-mix:#?work_mem *=.*) with work_mem = $db_work_mem in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.744734 #1]  INFO -- : Replacing (?-mix:#?default_text_search_config *=.*) with default_text_search_config = '$db_default_text_search_config' in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.745027 #1]  INFO -- : Replacing (?-mix:#?checkpoint_segments *=.*) with checkpoint_segments = $db_checkpoint_segments in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.747582 #1]  INFO -- : Replacing (?-mix:#?logging_collector *=.*) with logging_collector = $db_logging_collector in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.748035 #1]  INFO -- : Replacing (?-mix:#?log_min_duration_statement *=.*) with log_min_duration_statement = $db_log_min_duration_statement in /etc/postgresql/15/main/postgresql.conf
I, [2025-01-29T21:35:58.748263 #1]  INFO -- : Replacing (?-mix:^#local +replication +postgres +peer$) with local replication postgres  peer in /etc/postgresql/15/main/pg_hba.conf
I, [2025-01-29T21:35:58.748463 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*127.*$) with host all all 0.0.0.0/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-01-29T21:35:58.748657 #1]  INFO -- : Replacing (?-mix:^host.*all.*all.*::1\/128.*$) with host all all ::/0 md5 in /etc/postgresql/15/main/pg_hba.conf
I, [2025-01-29T21:35:58.748844 #1]  INFO -- : > if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi

/bin/bash: warning: setlocale: LC_ALL: cannot change locale (de_DE.UTF-8)
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
debconf: delaying package configuration, since apt-utils is not installed
I, [2025-01-29T21:37:25.430685 #1]  INFO -- : Generating locales (this might take a while)...
  de_DE.UTF-8... done
  en_US.UTF-8... done
Generation complete.
Upgrading PostgreSQL from version 13 to 15
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "de_DE.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "german".

Data page checksums are disabled.

fixing permissions on existing directory /shared/postgres_data_new ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok


Success. You can now start the database server using:

    /usr/lib/postgresql/15/bin/pg_ctl -D /shared/postgres_data_new -l logfile start

Get:1 http://deb.debian.org/debian bookworm-backports InRelease [59,0 kB]
Get:2 http://deb.debian.org/debian bookworm InRelease [151 kB]
Get:3 http://deb.debian.org/debian bookworm-updates InRelease [55,4 kB]
Get:4 https://dl.yarnpkg.com/debian stable InRelease [17,1 kB]
Get:5 http://deb.debian.org/debian-security bookworm-security InRelease [48,0 kB]
Get:6 https://deb.nodesource.com/node_22.x nodistro InRelease [12,1 kB]
Get:7 http://deb.debian.org/debian bookworm-backports/main amd64 Packages [280 kB]
Get:8 http://deb.debian.org/debian bookworm/main amd64 Packages [8.792 kB]
Get:9 http://deb.debian.org/debian bookworm-updates/main amd64 Packages [13,5 kB]
Get:10 https://dl.yarnpkg.com/debian stable/main amd64 Packages [10,9 kB]
Get:11 https://dl.yarnpkg.com/debian stable/main all Packages [10,9 kB]
Get:12 http://deb.debian.org/debian-security bookworm-security/main amd64 Packages [243 kB]
Get:13 https://deb.nodesource.com/node_22.x nodistro/main amd64 Packages [5.274 B]
Get:14 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg InRelease [129 kB]
Get:15 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 Packages [360 kB]
Fetched 10,2 MB in 2s (6.159 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  postgresql-client-13
Suggested packages:
  postgresql-doc-13
The following NEW packages will be installed:
  postgresql-13 postgresql-13-pgvector postgresql-client-13
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 17,3 MB of archives.
After this operation, 56,7 MB of additional disk space will be used.
Get:1 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-client-13 amd64 13.18-1.pgdg120+1 [1.523 kB]
Get:2 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13 amd64 13.18-1.pgdg120+1 [15,4 MB]
Get:3 https://apt.postgresql.org/pub/repos/apt bookworm-pgdg/main amd64 postgresql-13-pgvector amd64 0.8.0-1.pgdg120+1 [297 kB]
Fetched 17,3 MB in 1s (32,1 MB/s)
Selecting previously unselected package postgresql-client-13.
(Reading database ... 33363 files and directories currently installed.)
Preparing to unpack .../postgresql-client-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-client-13 (13.18-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13.
Preparing to unpack .../postgresql-13_13.18-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13 (13.18-1.pgdg120+1) ...
Selecting previously unselected package postgresql-13-pgvector.
Preparing to unpack .../postgresql-13-pgvector_0.8.0-1.pgdg120+1_amd64.deb ...
Unpacking postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Setting up postgresql-client-13 (13.18-1.pgdg120+1) ...
Setting up postgresql-13 (13.18-1.pgdg120+1) ...
Creating new PostgreSQL cluster 13/main ...
/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main --auth-local peer --auth-host md5
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale "C.UTF-8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/13/main ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Etc/UTC
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctlcluster 13 main start

invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-13-pgvector (0.8.0-1.pgdg120+1) ...
Processing triggers for postgresql-common (267.pgdg120+1) ...
Building PostgreSQL dictionaries from installed myspell/hunspell packages...
Removing obsolete dictionary files:
Stopping PostgreSQL 13 database server: main.
Stopping PostgreSQL 15 database server: main.
Performing Consistency Checks
-----------------------------
Checking cluster versions                                   ok
Checking database user is the install user                  ok
Checking database connection settings                       ok
Checking for prepared transactions                          ok
Checking for system-defined composite types in user tables  ok
Checking for reg* data types in user tables                 ok
Checking for contrib/isn with bigint-passing mismatch       ok
Checking for user-defined encoding conversions              ok
Checking for user-defined postfix operators                 ok
Checking for incompatible polymorphic functions             ok
Creating dump of global objects                             ok
Creating dump of database schemas                           ok

lc_collate values for database "template1" do not match:  old "en_US.UTF-8", new "de_DE.UTF-8"
Failure, exiting
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Please visit https://meta.discourse.org/t/postgresql-15-update/349515 for support.

You can run ./launcher start app to restart your app in the meanwhile
-------------------------------------------------------------------------------------



FAILED
--------------------
Pups::ExecError: if [ -f /root/install_postgres ]; then
  /root/install_postgres && rm -f /root/install_postgres
elif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then
  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1
fi
 failed with return #<Process::Status: pid 18 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"tag"=>"db", "cmd"=>"if [ -f /root/install_postgres ]; then\n  /root/install_postgres && rm -f /root/install_postgres\nelif [ -e /shared/postgres_run/.s.PGSQL.5432 ]; then\n  socat /dev/null UNIX-CONNECT:/shared/postgres_run/.s.PGSQL.5432 || exit 0 && echo postgres already running stop container ; exit 1\nfi\n"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
80933ad1f9a6809c85383c9d512c34340988ab7791b3ff57a6a563fd42fc413f
1 Mi Piace

Ciao @mwaniki l’aggiornamento che hai inviato ha funzionato bene per me. Grazie mille.

2 Mi Piace

Dato che riscontri il fallimento durante il dump dei vecchi schemi, puoi confermare le impostazioni di localizzazione correnti?

docker exec -it -u postgres app bash
env
psql -c 'SELECT
  datname,
  datcollate,
  datctype
FROM
  pg_database;'

In effetti. Grazie per averlo fatto notare! Ho aggiornato la procedura nell’OP. :+1:

Sono lieto di sentirlo! Grazie per la conferma.

4 Mi Piace

4 messaggi sono stati divisi in un nuovo argomento: Problemi con la configurazione degli embedding di Discourse AI

Oefhh, sarebbe stato fantastico se lo script di aggiornamento fosse stato aggiornato con un link a questo e una richiesta y/N. Ora ho aggiornato e non sono sicuro se devo recuperare il mio sito a causa di questa modifica.

Modifica: sembra che sia terminato con successo :tada:

Sono riuscito ad aggiornare un forum (ce ne sono quattro su questo server), sono passato ad aggiornare il successivo ma sto ricevendo:

Caused by:
PG::ConnectionBad: connection to server on socket "/var/run/postgresql/.s.PGSQL.5432" failed: Connection refused (PG::ConnectionBad)

Ho dovuto eseguire ./launcher start app per farlo ripartire.

Mi sembra di ricordare che ci fosse un problema con PostgreSQL 12 update e penso di aver dovuto eseguire ./launcher stop app per le altre app prima di provare a fare l’aggiornamento, tuttavia questa volta non sta funzionando. (I post in quel thread sono stati rimossi automaticamente, un moderatore può gentilmente controllare i post per vedere se è quello che ho fatto?)

Qualche altro suggerimento?

1 Mi Piace

Ho richiesto al team di discourse-ai di intervenire.

Sì, è esattamente quello che avevi scritto. Dovrò testare utilizzando una configurazione simile e ti farò sapere.

3 Mi Piace

Grazie Mwaniki, sono riuscito a risolvere: ho solo dovuto accedere all’app e sudo service postgresql stop prima di eseguire l’upgrade rebuilds.

Grazie per tutto il tuo aiuto :heart:

1 Mi Piace

L’ambiente sembra avere le impostazioni locali previste (output di env di seguito, impostazioni email oscurate):

LEFTHOOK=0
HOSTNAME=Ubuntu-2204-jammy-amd64-base-app
LANGUAGE=de_DE.UTF-8
UNICORN_WORKERS=8
DISCOURSE_HOSTNAME=[..]
RUBY_GC_HEAP_INIT_SLOTS=400000
DISCOURSE_SMTP_USER_NAME=[...]
DOCKER_HOST_IP=172.17.0.1
DISCOURSE_SMTP_ADDRESS=[...]
RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5
RUBY_VERSION=3.3.6
PWD=/
DISCOURSE_DB_SOCKET=/var/run/postgresql
DISCOURSE_DEVELOPER_EMAILS=[...]
HOME=/var/lib/postgresql
LANG=de_DE.UTF-8
DISCOURSE_SMTP_PORT=587
RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000
DEBIAN_RELEASE=bookworm
DISCOURSE_SMTP_PASSWORD=[...]
DISCOURSE_NOTIFICATION_EMAIL=[...]
PG_MAJOR=13
DISCOURSE_DB_HOST=
TERM=xterm
RUBY_ALLOCATOR=/usr/lib/libjemalloc.so
SHLVL=1
DISCOURSE_DB_PORT=
DISCOURSE_SMTP_DOMAIN=[...]
UNICORN_SIDEKIQS=1
LC_ALL=de_DE.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
RAILS_ENV=production
_=/usr/bin/env

Tuttavia, l’output dell’istruzione Postgres indica una locale US:

  datname  | datcollate  |  datctype
-----------+-------------+-------------
 postgres  | en_US.UTF-8 | en_US.UTF-8
 template1 | en_US.UTF-8 | en_US.UTF-8
 template0 | en_US.UTF-8 | en_US.UTF-8
 discourse | en_US.UTF-8 | en_US.UTF-8
(4 rows)
1 Mi Piace

Quando è stata creata quell’istanza di Discourse?

Finora i nostri tentativi di riprodurre il problema sono possibili solo quando creiamo un database in una locale e poi tentiamo di migrare utilizzando una locale diversa, e vorremmo capire quando è stata creata l’istanza per verificare se ci potrebbero essere stati bug relativi alla locale in quel periodo.

2 Mi Piace

Per quanto riesco a risalire, l’installazione iniziale è avvenuta il 7 febbraio 2024 (penso che il server sia stato messo in funzione un paio di giorni prima, ma il sistema operativo è Ubuntu 22.04, che, proprio come Discourse, è stato continuamente aggiornato).

Modifica:
Non sono sicuro se questo aiuti, ma penso che gli avvisi sui problemi di localizzazione siano una cosa relativamente recente. Ricordo di averli visti l’ultima volta che ho ricostruito il container, ma non credo che fossero presenti fin dall’inizio.

1 Mi Piace