Padronizar a estrutura do projeto

TLDR: Trocar o compose.yml monolítico com Dockerfile local pelo padrão do .commons — compose.yml mínimo que inclui o template, compose.override.yml com os extras e .env organizado 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.yml passa a incluir apenas .commons/docker/n8n/compose.dev.yml
  • Criar compose.override.yml com o override de server.depends_on e volumes extras
  • Remover o Dockerfile da raiz
  • Reorganizar o .env com 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: caminho automation/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.dev usa Debian. Conferir se install-dev-dependencies.sh cobre postgresql-dev, libxml2-dev e libxslt-dev.
  • PORT para o automation: o template mapeia ${PORT}:${PORT}. Se a app não expõe HTTP, declarar PORT=3000 como 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)