Toda vez que um projeto novo precisa de Postgres, use create-db.sh.
Uso
cd /opt/server/infra/postgres
./create-db.sh <nome-do-db>
Regras para o nome:
- Só letras minúsculas, dígitos e
_
- Começa com letra
- Até 63 caracteres
Exemplos válidos: blog, meu_app, api_v2. Inválidos: MeuApp, 1api, meu-app.
O que o script faz
Valida o nome
Se o nome não bate com a regex, aborta antes de tocar no banco.
Verifica que o Postgres está rodando
Usa docker compose ps local. Se não estiver up, aborta com mensagem clara.
Checa duplicata
Se o DB já existe, aborta (não sobrescreve).
Gera senha aleatória
openssl rand -hex 24 — 48 caracteres hex.
Cria user + database no Postgres
Dentro de uma única sessão psql:CREATE USER "<nome>" WITH PASSWORD '<senha>';
CREATE DATABASE "<nome>" OWNER "<nome>";
GRANT ALL PRIVILEGES ON DATABASE "<nome>" TO "<nome>";
Salva credenciais em secrets/
Cria secrets/<nome>.env (modo 600) com:DB_HOST=postgres
DB_PORT=5432
DB_NAME=<nome>
DB_USER=<nome>
DB_PASSWORD=<senha>
DATABASE_URL=postgresql://<nome>:<senha>@postgres:5432/<nome>
Imprime resultado
Mostra nome, user, senha e caminho do arquivo no terminal.
Exemplo de saída
$ ./create-db.sh blog
CREATE ROLE
CREATE DATABASE
GRANT
created database 'blog'
user: blog
password: 7f3c8b2a9e4d1f6b0c5a8e2d3f1b7c9e4a6d8b0f2c7a3e9b5d1f4c8a6e2b9d3f
saved to: /opt/server/infra/postgres/secrets/blog.env
Usar as credenciais no projeto
No docker-compose.yml do projeto em /opt/server/projetos/blog/:
services:
app:
env_file:
- /opt/server/infra/postgres/secrets/blog.env
environment:
DATABASE_URL: ${DATABASE_URL}
networks:
- server_net
networks:
server_net:
external: true
Ou copie/symlink secrets/blog.env para dentro da pasta do projeto.
Apagar um DB
Não tem script para isso — é uma operação destrutiva que deve ser feita com cuidado. Manualmente:
cd /opt/server/infra/postgres
docker compose exec -T postgres psql -U postgres <<SQL
DROP DATABASE "meuprojeto";
DROP USER "meuprojeto";
SQL
rm secrets/meuprojeto.env
Antes de apagar, confirme que nenhum container está conectado ao DB, e faça backup: docker compose exec -T postgres pg_dump -U postgres meuprojeto > backup.sql.