Ao tentar atualizar o PostgreSQL 14 para a versão 17 no Docker Swarm, ocorreram problemas devido à incompatibilidade do diretório de dados. Além disso, a rede traefik_public não permitia anexação manual ao criar o container diretamente com docker run.
A solução envolve os seguintes passos:
- Fazer backup de todos os bancos de dados
- Criar um novo serviço PostgreSQL 17
- Restaurar o backup no PostgreSQL 17
Execute o seguinte comando para criar um backup de todos os bancos de dados no PostgreSQL 14:
docker exec -it <container_postgres_14> pg_dumpall -U postgres > backup_full.sqlCopie o backup para o host:
docker cp <container_postgres_14>:/backup_full.sql ./backup_full.sqlVerifique o tamanho do arquivo:
ls -lh backup_full.sqlSe o arquivo estiver vazio, algo deu errado.
Crie um novo serviço para o PostgreSQL 17 usando o Portainer ou um arquivo docker-compose.yml. Se estiver usando Swarm, utilize o seguinte script:
version: "3.8"
services:
postgres:
image: pgvector/pgvector:pg17
environment:
- POSTGRES_PASSWORD=123
- TZ=America/Sao_Paulo
networks:
- traefik_public
ports:
- 5432:5432
volumes:
- postgres_data:/var/lib/postgresql/data
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
resources:
limits:
cpus: "0.5"
memory: 1024M
volumes:
postgres_data:
external: true
name: postgres_data
networks:
traefik_public:
external: true
name: traefik_publicSe necessário, crie a rede antes de subir o serviço:
docker network create --driver overlay traefik_publicImplante o serviço:
docker stack deploy -c docker-compose.yml postgresVerifique se o serviço está rodando:
docker service lsSe o container não iniciar, verifique os logs:
docker logs <container_id>Agora, copie o backup para o container do PostgreSQL 17:
docker cp backup_full.sql <container_postgres_17>:/backup_full.sqlAcesse o container:
docker exec -it <container_postgres_17> bashDentro do container, restaure o backup:
psql -U postgres -f /backup_full.sqlSaia do container e verifique se os bancos de dados foram restaurados:
docker exec -it <container_postgres_17> psql -U postgres -c "\l"Se tudo estiver correto, o PostgreSQL 17 estará rodando com os dados restaurados.
Para evitar perda de dados no futuro, adicione um serviço de backup automático ao docker-compose.yml:
postgres_backup:
image: postgres:17
networks:
- traefik_public
environment:
- PGPASSWORD=123
volumes:
- postgres_backup:/backup
command: >
sh -c "while true; do
pg_dump -h postgres -U postgres -d n8n > /backup/backup-$(date +%F_%H-%M-%S).sql;
sleep 86400;
done"
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.role == manager
volumes:
postgres_backup:
external: falseAgora, o PostgreSQL 17 está rodando corretamente no Docker Swarm, com os dados do PostgreSQL 14 restaurados e backup automatizado. Isso garante a integridade dos dados e facilita futuras atualizações.