Step 2 of 2 for the last rotator. Ports pve-exporter from inline python to the binary's proxmox-token mode (merged in #339). Net -48 lines — and with this, inline Python is fully retired: all 12 rotators run the one binary, and the openbao image is left only to the raft-snapshot job.
Tested live end-to-end — the destructive test
Unlike every prior port (throwaway-token or roll-in-place), this one rotates the realmonitoring token, so it briefly breaks pve-exporter metrics. Ran it and verified full recovery:
job Complete: DELETE+recreated pve-exporter@pve!monitoring (privsep=0)
OpenBao pve.yml: 529d7f66 -> f7ca2141, document well-formed
no-verify TLS path worked vs the real in-cluster Service (valid LE cert, hostname mismatch)
-> this was the only piece that could not be unit/throwaway tested
PVE token recreated privsep=0 (inherits the user's PVEAuditor ACL)
ESO synced -> Reloader restarted pve-exporter -> RECOVERED:
OpenBao and k8s token_values MATCH
new token authenticates: /version 8.4.18
pve_up=1.0 for cluster + jupiter + neptune + saturn
The brief gap between delete and Reloader-restart is inherent to Proxmox having no atomic roll (documented in the header); off-hours quarterly makes it acceptable — the same tradeoff the python had.
Flux strips the old python command on apply (verified on the earlier ports); port via Flux, not kubectl apply. Image digest sha256:97c22bcf….
Step 2 of 2 for the **last** rotator. Ports pve-exporter from inline python to the binary's `proxmox-token` mode (merged in #339). **Net -48 lines** — and with this, **inline Python is fully retired**: all 12 rotators run the one binary, and the openbao image is left only to the raft-snapshot job.
## Tested live end-to-end — the destructive test
Unlike every prior port (throwaway-token or roll-in-place), this one rotates the **real** `monitoring` token, so it briefly breaks pve-exporter metrics. Ran it and verified full recovery:
```
job Complete: DELETE+recreated pve-exporter@pve!monitoring (privsep=0)
OpenBao pve.yml: 529d7f66 -> f7ca2141, document well-formed
no-verify TLS path worked vs the real in-cluster Service (valid LE cert, hostname mismatch)
-> this was the only piece that could not be unit/throwaway tested
PVE token recreated privsep=0 (inherits the user's PVEAuditor ACL)
ESO synced -> Reloader restarted pve-exporter -> RECOVERED:
OpenBao and k8s token_values MATCH
new token authenticates: /version 8.4.18
pve_up=1.0 for cluster + jupiter + neptune + saturn
```
The brief gap between delete and Reloader-restart is inherent to Proxmox having no atomic roll (documented in the header); off-hours quarterly makes it acceptable — the same tradeoff the python had.
Flux strips the old python `command` on apply (verified on the earlier ports); port via Flux, not kubectl apply. Image digest `sha256:97c22bcf…`.
## After this merges
```
12/12 rotators on the secret-rotator binary
random (5): paperless, authentik, woodpecker, crowdsec, shelly-manager
ha-token (3): prometheus, config-sync, shelly-manager-llat
cloudflare-roll (2): cloudflare, external-dns
netbird-key (1): netbird-ingress
proxmox-token (1): pve-exporter
inline Python: retired
```
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The LAST rotator. Replaces the inline python with the secret-rotator binary's
proxmox-token mode. Net -48 lines; inline Python is now fully retired — every
rotator runs the one binary, and the openbao image is left only to the
raft-snapshot job.
Tested live end-to-end via the real binary image — the destructive test that
could not be zero-blast-radius, since it rotates the real monitoring token:
- job Complete: DELETE+recreated pve-exporter@pve!monitoring (privsep=0),
OpenBao pve.yml rotated 529d7f66 -> f7ca2141, document well-formed
- the no-verify TLS path worked against the real in-cluster Service (valid LE
cert, hostname mismatch) — the piece that could only be compile-proven
- PVE token recreated privsep=0 (inherits the user's PVEAuditor ACL)
- ESO synced, Reloader restarted pve-exporter, and it recovered: OpenBao and
k8s token_values match, the new token authenticates (/version 8.4.18), and
pve_up=1.0 for the cluster and all three nodes
The brief metrics gap between delete and Reloader-restart is inherent to
Proxmox having no atomic roll (documented in the header); off-hours quarterly
makes it acceptable.
Flux strips the old python `command` on apply (verified on the earlier ports);
port via Flux, not kubectl apply.
Image digest sha256:97c22bcf…
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
Step 2 of 2 for the last rotator. Ports pve-exporter from inline python to the binary's
proxmox-tokenmode (merged in #339). Net -48 lines — and with this, inline Python is fully retired: all 12 rotators run the one binary, and the openbao image is left only to the raft-snapshot job.Tested live end-to-end — the destructive test
Unlike every prior port (throwaway-token or roll-in-place), this one rotates the real
monitoringtoken, so it briefly breaks pve-exporter metrics. Ran it and verified full recovery:The brief gap between delete and Reloader-restart is inherent to Proxmox having no atomic roll (documented in the header); off-hours quarterly makes it acceptable — the same tradeoff the python had.
Flux strips the old python
commandon apply (verified on the earlier ports); port via Flux, not kubectl apply. Image digestsha256:97c22bcf….After this merges
🤖 Generated with Claude Code
The LAST rotator. Replaces the inline python with the secret-rotator binary's proxmox-token mode. Net -48 lines; inline Python is now fully retired — every rotator runs the one binary, and the openbao image is left only to the raft-snapshot job. Tested live end-to-end via the real binary image — the destructive test that could not be zero-blast-radius, since it rotates the real monitoring token: - job Complete: DELETE+recreated pve-exporter@pve!monitoring (privsep=0), OpenBao pve.yml rotated 529d7f66 -> f7ca2141, document well-formed - the no-verify TLS path worked against the real in-cluster Service (valid LE cert, hostname mismatch) — the piece that could only be compile-proven - PVE token recreated privsep=0 (inherits the user's PVEAuditor ACL) - ESO synced, Reloader restarted pve-exporter, and it recovered: OpenBao and k8s token_values match, the new token authenticates (/version 8.4.18), and pve_up=1.0 for the cluster and all three nodes The brief metrics gap between delete and Reloader-restart is inherent to Proxmox having no atomic roll (documented in the header); off-hours quarterly makes it acceptable. Flux strips the old python `command` on apply (verified on the earlier ports); port via Flux, not kubectl apply. Image digest sha256:97c22bcf… Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>