Atualização do PostgreSQL 15

:warning: AVISO! Se o seu banco de dados for muito grande, você precisará de muito espaço em disco extra (2x o tamanho do banco de dados) e deve ter muito cuidado com esta atualização!

Acabamos de implementar alterações para atualizar nossa imagem Docker para o PostgreSQL 15. Quaisquer administradores de site que reconstruam o Discourse a partir da linha de comando serão atualizados para o PostgreSQL 15 a partir do PostgreSQL 13 anterior. Observe que, se você adiou a atualização quando a atualização do PostgreSQL 13 aconteceu em 2020, você pode pular essa atualização e ir direto para o PostgreSQL 15.

Se você adiou a atualização anteriormente, altere o template do PostgreSQL em app.yml de templates/postgres.12.template.yml para templates/postgres.template.yml.

Como em qualquer atualização, é altamente recomendado fazer um backup antes de fazer qualquer coisa.

Atualizando

Guia de Instalação Oficial (contêiner único)

Na sua próxima reconstrução, você verá esta mensagem no final:

-------------------------------------------------------------------------------------
ATUALIZAÇÃO DO POSTGRES CONCLUÍDA

Banco de dados antigo 13 está armazenado em /shared/postgres_data_old

Para concluir a atualização, reconstrua novamente usando:

./launcher rebuild app
-------------------------------------------------------------------------------------

Isso significa que tudo correu bem na atualização! Você só precisa emitir uma nova reconstrução para que seu site volte a funcionar.

Instalação com Contêiner de Dados

Se você estiver executando uma configuração com um contêiner de dados dedicado baseado no exemplo fornecido em nosso repositório discourse_docker, você desejará ter certeza de que está desligando o PostgreSQL de forma segura e limpa.

Atualmente, temos trabalhos em segundo plano executando consultas que abrangem vários minutos, portanto, desligar o contêiner web ajudará o contêiner de dados a ser desligado com segurança.

./launcher stop web_only
./launcher stop data
./launcher rebuild data
./launcher rebuild data
./launcher rebuild web_only

Antes de emitir a primeira reconstrução para o contêiner de dados, você pode acompanhar o log do PostgreSQL para ver se ele foi desligado corretamente.

Executar um tail -f shared/standalone/log/var-log/postgres/current deve fornecer o seguinte log se foi limpo:

2025-01-24 09:19:06.437 UTC [37] LOG:  received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG:  background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG:  shutting down
2025-01-24 09:19:06.468 UTC [37] LOG:  database system is shut down

Realizando uma atualização manual / ambientes com espaço restrito

:warning::warning::warning:
VOCÊ DEVE FAZER BACKUP DO POSTGRES_DATA ANTES DE TENTAR ISSO
:warning::warning::warning:

Se você estiver em um ambiente com espaço restrito e sem nenhuma maneira de obter mais espaço, pode tentar o seguinte:

./launcher stop app #(ou ambos web_only e data, se for o seu 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 #(ou local_discourse/data)
./launcher rebuild app #(ou primeiro data e depois web_only, se for o seu caso)

Nos meus testes, este procedimento requer menos de 1x o tamanho atual do seu banco de dados em espaço livre.

Se você estiver usando uma localidade não padrão, pode tentar substituir o primeiro comando docker por este:

# mude 'en_US.UTF-8' para sua localidade
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'

Adiar a atualização

Se você precisar adiar a atualização durante sua próxima reconstrução, pode trocar o template do PostgreSQL em seu arquivo app.yml alterando "templates/postgres.template.yml" para "templates/postgres.13.template.yml".

Isso não é recomendado, pois alguns administradores de site esquecerão de reverter a alteração depois.

Tarefas opcionais pós-atualização

Otimizando estatísticas do PostgreSQL

Após a atualização, o novo PostgreSQL não terá estatísticas de tabela à mão. Você pode gerá-las usando:

docker exec -u postgres app \
	/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages

Limpando dados antigos

Para uma instalação padrão, você pode excluir os dados antigos no formato PG13 com o seguinte comando:

cd /var/discourse
./launcher cleanup

Se você tiver um contêiner de dados separado, precisará remover a cópia de backup assim:

rm -fr /var/discourse/shared/data/postgres_data_old/

FAQ

O cluster de origem não foi desligado de forma limpa

Se você receber uma falha de atualização com a mensagem acima, pode tentar uma abordagem mais simples para colocá-lo em um estado melhor.

Reinicie o contêiner antigo com ./launcher start app. Espere alguns minutos até que ele esteja de volta.

Agora desligue-o novamente com ./launcher stop app. Depois disso, acompanhe os logs para ver se foi limpo:

tail -f shared/standalone/log/var-log/postgres/current
2025-01-24 09:19:06.437 UTC [37] LOG:  received smart shutdown request
2025-01-24 09:19:06.444 UTC [37] LOG:  background worker "logical replication launcher" (PID 54) exited with exit code 1
2025-01-24 09:19:06.446 UTC [49] LOG:  shutting down
2025-01-24 09:19:06.468 UTC [37] LOG:  database system is shut down

Se os logs não indicarem que o banco de dados foi desligado, você pode iniciar o contêiner antigo novamente, entrar com ./launcher enter app, executar estes comandos e acompanhar os logs novamente quando terminar.

export SVWAIT=300
sv stop nginx
sv stop unicorn
sv stop postgres
exit

Se os logs se parecerem com o acima, você pode agora tentar atualizar novamente usando ./launcher rebuild app.

Os valores de lc_collate para o banco de dados “postgres” não correspondem

Este erro acontece se você estiver usando localidades não padrão para seu banco de dados. Foi relatado que você precisa de 3 variáveis para que isso seja bem-sucedido. Certifique-se de que a seção env: do seu arquivo app.yml tenha as 3 linhas:

  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8

Alterando en_US.UTF-8 para sua localidade.

Cada reconstrução faz a atualização novamente, ou seja, loop de atualização

Quando isso acontece, seus logs de atualização conterão

mv: cannot move '/shared/postgres_data' to '/shared/postgres_data_old/postgres_data': Directory not empty
mv: cannot move '/shared/postgres_data_new' to '/shared/postgres_data/postgres_data_new': Directory not empty

Isso significa que ainda há arquivos da última atualização pairando por aí. Mova-os para outro lugar antes de continuar.

Scripts de sugestão de conclusão de atualização - preciso fazer alguma coisa?

Assim que a atualização for concluída, você verá a saída da mensagem pg_upgrade dizendo:

Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.

Once you start the new server, consider running:
    /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages

Running this script will delete the old cluster's data files:
    ./delete_old_cluster.sh

Você pode ignorar esta mensagem com segurança.

Eu pulei a atualização do PostgreSQL 13, o que fazer agora?

Você pode seguir as instruções padrão no topo deste guia e elas atualizarão de sua versão para a 15 sem problemas.

Se você estiver seguindo as instruções para espaço restrito, adapte os números de versão de acordo.

A reconstrução de índices pode proporcionar uma economia significativa de espaço em disco. Siga as etapas de nossa atualização do PostgreSQL 13 após a atualização.

28 curtidas
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, vejo a seguinte mensagem:

Você está executando uma versão antiga da imagem do Discourse
Atualizações via interface web estão desabilitadas até que você execute a imagem mais recente. Para fazer isso, faça login no seu servidor usando SSH e execute:

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

Após seguir essas instruções, recebo UPGRADE OF POSTGRES FAILED:

invoke-rc.d: não foi possível determinar o nível de execução atual
invoke-rc.d: policy-rc.d negou a execução de start.
Processando gatilhos para postgresql-common (267.pgdg120+1) ...
Construindo dicionários PostgreSQL a partir de pacotes myspell/hunspell instalados...
Removendo arquivos de dicionário obsoletos:
Parando servidor de banco de dados PostgreSQL 13: main.
Parando servidor de banco de dados PostgreSQL 15: main.
Executando verificações de consistência
-----------------------------
Verificando versões do cluster                                   ok
Verificando se o usuário do banco de dados é o usuário de instalação                  ok
Verificando configurações de conexão ao banco de dados                       ok
Verificando transações preparadas                          ok
Verificando tipos compostos definidos pelo sistema em tabelas de usuário  ok
Verificando tipos de dados reg* em tabelas de usuário                 ok
Verificando contrib/isn com incompatibilidade de passagem de bigint       ok
Verificando conversões de codificação definidas pelo usuário              ok
Verificando operadores de sufixo definidos pelo usuário                 ok
Verificando funções polimórficas incompatíveis             ok
Criando dump de objetos globais                             ok
Criando dump de esquemas de banco de dados
*falha*

Consulte as últimas linhas de "/shared/postgres_data_new/pg_upgrade_output.d/20250129T103738.877/log/pg_upgrade_dump_16384.log" para
a causa provável da falha.
Falha, saindo
-------------------------------------------------------------------------------------
UPGRADE OF POSTGRES FAILED

Por favor, visite https://meta.discourse.org/t/postgresql-15-update/349515 para obter suporte.

Você pode executar ./launcher start app para reiniciar seu aplicativo no meio tempo
-------------------------------------------------------------------------------------



FALHA
--------------------
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 já em execução, pare o container ; exit 1
fi
 falhou com retorno #<Process::Status: pid 18 exit 1>
Localização da falha: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falhou com os parâmetros {"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 já em execução, pare o container ; exit 1\nfi\n"}
bootstrap falhou com código de saída 1

Nada aqui ou neste tópico um pouco relacionado aborda meu problema, pelo que pude ver.

Aqui estão os logs de /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: erro: consulta falhou: ERRO: não foi possível acessar o arquivo "$libdir/vector": Arquivo ou diretório não encontrado
pg_dump: detalhe: A consulta foi: 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

Aqui está a saída de ./discourse-doctor:

Saída de ./discourse-doctor
DISCOURSE DOCTOR Qua 29 Jan 2025 10:39:42 AM UTC
SO: 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


Encontrado containers/app.yml

==================== CONFIGURAÇÕES 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 

==================== INFORMAÇÕES DO DOCKER ====================
VERSÃO DO DOCKER: Docker version 27.2.1, build 9e34c9b

PROCESSOS DO DOCKER (docker ps -a)

CONTAINER ID   IMAGE                           COMMAND        CREATED         STATUS          PORTS                                                                      NAMES
37e2430e1014   local_discourse/app             "/sbin/boot"   4 meses atrás    Up 33 segundos   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 meses atrás   Up 4 meses     0.0.0.0:25->25/tcp, :::25->25/tcp                                          mail-receiver


O container Discourse app está em execução


==================== PLUGINS ====================
          - 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

Nenhum plugin não oficial detectado.

Veja https://github.com/discourse/discourse/blob/main/lib/plugin/metadata.rb para a lista oficial.

========================================
Versão do Discourse em community.ankihub.net: Discourse 3.4.0.beta2 
Versão do Discourse em localhost: Discourse 3.4.0.beta2 


==================== INFORMAÇÕES DE MEMÓRIA ====================
SO: Linux
RAM (MB): 4127

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

==================== VERIFICAÇÃO DE ESPAÇO EM DISCO ====================
---------- Espaço em disco do SO ----------
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1        78G   50G   28G  65% /

---------- Espaço em disco do container ----------
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

==================== INFORMAÇÕES DO DISCO ====================
Disco /dev/loop0: 55.68 MiB, 58363904 bytes, 113992 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de E/S (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/loop1: 91.85 MiB, 96292864 bytes, 188072 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de E/S (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/loop2: 63.71 MiB, 66789376 bytes, 130448 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de E/S (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/loop3: 63.10 MiB, 67080192 bytes, 131016 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de E/S (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/loop4: 44.45 MiB, 46596096 bytes, 91008 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de E/S (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/loop5: 91.9 MiB, 96346112 bytes, 188176 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de E/S (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/loop7: 44.3 MiB, 46448640 bytes, 90720 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de E/S (mínimo/ótimo): 512 bytes / 512 bytes


Disco /dev/vda: 80 GiB, 85899345920 bytes, 167772160 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de E/S (mínimo/ótimo): 512 bytes / 512 bytes
Tipo de rótulo de disco: gpt
Identificador do 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

As entradas da tabela de partição não estão na ordem do disco.


Disco /dev/loop8: 55.37 MiB, 58052608 bytes, 113384 setores
Unidades: setores de 1 * 512 = 512 bytes
Tamanho do setor (lógico/físico): 512 bytes / 512 bytes
Tamanho de E/S (mínimo/ótimo): 512 bytes / 512 bytes

==================== FIM DAS INFORMAÇÕES DO DISCO ====================

==================== TESTE DE E-MAIL ====================
Para um teste robusto, obtenha um endereço em http://www.mail-tester.com/
Teste de e-mail pulado.

==================== CONCLUÍDO! ====================

Esperando que alguém possa me apontar na direção certa. Obrigado!

1 curtida

Estou tendo o mesmo problema que você e também estou procurando uma solução.

1 curtida

Como posso verificar o tamanho do banco de dados da minha instância?

2 curtidas

Obrigado pelos relatórios - estamos investigando o problema could not access file \"$libdir/vector\".

Em uma instalação padrão, acho que você pode executar isso:

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

por exemplo, para o meu site de teste, o resultado é:

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

(@mwaniki, por favor, corrija-me se houver uma maneira melhor!)

4 curtidas

Claro, isso retornaria o tamanho total de todos os arquivos de dados do PostgreSQL em disco (incluindo arquivos WAL).

Se você estiver interessado apenas no tamanho do banco de dados discourse, você pode usar a função pg_database_size ou o meta-comando \\list+.

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

# ou

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

Por curiosidade, qual é a vantagem de usar um dos seus formulários de análise de vácuo em vez do comando sugerido pelo postgres?

Apenas que é desnecessário gerar essas estatísticas para qualquer coisa fora do banco de dados discourse? Se sim, analyze-in-stages seria uma vantagem para instâncias muito grandes se isso fosse usado em vez disso:
/var/discourse/launcher run app "/usr/lib/postgresql/15/bin/vacuumdb -d discourse --analyze-in-stages"

Olá @aas e @NKERIFAC_CLAUD_NBAPNON ! :wave:

Não consegui reproduzir o erro ao executar launcher rebuild para um site em execução na imagem base anterior. Meus testes resultaram em uma atualização bem-sucedida, mesmo com o plugin discourse-ai instalado.

Como o erro ocorre ao descarregar o esquema do banco de dados antigo, acabamos de lançar uma atualização que suspeito que possa corrigir o problema que você encontrou.

Você pode tentar seguir os mesmos passos e nos informar como foi.

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

Se isso ainda não resolver o problema, você poderia compartilhar mais detalhes sobre seu ambiente? Estes seriam particularmente úteis:

  • sua versão atual da imagem base

    docker image inspect --format '{{ .Config.Image }}' local_discourse/app
    
  • plugins do Discourse instalados

    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']\"
    
  • extensões PostgreSQL e suas versões

    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 curtidas

Notei uma linha preocupante em postgres.template.yml:

A lógica atual faz com que o script saia imediatamente se o arquivo /shared/postgres_run/.s.PGSQL.5432 existir, independentemente de o PostgreSQL estar realmente em execução. Isso pula todo o código subsequente em /root/install_postgres, incluindo o script de atualização. Acho que o primeiro exit 0 deve ser removido.

1 curtida

A atualização também falhou para mim. O erro que vejo parece indicar um problema de localidade (o que é um pouco estranho, já que a localidade do sistema sempre foi 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 curtida

Olá @mwaniki, a atualização que você enviou funcionou bem para mim. Muito obrigado.

2 curtidas

Como você está recebendo a falha ao descarregar os esquemas antigos, você pode confirmar as configurações atuais de locale?

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

De fato. Obrigado por apontar isso! Atualizei o procedimento no OP. :+1:

Fico feliz em saber! Obrigado por confirmar.

4 curtidas

4 posts foram divididos em um novo tópico: Problemas com a configuração de embeddings de IA do Discourse

Oefhh, teria sido ótimo se o script de atualização tivesse sido atualizado com um link para isso e um prompt s/N. Agora atualizei e não tenho certeza se preciso recuperar meu site devido a essa mudança.

Editar: parece que terminou com sucesso :tada:

Consegui atualizar um fórum (há quatro neste servidor) e, ao tentar atualizar o próximo, recebo:

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

Tive que executar ./launcher start app para colocá-lo de volta em funcionamento.

Parece que me lembro de ter havido um problema com o PostgreSQL 12 update e acho que tive que executar ./launcher stop app para os outros aplicativos antes de tentar fazer a atualização, no entanto, isso não está funcionando desta vez. (As postagens nesse tópico foram removidas automaticamente, um moderador pode verificar as postagens para ver se foi isso que fiz?)

Alguma outra ideia?

1 curtida

Solicitei à equipe do discourse-ai que se manifestasse.

Sim, foi exatamente o que você postou. Terei que testar usando uma configuração semelhante e voltarei para você.

3 curtidas

Obrigado Mwaniki, consegui resolver - eu só precisei entrar no aplicativo e sudo service postgresql stop antes de fazer o upgrade rebuilds.

Obrigado por toda a ajuda :heart:

1 curtida

O ambiente parece ter a localidade esperada (saída de env abaixo, configurações de e-mail ocultadas):

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

No entanto, a saída da declaração do Postgres indica uma localidade dos EUA:

  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 curtida

Quando você criou essa instância do Discourse?

Até agora, nossas tentativas de reproduzir o problema só foram possíveis quando criamos um banco de dados em um local e, em seguida, tentamos migrar usando um local diferente, e gostaríamos de entender quando a instância foi criada para verificar se pode haver algum bug de local antigo naquela época.

2 curtidas

Pelo que consigo rastrear, a instalação inicial ocorreu em 7 de fevereiro de 2024 (acho que o servidor foi comissionado alguns dias antes, mas o sistema operacional é o Ubuntu 22.04, que, assim como o Discourse, foi continuamente atualizado).

Editar:
Não tenho certeza se isso ajuda, mas acho que os avisos sobre problemas de local são algo relativamente recente. Lembro-me de vê-los na última vez que reconstruí o contêiner, mas acho que eles não estavam lá desde o início.

1 curtida