refactor(mosquitto): move broker credentials to OpenBao, delete bootstrap Jobs #450
Closed
claude-bot
wants to merge 2 commits from
mosquitto-openbao into main
pull from: mosquitto-openbao
merge into: :main
:main
:claude/mqtt-admin-register
:claude/shelly-manager-mdns
:feat/wiki-encyclopedia-pilot
:ci-image/claude-2.1.310
:claude/mosquitto-legacy-auth-removal
:claude/egress-lockdown
:fix/gate-embedded-refresh-interval
:fix/gate-embedded-browser-host
:feat/authentik-gate-forwardauth
:docs/drop-wildcard-references
:fix/netbird-controller-disable-dns
:feat/dns-labels-split-2
:feat/dns-labels-split-1
:fix/cloudflare-lb-sync-image-tag
:feat/cloudflare-lb-sync
:fix/wordpress-php85-php2shell
:feat/update-os
:chore/talos-1.13.12
:atlas/talos-v1.13.12-cve-2026-99999
:fix/gitea-webhook-sync-org-scope
:atlas/kuma-mcb-www-retries
:feat/hermes-gitea-pr-review-loop
:atlas/traefik-chart-42
:fix/monitoring-k8s-gateway-probe
:alert-fix/issue-1081-rotator
:ci-image/claude-2.1.306
:alert-fix/issue-1084-v2
:atlas/flux-2.9.6
:alert-fix/issue-1082
:feat/hermes-gitea-issues-kanban
:worktree-restore-test-real
:fix/hermes-multiplex-env
:feat/hermes-experts
:feat/hermes-ha-mcp
:feat/kuma-status-page
:fix/hermes-ha-updates-review
:feat/hermes-alert-monitor
:feat/hermes-ha-updates
:fix/turn-tcp-router
:fix/crowdsec-own-ca
:fix/livekit-service-links
:fix/crowdsec-lapi-transport-ca
:feat/matrix-element-call
:feat/kuma-public-coverage
:feat/ha-matrix-nabu-secret
:feat/hermes-matrix-cross-signing
:feat/hermes-matrix
:fix/wiki-basic-auth-in-service
:proposal/traefik-vip-maglev-dsr
:fix/hermes-dashboard-ws-ping-timeout
:fix/hermes-dashboard-ws-ping-interval
:fix/hermes-dashboard-refresh-token
:feat/wiki-drop-gate
:feat/wiki-oidc-provider
:fix/hermes-soul-talos-node-names
:claude/docs-konairius-main
:claude/drop-k-renner-org-secrets
:claude/prompts-main
:claude/default-branch-main
:feat/hermes-cli-logins
:claude/plan-step0-claude-bot
:alert-fix/issue-1363
:claude/homelab-konairius
:claude/konairius-org-secrets
:fix/hermes-image-registry-bot
:feat/hermes-use-custom-image
:feat/hermes-image
:feat/kuma-task5-monitors
:feat/hermes-gitea
:fix/hermes-configmap-namespace
:feat/hermes-homelab-context
:fix/uptime-kuma-script-mount
:feat/kuma-task4-bootstrap
:feat/kuma-task4-cluster
:feat/kuma-sync-default-notifications
:fix/hermes-image-policy
:fix/kuma-sync-foreign-key-create
:feat/hermes-agent
:chore/kuma-sync-smoke-remove
:feat/kuma-sync-smoke
:feat/kuma-sync-deploy
:ci-image/claude-2.1.303
:renovate/authentik
:renovate/home-assistant-minor-patch
:renovate/pin-image-digests
:feat/kuma-sync
:docs/uptime-kuma-plan
:chore/remove-autokuma
:fix/uptime-kuma-ipv6
:feat/autokuma-pilot-update
:fix/drop-flux-image-automation-alert
:feat/autokuma-pilot
:feat/autokuma
:fix/uptime-kuma-fail-guard
:fix/uptime-kuma-setup-diagnostics
:feat/uptime-kuma-vps
:ci/ansible-image-hvac
:claude/plan-homelab-konairius-main
:fix/kubejobfailed-resolve-on-later-success
:claude/homeassistant-konairius
:claude/ha-config-sync-identity
:feat/site-base-domain
:claude/review-bot-repos-konairius
:claude/authentik-konairius-images
:claude/notes-renovate-konairius
:claude/vsftpd-konairius-image
:claude/registry-bot-read-scope
:claude/registry-bot
:ci-image/claude-2.1.302
:claude/review-bot-approved
:claude/review-bot-backends
:fix/wp-pg-recovery-source
:feat/review-bot-status
:worktree-hcloud-wg-site
:node-dns-via-k8s-gateway
:chore/remove-paperclip
:worktree-k8s-gateway-chart-4
:fix/review-bot-approve-with-unverified
:chore/remove-wiki-maintenance-ci
:fix/review-bot-unique-tag
:fix/review-bot-rereview
:fix/review-bot-build-trigger
:fix/review-bot-backoff-cap
:fix/review-bot-rate-limit
:chore/disable-old-pr-review
:feat/review-bot-deploy
:feat/review-bot-service
:feat/pr-review-mistral
:fix/gitea-mcp-public-gitea-url
:alert-fix/issue-1242
:alert-fix/issue-1241
:fix/gitea-mcp-command
:feat/gitea-mcp
:claude/netbird-service-sync-pin
:claude/gitea-public
:feat/embed-knn-bench
:claude/pr-review-latest-cli
:ci-image/claude-2.1.296
:chore/decommission-openproject
:claude/pr-review-central
:feat/openproject-authentik-oidc
:fix/alloy-syslog-udm-cef-regex
:alert-fix/issue-1217
:alert-fix/issue-1214
:atlas/ren-1363-openproject-seeder-order
:atlas/ren-1367-gitea-1.27
:atlas/ren-1367-gitea-pre-upgrade-snapshot
:atlas/ren-1363-openproject
:atlas/ren-1345-ops-image-jq
:atlas/ren-1345-hermes-prometheus-read
:atlas/ren-1345-bridge-agent-secrets
:atlas/ren-802-retire-sml2mqtt
:atlas/ren-953-remove-legacy-users
:atlas/ren-1307-edge1-register
:atlas/ren-1307-edge1-cred-receiver
:atlas/ren-953-controller-ha-cert
:atlas/ren-1256-prune-shellies-secret
:atlas/ren-953-ha-mqtt-cert-sync
:atlas/ren-1256-adopt-shellies-secret
:atlas/ren-1203-eso-gitea-namespace
:atlas/ren-1203-gitea-package-retention
:atlas/ren-1196-agent-runtime-tzdata
:atlas/ren-1017-remove-legacy-shellies
:atlas/ren-1017-ht-wake-reland
:atlas/ren-1017-shelly-30
:atlas/ren-1167-revert-1183
:alert-fix/issue-1184
:atlas/ren-1017-ht-wake
:atlas/ren-1017-shelly-group5c
:atlas/ren-1017-shelly-group5b
:atlas/ren-1080-controller-1d03144-rotate-hold
:atlas/ren-1017-shelly-group5
:atlas/ren-1017-shelly-group4
:atlas/ren-1053-controller-a307693
:atlas/ren-1017-shelly-group3
:atlas/ren-1017-shelly-group2
:atlas/ren-1017-shelly-group1
:atlas/ren-1017-device-list
:atlas/ren-1017-shelly-accounts
:atlas/ren-953-agents-read-paperclip-pod
:atlas/ren-953-agents-read
:atlas/ren-953-ha-mqtt-tls
:atlas/ren-953-ha-account
:atlas/ren-953-evcc-cert
:atlas/ren-953-evcc-account
:atlas/ren-953-z2m-cert
:atlas/ren-953-z2m-account
:atlas/ren-953-health-probe-cert
:atlas/ren-931-agent-shelly-manager
:atlas/ren-900-controller-bump
:atlas/ren-900-mosquitto-dynsec
:atlas/ren-888-revoke-test-account
:atlas/ren-888-mqtt-account-controller
:atlas/ren-841-remove-repair-job
:atlas/ren-841-k8s-plugin-termination-receipt
:atlas/ren-841-lease-receipt-repair
:atlas/ren-802-suspend-open3e-int-rotator
:atlas/ren-826-remove-read-job
:atlas/ren-826-room-setpoint-read
:atlas/ren-809-remove-capture
:atlas/ren-809-open3e-fbh-capture
:atlas/ren-723-authentik-2026.8.3
:atlas/ren-772-remove-rekey-job
:atlas/ren-772-wp-repo4-rekey
:atlas/ren-722-mdns-relay-v191-attach
:atlas/ren-723-openbao-rolling
:atlas/ren-722-dhcp-lease-renew
:atlas/ren-722-cni-plugins-installer-v1.9.1
:atlas/ren-723-influxdb-snapshot
:atlas/ren-722-cni-plugins-v1.9.1
:atlas/ren-722-job-force-annotations
:atlas/ren-717-matrix-bridge-1791195981
:atlas/ren-702-paperclip-cap-kill
:atlas/ren-691-matrix-bridge-1791179547
:atlas/ren-685-matrix-bridge-1791177680
:ci-image/claude-2.1.289
:atlas/ren-671-matrix-bridge-1791152484
:atlas/ren-663-matrix-public
:atlas/ren-587-matrix-bridge
:atlas/ren-567-authentik-grant-types
:atlas/ren-567-mas
:atlas/ren-627-edge1-ssh-egress
:atlas/ren-621-loki-read-gateway
:atlas/ren-603-pclp-pg-memory
:atlas/ren-583-gitea-pvc-volumename
:atlas/ren-583-gitea-volume-60gi
:atlas/ren-563-claude-session-resume
:atlas/ren-563-revert-1111
:atlas/ren-567-matrix
:atlas/ren-563-acpx-session-resume
:atlas/ren-544-argus-token-v3
:atlas/ren-539-atlas-token-v3
:atlas/ren-541-claude-auto-memory
:atlas/ren-540-hestia-token-v3
:atlas/ren-528-review-bot-verify-repo
:atlas/ren-533-shelly-manager-probe
:atlas/ren-525-rotate-argus-token
:atlas/ren-509-rotate-agent-tokens
:atlas/ren-487-hubble-relay
:atlas/ren-488-govulncheck
:atlas/ren-487-agent-pod-egress
:atlas/ren-453-retire-immich-library
:atlas/ren-451-restore-abort
:atlas/ren-451-restore-test-skip-cnpg
:alert-fix/issue-1095
:atlas/ren-442-restore-capacity-gate
:z2m-ws90-converter
:alert-fix/issue-1089
:atlas/ren-419-ephemeral-wear-alert
:alert-fix/issue-1084
:alert-fix/issue-1081
:atlas/ren-414-agent-kubectl-sa
:atlas/ren-411-agent-gitea-egress
:atlas/ren-409-paperclip-14769
:atlas/ren-405-k8s-plugin-dist
:atlas/ren-401-kaniko-oom
:atlas/ren-401-paperclip-patched-image
:z2m-memory-limit
:atlas/ren-350-beets-write-retry
:fix/navidrome-native-api
:atlas/ren-350-paperclip-lidarr-cnp
:atlas/ren-350-beets-retry-skips
:atlas/ren-350-beets-write
:atlas/ren-350-beets-phase2
:atlas/ren-350-beets-cronjob
:atlas/ren-339-restore-test-teardown
:atlas/ren-339-restore-roll
:atlas/ren-339-restore-plugin
:atlas/ren-339-ha-backup-cleanup
:atlas/ren-339-ha-restore-test
:atlas/ren-315-renovate-groups
:atlas/ren-315-renovate-tool-install
:atlas/ren-107-retention-divergence-alert
:atlas/ren-159-remove-ren28-negative-probes
:atlas/ren-302-claude-agent-acp
:atlas/ren-298-agent-sandbox-v0.5.6
:atlas/ren-294-ical-proxy-926ead0
:atlas/ren-286-agent-runtime-own-workflow
:atlas/ren-285-agent-sandbox-labels
:atlas/ren-286-agent-runtime-images
:atlas/ren-285-agent-sandbox
:atlas/ren-148-paperless-ingress-scoping
:atlas/ren-93-promql-gate
:atlas/ren-268-ha-hacs-proxy
:atlas/ren-266-hacs-versions
:atlas/ren-245-ha-critical-alerts
:atlas/ren-243-ha-window
:feat/openbao-secret-exists-check
:atlas/ren-239-ical-proxy-main-73b5d97
:atlas/ren-238-ical-proxy-main-4783abe
:atlas/ren-201-ical-proxy-gitea-image
:atlas/ren-216-renovate
:atlas/ren-152-wal-backlog-retune
:atlas/ren-198-pin-kps-chart
:atlas/ren-176-ha-pg-walstorage
:atlas/ren-166-cilium-verdict-metric
:atlas/ren-7-alert-contacts
:atlas/ren-177-velero-cephfs-readonly-backuppvc
:feat/paperclip-api-door
:atlas/ren-186-cost-ledger-sync
:atlas/ren-183-yaml-anchors
:atlas/ren-161-promtool-ci
:atlas/ren-163-ceph-nearfull-headroom
:atlas/ren-7-restore-audiobooks
:atlas/ren-127-podmonitor-comment
:atlas/ren-165-wal-maxparallel-stage
:atlas/ren-141-ha-pg-32gi
:atlas/ren-147-cilium-agent-metrics-service
:atlas/ren-142-negative-control-probe
:atlas/ren-140-negative-test-probes
:atlas/ren-102-flux-ksm-crs
:atlas/ren-7-pilot-endpointmonitors
:atlas/ren-131-openbao-unavailable-for
:atlas/ren-106-narrow-eso-failed
:atlas/ren-116-probe-citation-path
:atlas/ren-103-scrape-doc-gaps
:atlas/ren-6-imc-deploy
:atlas/ren-100-externalsecret-healthcheck
:atlas/ren-91-imagepolicy-total-order
:atlas/ren-88-ceph-ec-pool-false-page
:atlas/ren-86-paperclip-dependson-monitoring
:atlas/ren-36-prometheus-read-path
:docs/probe-egress-dependency-and-revert-recipe
:docs/paperclip-claude-token
:fix/paperclip-memory
:docs/probe-cnp-egress-and-status-caveats
:feat/ren-21-paperless-app-health-probe
:feat/ren-21-navidrome-app-health-probes
:alert-fix/issue-968
:feat/paperclip-wiki-key
:feat/lidarr
:feat/wiki-api-key-paperclip
:feat/paperclip-signup-off
:feat/paperclip
:feat/netbird-retire-vps-proxy
:feat/navidrome
:feat/immich-bulk-cutover
:feat/immich-bulk-pvcs
:feat/wiki-image-automation
:chore/wiki-image-fact-drafter
:chore/wiki-image-facts-page
:chore/abs-drop-old-books-pvc
:chore/wiki-image-judge-one-request
:feat/abs-books-bulk
:feat/libation-strip-branding
:feat/cephfs-ec-bulk
:feat/open3e-int-broker-user
:feat/wiki-reloader
:chore/wiki-image-phases-4-6
:feat/wiki-anthropic-key
:feat/wiki-service-write-token
:chore/retire-python-wiki-index
:feat/wiki-machine-door
:chore/wiki-phase3-image
:chore/wiki-phase2-image
:chore/wiki-build-1790250017
:feat/wiki-gate
:fix/gitea-egress-wiki
:feat/wiki-service-manifests
:docs/proposal-wiki-web-api
:alert-fix/issue-937
:fix/alertmanager-info-inhibitor
:feat/cephx-allowed-ciphers-aes256k
:feat/cephx-drop-prior-csi-keys
:ci/wiki-consolidate-tilde-paths
:feat/cephx-csi-aes256k
:ci/wiki-consolidate-in-ci
:chore/talos-1.13.10
:feat/drain-tolerant-singletons
:ci/wiki-distill-skip-empty
:ci/wiki-audit-script
:fix/k8s-gateway-oci-chart
:docs/network-traffic-classes-as-built
:feat/node-ip-vlan-46
:alert-fix/issue-920
:feat/bird-attached-node0
:feat/node-vlan-46-link
:chore/cni-drop-stage-labels
:feat/cni-sole-writer-converge-b2
:feat/cni-sole-writer-converge-b1
:chore/cni-stage-k8s-1
:fix/whereabouts-reconciler-cordon
:chore/cni-stage-k8s-2
:chore/cni-stage-k8s-3
:feat/cni-staged-sole-writer
:feat/netbird-service-sync-phase2
:feat/netbird-service-sync-phase1
:chore/gitea-namespace-phase3
:feat/gitea-namespace-phase2
:feat/gitea-namespace-phase1
:ci-image/claude-2.1.280
:fix/ci-claude-refresh-mixed-pins
:fix/align-ci-claude-pins
:fix/ci-claude-bump-token-newline
:worktree-fix-paperless-memory-limit
:alert-fix/issue-897
:alert-fix/issue-896
:fix/wiki-maintenance-merge-verify
:feat/pick-model-newest-among-comparable
:feat/pick-model-typesafe
:fix/wiki-maintenance-rebase-push
:fix/wiki-maintenance-strip-secrets
:fix/wiki-maintenance-image-2.1.278
:feat/wiki-maintenance-ci
:fix/wiki-index-commit-tags
:fix/wiki-index-pin-digest-2
:alert-fix/issue-880
:fix/wiki-index-tree-paging
:fix/wiki-index-pin-digest
:fix/wiki-index-strip-credentials
:fix/gitea-webhook-egress-wiki-index
:fix/wiki-index-openbao-ingress
:feat/wiki-index-deploy
:feat/wiki-index-image
:fix/eso-allow-ai
:feat/wiki-embed
:fix/multus-only-cni-writer
:fix/cilium-cni-uninstall
:feat/onebase-room-telemetry
:fix/external-dns-scrape-policy
:feat/dns-monitoring
:fix/external-dns-annotation-prefix
:fix/ftp-scanner-probe
:fix/libation-accounts-persistence
:fix/libation-pin-14.2.1
:feat/ceph-read-affinity
:fix/bird-local-cidr
:feat/single-pod-table
:docs/traffic-classes
:feat/podpod-rules
:fix/bird-static
:fix/bird-digest
:feat/bird-mesh2
:feat/bird-kubectl
:feat/bird-mesh
:feat/bird-image-api
:feat/bird-daemonset
:alert-fix/issue-844
:feat/bird-image
:alert-fix/issue-843
:feat/pod-egress-vlan47
:docs/576-rejected-options
:feat/antrea-eval
:feat/nodeip-pod0
:feat/cilium-native-pod0
:feat/bgp-peer-ingress
:feat/bgp-listen-ingress
:feat/ingress-static-addressing
:feat/k8s-net-split-phase-a
:feat/cilium-pin-devices
:chore/ci-k8s-2026-09-08
:feat/flux-2.9.5
:feat/ci-tool-pins
:feat/openbao-seal-key-bootstrap
:feat/openbao-static-seal
:fix/openbao-alerts-immediate
:feat/intel-gpu-dashboard
:feat/intel-gpu-exporter
:feat/intel-gpu-monitoring-resource
:fix/reloader-configmap-annotations
:netbird-proxy-protocol-digest
:netbird-proxy-protocol-deploy
:netbird-proxy-protocol
:netbird-proxy-services-uid
:netbird-proxy-services-deploy
:netbird-proxy-services
:proxy-watchdog-cooldown
:proposal-node-roll-downtime
:alert-fix/issue-808
:lapi-transport-phase-2
:ceph-address-ranges
:fix/arp-flux-second-nic
:rehearsal-san
:osd-partlabel-no-ceph
:lapi-transport-post-crds
:san-host-device-nad
:san-rollout
:san-role-rename
:ceph-20-cutover
:rebuild-tooling
:apply-set-hygiene
:rebuild-image-resilience
:cold-rebuild-ordering
:fix/bootstrap-honour-vm-state
:chore/remove-paperless-eval
:issue-fix/789-cilium-node-ula
:issue-fix/787-mdns-relay-supervisor
:trmnl-firmware-sync-off
:trmnl-device-tls
:vmtest-flux
:eval-script-fixes
:alert-fix/issue-780
:worktree-eval-script-fixes
:eval-out-of-iac
:paperless-eval-jobs
:paperless-eval-fixes
:paperless-eval-instance
:crowdsec-tailer-polling
:crowdsec-alerting
:llama-single-slot
:llama-ctx-revert
:arm-crowdsec-proxy-1
:fix-proxy-deploy-triggers
:llama-ctx-fix
:arm-crowdsec-proxy-2
:llama-ctx-assist
:crowdsec-metrics-dashboard
:alert-fix/issue-761
:embed-batch-fix
:crowdsec-lapi-service-annotations
:ha-llm-agent
:paperless-eval
:crowdsec-bouncer-unpack-on-host
:embed-bgem3
:crowdsec-bouncer-fetch-controller
:crowdsec-edge-lapi
:alert-fix/issue-750
:embed-pvc
:immich-drop-pgvectors
:fix-stale-migration-docs
:embed-oom
:embed-eval
:paperless-reloader
:close-paperless-data-migration
:paperless-llm
:paperless-3x
:llama-gate-flow
:llama-authentik-gate
:alert-fix/issue-726
:llama-single-alias
:llama-alias-order
:llama-model-alias
:ai-eval
:remove-netbird-backup
:llama-thinking-alias
:llama-split-embed
:netbird-backup-vacuum-into
:llama-server
:intel-gpu-device-plugin
:ceph-osd-by-label
:alert-fix/issue-714
:alert-fix/issue-712
:cilium-track-untracked-settings
:proposal-cilium-single-owner
:fix-cilium-bootstrap-seed
:woodpecker-agent-probe
:add-missing-probes
:paperless-http-probes
:gatus-hardening
:gatus-drop-file-check
:gatus-config-reload
:drop-pbs2-gatus
:generic-blackbox-alert
:probe-ci-openbao
:cleanup-nas-1-remnants
:ci-image/claude-2.1.250
:woodpecker-deployment-dispatch-rest
:woodpecker-deployment-dispatch-pilot
:fix-monitor-selector-comments
:fix-wear-alert-design
:trim-comments-authentik
:trim-comments-apps
:trim-comments-helm
:trim-comments-netpol
:trim-comments-infra
:trim-comments-talos
:alert-fix/issue-675
:trim-manifest-comments
:drop-unused-barman-creds
:hetzner-creds-shared-path
:ephemeral-framing
:disk-dashboard-smart
:smartctl-privileged
:smartctl-seccomp
:smartctl-exporter
:disk-dashboard-status
:disk-dashboard
:ci-image/claude-2.1.247
:kaniko-fork-rest
:kaniko-replacement
:proposal-traffic-classes
:runbook-remote-rebuild-possible
:runbook-cold-rebuild-baremetal
:alert-fix/issue-657
:velero-stale-60h
:talos-1-13-9
:ceph-mon-disk-warn-default
:ceph-san-pool-widen
:no-ipv6-on-vlan-parents
:alert-fix/issue-649
:alert-fix/issue-645
:openbao-alerting
:openbao-ha-3-replicas
:alert-fix/issue-635
:ceph-san-cleanup
:ceph-san-nad
:whereabouts-ipam
:talos-1-12-11
:mdns-relay
:netbird-rotate-migration
:runbook-stale-sockets
:drop-monitoring-agent
:ansible-drop-dead-plays
:ansible-rotate-netbird
:ansible-drop-pve
:tofu-state-verify
:alert-fix/issue-603
:drop-decommissioned-dns
:tofu-drop-proxmox-vm
:drop-pve-monitoring
:talos-factory-installer
:cilium-reloader
:drop-talos-image-seeding
:cilium-vlan-bypass
:restore-replicapool-size
:restore-cephfs-metadata-size
:alert-fix/issue-592
:ceph-readd-neptune
:k8s-3-baremetal
:ceph-drop-neptune
:alert-fix/issue-591
:ceph-readd-saturn
:alert-fix/issue-590
:remove-vm-605
:remove-vm-151
:k8s-2-baremetal
:ceph-remove-k8s-2
:baremetal-conversion-runbook
:restore-after-jupiter
:alert-fix/issue-579
:ceph-readd-k8s-1
:k8s-1-network-fix
:alert-fix/issue-573
:k8s-1-ephemeral-on-crucial
:alert-fix/issue-571
:alert-fix/issue-569
:immich-window-scaledown
:ceph-exclude-k8s-1
:crowdsec-cpu-requests
:jupiter-baremetal-u2
:velero-restore-test-monthly
:ws90-reporting-config
:alert-fix/issue-562
:fix-ws90-merge-overclaim
:fix-ws90-debounce-rationale
:worktree-z2m-2.13.0-ws90-debounce
:kaniko-no-debug-image
:alert-fix/issue-557
:alert-fix/issue-554
:alert-fix/issue-550
:bump-stale-ci-images
:document-pool-no-redundancy-meaning
:fix-ci-pool-blocks-osd-maintenance
:rotate-cephx-daemon-keys
:fix-ceph-health-alert
:repoint-ci-workspaces
:ci-throwaway-cephfs
:rollout-archive-timeout
:archive-timeout-gf-pg
:reduce-pg-wal-fpi
:reduce-wal-segment-padding
:fix-prometheus-cardinality
:fix-barman-sidecar-visible
:feat-paperless-data-repoint
:feat-paperless-data-block
:fix-cnpg-write-tuning
:fix-emptydir-tmpfs
:fix-trmnl-renderer-tmpfs
:feat-ha-recorder-db-url
:alert-fix/issue-525
:fix-cnpg-backup-alerting
:feat-ha-recorder-postgres
:fix-ceph-mon-write-amplification
:fix-ceph-replica-size-2
:fix-ceph-deferred-write-amplification
:fix-326-noise-log-suppression
:fix-381-z2m-discovery
:decommission-rustfs-lxc
:document-hairpin-id-diff
:fix-rustfs-shim-replace
:fix-rotator-woodpecker-url
:alert-fix/issue-510
:bump-woodpecker-cli
:migrate-woodpecker-stage3
:migrate-woodpecker-stage2
:fix-eso-woodpecker-namespace
:migrate-woodpecker-namespace
:ceph-mon-data-avail-warn
:revert-image-gc-thresholds
:fix-ceph-toolbox-and-gc-thresholds
:fix-cilium-policy-map-exhaustion
:drop-stale-hetzner-dns
:fix-outpost-callback-path
:bump-ci-k8s-pins
:fix-wordpress-config-extra
:wordpress-renner-uno
:fix-authentik-double-passkey-touch
:pin-ical-proxy-image
:fix-trmnl-renderer-reloader
:fix-trmnl-render-lang
:fix-trmnl-session-expiry
:fix-trmnl-graphite-theme
:fix-trmnl-token-lifetime
:fix-trmnl-renderer-runtime
:feat-trmnl-renderer
:fix-trmnl-lb-address
:feat-trmnl-terminus
:retire-dead-monitoring
:heating-can-supervisorctl
:fix-native-teardown
:edge-capability-groups
:heating-can-image
:edge-bootstrap-selfcontained
:prometheus-pve-hostnames
:inventory-pve-hostnames
:chrony-allow-ipv6
:ntp-vrrp-linklocal-and-dad-sequencing
:ntp-service-address-health-gated
:ntp-anycast-capture-drift
:ntp-health-clock-correctness
:chrony-comment-correction
:worktree-chrony-makestep
:ci-k8s-validate
:rotator-repin
:mosquitto-rotate-health
:alert-fix/issue-454
:alert-fix/issue-452
:mosquitto-rotation-proposal
:mosquitto-openbao
:mosquitto-drop-apk
:paperless-drop-apk
:cni-plugins-image
:multus-drop-apk
:fix-jq-comment
:rename-alpine-jq
:fix-ci-yaml
:z2m-seed-drop-apk
:z2m-interview-watchdog
:alert-fix/issue-439
Labels
Clear labels
apollo
atlas
clio
daedalus
hestia
Hermes expert: Immich, Audiobookshelf, Libation, Navidrome, Music Assistant
Hermes expert: Talos, Flux, network, Authentik, Matrix, monitoring
Hermes expert: Paperless, wiki, ical-proxy, TRMNL, websites
Hermes expert: Gitea, Woodpecker, Renovate, review-bot, Hermes
Hermes expert: Home Assistant, IoT, MQTT, ESPHome, voice
No labels
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: konairius/homelab#450
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Replaces #449 (closed). Instead of tidying the bootstrap Jobs, this deletes them.
518 lines → 14 declarative ones. Out: 7 Jobs, a ServiceAccount, a Role, a RoleBinding, the
curl, thejq, theapk add, and thealpine-curl-jqimage dependency. In: 7 ExternalSecrets matching themosquitto-evcc-credentialspattern already in the same directory.Why deleting beats fixing
Each Job was ~70 lines of shell that generated a password, base64'd it, hand-built Secret JSON with
jq, and POSTed it to the Kubernetes API withcurl.More importantly it could not be maintained: a Job's
spec.templateis immutable, so merely changing the container image made the whole home-assistant Kustomization fail to reconcile — that's what made #449 unmergeable. Deleting is the only way to change a completed Job, and since this Kustomization hasprune: true, removing them from git does exactly that instead of attempting a patch the API rejects.The passwords also only ever existed in the Secret objects — not in OpenBao, so not backed up, not centrally rotatable, and unrecoverable if a Secret were lost.
Migration is value-preserving
This is the part that mattered. The broker has already hashed these passwords (
mosquitto_passwd -Uat startup) and every client is using them, so generating fresh ones would have broken Home Assistant, zigbee2mqtt, shellies, sml2mqtt, open3e and the health check simultaneously.So the live values were copied into OpenBao first, each round-trip verified by sha256:
Values were passed to
baoon stdin, never argv, so they never entered process listings or shell history. No value was printed at any point.The one real unknown, tested
Whether ESO would adopt a Secret it didn't create. Tested live on the least critical credential before committing:
3a145b6cc97f3a145b6cc97f— unchangedreconcile.external-secrets.io/managedtrueownerReferencesExternalSecretSecretSynced,Ready=True. ESO adopts and rewrites byte-identically, so consumers observe nothing.Also confirmed the Secrets carry no
ownerReferencesfrom the Jobs, so pruning the Jobs cannot garbage-collect them.Deliberately not normalised
mosquitto-credentialskeeps the keyhomeassistant-passwordwhile the other six keeppassword. That asymmetry came from the original Jobs, and consumers reference those key names — unifying them would be a separate breaking change. Each OpenBao entry was seeded with its matching key name, sincedataFrom.extractcopies whatever keys the entry holds.Rotation, before and after
refreshInterval.The broker still needs a restart to re-hash, unchanged.
Verification
kustomize build+ server-side dry run (0 errors); all 7 Jobs and the SA/Role/RoleBinding gone from the rendered output; all 8 mosquitto ExternalSecrets present.Note the
mosquitto-health-credentialsExternalSecret already exists in-cluster from the adoption test above — merging simply brings git into line with it.🤖 Generated with Claude Code
🤖 Automated review — model
CLI default(complexity: complex), commitb24442ab71e6c2f1392e9d1cf21a5e2252d26645.Summary
Deletes the 518-line
mosquitto-bootstrap.yaml(7 bootstrapJobs + aServiceAccount/Role/RoleBindingthat hand-generated broker passwords viacurl+jqagainst the Kubernetes API) and replaces it with 7ExternalSecrets pulling the same credentials from OpenBao, following the existingmosquitto-evcc-credentials-externalsecret.yamlpattern in the same directory. I checked every consumer against the new resources and everything lines up — no blocking issues found.🟡 Suggestions
kubernetes/apps/home-assistant/mosquitto-bootstrap-credentials-externalsecrets.yaml: this PR's safety hinges entirely on the OpenBao values underapps/home-assistant/mosquitto-*-credentialsalready being seeded with the exact live passwords (the PR body documents this was done and sha256-verified out of band). That step isn't visible in the diff or checkout — there's no way to verify it from here. If it hasn't actually happened yet for all 7 keys before this merges, ESO will adopt each Secret withcreationPolicy: Ownerand overwrite it with whateverdataFrom.extractreturns (empty/missing key on a 404, or a fresh value if someone pre-seeded something else), silently rotating live broker credentials and locking out Home Assistant, zigbee2mqtt, shellies, sml2mqtt, open3e, evcc, and the health probe simultaneously. Worth a final confirmation the OpenBao entries are in place before merge, since the file itself can't prove it.creationPolicyexplicitly, so it's implicitlyOwner(default). The PR body says this was tested live formosquitto-health-credentialsand confirmed to adopt the existing Secret byte-identically and setownerReferences. Given that Secret now has anExternalSecretowner and the Kustomization hasprune: true, deleting theExternalSecretresource (not just this Job) in a future change will now delete the live Secret too — a behavior change worth keeping in mind for whoever edits this file next (the header comment could mention it, since the old Jobs had no such coupling).🟢 Nits
kubernetes/apps/home-assistant/mosquitto-bootstrap-credentials-externalsecrets.yaml: filename still says "bootstrap" even though the whole point of the change is that these are no longer bootstrap Jobs. A name likemosquitto-credentials-externalsecrets.yamlwould better reflect the new steady-state role, though keeping "bootstrap" as a breadcrumb for git-blame archaeology is a reasonable tradeoff too.target.namecomment onmosquitto-credentials("unchanged name; HA's MQTT integration reads this") and on the siblingmosquitto-evcc-credentials-externalsecret.yaml("keeps the old Secret's name — consumers unchanged") say the same thing with different wording; not worth blocking on, just noting for consistency-minded future edits.Tests
No test suite applies here (GitOps YAML, no CI-run tests in this repo for Kustomize resources). Verification is operational: the PR body states
kustomize build+ a server-side dry run passed, and the author manually tested ESO's adoption behavior live against one of the seven existing Secrets before writing this migration. I independently confirmed from the checkout that:ExternalSecretnames/target names (mosquitto-credentials,mosquitto-admin-credentials,mosquitto-health-credentials,mosquitto-open3e-credentials,mosquitto-shellies-credentials,mosquitto-sml2mqtt-credentials,mosquitto-zigbee2mqtt-credentials) match thesecretKeyRefnames/keys consumed inmosquitto-deployment.yaml(including the asymmetrichomeassistant-passwordkey onmosquitto-credentialsvs.passwordon the rest).home-assistantnamespace is already listed inkubernetes/infrastructure/post-crds/openbao-clustersecretstore.yaml'sconditions.namespaces, so no additional RBAC/ClusterSecretStore change is needed for theseExternalSecrets to sync.mosquitto-bootstrapServiceAccount/Role/RoleBindingor theapp.kubernetes.io/name: mosquitto-bootstraplabel (e.g., no stray NetworkPolicy), so nothing is left dangling by the deletion.The one thing that cannot be verified from a static checkout — that the live OpenBao entries actually hold the current production passwords — is called out above as a pre-merge suggestion, not a defect in the diff itself.
Recommendation
Looks reasonable — no blocking issues; comments above are optional (though the OpenBao-seeding suggestion is worth a final confirmation before merge given the blast radius of getting it wrong).
No — I said I would wait for this review and then did not read it until prompted. Addressed now in
3d905416.🟡 Confirm the OpenBao seeding before merge
The right thing to push on: this PR's safety rests on a fact the diff cannot show, and the blast radius of getting it wrong is every MQTT client at once. Re-verified independently just now, against the live Secrets rather than against my earlier run:
The
ABSENTcase you worried about is covered too: the readback substitutes the literal stringABSENTfor a missing key, which would hash differently and show MISMATCH rather than silently comparing empty to empty.🟡 The new ownership coupling
Good catch, and a genuine behaviour change I had not written down. With
creationPolicyimplicitlyOwner, ESO sets an ownerReference from each Secret to its ExternalSecret; withprune: true, deleting an ExternalSecret block now deletes the live Secret and that client's broker access. The old Jobs created Secrets with no ownerReference, so removing a Job left its Secret untouched — that safety net is gone.Now documented prominently in the file header, including the
creationPolicy: Orphanescape hatch for detaching a credential without destroying it.🟢 Filename
Renamed to
mosquitto-credentials-externalsecrets.yaml. "bootstrap" described Jobs that no longer exist. git tracks the rename, so the blame trail you wanted to preserve survives without the misleading name.🟢 Comment wording overlap
Left alone deliberately — harmonising it would mean touching
mosquitto-evcc-credentials-externalsecret.yaml, a file this PR otherwise does not modify.On your verification work
Worth noting you checked three things I had not: that the
secretKeyRefnames and keys inmosquitto-deployment.yamlmatch all seven (including the asymmetrichomeassistant-password), thathome-assistantis already in the ClusterSecretStore'sconditions.namespacesso no RBAC change is needed, and that nothing else references the deleted ServiceAccount/Role/RoleBinding or theapp.kubernetes.io/name: mosquitto-bootstraplabel. That last one is exactly the kind of dangling reference this deletion could have left behind.🤖 Automated review — model
CLI default(complexity: complex), commit3d905416bc9e9002edef5e6626f7bc9a7d0e1819.Summary
Deletes
mosquitto-bootstrap.yaml(508 lines: 7curl/jq-based bootstrap Jobs plus a ServiceAccount/Role/RoleBinding that hand-generated broker credentials as plaintext-only Secrets) and replaces it withmosquitto-credentials-externalsecrets.yaml(14 lines × 7 ExternalSecrets pulling from OpenBao via theopenbaoClusterSecretStore). This follows the exact pattern already in production in the same directory (mosquitto-evcc-credentials-externalsecret.yaml). No blocking issues found.I verified against the checkout:
secretStoreRef/dataFrom.extractshape matches the existing workingmosquitto-evcc-credentials-externalsecret.yamlexactly.mosquitto-deployment.yaml:152-196(mosquitto-credentials/homeassistant-passwordkept distinct from the other six, which all usepassword, as the PR body states).kubernetes/tomosquitto-bootstrap, the deleted ServiceAccount/Role/RoleBinding, or thealpine:3.21/curl/jqbootstrap image.kubernetes/clusters/homelab/home-assistant.yamlconfirms thehome-assistantFlux Kustomization hasprune: true, which is exactly the mechanism the PR relies on to remove the Jobs (a Job'sspec.templateis immutable so an in-place patch would otherwise fail).ClusterSecretStore/openbaoexists (kubernetes/infrastructure/post-crds/openbao-clustersecretstore.yaml).I could not independently re-run
kustomize build/ a server-side dry-run in this environment, so I leaned on the cross-checks above rather than re-verifying the PR's own build output.🟡 Suggestions
kubernetes/apps/home-assistant/mosquitto-deployment.yaml:180,189-191,233still reference the now-deleted*-bootstrapJob names in comments (e.g. "Probe-only credential (mosquitto-health-credentials-bootstrap)", "mosquitto-health-credentials-bootstrap Job"). These are now dangling references to objects that no longer exist. Not incorrect in intent, but since this PR's whole point is retiring those Jobs, it'd be worth a small follow-up to reword them (or fold into this PR) so they don't point future readers at nonexistent resources.Tests
No automated test framework applies to this GitOps manifest change; the appropriate verification is
kustomize build+ a server-side dry run, which the PR body states was done (0 errors, all 7 Jobs/SA/Role/RoleBinding gone, all 8 mosquitto ExternalSecrets present) along with a live pre-merge test of ESO adopting an existing Secret without changing its content. I was not able to re-run the build/dry-run myself in this sandbox, but the static checks above (consumer key names, resource references, prune flag, ClusterSecretStore existence) are all consistent with what the PR claims.Recommendation
Looks reasonable — no blocking issues; comment above is optional.
Closing. The objection is correct and fatal: this depends on OpenBao already containing values I copied in by hand, which git cannot recreate. A fresh OpenBao would leave these paths empty and ESO would then overwrite live broker credentials with nothing.
Investigating the alternatives turned up why this is hard, and it is not an implementation problem:
KNOWN-PREEXISTING-VALUE-> freshly generated), so adopting it rotates every live password.shellies,sml2mqttandopen3ehave no in-cluster workloads at all — those passwords live in Shelly device firmware and external daemons.mosquitto-credentialsis entered by hand in the Home Assistant MQTT UI, andadminis held by a workstation client. Onlyhealthandzigbee2mqttare fully in-cluster and safe to rotate unattended.So no approach is simultaneously declarative, git-self-sufficient, and value-preserving — because 5 of these credentials are pinned by consumers outside the cluster. That is the actual constraint, and it is worth recording here rather than rediscovering.
The OpenBao entries seeded during this attempt hold the current live values and are harmless (nothing reads them now that these ExternalSecrets are gone), but they are hand-made state and should be removed if this direction is abandoned for good.
One artefact of the adoption test remains:
mosquitto-health-credentialshas an ExternalSecret in-cluster and its Secret now carries an ExternalSecret ownerReference. That needs unwinding — withprune: trueand no manifest in git, Flux will delete the ExternalSecret, and the ownerReference means the live Secret goes with it. Handling that before it bites.Pull request closed