Plataforma de Deploy Automatizado baseada em GitOps e Infrastructure as Code.
Versão atual: v1.1.0 — Dashboard + Rollback
| Categoria | Tecnologia |
|---|---|
| Backend | Go 1.24+ · Fiber v2 · pgx v5 · zerolog |
| Frontend | React 18 · TypeScript · Vite · Tailwind CSS |
| Gráficos | Recharts |
| Mensageria | RabbitMQ |
| Infraestrutura | Terraform + Docker Provider |
| Streaming | SSE (Server-Sent Events) |
| Banco | PostgreSQL 16 |
| Containerização | Docker + Docker Compose |
flowchart TD
User["Usuário"]
User -->|HTTP| API["API (Go / Fiber)"]
API -->|Serve SPA| Frontend["Dashboard Web (React + Vite)"]
Frontend -->|REST + SSE| API
API -->|Publica Job| RMQ["RabbitMQ"]
RMQ -->|Consome| Worker["Deploy Worker"]
Worker --> TF["Terraform Executor"]
TF --> TFInit["terraform init"]
TFInit --> TFPlan["terraform plan"]
TFPlan --> TFApply["terraform apply"]
TFApply --> Docker["Docker Provider"]
Docker --> Containers["Containers"]
Worker -->|Health Check| Containers
Worker -->|SSE Events| API
Worker -->|Persiste resultado + state snapshot| DB[("PostgreSQL")]
API -->|Consulta histórico| DB
Frontend -->|Logs via SSE| API
gitops-lite/
├── apps/
│ ├── api/ # API HTTP (Fiber)
│ │ ├── cmd/main.go
│ │ └── internal/
│ │ ├── config/ # Config via env + .env loader
│ │ ├── handler/ # Handlers HTTP (deploy, logs, rollback, events, router)
│ │ └── queue/ # Producer RabbitMQ
│ ├── deploy-worker/ # Worker assíncrono
│ │ ├── cmd/main.go
│ │ └── internal/
│ │ ├── config/
│ │ ├── consumer/ # Consumer RabbitMQ
│ │ ├── events/ # HTTP client para SSE
│ │ ├── executor/ # Terraform executor
│ │ └── health/ # Health check HTTP
│ └── frontend/ # Dashboard Web (React + Vite)
│ ├── src/
│ │ ├── components/ # Layout, DeployTable, DeployTimeline,
│ │ │ # LogViewer, RollbackModal, HistoryChart, StatusBadge
│ │ ├── pages/ # Dashboard, DeployDetail, History
│ │ ├── services/ # api.ts (Axios), sse.ts (EventSource)
│ │ ├── hooks/ # useDeployments, useDeployDetail, useSSE
│ │ └── types/ # TypeScript interfaces
│ ├── package.json
│ └── vite.config.ts
├── pkg/ # Pacotes compartilhados
│ ├── model/ # Deployment, Job, Log, API response
│ └── repository/ # Acesso a banco (pgx)
├── terraform/ # Módulos Terraform
│ ├── modules/
│ │ ├── network/ # Rede Docker
│ │ ├── container/ # Container Docker
│ │ └── volume/ # Volume Docker
│ └── app/ # Root module (deploy)
├── migrations/ # Migrations SQL
├── docker/
│ ├── Dockerfile.api
│ ├── Dockerfile.worker
│ └── docker-compose.yml
├── scripts/
│ ├── setup.ps1
│ ├── migrate.ps1
│ └── deploy.ps1
├── go.work # Go workspace
└── README.md
docker compose -f docker/docker-compose.yml up -d postgres rabbitmqAguarde os serviços ficarem prontos (~10s).
O PostgreSQL estará disponível em
localhost:5433(porta 5432 do container mapeada para 5433 no host para evitar conflitos com outras instalações locais).
Terminal 1 — API:
cd apps/api
go run ./cmd/main.goA API estará disponível em http://localhost:8080.
Terminal 2 — Worker:
cd apps/deploy-worker
go run ./cmd/main.goO
.envé carregado automaticamente por ambos os serviços.
cd apps/frontend
npm install # apenas na primeira vez
npm run devO dashboard estará disponível em http://localhost:5173.
Em desenvolvimento, o Vite faz proxy de
/apipara a API emlocalhost:8080. Em produção, a própria API serve os arquivos estáticos do frontend (apps/frontend/dist/).
| Método | Rota | Descrição |
|---|---|---|
POST |
/api/deploy |
Criar um novo deploy |
GET |
/api/deployments |
Listar deploys (paginado) |
GET |
/api/deployments/:id |
Detalhes de um deploy |
PUT |
/api/deployments/:id/cancel |
Cancelar um deploy pendente |
| Método | Rota | Descrição |
|---|---|---|
GET |
/api/deployments/:id/logs |
Logs de um deploy |
GET |
/api/deployments/:id/logs/download |
Download dos logs (.txt) |
POST |
/api/deployments/:id/rollback |
Solicitar rollback para versão anterior |
POST |
/api/deployments/:id/retry |
Reexecutar deploy falho |
GET |
/api/events?deploy_id=:id |
SSE streaming de eventos em tempo real |
GET |
/health |
Health check da API |
sequenceDiagram
participant U as Usuário
participant API as API
participant RMQ as RabbitMQ
participant W as Worker
participant TF as Terraform
participant DB as PostgreSQL
U->>API: POST /api/deploy {app_name, image_tag}
API->>DB: Salva deploy (status: pending)
API->>RMQ: Publica job
API->>DB: Atualiza status (queued)
API-->>U: 202 Accepted
RMQ->>W: Consome job
W->>DB: Atualiza status (in_progress)
W->>W: Gera terraform.tfvars
W->>TF: terraform init
W->>TF: terraform plan
W->>TF: terraform apply
TF->>Docker: Cria container
W->>W: Health Check
W->>DB: Atualiza status (success/failed)
W->>API: SSE event (deploy_completed)
API->>U: SSE: deploy_completed
- Listagem de deploys com paginação (20 por página)
- Filtros por status (Todos, Sucesso, Falha, Em Andamento)
- Botão "Novo Deploy" com formulário inline
- Botão "Retry" em deploys falhos diretamente na tabela
- Gráficos: deploys por dia (barras) e distribuição por status (pizza)
- Metadados completos (ID, app, imagem, datas)
- Timeline visual das etapas do pipeline
- Logs com auto-scroll e suporte a SSE em tempo real
- Botões de ação: Rollback (modal), Retry, Cancelar, Download de logs
- Taxa de sucesso, falha e cancelamento
- Gráfico de deploys por dia (últimos 100 deploys)
- Gráfico de distribuição por status
curl -X POST http://localhost:8080/api/deploy \
-H "Content-Type: application/json" \
-d '{"app_name": "my-app", "image_tag": "nginx:latest"}'curl -X POST http://localhost:8080/api/deployments/<deploy-id>/rollback \
-H "Content-Type: application/json" \
-d '{"target_version": "nginx:1.25"}'curl -X POST http://localhost:8080/api/deployments/<deploy-id>/retryconst source = new EventSource('/api/events?deploy_id=abc-123');
source.addEventListener('deploy_log', (e) => {
const data = JSON.parse(e.data);
console.log(`[${data.step}] ${data.message}`);
});
source.addEventListener('deploy_completed', (e) => {
const data = JSON.parse(e.data);
console.log(`Deploy concluído: ${data.status}`);
source.close();
});| Serviço | Porta (Host) | URL |
|---|---|---|
| API | 8080 | http://localhost:8080 |
| Frontend (dev) | 5173 | http://localhost:5173 |
| RabbitMQ (AMQP) | 5672 | amqp://guest:guest@localhost:5672 |
| RabbitMQ (Management) | 15672 | http://localhost:15672 |
| PostgreSQL | 5433 | postgres://gitops:gitops@localhost:5433/gitops |
.\scripts\setup.ps1 -InitTerraform.\scripts\deploy.ps1 -AppName my-app -ImageTag nginx:latest| Versão | Foco | Status |
|---|---|---|
| MVP v1.0.0 | Backend: API + Worker + Terraform + RabbitMQ + PostgreSQL | ✅ Concluído |
| v1.1.0 | Dashboard Web + Rollback + SSE + logs | ✅ Concluído |
| v1.2.0 | Observabilidade (Prometheus, Grafana, Loki, OpenTelemetry) | 📋 Planejado |
| v2.0.0 | GitOps completo (Kubernetes, Argo CD, Helm, Canary, Blue/Green) | 📋 Planejado |
Desenvolvido por Lázaro Vasconcelos — Plataforma de estudo em Platform Engineering e DevOps