Este guia cobre a configuração de volumes para o PostgreSQL no Docker Swarm, a criação de backups e a solução de erros comuns.
O problema da perda de dados no PostgreSQL após um restart provavelmente está relacionado à configuração do volume no Docker Swarm. Para garantir a persistência dos dados, defina corretamente o volume no 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_data:
external: true
name: postgres_data
postgres_backup:
external: false
Para fazer backup do PostgreSQL manualmente:
docker exec -it <ID_DO_CONTAINER_POSTGRES> pg_dumpall -U postgres > backup_full.sqlSe quiser copiar o backup para a máquina host:
docker cp <ID_DO_CONTAINER_POSTGRES>:/backup_full.sql ./backup_full.sqlPara verificar o tamanho do backup:
ls -lh backup_full.sqlSe o arquivo estiver vazio, tente rodar o backup diretamente dentro do container:
docker exec -it <ID_DO_CONTAINER_POSTGRES> bash
pg_dumpall -U postgres > /backup/backup_full.sql
exit
docker cp <ID_DO_CONTAINER_POSTGRES>:/backup/backup_full.sql ./backup_full.sqlPara restaurar um backup em um PostgreSQL novo:
docker exec -i <ID_DO_CONTAINER_POSTGRES> psql -U postgres < backup_full.sqlSe o volume antigo ainda contiver dados incompatíveis, remova o volume antes de reiniciar o serviço:
docker volume rm postgres_dataE recrie os serviços:
docker stack deploy -c docker-compose.yml meu_stackSe ao iniciar o container aparecer o erro:
FATAL: database files are incompatible with server
DETAIL: The data directory was initialized by PostgreSQL version 14, which is not compatible with this version 17.0.
Isso indica que os dados do PostgreSQL 14 ainda estão armazenados no volume postgres_data, mas o serviço foi atualizado para a versão 17. Para resolver:
- Fazer backup dos dados antigos
docker exec -it <ID_DO_CONTAINER_POSTGRES_14> pg_dumpall -U postgres > backup_full.sql- Remover o volume antigo
docker volume rm postgres_data- Recriar o serviço com o PostgreSQL 17
docker stack deploy -c docker-compose.yml meu_stack- Restaurar os dados
docker exec -i <ID_DO_CONTAINER_POSTGRES_17> psql -U postgres < backup_full.sqlEste guia detalha as melhores práticas para garantir que os dados do PostgreSQL sejam persistentes no Docker Swarm, evitando perdas após reinicializações e garantindo backups confiáveis. Se precisar de mais suporte, verifique os logs do container:
docker logs <ID_DO_CONTAINER_POSTGRES>