From a1e020556e1254ed0ec09d0d6f47612c6eaae8d9 Mon Sep 17 00:00:00 2001 From: "Matheus (Handix)" Date: Sat, 19 Sep 2026 20:49:26 -0300 Subject: [PATCH] =?UTF-8?q?docs:=20passo=20a=20passo=20para=20subir=20uma?= =?UTF-8?q?=20VM=20nova=20de=20pr=C3=A9-produ=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5 --- docs/runbooks/setup-vm-pre-producao.md | 87 ++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 docs/runbooks/setup-vm-pre-producao.md diff --git a/docs/runbooks/setup-vm-pre-producao.md b/docs/runbooks/setup-vm-pre-producao.md new file mode 100644 index 0000000..5e2605f --- /dev/null +++ b/docs/runbooks/setup-vm-pre-producao.md @@ -0,0 +1,87 @@ +# Setup de uma nova VM (pré-produção) + +Passo a passo mínimo para subir o EDEN do zero numa VM nova. Ver `docs/adr/0002-container-topology.md` +para o porquê da topologia (Postgres isolado, 1 container por app). + +## 1. Requisitos da VM + +- Linux (Debian/Ubuntu), 4 vCPU / 8GB RAM como piso razoável (Chromium headless para PDF consome memória). +- Docker Engine + plugin `docker compose` instalados. +- Git. +- Portas liberadas no firewall: só as que forem expostas publicamente (ver passo 5) — nunca a porta do + Postgres. + +```bash +curl -fsSL https://get.docker.com | sh +sudo usermod -aG docker $USER # relogar depois disso +``` + +## 2. Clonar o repositório + +```bash +git clone https://git.falehandix.com.br/Matheus/eden.git /opt/eden +cd /opt/eden +git checkout main # pré-produção valida o que já foi mergeado — não a branch developer +``` + +## 3. Configurar o `.env` + +```bash +cp .env.example .env +``` + +Preencher no `.env` (nunca commitar este arquivo): + +- `EDEN_DATABASE_PASSWORD` / ajustar `DATABASE_URL` com a mesma senha. +- `JWT_SIGNING_SECRET` — `openssl rand -hex 48` (segredo próprio desta VM, nunca reaproveitar o de outro ambiente). +- `SIGNATURE_OTP_SECRET` — `openssl rand -hex 32`. +- `EDEN_FIELD_ENCRYPTION_KEY` — `openssl rand -hex 32`. +- `EDEN_SUPERADMIN_EMAIL` / `EDEN_SUPERADMIN_PASSWORD` — só usado para criar o primeiro usuário se a + tabela `users` estiver vazia. +- `S3_*` — credenciais do MinIO bundled (`openssl rand -hex 12`/`openssl rand -hex 24` para user/senha) ou + de um S3 real. +- `SMTP_*` — se já tiver um provedor de e-mail pra este ambiente. +- `PUBLIC_BASE_URL` — domínio público desta VM (usado em links de e-mail). +- Portas (`EDEN_API_PORT`/`EDEN_CORE_PORT`/`EDEN_PARCEIROS_PORT`/`EDEN_ASSINANTE_PORT`) — só mudar se for + rodar mais de uma instância na mesma máquina. + +## 4. Subir os containers + +```bash +docker compose --env-file .env up -d +``` + +Sobe Postgres, MinIO, API, worker e as 3 apps web. Cada serviço tem healthcheck — conferir com: + +```bash +docker compose --env-file .env ps +``` + +## 5. Rodar as migrations + +A imagem do `eden-api` carrega o monorepo inteiro (ver `infra/docker/Dockerfile.node`), então dá pra +rodar direto de dentro do container — `DATABASE_URL` já está no ambiente dele: + +```bash +docker compose --env-file .env exec eden-api pnpm --filter @eden/database exec node-pg-migrate up +``` + +(Ou, se tiver Node 22 + pnpm instalados na própria VM, fora de Docker: `pnpm install && pnpm db:migrate`, +com `DATABASE_URL` apontando pra porta mapeada do Postgres no host.) + +## 6. Confirmar o primeiro acesso + +```bash +curl -X POST http://localhost:${EDEN_API_PORT:-8080}/api/v1/auth/login \ + -H "Content-Type: application/json" \ + -d "{\"email\":\"$EDEN_SUPERADMIN_EMAIL\",\"password\":\"$EDEN_SUPERADMIN_PASSWORD\",\"applicationKey\":\"core\"}" +``` + +Deve devolver um `accessToken`. Depois logar normalmente em `http://:${EDEN_CORE_PORT}`. + +## 7. Proxy reverso / domínio (se for expor publicamente) + +- Cada app tem um domínio próprio (core/parceiros/assinante); a API **não** tem domínio público — o proxy + na frente de cada domínio deve rotear `/api/*` internamente para `eden-api:8080` na rede docker + (`eden_net`), nunca expor a API direto. +- Nunca expor a porta do Postgres (`EDEN_POSTGRES_DEV_PORT`) fora da rede interna em pré-produção.