Padronizar a estrutura do projeto
TLDR: Trocar o
compose.ymlmonolítico comDockerfilelocal pelo padrão do.commons—compose.ymlmínimo que inclui o template,compose.override.ymlcom os extras e.envorganizado por contexto.
Contexto
O projeto usa um compose.yml monolítico com Dockerfile local, sem aproveitar o .commons/docker/ruby/ já presente. O padrão adotado em checkout-api e nos outros projetos Ruby da organização separa as responsabilidades: um compose.yml mínimo que inclui o template do .commons, um compose.override.yml com serviços extras, e um .env organizado por contexto.
Objetivos
- Renomear
automation/→src/ - Criar
.commons/docker/n8n/compose.dev.yml, que inclui o template ruby e define os serviços do n8n compose.ymlpassa a incluir apenas.commons/docker/n8n/compose.dev.yml- Criar
compose.override.ymlcom o override deserver.depends_one volumes extras - Remover o
Dockerfileda raiz - Reorganizar o
.envcom variáveis nomeadas conforme o template do.commons - Adicionar targets de banco e de install na stack n8n do
.commons
Fora de escopo
— (não registrado na spec original)
Mudanças
1. Renomear automation/ → src/
- Renomear o diretório no filesystem
- Atualizar
.project/make/main.mk: caminhoautomation/db/schemas/→src/db/schemas/ - Os volumes do compose passam a ser montados pelo template (raiz do repo →
/source)
2. Criar .commons/docker/n8n/compose.dev.yml
Inclui o template ruby e define os serviços do n8n:
```yaml include: - ../ruby/docker-compose.dev.yml
services: n8n: image: n8nio/n8n:1.63.4 # …variáveis de ambiente N8N_* e N8N_DATABASE_*…
n8n-database: image: postgres:16 # …variáveis de ambiente N8N_DATABASE_*… ```
Os caminhos ../../.. do template ruby continuam resolvendo corretamente para a raiz do projeto.
3. Reescrever compose.yml
```yaml name: marketing-automation
include: - .commons/docker/n8n/compose.dev.yml ```
4. Criar compose.override.yml
Contém apenas o override de server.depends_on, para aguardar o n8n-database:
```yaml name: marketing-automation
services: server: depends_on: n8n-database: condition: service_healthy ```
5. Adicionar targets na stack n8n (.commons/make/stacks/n8n/main.mk)
Targets de install e de banco da app Ruby, espelhando o padrão da stack ruby:
```makefile n8n.install: docker compose run –rm server bundle install
n8n.db.migrate: docker compose run –rm server bundle exec rake db:migrate
n8n.db.rollback: docker compose run –rm server bundle exec rake db:rollback
n8n.db.create: docker compose run –rm server bundle exec rake db:create
n8n.db.drop: docker compose stop database docker compose rm -f database docker volume rm -f marketing-automation_postgres_data
n8n.db.schema.dump: docker compose run –rm server bundle exec rake db:schema:dump
n8n.db.schema.load: docker compose run –rm server bundle exec rake db:schema:load
n8n.db.data.load: docker compose run –rm -v “$(CURDIR)/data:/data:ro” server bundle exec rake db:data:load DUMP_FILE=/data/$(notdir $(DUMP_FILE))
n8n.migration.create: docker compose run –rm server bundle exec rake db:generate name=$(name) ```
6. Deletar o Dockerfile
Substituído por .commons/docker/ruby/Dockerfile.dev. Criar .ruby-version na raiz com o valor de RUBY_VERSION.
7. Reorganizar .env e .env.example
``` # Runtime RUBY_VERSION=3.3.0 PORT=3000
Application database
DATABASE_HOST=database DATABASE_PORT=5432 DATABASE_NAME=automation DATABASE_USERNAME=postgres DATABASE_PASSWORD=postgres
n8n database
N8N_DATABASE_NAME=n8n N8N_DATABASE_USER=postgres N8N_DATABASE_PASSWORD=postgres
n8n application
N8N_PORT=5678 N8N_ENCRYPTION_KEY=local_dev_key N8N_TIMEZONE=America/Sao_Paulo ```
8. Remover .project/make/main.mk
Todos os targets migram para .commons/make/stacks/n8n/main.mk (passo 5).
9. Atualizar src/config/database.yml
Substituir todas as ocorrências de LEADS_DB_* por DATABASE_*:
| Antes | Depois |
|---|---|
LEADS_DB_HOST |
DATABASE_HOST |
LEADS_DB_PORT |
DATABASE_PORT |
LEADS_DB_DATABASE |
DATABASE_NAME |
LEADS_DB_USER |
DATABASE_USERNAME |
LEADS_DB_PASSWORD |
DATABASE_PASSWORD |
Host default: "postgres" → "database".
10. Atualizar src/Rakefile
As mesmas substituições LEADS_DB_* → DATABASE_*. Host default: "mkt-automation-db" → "database".
Riscos
- Volumes locais: os volumes Docker existentes não migram sozinhos. Os devs precisam recriar os bancos (
docker compose down -v). - Imagem Alpine → Debian: o
.commons/Dockerfile.devusa Debian. Conferir seinstall-dev-dependencies.shcobrepostgresql-dev,libxml2-develibxslt-dev. PORTpara o automation: o template mapeia${PORT}:${PORT}. Se a app não expõe HTTP, declararPORT=3000como placeholder.
Como verificar
bash
docker compose up
docker compose run --rm server bundle exec rake db:migrate
make db.migrate
Documentação
— (não registrado na spec original)