Releases: fabgcruz/bagre
v0.5.0 — Cleanup do backlog + DNS/Validation com UI
v0.5.0 — Cleanup do backlog + DNS/Validation com UI
Release que limpa o backlog quase inteiro numa tacada. 8 issues fechadas, 6 features end-to-end, 4 design specs, 1 bug fix da comunidade, 2 páginas admin novas.
✨ Features novas
🌐 DNS sync (PowerDNS) — backend + UI (#17)
Push de hostnames do Bagre como A records numa zona PowerDNS. Records gerenciados pelo Bagre marcados com comment bagre-managed pra não pisar em registros manuais. Página admin com test, preview do diff (a criar / a atualizar / a deletar) e sync com confirmação.
🛡️ Sistema de validação de subnets — backend + UI (#27)
4 regras built-in (no-overlap, within-master, size-range, name-pattern) com severity error/warning, scope global/site/provider. Roda antes de criar subnet — erros bloqueiam (HTTP 422), warnings só avisam. UI admin pra CRUD das regras com toggle inline.
🧮 Calculadora CIDR avançada (#12)
4 tabs: Análise (com detecção de overlap no IPAM), Dividir, Próximas livres, Supernet. Endpoints REST: /api/cidr/parse|split|merge|next-free.
☑️ Operações em lote nos IPs (#14)
Checkboxes, barra de ação flutuante, 3 ações em massa (reservar, liberar, editar campos). Endpoint POST /api/ips/bulk admin-gated, cap 500.
📈 Histórico temporal de utilização (#11)
Gráfico SVG inline com 7d/30d/90d, indicador de tendência, scheduler de snapshots a cada 60min, botão "Capturar agora".
🌍 IPv6 first-class — fase 1 (#10)
Parse IPv6 via BigInt 128-bit, subnets v6 criadas sem pré-enumeração, endpoint POST /api/subnets/:id/ips pra alocação ad-hoc. Split/merge/next-free pra v6 vem na próxima.
📥 Importação universal — fase 1 (#13)
POST /api/import aceita JSON, CSV ou XLSX via upload multipart ou body inline. Limite 25MB. YAML e NetBox na próxima.
🔥 Prometheus discovery (#25)
Já estava em v0.3.0, mas vale lembrar: sugestão do Leonardo Berbert via LinkedIn, implementada em <24h.
🖼️ Screenshots no README (#9)
Galeria 2x2 com dashboard, subnet detail, CIDR calculator, cloud accounts — capturados via Playwright em viewport 1440x900.
📚 Gerador de tutoriais Playwright (#24 partial)
scripts/generate-tutorial-screenshots.mjs automatiza captura + montagem de markdown. 3 tutoriais base. UI com mais tutoriais e workflow CI na próxima.
🐛 Bug fix da comunidade
#29 (reportado por @ruiluna) — criar subnet com CIDR ≥128.0.0.0 (192.168.x.x, 172.16.x.x, qualquer público) dava erro "expandiria para 4294967552 IPs". Causa: & em JS força int32 signed, sem >>> 0 o network voltava negativo e broadcast - network + 1 explodia pra ~4B. Bug long-standing — existia desde v0.1, mas só pegava CIDRs onde o bit alto do primeiro octeto estava setado. 10.x.x.x escapava.
Primeiro bug pago pelo template de issue (#6) — comunidade conseguiu abrir estruturado, eu reproduzi e corrigi.
📐 Design specs (projetos separados)
Pra issues que exigem repositórios Go separados ou são projetos multi-semana, entreguei specs detalhadas:
- #15 Terraform Provider —
docs/terraform-provider-design.md(resources, datasources, auth, roadmap) - #16 K8s Operator —
docs/kubernetes-operator-design.md(CRDs IpReservation/SubnetClaim, integração webhook com Service, MetalLB sync) - #26 SNMP + topology —
docs/snmp-topology-design.md(schema NetworkDevice/Port/Neighbor, LLDP discovery, vis-network UI) - #28 gRPC —
docs/grpc-design.md+proto/bagre.proto(schema stub cobrindo subset read-mostly)
🚀 Como atualizar
git pull
docker compose build api web
docker compose up -dSem mudança de env vars. Schema novo (DnsConfig, ValidationRule, SubnetUtilizationSnapshot) propaga via prisma db push no startup do container API.
📊 Resumo da release
| Issues fechadas | 8 (#9, #10, #11, #12, #13, #14, #17 partial, #18, #24 partial, #27, #29) |
| Issues abertas | 4 (#15, #16, #26, #28 — todas com design doc) |
| Commits novos | 17 (incluindo bug fix, design specs e UI) |
| Páginas admin novas | 2 (DNS Settings, Validation Rules) |
| Arquivos novos | 14 |
| Linhas adicionadas | ~3.500 |
🛣️ Próximo
- BIND, Route53, Cloudflare como providers DNS (atual só PowerDNS)
- Plugin custom de validation via
apps/api/plugins/validation/*.js - Mais tutoriais Playwright + workflow CI que regenera automaticamente
- IPv6 — split/merge/next-free
- YAML e NetBox no importer
📦 Código: https://github.com/fabgcruz/bagre — MIT
v0.4.0 — Multi-cloud completo
v0.4.0 — Multi-cloud completo
Marco do roadmap. O Bagre agora conecta AWS + Azure + GCP simultaneamente — single pane of glass para IPs em qualquer combinação de cloud + on-prem, com detecção automática de IPs públicos ociosos em todos os três providers.
✨ Destaques
☁️ Cloud sync Azure (#20)
Service Principal (App Registration + client secret) com OAuth2 client_credentials. Sincroniza:
- VNets e subnets (com região, tags, address prefixes)
- Network Interfaces (private IPs com referência à subnet, VM attachment)
- Public IPs — incluindo unassociated, que entram automaticamente no relatório FinOps
REST puro contra management.azure.com — sem @azure/* SDK (50MB+ de dep evitados).
☁️ Cloud sync GCP (#21)
Service Account JSON key com JWT RS256 manual + OAuth2 JWT bearer (RFC 7523). Sincroniza:
- Subnetworks via aggregated endpoint (todas regions num call só)
- Instances → NICs: private IPs + ephemeral public IPs (
accessConfigs.natIP) - Reserved Addresses: static INTERNAL/EXTERNAL — os EXTERNAL com
users:[]viram FinOps gold (equivalente Elastic IPs unassociated no GCP)
REST puro contra compute.googleapis.com — sem @google-cloud/* SDK.
🎯 O que veio de graça pra Azure e GCP
Como toda a base do v0.2.0 foi desenhada provider-agnostic, ao habilitar Azure e GCP estes recursos passaram a funcionar sem nenhuma mudança adicional:
- FinOps idle public IPs — relatório unificado com custo USD/mês desperdiçado entre os 3 providers
- Catálogos com abas dinâmicas — uma aba por CloudAccount conectada, em todos os providers
- Pool sintético de Public IPs — captura Elastic IPs (AWS) / Public IPs (Azure) / Static EXTERNAL Addresses (GCP)
- Audit log das operações
- Hero card com 3 estados (sem dados / zero ociosos / N ociosos pra revisar)
🚀 Como atualizar
git pull
docker compose build api web
docker compose up -dSem mudança de schema, sem novas env vars obrigatórias.
🔧 Configuração nova
Pra conectar Azure: precisa criar App Registration + client secret + atribuir role Reader na subscription. UI tem instruções inline.
Pra conectar GCP: precisa criar Service Account + role roles/compute.networkViewer + baixar JSON key. UI tem instruções inline + link pra doc.
📊 Comparativo dos providers
| Característica | AWS | Azure | GCP |
|---|---|---|---|
| Auth | Access Key OR Assume Role | Service Principal | Service Account JSON |
| API base | EC2 SDK | REST direto | REST direto |
| Scope | Account ID | Subscription ID | Project ID |
| Regions | iterado | aggregated | aggregated |
| Custo estimado idle/h | $0.005 | $0.005 | $0.010 |
🛣️ Próximo
- #26 SNMP discovery + topology graph (sugestão do Raul)
- #27 Validation plugin system (sugestão do Jesse)
- #15 Terraform Provider
- #16 Kubernetes Operator + CRDs
- #10 IPv6 first-class
📦 Código: https://github.com/fabgcruz/bagre — MIT
v0.3.2 — Histórico de capacidade
v0.3.2 — Histórico de capacidade
Patch release que transforma "acho que essa subnet está cheia" em dado mensurável.
✨ Novidade
📈 Histórico temporal de utilização (#11)
A página de detalhes de cada subnet ganhou um gráfico SVG inline mostrando IPs em uso ao longo do tempo.
- Toggles 7d / 30d / 90d
- Indicador de tendência automático: subindo, estável ou descendo (compara primeiro quarto vs último quarto da janela)
- Linha dashed da capacidade total pra você ver de longe quanto sobra
- Tooltip em cada ponto com data + breakdown (em uso / reservados / livres)
- Botão "Capturar agora" pra forçar snapshot fora do ciclo do scheduler — útil depois de uma operação em massa
⚙️ Por trás
- Schema novo:
SubnetUtilizationSnapshotcom índice composto pra consultas eficientes. - Scheduler periódico (default a cada 60min, configurável via
SNAPSHOT_INTERVAL_MINUTES). - Endpoints REST:
GET /api/subnets/:id/utilization-history?days=NePOST /api/subnets/:id/utilization-snapshot. - Zero dependência nova — SVG inline puro, sem chart lib.
🚀 Como atualizar
git pull
docker compose build api web
docker compose up -dSem novas env vars obrigatórias. O scheduler começa a capturar snapshots automaticamente após ~2min do boot. Para ver tendência de 7d, é preciso esperar ~7 dias rodando.
📝 Notas operacionais
- Retenção: snapshots crescem indefinidamente por enquanto. Para uso em larga escala (10k+ subnets), considerar limpeza periódica numa release futura.
- Volume: ~50 subnets × 24h/dia × 30d = 36k linhas/mês (negligível).
- Captura manual: se você fez bulk ops e quer ver o impacto imediato no gráfico sem esperar o ciclo do scheduler, use o botão "Capturar agora".
🛣️ Próximo
- #20 Cloud sync Azure (fecha o multi-cloud)
- #26 SNMP discovery + topology graph
- #27 Validation plugin system
📦 Código: https://github.com/fabgcruz/bagre — MIT
v0.3.1 — Calculadora CIDR avançada e bulk ops
v0.3.1 — Calculadora CIDR avançada e bulk ops
Patch release focada em produtividade do operador. Sem breaking changes — atualize sem se preocupar.
✨ Novidades
🧮 Calculadora CIDR avançada (#12)
A página /cidr ganhou 4 tabs:
- Análise — parse de um CIDR + detecção em tempo real de overlap com subnets do IPAM + match com master ranges
- Dividir — quebra um CIDR em N subnets menores, marcando quais já estão em uso (com link pra detalhes)
- Próximas livres — "preciso de um /24 dentro de 10.0.0.0/16, me dê 10 opções"
- Supernet — calcula o menor CIDR que contém vários CIDRs (útil pra documentar agregação)
Endpoints REST: /api/cidr/parse, /api/cidr/split, /api/cidr/merge, /api/cidr/next-free.
☑️ Operações em lote nos IPs (#14)
Acabou o clique-em-cada-um:
- Checkbox em cada IP da lista da subnet
- Master checkbox com tri-state (todos / parcial / nenhum) baseado em filtros visíveis
- Barra de ação flutuante quando há seleção
- 3 ações: Reservar, Liberar (com confirm) e Editar campos em massa (tipo, função, notas)
- Endpoint
POST /api/ips/bulkadmin-gated, cap de 500 por chamada
Audit log registra cada ação em massa com diff individual — você ainda consegue auditar quem fez o quê.
🛠️ Infra
- Workflow do Docker Hub faz skip elegante quando secrets não configurados — não polui mais o dashboard com runs vermelhos.
🚀 Como atualizar
git pull
docker compose build api web
docker compose up -dSem mudança de schema, sem novas env vars obrigatórias.
🛣️ Próximo
- #11 Histórico temporal de utilização de subnet (gráfico de uso ao longo do tempo)
- #20 Cloud sync Azure
- #26 SNMP discovery + topology graph
- #27 Validation plugin system
📦 Código: https://github.com/fabgcruz/bagre — MIT
v0.3.0 — Prometheus discovery + security hardening
v0.3.0 — Prometheus discovery + security hardening
Release que responde aos primeiros feedbacks da comunidade após o lançamento, endurece os defaults de segurança e polish geral da experiência.
✨ Destaques
🔥 Prometheus discovery (#25)
Sugerido pelo Leonardo Berbert no LinkedIn — implementado em <24h.
Nova integração admin que conecta no seu Prometheus, lê /api/v1/targets, e cria pending discoveries no Bagre a partir dos labels (__address__, instance, job).
- Auth:
none(default),bearer, oubasic - Tipo derivado do job name (
node→ Servidor Linux,windows→ Servidor Windows, etc) - Scheduler periódico configurável
- Mesmo fluxo de aprovação do Zabbix
Bonus: o pipeline de discovery virou módulo compartilhado, então adicionar SNMP / Nmap / outras descobertas no futuro reusa direto.
🔒 Hardening de segurança
- JWT_SECRET é fail-closed — API recusa boot se < 32 chars ou se for um dos placeholders conhecidos. Tokens forjáveis em deploys mal configurados eram risco real.
- Sem mais "admin123" — se
BOOTSTRAP_ADMIN_PASSWORDnão vier do env, uma senha aleatória forte é gerada e impressa UMA vez no log do container. - docker-compose.yml sem defaults inseguros — todos os tokens vêm do
.env, sem fallbacks placeholder. .env.examplereescrito com instruções claras de geração de cada segredo.
📊 Catálogos com cloud-aware tabs
A aba "Azure Subnets" estática saiu. Em seu lugar: uma aba por cloud account conectado, listando subnets sincronizadas em tempo real (CIDR, region, contagem de IPs, link pra detalhes).
🎯 Hero FinOps reframed
Antes: card verde "Sem desperdício de IPs públicos" mesmo sem conta conectada — falso positivo. Agora 3 estados explícitos:
- Cinza neutro: sem dados pra avaliar
- Verde: auditoria rodou, nenhum ocioso (com nota pra re-sincronizar)
- Âmbar: N ociosos · $X/mês se mantidos · avalie caso a caso
🏷️ EquinixVlan → DatacenterVlan (#23)
Catálogo de VLANs agora é neutro: campo provider aceita Equinix, Ascenty, ODATA, próprio datacenter, etc. Endpoints renomeados de /api/equinix-vlans para /api/datacenter-vlans.
📚 Documentação/processo
- CONTRIBUTING.md novo (#4)
- SECURITY.md novo (#5) — política de disclosure privada via GitHub Security Advisories
- Issue templates (#6) — formulários bug + feature
- docs.html regenerada (#3)
🧹 Removido
- Feature de Firewall Rules — fora do escopo IPAM. NetBox e ferramentas dedicadas fazem isso melhor.
⚠️ Breaking changes
.env requer atualização
JWT_SECRETobrigatório (≥32 chars). Gere com:node -e "console.log(require('crypto').randomBytes(48).toString('base64'))"- Veja
.env.exampleatualizado.
Endpoints renomeados
/api/equinix-vlans/*→/api/datacenter-vlans/*. Quem automatiza via API precisa atualizar.
📦 Como atualizar
git pull
docker compose build api web
docker compose up -dAntes do up -d, garanta que .env está com JWT_SECRET válido — sem isso a API não sobe.
🛣️ O que vem na sequência
Próximas issues na fila:
- #26 SNMP discovery + topology graph (sugestão do Raul Libório)
- #27 Validation plugin system (sugestão do Jesse Fernandes)
- #20 Cloud sync Azure
- #11, #12, #14 — histórico subnet, CIDR avançado, bulk ops
🙏 Obrigado
Comunidade que reagiu ao lançamento e gerou as features desta release:
- Leonardo Berbert — Prometheus discovery
- Raul Libório — SNMP/topology (próximas)
- Jesse Fernandes — gRPC + validation (próximas)
12 issues fechadas nesta release.
📦 Código: https://github.com/fabgcruz/bagre — MIT — docker compose up -d em 5 min
v0.2.0 — Cloud sync (AWS) + FinOps idle public IPs
v0.2.0 — Cloud sync (AWS) + FinOps idle public IPs
Primeira entrega significativa pós-lançamento: o Bagre agora conecta na sua AWS, sincroniza VPCs, subnets, ENIs e Elastic IPs, e mostra quanto você está desperdiçando por mês em IPs públicos ociosos.
✨ Novidades
Cloud Accounts (AWS)
- Nova página admin em /admin/cloud-accounts
- Wizard de conexão com policy IAM read-only copy-paste pronta
- Dois modos de autenticação:
- Access Key — IAM User dedicado (mais simples)
- Assume Role — STS:AssumeRole com external ID (mais seguro)
- Test de credenciais antes de salvar
- Sync manual com feedback de progresso
- Histórico de execuções por account (read, created, updated, errors)
- Credenciais criptografadas com AES-256-GCM no banco
FinOps — IPs públicos ociosos
- Hero card no topo da página: número grande em USD/mês desperdiçados
- Drill-down table com address, account, tag Name, allocation ID, idade
- Endpoint REST:
GET /api/cloud/finops/idle-public-ips - Atualiza a cada 30s
Estrutura de dados
- Subnets e IPs ganham campos opcionais de tracking cloud (
source,cloudAccountId,cloudResourceId,cloudMetadata,ipKind) - Modelos:
CloudAccount,CloudSyncRun, enumsIpKind,CloudProvider,CloudSyncMode,CloudSyncStatus - Per-account site sintético (
cloud-aws-<accountId>) pra isolar múltiplas contas - Public IP pool sintético pra capturar Elastic IPs unassociated (chave do FinOps)
🧹 Removido
- Feature de Firewall Rules — fora do escopo de IPAM. Manage suas regras no NetBox, no provider, ou na ferramenta dedicada. A classificação de equipamento como "Firewall" (FortiGate etc) continua disponível.
⚙️ Configuração nova
Pra usar cloud sync, gere uma chave de criptografia e coloque em .env:
echo "CLOUD_CREDS_KEY=$(node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")" >> .envPra usar Assume Role (opcional), exporte também as credenciais base do Bagre:
AWS_ACCESS_KEY_ID=...
AWS_SECRET_ACCESS_KEY=...
AWS_REGION=us-east-1
docker compose up -d continua funcionando sem nenhuma config nova — cloud sync é opt-in.
🚀 Como atualizar
git pull
docker compose build api web
docker compose up -d🛣️ Próximas entregas
- Scheduler periódico (hoje sync é só manual)
- Azure provider
- GCP provider
- Surface da origem cloud nas páginas de subnet e IP
🙏 Feedback
O Bagre é jovem e essa é a primeira release com a integração cloud. Se sua dor é planilha de IPs ou sangria de Elastic IP idle, abre uma issue ou discussion — feedback de quem sente a dor pauta o que vem antes.
📦 Código no GitHub — MIT — docker compose up -d em 5 min