Major version bump from v2.34.0 to v3.2.0.
Breaking changes upstream:
- v3.0.0: UniFi network API shifts (later 10.x); metrics, events and logs
may have changed names/labels.
- v3.2.0: defaults to a 60s background poll feeding cached Prometheus
scrapes (was on-demand poll per scrape). Set interval = 0 in up.conf
to restore on-demand behavior if needed.
Also migrate the container build from a Dockerfile to a native Dagger
pipeline (containers/unpoller/container.py) using the shared helpers in
blumeops.containers, following the navidrome/miniflux pattern. The
build-container workflow already prefers container.py when present.
Refresh last-reviewed and current-version in service-versions.yaml.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Every container now carries title, description, version, source, and
vendor labels per the OCI image spec. Version is derived from the
existing CONTAINER_APP_VERSION ARG at build time.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary
- Deploy UnPoller as a k8s service on indri to export UniFi controller metrics to Prometheus
- Custom-built container from forge mirror (`containers/unpoller/Dockerfile`)
- Credentials pulled from 1Password via external-secrets
- Prometheus scrape job added, docs and service-versions updated
## Test plan
- [ ] Build container: `mise run container-release unpoller v2.34.0`
- [ ] Update kustomization tag with built image tag
- [ ] Deploy from branch: `argocd app set unpoller --revision feature/unpoller && argocd app sync unpoller`
- [ ] Verify pod connects to UX7 controller (check logs)
- [ ] Confirm `unpoller` target appears in Prometheus
- [ ] Query `unifi_` metrics in Grafana
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Reviewed-on: #298