Last active
March 4, 2025 13:33
-
-
Save pogermano/e552015b98c99ddddbbae935a2fbf4b3 to your computer and use it in GitHub Desktop.
Revisions
-
pogermano revised this gist
Mar 4, 2025 . 1 changed file with 46 additions and 99 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,47 +1,41 @@ # Migração do PostgreSQL 14 para 17 no Docker Swarm ## Problema Ao atualizar o PostgreSQL do Docker Swarm da versão 14 para 17, ocorreu 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. ``` O problema ocorre porque o diretório de dados de uma versão anterior não pode ser usado diretamente em uma versão mais recente. ## Solução ### 1️⃣ Fazer backup do PostgreSQL 14 Antes de iniciar a migração, é fundamental realizar um backup completo dos bancos de dados. ```bash docker exec -it <CONTAINER_ID_POSTGRES14> pg_dumpall -U postgres > backup_full.sql docker cp <CONTAINER_ID_POSTGRES14>:/backup_full.sql ./backup_full.sql ``` Se o backup estiver vazio, verifique se o usuário `postgres` tem as permissões corretas. ### 2️⃣ Criar um novo volume para o PostgreSQL 17 Como o volume antigo contém dados da versão 14, devemos criar um novo volume para evitar conflitos. ```bash docker volume create postgres_data_17 ``` Verifique se o volume foi criado: ```bash docker volume ls ``` ### 3️⃣ Subir o PostgreSQL 17 Atualize seu `docker-compose.yml`: ```yaml version: "3.8" @@ -57,7 +51,7 @@ services: ports: - 5432:5432 volumes: - postgres_data_17:/var/lib/postgresql/data deploy: mode: replicated replicas: 1 @@ -70,105 +64,58 @@ services: memory: 1024M volumes: postgres_data_17: external: true name: postgres_data_17 networks: traefik_public: external: true name: traefik_public ``` Agora, suba o serviço com: ```bash docker stack deploy -c docker-compose.yml postgres_stack ``` Se estiver usando `docker run` diretamente: ```bash docker run -d \ --name postgres17 \ -e POSTGRES_USER=postgres \ -e POSTGRES_PASSWORD=123 \ -v postgres_data_17:/var/lib/postgresql/data \ --network=traefik_public \ postgres:17 ``` ### 4️⃣ Restaurar o backup no PostgreSQL 17 Com o novo container em execução, copie o backup para dentro dele: ```bash docker cp backup_full.sql <CONTAINER_ID_POSTGRES17>:/backup_full.sql ``` Acesse o container: ```bash docker exec -it <CONTAINER_ID_POSTGRES17> bash ``` Dentro do container, restaure o backup: ```bash psql -U postgres -f /backup_full.sql ``` ### 5️⃣ Verificar se a restauração foi bem-sucedida Saia do container e conecte-se ao banco para verificar se os dados foram restaurados: ```bash docker exec -it <CONTAINER_ID_POSTGRES17> psql -U postgres ``` Liste os bancos de dados para conferir: ```sql \l ``` Se tudo estiver correto, a migração foi concluída com sucesso! 🎉 -
pogermano revised this gist
Mar 4, 2025 . 1 changed file with 103 additions and 90 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,161 +1,174 @@ # 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: ```bash docker exec -it <container_postgres_14> pg_dumpall -U postgres > backup_full.sql ``` Copie o backup para o host: ```bash docker cp <container_postgres_14>:/backup_full.sql ./backup_full.sql ``` Verifique o tamanho do arquivo: ```bash 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: ```yaml 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: ```bash docker network create --driver overlay traefik_public ``` Implante o serviço: ```bash docker stack deploy -c docker-compose.yml postgres ``` Verifique se o serviço está rodando: ```bash docker service ls ``` Se o container não iniciar, verifique os logs: ```bash docker logs <container_id> ``` --- ## 5. Restaurando o Backup no PostgreSQL 17 Agora, copie o backup para o container do PostgreSQL 17: ```bash docker cp backup_full.sql <container_postgres_17>:/backup_full.sql ``` Acesse o container: ```bash docker exec -it <container_postgres_17> bash ``` Dentro do container, restaure o backup: ```bash psql -U postgres -f /backup_full.sql ``` Saia do container e verifique se os bancos de dados foram restaurados: ```bash 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`: ```yaml 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. -
pogermano revised this gist
Mar 2, 2025 . 1 changed file with 24 additions and 1 deletion.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -9,6 +9,26 @@ Este guia cobre a configuração de volumes para o PostgreSQL no Docker Swarm, a 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`: ```yaml version: '3.8' services: postgres: image: postgres:17 networks: - traefik_public environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: 123 POSTGRES_DB: n8n volumes: - postgres_data:/var/lib/postgresql/data deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager postgres_backup: image: postgres:17 networks: @@ -29,13 +49,16 @@ O problema da perda de dados no PostgreSQL após um restart provavelmente está constraints: - node.role == manager networks: traefik_public: external: true volumes: postgres_data: external: true name: postgres_data postgres_backup: external: false ``` --- -
pogermano revised this gist
Mar 2, 2025 . 1 changed file with 1 addition and 24 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -9,26 +9,6 @@ Este guia cobre a configuração de volumes para o PostgreSQL no Docker Swarm, a 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`: ```yaml postgres_backup: image: postgres:17 networks: @@ -49,16 +29,13 @@ services: constraints: - node.role == manager volumes: postgres_data: external: true name: postgres_data postgres_backup: external: false ``` --- -
pogermano revised this gist
Mar 2, 2025 . 1 changed file with 124 additions and 53 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -1,90 +1,161 @@ # Guia Completo para Backup e Restauração do PostgreSQL no Docker Swarm ## 1. Introdução 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. --- ## 2. Configuração do Volume no Docker Swarm 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`: ```yaml version: '3.8' services: postgres: image: postgres:17 networks: - traefik_public environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: 123 POSTGRES_DB: n8n volumes: - postgres_data:/var/lib/postgresql/data deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager 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 networks: traefik_public: external: true volumes: postgres_data: external: true name: postgres_data postgres_backup: external: false ``` --- ## 3. Backup do Banco de Dados Para fazer backup do PostgreSQL manualmente: ```bash docker exec -it <ID_DO_CONTAINER_POSTGRES> pg_dumpall -U postgres > backup_full.sql ``` Se quiser copiar o backup para a máquina host: ```bash docker cp <ID_DO_CONTAINER_POSTGRES>:/backup_full.sql ./backup_full.sql ``` Para verificar o tamanho do backup: ```bash ls -lh backup_full.sql ``` Se o arquivo estiver vazio, tente rodar o backup diretamente dentro do container: ```bash 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.sql ``` --- ## 4. Restauração do Backup Para restaurar um backup em um PostgreSQL novo: ```bash docker exec -i <ID_DO_CONTAINER_POSTGRES> psql -U postgres < backup_full.sql ``` Se o volume antigo ainda contiver dados incompatíveis, remova o volume antes de reiniciar o serviço: ```bash docker volume rm postgres_data ``` E recrie os serviços: ```bash docker stack deploy -c docker-compose.yml meu_stack ``` --- ## 5. Solução de Erros Comuns ### 5.1. Erro de Incompatibilidade de Versão Se 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: 1. **Fazer backup dos dados antigos** ```bash docker exec -it <ID_DO_CONTAINER_POSTGRES_14> pg_dumpall -U postgres > backup_full.sql ``` 2. **Remover o volume antigo** ```bash docker volume rm postgres_data ``` 3. **Recriar o serviço com o PostgreSQL 17** ```bash docker stack deploy -c docker-compose.yml meu_stack ``` 4. **Restaurar os dados** ```bash docker exec -i <ID_DO_CONTAINER_POSTGRES_17> psql -U postgres < backup_full.sql ``` --- ## 6. Conclusão Este 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: ```bash docker logs <ID_DO_CONTAINER_POSTGRES> ``` -
pogermano created this gist
Mar 2, 2025 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,90 @@ # **Backup e Restauração do PostgreSQL no Docker** Este documento apresenta os passos para realizar o backup e a restauração de um banco de dados PostgreSQL rodando em um container Docker. Também inclui soluções para problemas comuns. --- ## **1. Verificar se o PostgreSQL está rodando** Antes de iniciar o backup, verifique se o PostgreSQL está ativo dentro do container: ```sh # Substitua <container_id> pelo ID ou nome do container docker exec -it <container_id> pg_isready -U postgres ``` Se o resultado for algo como: ``` /var/run/postgresql:5432 - accepting connections ``` O banco está funcionando corretamente. Caso o banco não esteja rodando, reinicie o container: ```sh docker restart <container_id> ``` --- ## **2. Realizar o Backup** ### **Opção 1: Gerar o backup diretamente no host (Pode falhar!)** ```sh docker exec -it <container_id> pg_dumpall -U postgres > backup_full.sql ``` **Problema comum:** O arquivo `backup_full.sql` pode ficar com **0 bytes**. #### **Alternativa 1: Gerar o backup dentro do container** ```sh docker exec -it <container_id> bash pg_dumpall -U postgres > /backup_full.sql exit ``` Agora, copie o backup para sua máquina local: ```sh docker cp <container_id>:/backup_full.sql ./backup_full.sql ``` Verifique se o arquivo tem conteúdo: ```sh ls -lh backup_full.sql cat backup_full.sql | head -n 20 ``` Se o arquivo estiver com **0 bytes**, tente refazer o processo garantindo que o PostgreSQL esteja rodando corretamente. --- ## **3. Restaurar o Backup** Antes de restaurar, garanta que o banco de dados está vazio ou exclua os dados antigos: ```sh docker exec -it <container_id> psql -U postgres -c "DROP DATABASE IF EXISTS nome_do_banco;" docker exec -it <container_id> psql -U postgres -c "CREATE DATABASE nome_do_banco;" ``` Agora, restaure o backup: ```sh docker exec -i <container_id> psql -U postgres -d nome_do_banco < backup_full.sql ``` Caso o PostgreSQL esteja recusando conexão, verifique as configurações de autenticação no arquivo `pg_hba.conf` e `postgresql.conf`. --- ## **4. Solução para Problemas Comuns** ### **Erro: "PostgreSQL Database directory appears to contain a database; Skipping initialization"** Isso ocorre se você está tentando rodar uma versão diferente do PostgreSQL sem migrar os dados corretamente. Solução: ```sh mv /var/lib/postgresql/data /var/lib/postgresql/data_old mkdir /var/lib/postgresql/data chown -R postgres:postgres /var/lib/postgresql/data ``` Depois, inicialize o banco novamente e importe os dados do backup. ### **Erro: "database files are incompatible with server"** O banco de dados foi criado em uma versão diferente. Para corrigir, você precisa restaurar o backup em um PostgreSQL da mesma versão original, depois fazer um dump e importar na nova versão. --- Este guia deve ajudar a garantir um backup e restauração bem-sucedidos. 🚀