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
VOCÊ DEVE FAZER BACKUP DO POSTGRES_DATA ANTES DE TENTAR ISSO
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.