Se você está criando uma aplicação que usa PostgreSQL em produção para armazenar dados, em algum momento provavelmente vai precisar rodar o PostgreSQL para desenvolvimento na sua máquina local.
Às vezes é possível usar algo como SQLite em desenvolvimento e Postgres em produção, mas quando seu app fica sério, você vai querer que os ambientes sejam iguais.
Exemplo de Postgres no Docker para desenvolvimento local
Eu prefiro usar o docker-compose em vez da CLI do docker, mas a escolha é sua. Apresento as duas opções aqui.
Recomendo trocar a imagem usada aqui pela mesma versão que você usa em produção, por exemplo postgres:9.4 em vez de postgres:latest.
PostgreSQL com a CLI do Docker
docker run -d \
--name psql \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=example \
-v psql:/var/lib/postgresql/data \
-p 5555:5432 \
postgres:latest
Isso vai iniciar seu servidor PostgreSQL e deixá-lo disponível em localhost:5555. Coloque em um script como dev/postgres e execute sempre que iniciar seu app.
PostgreSQL com Docker Compose
Eu prefiro usar o Docker Compose, porque ele facilita mudar a configuração do banco de dados e adicionar mais serviços (ex.: Redis) sempre que eu precisar.
version: '3'
volumes:
psql:
services:
psql:
image: postgres:latest
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: example # only do this in development
volumes:
- psql:/var/lib/postgresql/data # save data between restarts
ports:
- 5555:5432 # binds port 5555 on your computer to the postgres port!
Novamente, seu banco de dados de desenvolvimento ficará disponível em localhost:5555
Recomendações para desenvolvimento local com Postgres
Recomendamos gerenciar o postgres de desenvolvimento das seguintes formas:
- Garanta que você está usando a imagem oficial do Postgres.
- Guarde a configuração do postgres em um arquivo do Docker Compose (veja um exemplo abaixo).
- Faça commit do arquivo do docker compose no controle de versão (como Git) junto com o código-fonte do projeto.
- Faça com que todos do time usem as mesmas configurações do postgres em desenvolvimento.
- Faça o bootstrap da sua imagem do postgres (se precisar), usando alguns dos recursos mais avançados da imagem docker.
- Não deixe de especificar um
volumepara o contêiner armazenar os dados, assim eles persistem entre execuções. - Use os recursos nativos da imagem para rodar SQL de bootstrap, definir credenciais e criar bancos de dados.
Docker vs. instalação do Postgres no sistema
É possível simplesmente instalar o Postgres no seu computador. Há builds para os três principais sistemas operacionais. Parece o caminho mais fácil, mas essa abordagem tem alguns problemas.
Problemas de instalar o Postgres no sistema
- O Postgres vai ficar sempre rodando como serviço do sistema
- Na prática, só dá para ter uma versão do Postgres instalada e rodando por vez
- Todo app que precisa do próprio banco Postgres terá que compartilhar a mesma instância
- Exige acesso root/admin à sua máquina
- Se você trabalha em equipe, cada setup pode ser um pouco diferente, o que dificulta compartilhar configurações de desenvolvimento.
O Docker resolve (a maioria) desses problemas
Com o Docker, cada projeto em desenvolvimento pode ter seu próprio Postgres fixado na versão correta, com um setup padrão compartilhado entre os colegas de equipe e versionado no controle de código.
O maior problema de rodar o Postgres em um contêiner Docker é, bem, aprender Docker se você nunca usou antes.
Usando Docker para Postgres em produção
Se você usa Docker puro em produção, ter um banco Postgres é bem parecido com a nossa configuração de desenvolvimento
version: '3.8'
volumes:
psql_data:
driver: local
services:
postgres:
image: postgres:14
container_name: postgres
restart: always
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mysecurepassword
POSTGRES_DB: mydatabase
volumes:
- psql_data:/var/lib/postgresql/data
- ./backups:/backups
ports:
- 5432:5432
healthcheck:
test: ["CMD-SHELL", "pg_isready -U myuser"]
interval: 30s
timeout: 10s
retries: 5
Backup e restauração de bancos Postgres no Docker
O conteúdo abaixo não é um guia completo de como gerenciar Postgres em produção, mas deve servir como ponto de partida para uma estratégia de backup simples.
Em um ambiente de produção, os backups do PostgreSQL podem ser automatizados exportando o banco periodicamente para um arquivo de backup. Isso pode ser feito agendando um cron job ou um contêiner de backup dedicado que execute periodicamente um comando pg_dump para exportar os dados do banco para um diretório (ex.: /backups) montado no sistema host. A pasta backups na configuração acima é montada em um diretório da máquina host, onde os arquivos de backup podem ser armazenados com segurança.
Criando backups do Postgres no Docker
Para uma estratégia de backup básica:
- Execute
pg_dumppara exportar o banco de dados:docker exec postgres pg_dump -U myuser mydatabase > ./backups/backup_$(date +%F).sqlEsse comando cria um backup do banco de dados dentro do diretório
backups. - Você pode configurar um cron job ou usar outro mecanismo de agendamento para rodar esse comando em intervalos regulares (ex.: diariamente ou semanalmente).
0 2 * * * docker exec postgres pg_dump -U myuser mydatabase > /path/to/backups/backup_$(date +\%F).sql - Envie o backup para o S3 ou outro local de armazenamento semelhante
aws s3 cp ./backups/backup_$(date +%F).sql s3://your-bucket-name/path/to/backup/Além disso, você pode configurar o arquivamento de WAL (Write-Ahead Logging) para criar backups contínuos das alterações, permitindo recuperação point-in-time, mas isso foge do escopo deste artigo. Confira a documentação oficial para mais informações.
Restaurando um backup
- Baixe o backup do S3
aws s3 cp s3://your-bucket-name/path/to/backup/backup_YYYY-MM-DD.sql ./backups/Esse comando baixa o arquivo de backup do S3 para o seu diretório local de backups.
- Restaure-o no seu banco de dados
docker exec -i postgres psql -U myuser -d mydatabase < ./backups/backup_YYYY-MM-DD.sqlEsse comando usa o psql para restaurar o arquivo de backup no seu contêiner PostgreSQL em execução.
Conclusão
Agora você já conhece o básico de como iniciar e gerenciar um contêiner Docker do Postgres. Lembre-se de que há muitas outras coisas necessárias para rodar um cluster Postgres em produção (ex.: monitoramento, alertas), mas esperamos que o conteúdo acima ajude você a começar.
Beekeeper Studio é um cliente de banco de dados gratuito e open source
A melhor ferramenta de consultas e edição de SQL que já usei. Tem tudo o que preciso para gerenciar meu banco de dados. - ⭐⭐⭐⭐⭐ Mit
O Beekeeper Studio é rápido, intuitivo e fácil de usar. Ele suporta vários bancos de dados e funciona muito bem no Windows, Mac e Linux.
O que os usuários dizem sobre o Beekeeper Studio
"O Beekeeper Studio substituiu completamente meu antigo fluxo de trabalho com PostgreSQL. É rápido, intuitivo e torna o trabalho com bancos de dados prazeroso de novo."
"Já testei muitas GUIs de banco de dados, mas o Beekeeper encontra o equilíbrio perfeito entre recursos e simplicidade. Simplesmente funciona."