Falha no backup com PostgreSQL 18

O banco de dados da nossa instância do Discourse não é um contêiner local; em vez disso, usamos um cluster de banco de dados central. Recentemente, o PostgreSQL central foi atualizado para a versão 18.3. Percebi que o backup do Discourse agora falha:

[2026-05-19 03:37:37] [INICIADO]
[2026-05-19 03:37:37] O 'system' iniciou o backup!
[2026-05-19 03:37:37] Marcando o backup como em execução...
[2026-05-19 03:37:37] Garantindo que '/var/www/discourse/tmp/backups/default/2026-05-19-033737' exista...
[2026-05-19 03:37:37] Garantindo que '/var/www/discourse/public/backups/default' exista...
[2026-05-19 03:37:37] Atualizando metadados...
[2026-05-19 03:37:37] Despejando o esquema público do banco de dados...
[2026-05-19 03:37:37] pg_dump: erro: abortando devido a incompatibilidade de versão do servidor
[2026-05-19 03:37:37] pg_dump: detalhe: versão do servidor: 18.3 (Ubuntu 18.3-1.pgdg24.04+1); versão do pg_dump: 15.15 (Debian 15.15-1.pgdg12+1)
[2026-05-19 03:37:37] EXCEÇÃO: pg_dump falhou
[2026-05-19 03:37:37] /var/www/discourse/lib/backup_restore/creator.rb:173:in 'BackupRestore::Creator#dump_public_schema'
/var/www/discourse/lib/backup_restore/creator.rb:36:in 'BackupRestore::Creator#run'
/var/www/discourse/lib/backup_restore.rb:13:in 'BackupRestore.backup!'
/var/www/discourse/app/jobs/regular/create_backup.rb:10:in 'Jobs::CreateBackup#execute'

Alguma ideia de como corrigir isso?

Isso parece ser uma incompatibilidade entre as versões do cliente/servidor do PostgreSQL.

O backup está sendo executado a partir do contêiner do Discourse, onde o pg_dump é da versão 15.15, mas o servidor PostgreSQL externo é da versão 18.3:

server version: 18.3; pg_dump version: 15.15

Eu teria cautela ao modificar o contêiner do Discourse, a menos que a equipe do Discourse recomende. Minha primeira reação seria manter o cluster de banco de dados externo alinhado com a versão do PostgreSQL que o Discourse atualmente espera/suporta.

OK, entendido. Neste caso, não tive escolha, pois precisávamos de 18 para outro projeto que usa o mesmo cluster de banco de dados. Hmm, parece que precisaríamos de um servidor de banco de dados separado com 15 exclusivamente para o Discourse.

Algum comentário do lado da CDCK?

Seria possível fazer a atualização do cliente no local?

Considerando que você parece ter comprovado a compatibilidade com o PG 18, já que o está usando como banco de dados de produção, isso parece ter baixo risco.

Fiz um teste rápido antes com um PostgreSQL 18 externo e uma instalação de Discourse de teste, e não apresentou problemas. Mas, para ser honesto, isso foi apenas algo “rápido e sujo”, não um teste “profundo”. De qualquer forma, está rodando há 2 semanas, então assumo que está tudo bem. O único problema até agora é o backup interno do Discourse. Por outro lado, o próprio servidor de banco de dados (rodando em LXC) também é backupado separadamente.

A política no passado era atualizar a cada duas versões. No entanto, já se passaram 1,5 anos desde o lançamento do PostgreSQL 17 e a imagem oficial do Docker ainda usa a versão 15, então não tenho certeza se isso ainda é válido.

Existem tópicos quase idênticos no passado que você pode consultar, por exemplo: Any chance to upgrade the postgres-client version?

Só uma ideia — você pode fazer o dump diretamente na linha de comando a partir do servidor pg?

Você pode adicionar código ao seu app.yml para atualizar o PostgreSQL para a versão correspondente. Já fiz isso antes, mas não consigo encontrar minhas anotações. A coisa mais fácil a fazer é entrar no contêiner, executar os comandos apt para instalar os clientes do PostgreSQL corretos e, em seguida, tentar o backup. Assim que isso funcionar, você adiciona esses comandos aos comandos exec no seu app.yml, para que funcione após a próxima reconstrução.

Se precisar que alguém o guie pelo processo, pode me enviar um e-mail ou postar no Marketplace.

Hmm, isso foi bem simples:

  1. ./launcher enter web_only
  2. sudo apt-get install postgresql

Isso atualiza o pacote postgres para a versão 18.
Em seguida, inicie o backup pela Interface de Administração, o que parece ter sido bem-sucedido.

[2026-05-21 16:26:50] 'admin' iniciou o backup!
[2026-05-21 16:26:50] Marcando backup como em execução...
[2026-05-21 16:26:50] Garantindo que '/var/www/discourse/tmp/backups/default/2026-05-21-162650' exista...
[2026-05-21 16:26:50] Garantindo que '/var/www/discourse/public/backups/default' exista...
[2026-05-21 16:26:50] Atualizando metadados...
[2026-05-21 16:26:50] Exportando o esquema público do banco de dados...
[2026-05-21 16:26:50] pg_dump: executando SELECT pg_catalog.set_config('search_path', '', false);
[2026-05-21 16:26:50] pg_dump: último OID interno é 16383
[2026-05-21 16:26:50] pg_dump: lendo extensões
[2026-05-21 16:26:50] pg_dump: identificando membros da extensão
[2026-05-21 16:26:50] pg_dump: lendo esquemas
[2026-05-21 16:26:50] pg_dump: lendo tabelas definidas pelo usuário
[2026-05-21 16:26:50] pg_dump: lendo funções definidas pelo usuário
[2026-05-21 16:26:50] pg_dump: lendo tipos definidos pelo usuário
[2026-05-21 16:26:50] pg_dump: lendo linguagens procedurais
[2026-05-21 16:26:50] pg_dump: lendo funções agregadas definidas pelo usuário
[2026-05-21 16:26:50] pg_dump: lendo operadores definidos pelo usuário
[2026-05-21 16:26:50] pg_dump: lendo métodos de acesso definidos pelo usuário
[2026-05-21 16:26:50] pg_dump: lendo classes de operador definidas pelo usuário
[2026-05-21 16:26:50] pg_dump: lendo famílias de operador definidas pelo usuário
[... .... ...]
[2026-05-21 16:26:57] Finalizando backup...
[2026-05-21 16:26:57] Criando arquivo compactado: netzwissen-forum-2026-05-21-162650-v20260520064255.tar.gz
[2026-05-21 16:26:57] Garantindo que o arquivo compactado ainda não exista...
[2026-05-21 16:26:57] Criando arquivo compactado vazio...
[2026-05-21 16:26:57] Arquivando o dump de dados...
[2026-05-21 16:26:57] Arquivando uploads...
[2026-05-21 16:26:58] Removendo diretório temporário '/var/www/discourse/tmp/backups/default/2026-05-21-162650'...
[2026-05-21 16:26:58] Comprimindo arquivo com gzip, isso pode levar algum tempo...

Ótimo! Eu provavelmente tentaria instalar especificamente os componentes do cliente do pg18 para que ele não mude para a versão 19 em algum momento. Além disso, você vai querer adicionar esses comandos ao seu app.yml, a menos que prefira fazer isso manualmente a cada atualização.