From c3550384ba4716954d01819a68867ffc51882e66 Mon Sep 17 00:00:00 2001 From: Leandro Ronetto Date: Sun, 23 Aug 2026 19:02:11 -0300 Subject: [PATCH] chore(orquestrador): adiciona stack bom-vizinho ao Makefile Makefile: - BOMVIZINHO_DIR + alvos up/down/logs/pull/rebuild/clone - compose em infra/docker-compose.yml e .env em infra/.env (terceiro layout diferente entre os repos; por isso os -f/--env-file explicitos) - ordem do up: main -> gitea -> wedding -> finance -> bomvizinho -> claudeweb CLAUDE.md: tabela de onde vive compose/.env por repo, container bomvizinho_api, URL api.bomvizinho.{DOMAIN_BASE} e comandos novos. Gotcha da secao 9 ampliado: bom-vizinho nao traz snippet de Caddy pronto e exige PostGIS, que a imagem atual (postgres:16-alpine) nao tem. Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 71 ++++++++++++++++++++++++++----------- Makefile | 102 +++++++++++++++++++++++++++++++++++------------------- 2 files changed, 118 insertions(+), 55 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 487c702..065041f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,23 +17,32 @@ App web pro casamento de **Stefanie & Leandro**. Convidados escaneiam um QR Code Cada stack é um repositório git separado, com seu próprio compose isolado. Todas compartilham uma **network Docker externa** chamada `infra-net`. ``` -lronetto-main/ Postgres + Redis + MinIO + pgAdmin + Caddy (+ orquestrador) -lronetto-gitea/ Gitea + Actions runner -lronetto-wedding/ App FastAPI + sidecars de backup (+ deploy CI) -lronetto-finance/ App FastAPI (Pluggy / open finance) (+ deploy CI) -lronetto-claudeweb/ API FastAPI + SPA + workers efêmeros (+ deploy CI) +lronetto-main/ Postgres + Redis + MinIO + pgAdmin + Caddy (+ orquestrador) +lronetto-gitea/ Gitea + Actions runner +lronetto-wedding/ App FastAPI + sidecars de backup (+ deploy CI) +lronetto-finance/ App FastAPI (Pluggy / open finance) (+ deploy CI) +lronetto-bom-vizinho/ App FastAPI + mobile (bairro/vizinhança) (+ deploy CI) +lronetto-claudeweb/ API FastAPI + SPA + workers efêmeros (+ deploy CI) ``` -No disco todos ficam como **diretórios irmãos** (ex.: `C:\Users\lrone\code\lronetto-*`). O `Makefile` orquestrador (neste repo, `lronetto-main`) referencia os outros por caminho relativo — sobrescrevível via `GITEA_DIR=` / `WEDDING_DIR=` / `FINANCE_DIR=` / `CLAUDEWEB_DIR=`. +No disco todos ficam como **diretórios irmãos** (ex.: `C:\Users\lrone\code\lronetto-*`). O `Makefile` orquestrador (neste repo, `lronetto-main`) referencia os outros por caminho relativo — sobrescrevível via `GITEA_DIR=` / `WEDDING_DIR=` / `FINANCE_DIR=` / `BOMVIZINHO_DIR=` / `CLAUDEWEB_DIR=`. -Duas pegadinhas de layout, já tratadas no Makefile orquestrador: +**Cada repo põe o compose e o `.env` num lugar diferente** — daí os `-f` / `--env-file` explícitos no Makefile orquestrador em vez de um padrão único: -- **claudeweb**: o compose fica em `deploy/compose.yml`, mas o `.env` fica na **raiz** do repo (daí o `--env-file` explícito). E o `up` dele builda antes a imagem do worker efêmero (`make worker-image`), que **não é serviço do compose** — por isso `up-claudeweb` delega pro Makefile do próprio repo em vez de chamar `docker compose` direto. -- **claudeweb** declara uma segunda network external, `claudeweb-workers` (isola os workers efêmeros da `infra-net`). O alvo `network-claudeweb` a cria reusando o `network.sh` via `INFRA_NETWORK=`. +| Repo | compose | `.env` | +|---|---|---| +| gitea, wedding, finance | `docker-compose.yml` (raiz) | raiz | +| bom-vizinho | `infra/docker-compose.yml` | `infra/.env` | +| claudeweb | `deploy/compose.yml` | raiz | + +Mais duas pegadinhas do **claudeweb**, também já tratadas no orquestrador: + +- O `up` dele builda antes a imagem do worker efêmero (`make worker-image`), que **não é serviço do compose** — por isso `up-claudeweb` delega pro Makefile do próprio repo em vez de chamar `docker compose` direto. +- Declara uma segunda network external, `claudeweb-workers` (isola os workers efêmeros da `infra-net`). O alvo `network-claudeweb` a cria reusando o `network.sh` via `INFRA_NETWORK=`. **Por que repos separados**: cada stack tem ciclo de vida, histórico e CI próprios. Subir/derrubar ou versionar uma não afeta as outras. Gitea pode ser desativado sem tocar no app. -**`lronetto-main` é o "platform layer"** que os consumidores usam. `gitea`, `wedding`, `finance` e `claudeweb` conectam ao Postgres/Redis/MinIO de lá pela `infra-net`, e são expostos pelo Caddy de lá. +**`lronetto-main` é o "platform layer"** que os consumidores usam. `gitea`, `wedding`, `finance`, `bom-vizinho` e `claudeweb` conectam ao Postgres/Redis/MinIO de lá pela `infra-net`, e são expostos pelo Caddy de lá. > Histórico: nasceu como monorepo `wedding-app` (branch `main`) com tudo em `infra/{main,gitea,wedding_photo}/`. Foi dividido em 3 repos (fresh start, sem histórico herdado — o monorepo original fica arquivado como backup). @@ -126,6 +135,16 @@ lronetto-finance/ # APLICAÇÃO (open finance via Pluggy) ├── apps/{api,web}/ # FastAPI + Vite/React └── infra-snippets/ # trechos a colar no lronetto-main (Caddy + init do postgres) +lronetto-bom-vizinho/ # APLICAÇÃO (bairro / vizinhança) +├── infra/ +│ ├── docker-compose.yml # stack "plataforma" (api, plugada na infra-net) +│ ├── docker-compose.dev.yml # stack dev standalone (pg+redis+minio próprios) +│ └── .env.example # o .env vive AQUI, não na raiz +├── Makefile # up/down/deploy + up-dev standalone +├── backend/ # FastAPI + alembic (migrations) +├── mobile/ # app mobile +└── docs/DEPLOY.md # runbook de deploy e pré-requisitos da plataforma + lronetto-claudeweb/ # APLICAÇÃO (Claude Code via web) ├── deploy/ │ ├── compose.yml # api + web + worker-proxy (.env fica na RAIZ) @@ -157,6 +176,7 @@ docker network connect claudeweb-workers minio - `gitea`, `gitea_runner` (stack gitea) - `wedding_app`, `wedding_pg_backup`, `wedding_media_backup` (stack wedding) - `finance_app` (stack finance) +- `bomvizinho_api` (stack bom-vizinho) - `claudeweb-api`, `claudeweb-web`, `claudeweb-worker-proxy` (stack claudeweb) — os workers efêmeros sobem e morrem com nome próprio por sessão ### URLs (com `DOMAIN_BASE`) @@ -165,6 +185,7 @@ docker network connect claudeweb-workers minio |---|---| | `https://wedding.{DOMAIN_BASE}` | Site dos noivos (uploads + galeria + admin) | | `https://finance.{DOMAIN_BASE}` | App de finanças (Pluggy) — rota Caddy pendente, ver §9 | +| `https://api.bomvizinho.{DOMAIN_BASE}` | API do bom-vizinho — rota Caddy pendente, ver §9 | | `https://code.lronetto.com` | claudeweb (API + SPA) — rota Caddy pendente, ver §9 | | `https://gitea.{DOMAIN_BASE}` | Git hosting + Actions | | `https://pgadmin.{DOMAIN_BASE}` | Web UI dos bancos | @@ -190,7 +211,7 @@ como diretórios irmãos (ou ajuste `GITEA_DIR=` / `WEDDING_DIR=` / `FINANCE_DIR=` / `CLAUDEWEB_DIR=`). ```bash make help # lista tudo -make up # network + main + gitea + wedding + finance + claudeweb +make up # network + main + gitea + wedding + finance + bomvizinho + claudeweb make down # inverso make restart # down + up make status # ps de todas as stacks @@ -199,16 +220,18 @@ make up-main # só infra base (este repo) make up-gitea make up-wedding # rebuilda imagem do app make up-finance # rebuilda imagem do app +make up-bomvizinho # rebuilda imagem do app (compose e .env em infra/) make up-claudeweb # delega pro Makefile do repo (builda o worker-image antes) -make rebuild-{wedding,finance,claudeweb} # build --no-cache + up -make down-{main,gitea,wedding,finance,claudeweb} -make logs-{main,gitea,wedding,finance,claudeweb} -make pull-{main,gitea,wedding,finance,claudeweb} +make rebuild-{wedding,finance,bomvizinho,claudeweb} # build --no-cache + up +make down-{main,gitea,wedding,finance,bomvizinho,claudeweb} +make logs-{main,gitea,wedding,finance,bomvizinho,claudeweb} +make pull-{main,gitea,wedding,finance,bomvizinho,claudeweb} make network # cria infra-net make network-claudeweb # cria claudeweb-workers make clone-claudeweb # clona o repo do claudeweb como irmão +make clone-bomvizinho # idem pro bom-vizinho ``` ### App wedding (`lronetto-wedding/Makefile`) @@ -357,14 +380,22 @@ Setup (1ª vez): ## 9. Gotchas conhecidos -### Caddy e Postgres do main não conhecem finance nem claudeweb (pendente) -`caddy/Caddyfile` (neste repo) tem blocos só pra `gitea`, `wedding`, `pgadmin`, `minio` e `media`. E `postgres/init/01-create-databases.sh` cria role/DB só pra wedding e gitea. Os dois apps novos trazem os trechos prontos pra colar aqui: +### O platform layer ainda não conhece finance, bom-vizinho nem claudeweb (pendente) +`caddy/Caddyfile` (neste repo) tem blocos só pra `gitea`, `wedding`, `pgadmin`, `minio` e `media`. E `postgres/init/01-create-databases.sh` cria role/DB só pra wedding e gitea. Falta, por app: +**finance** — snippets prontos no próprio repo: - `../lronetto-finance/infra-snippets/caddy-finance.snippet` → `caddy/Caddyfile` - `../lronetto-finance/infra-snippets/postgres-finance-db.snippet.sh` → `postgres/init/01-create-databases.sh` + +**claudeweb**: - `../lronetto-claudeweb/deploy/Caddyfile.snippet` → `caddy/Caddyfile` -Enquanto não forem aplicados, `make up-finance` / `make up-claudeweb` sobem os containers mas eles não ficam acessíveis por HTTPS (e falham ao conectar no banco). Lembre que o init do postgres **só roda com `PGDATA` vazio** — em banco já existente, crie role/DB manualmente (ver abaixo). +**bom-vizinho** — não traz snippet pronto; ver `../lronetto-bom-vizinho/docs/DEPLOY.md`. Precisa de: +- bloco `api.bomvizinho.{DOMAIN_BASE}` → `bomvizinho_api:8000` no `caddy/Caddyfile` +- role + DB `bomvizinho` **com PostGIS** — e a imagem atual (`postgres:16-alpine`) **não traz PostGIS**: exige trocar por `postgis/postgis:16-x`, o que é troca de imagem com `PGDATA` já populado (fazer com backup na mão) +- bucket `bomvizinho-media` no MinIO (`minio/init.sh`) + +Enquanto não forem aplicados, `make up-finance` / `make up-bomvizinho` / `make up-claudeweb` sobem os containers mas eles não ficam acessíveis por HTTPS (e falham ao conectar no banco). Lembre que o init do postgres **só roda com `PGDATA` vazio** — em banco já existente, crie role/DB manualmente (ver abaixo). ### Postgres init script só roda na 1ª vez `postgres/init/01-create-databases.sh` (neste repo, `lronetto-main`) é executado pelo entrypoint do postgres **apenas quando `PGDATA` está vazio**. Pra "rerodar": @@ -439,10 +470,10 @@ O `extra_hosts: host-gateway` pra `media.{DOMAIN_BASE}` faz o container resolver 6. **Deploy CI + rename main**: workflow Gitea Actions de deploy via SSH; branch renomeada pra `main`. 7. **Split em 3 repos**: `lronetto-main` + `lronetto-gitea` + `lronetto-wedding` (fresh start). Orquestrador no main, deploy CI no wedding. Monorepo `wedding-app` arquivado. -8. **Novas apps na plataforma**: `lronetto-finance` (open finance via Pluggy) e `lronetto-claudeweb` (Claude Code via web, com workers efêmeros em rede isolada). Ambas entraram no Makefile orquestrador; os snippets de Caddy/Postgres delas ainda não foram aplicados neste repo (§9). +8. **Novas apps na plataforma**: `lronetto-finance` (open finance via Pluggy), `lronetto-bom-vizinho` (bairro/vizinhança, precisa de PostGIS) e `lronetto-claudeweb` (Claude Code via web, com workers efêmeros em rede isolada). As três entraram no Makefile orquestrador; a integração delas com Caddy/Postgres/MinIO deste repo ainda não foi feita (§9). Repos / branches: -- `lronetto-main`, `lronetto-gitea`, `lronetto-wedding`, `lronetto-finance`, `lronetto-claudeweb` (atuais; default branch `main`) +- `lronetto-main`, `lronetto-gitea`, `lronetto-wedding`, `lronetto-finance`, `lronetto-bom-vizinho`, `lronetto-claudeweb` (atuais; default branch `main`) - Arquivados no monorepo `wedding-app`: `claude/wedding-qrcode-photos-C0PQt` (Cloudflare original), `claude/docker-vps-migration` (1ª migração Docker Node) --- diff --git a/Makefile b/Makefile index 0c1f415..66cb651 100644 --- a/Makefile +++ b/Makefile @@ -1,61 +1,71 @@ .PHONY: help network network-claudeweb up down restart status \ - up-main up-gitea up-wedding up-finance up-claudeweb \ - down-main down-gitea down-wedding down-finance down-claudeweb \ - logs-main logs-gitea logs-wedding logs-finance logs-claudeweb \ - pull-main pull-gitea pull-wedding pull-finance pull-claudeweb \ - rebuild-wedding rebuild-finance rebuild-claudeweb clone-claudeweb + up-main up-gitea up-wedding up-finance up-bomvizinho up-claudeweb \ + down-main down-gitea down-wedding down-finance down-bomvizinho down-claudeweb \ + logs-main logs-gitea logs-wedding logs-finance logs-bomvizinho logs-claudeweb \ + pull-main pull-gitea pull-wedding pull-finance pull-bomvizinho pull-claudeweb \ + rebuild-wedding rebuild-finance rebuild-bomvizinho rebuild-claudeweb \ + clone-claudeweb clone-bomvizinho # Orquestrador das stacks. `lronetto-main` é o "platform layer" # (postgres + redis + minio + pgadmin + caddy). Os demais repos são clonados # como diretórios IRMÃOS e referenciados aqui. Ajuste os caminhos abaixo se # usar outro layout no disco. # -# lronetto-gitea https://gitea.lronetto.com/lronetto/lronetto-gitea.git -# lronetto-wedding https://gitea.lronetto.com/lronetto/lronetto-wedding.git -# lronetto-finance https://gitea.lronetto.com/lronetto/lronetto-finance.git -# lronetto-claudeweb https://gitea.lronetto.com/lronetto/lronetto-claudeweb.git +# lronetto-gitea https://gitea.lronetto.com/lronetto/lronetto-gitea.git +# lronetto-wedding https://gitea.lronetto.com/lronetto/lronetto-wedding.git +# lronetto-finance https://gitea.lronetto.com/lronetto/lronetto-finance.git +# lronetto-bom-vizinho https://gitea.lronetto.com/lronetto/lronetto-bom-vizinho.git +# lronetto-claudeweb https://gitea.lronetto.com/lronetto/lronetto-claudeweb.git +# +# Cada repo põe o compose e o .env num lugar diferente — daí os -f/--env-file +# explícitos abaixo em vez de um padrão único. NET := infra-net # Rede isolada dos workers efêmeros do claudeweb (declarada external no compose dele). NET_WORKERS := claudeweb-workers -WEDDING_DIR ?= ../lronetto-wedding -GITEA_DIR ?= ../lronetto-gitea -FINANCE_DIR ?= ../lronetto-finance -CLAUDEWEB_DIR ?= ../lronetto-claudeweb +WEDDING_DIR ?= ../lronetto-wedding +GITEA_DIR ?= ../lronetto-gitea +FINANCE_DIR ?= ../lronetto-finance +BOMVIZINHO_DIR ?= ../lronetto-bom-vizinho +CLAUDEWEB_DIR ?= ../lronetto-claudeweb -CLAUDEWEB_REPO ?= https://gitea.lronetto.com/lronetto/lronetto-claudeweb.git +CLAUDEWEB_REPO ?= https://gitea.lronetto.com/lronetto/lronetto-claudeweb.git +BOMVIZINHO_REPO ?= https://gitea.lronetto.com/lronetto/lronetto-bom-vizinho.git DC_MAIN := docker compose -f docker-compose.yml --env-file .env DC_GITEA := docker compose -f $(GITEA_DIR)/docker-compose.yml --env-file $(GITEA_DIR)/.env DC_WEDDING := docker compose -f $(WEDDING_DIR)/docker-compose.yml --env-file $(WEDDING_DIR)/.env DC_FINANCE := docker compose -f $(FINANCE_DIR)/docker-compose.yml --env-file $(FINANCE_DIR)/.env +# bom-vizinho: compose E .env vivem em infra/. +DC_BOMVIZINHO := docker compose -f $(BOMVIZINHO_DIR)/infra/docker-compose.yml --env-file $(BOMVIZINHO_DIR)/infra/.env # claudeweb: compose vive em deploy/compose.yml e o .env fica na RAIZ do repo. DC_CLAUDEWEB := docker compose -f $(CLAUDEWEB_DIR)/deploy/compose.yml --env-file $(CLAUDEWEB_DIR)/.env help: @echo "Stacks: main (este repo) | gitea ($(GITEA_DIR)) | wedding ($(WEDDING_DIR))" - @echo " finance ($(FINANCE_DIR)) | claudeweb ($(CLAUDEWEB_DIR))" + @echo " finance ($(FINANCE_DIR)) | bomvizinho ($(BOMVIZINHO_DIR))" + @echo " claudeweb ($(CLAUDEWEB_DIR))" @echo "" - @echo " make up Sobe tudo (main -> gitea -> wedding -> finance -> claudeweb)" - @echo " make down Desce tudo na ordem inversa" - @echo " make restart down + up" - @echo " make status ps de todas as stacks" + @echo " make up Sobe tudo (main -> gitea -> wedding -> finance -> bomvizinho -> claudeweb)" + @echo " make down Desce tudo na ordem inversa" + @echo " make restart down + up" + @echo " make status ps de todas as stacks" @echo "" - @echo " make up-main Sobe só a stack main" - @echo " make up-gitea Sobe só o gitea" - @echo " make up-wedding Build + up do app wedding" - @echo " make up-finance Build + up do app finance" - @echo " make up-claudeweb Build (incl. worker-image) + up do claudeweb" - @echo " make rebuild-wedding Force rebuild do app wedding" - @echo " make rebuild-finance Force rebuild do app finance" - @echo " make rebuild-claudeweb Force rebuild do claudeweb" - @echo " make down-{main,gitea,wedding,finance,claudeweb}" - @echo " make logs-{main,gitea,wedding,finance,claudeweb}" - @echo " make pull-{main,gitea,wedding,finance,claudeweb}" - @echo " make clone-claudeweb Clona $(CLAUDEWEB_REPO) em $(CLAUDEWEB_DIR)" - @echo " make network Cria a network external '$(NET)' (idempotente)" - @echo " make network-claudeweb Cria a network external '$(NET_WORKERS)' (idempotente)" + @echo " make up-main Sobe só a stack main" + @echo " make up-gitea Sobe só o gitea" + @echo " make up-wedding Build + up do app wedding" + @echo " make up-finance Build + up do app finance" + @echo " make up-bomvizinho Build + up do app bom-vizinho" + @echo " make up-claudeweb Build (incl. worker-image) + up do claudeweb" + @echo " make rebuild-{wedding,finance,bomvizinho,claudeweb}" + @echo " make down-{main,gitea,wedding,finance,bomvizinho,claudeweb}" + @echo " make logs-{main,gitea,wedding,finance,bomvizinho,claudeweb}" + @echo " make pull-{main,gitea,wedding,finance,bomvizinho,claudeweb}" + @echo " make clone-claudeweb Clona $(CLAUDEWEB_REPO)" + @echo " make clone-bomvizinho Clona $(BOMVIZINHO_REPO)" + @echo " make network Cria a network external '$(NET)' (idempotente)" + @echo " make network-claudeweb Cria a network external '$(NET_WORKERS)' (idempotente)" network: @./network.sh @@ -63,9 +73,9 @@ network: network-claudeweb: @INFRA_NETWORK=$(NET_WORKERS) ./network.sh -up: network up-main up-gitea up-wedding up-finance up-claudeweb +up: network up-main up-gitea up-wedding up-finance up-bomvizinho up-claudeweb -down: down-claudeweb down-finance down-wedding down-gitea down-main +down: down-claudeweb down-bomvizinho down-finance down-wedding down-gitea down-main restart: down up @@ -74,6 +84,7 @@ status: @$(DC_GITEA) ps || true @$(DC_WEDDING) ps || true @$(DC_FINANCE) ps || true + @$(DC_BOMVIZINHO) ps || true @$(DC_CLAUDEWEB) ps || true up-main: network @@ -88,6 +99,9 @@ up-wedding: network up-finance: network $(DC_FINANCE) up -d --build +up-bomvizinho: network + $(DC_BOMVIZINHO) up -d --build + # Delegado ao Makefile do repo: o `up` de lá builda antes a imagem do worker # efêmero (fora do compose) que o backend instancia. up-claudeweb: network network-claudeweb @@ -101,6 +115,10 @@ rebuild-finance: network $(DC_FINANCE) build --no-cache $(DC_FINANCE) up -d +rebuild-bomvizinho: network + $(DC_BOMVIZINHO) build --no-cache + $(DC_BOMVIZINHO) up -d + rebuild-claudeweb: network network-claudeweb $(MAKE) -C $(CLAUDEWEB_DIR) worker-image $(DC_CLAUDEWEB) build --no-cache @@ -118,6 +136,9 @@ down-wedding: down-finance: $(DC_FINANCE) down +down-bomvizinho: + $(DC_BOMVIZINHO) down + down-claudeweb: $(DC_CLAUDEWEB) down @@ -133,6 +154,9 @@ logs-wedding: logs-finance: $(DC_FINANCE) logs -f +logs-bomvizinho: + $(DC_BOMVIZINHO) logs -f + logs-claudeweb: $(DC_CLAUDEWEB) logs -f @@ -148,6 +172,9 @@ pull-wedding: pull-finance: $(DC_FINANCE) pull +pull-bomvizinho: + $(DC_BOMVIZINHO) pull + pull-claudeweb: $(DC_CLAUDEWEB) pull @@ -155,3 +182,8 @@ clone-claudeweb: @test -d $(CLAUDEWEB_DIR)/.git \ && echo "$(CLAUDEWEB_DIR) já existe" \ || git clone $(CLAUDEWEB_REPO) $(CLAUDEWEB_DIR) + +clone-bomvizinho: + @test -d $(BOMVIZINHO_DIR)/.git \ + && echo "$(BOMVIZINHO_DIR) já existe" \ + || git clone $(BOMVIZINHO_REPO) $(BOMVIZINHO_DIR)