Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save pogermano/e552015b98c99ddddbbae935a2fbf4b3 to your computer and use it in GitHub Desktop.

Select an option

Save pogermano/e552015b98c99ddddbbae935a2fbf4b3 to your computer and use it in GitHub Desktop.
Backup e Restauração do PostgreSQL no Docker

Atualizando PostgreSQL de 14 para 17 no Docker Swarm

1. Problema

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.

2. Solução

A solução envolve os seguintes passos:

  1. Fazer backup de todos os bancos de dados
  2. Criar um novo serviço PostgreSQL 17
  3. Restaurar o backup no PostgreSQL 17

3. Backup do PostgreSQL 14

3.1 Criar um backup completo

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.sql

Copie o backup para o host:

docker cp <container_postgres_14>:/backup_full.sql ./backup_full.sql

Verifique o tamanho do arquivo:

ls -lh backup_full.sql

Se o arquivo estiver vazio, algo deu errado.


4. Criando o PostgreSQL 17 no Docker Swarm

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_public

Se necessário, crie a rede antes de subir o serviço:

docker network create --driver overlay traefik_public

Implante o serviço:

docker stack deploy -c docker-compose.yml postgres

Verifique se o serviço está rodando:

docker service ls

Se o container não iniciar, verifique os logs:

docker logs <container_id>

5. Restaurando o Backup no PostgreSQL 17

Agora, copie o backup para o container do PostgreSQL 17:

docker cp backup_full.sql <container_postgres_17>:/backup_full.sql

Acesse o container:

docker exec -it <container_postgres_17> bash

Dentro do container, restaure o backup:

psql -U postgres -f /backup_full.sql

Saia 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.


6. Automatizando o Backup Diário

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: false

7. Conclusão

Agora, 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment