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

1

Valida o nome

Se o nome não bate com a regex, aborta antes de tocar no banco.
2

Verifica que o Postgres está rodando

Usa docker compose ps local. Se não estiver up, aborta com mensagem clara.
3

Checa duplicata

Se o DB já existe, aborta (não sobrescreve).
4

Gera senha aleatória

openssl rand -hex 24 — 48 caracteres hex.
5

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>";
6

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

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.