# 🚀 Deploy-Automático — Modelo GitOps (Gitea + Multi-VPS) Repositório de **referência/exemplo** da nossa automação de deploy contínuo baseada em **Gitea Webhooks** + **listener na VPS de build** + **Docker** na VPS de produção. > ⚠️ **Importante:** todos os scripts aqui são **exemplos sanitizados**. Tokens, secrets, > senhas de banco, JWT e IPs sensíveis foram substituídos por **placeholders** (`<...>`). > Nunca commite segredos reais — use variáveis de ambiente / arquivos `.env` fora do Git. --- ## 🗺️ Arquitetura (papéis dos servidores) | Servidor | IP (VPN) | Função | |---|---|---| | **VPS 1 — App** | `10.99.0.1` | Execução em **produção** (containers Docker) | | **VPS 3 — Data/Git** | `10.99.0.3` | **Gitea** + PostgreSQL | | **VPS 4 — Builder** | `10.99.0.4` | Desenvolvimento, **build** e disparo do deploy | ``` Dev (VPS4) ──git push──► Gitea (VPS3) ──webhook──► listener (VPS4:porta) │ ▼ deploy-*.sh (VPS4) │ ┌────────────────────┴────────────────────┐ ▼ ▼ [Modelo A] build na VPS4 + [Modelo B] rsync do fonte + rsync de artefatos → VPS1 build na VPS1 (docker compose → docker compose restart up -d --build) ``` --- ## 📦 O que tem aqui ``` . ├── webhook-listener/ │ ├── listener.js # Listener genérico do webhook do Gitea (parametrizável por ENV) │ ├── webhook-listener.service # Unit systemd de exemplo │ └── config.example.env # Variáveis de ambiente do listener ├── scripts/ │ ├── deploy-prod-builder.sh # Modelo A: build na VPS4 → envia artefato → VPS1 restart │ ├── deploy-to-prod.sh # Promoção manual Staging(VPS4) → Produção(VPS1) │ └── deploy-prod-onhost.sh # Modelo B: rsync do fonte → build na VPS1 └── docs/ ├── 01-arquitetura-vps.md ├── 02-fluxo-gitops.md ├── 03-configurar-webhook-gitea.md └── 04-seguranca-deploy.md ``` ## 🔑 Conceitos-chave da automação - **Um listener por projeto**, cada um numa **porta** própria (ex.: 9000, 9002, 9003), apontando para o `deploy-*.sh` daquele projeto. - O listener **valida um token**, tem **trava de concorrência**, **ignora commits de bump de versão** (`chore(deploy): bump version`) para evitar loop de CI, e **reporta o status do commit ao Gitea**. - **GitOps**: o script de deploy roda `git fetch && git reset --hard origin/main` — a fonte de verdade é sempre o Gitea, nunca arquivos soltos na VPS de build. Veja `docs/` para o passo a passo completo.