Skip to content

Releases: fabgcruz/bagre

v0.5.0 — Cleanup do backlog + DNS/Validation com UI

28 May 12:06

Choose a tag to compare

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 Providerdocs/terraform-provider-design.md (resources, datasources, auth, roadmap)
  • #16 K8s Operatordocs/kubernetes-operator-design.md (CRDs IpReservation/SubnetClaim, integração webhook com Service, MetalLB sync)
  • #26 SNMP + topologydocs/snmp-topology-design.md (schema NetworkDevice/Port/Neighbor, LLDP discovery, vis-network UI)
  • #28 gRPCdocs/grpc-design.md + proto/bagre.proto (schema stub cobrindo subset read-mostly)

🚀 Como atualizar

git pull
docker compose build api web
docker compose up -d

Sem 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

28 May 03:31

Choose a tag to compare

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 -d

Sem 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

28 May 01:16

Choose a tag to compare

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: SubnetUtilizationSnapshot com í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=N e POST /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 -d

Sem 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

28 May 00:51

Choose a tag to compare

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/bulk admin-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 -d

Sem 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

27 May 22:58

Choose a tag to compare

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, ou basic
  • 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_PASSWORD nã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.example reescrito 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_SECRET obrigatório (≥32 chars). Gere com:
    node -e "console.log(require('crypto').randomBytes(48).toString('base64'))"
    
  • Veja .env.example atualizado.

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 -d

Antes 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

27 May 14:27

Choose a tag to compare

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, enums IpKind, 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'))")" >> .env

Pra 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