Commit Graph
2034 Commits
Author SHA1 Message Date
k.renner 5306c47600 Merge pull request 'feat(esphome): enable OTA + BLE debug logging on the shelly proxy' (#181) from feat/esphome-proxy-ota into master
Reviewed-on: gitea_admin/homelab#181
2026-07-14 07:39:20 +00:00
claude-bot 2990f6e425 feat(esphome): enable OTA + BLE debug logging on the shelly proxy
Provisioning a Shelly over BLE fails at the GATT connect and the cause is
inside the ESP's BLE stack — invisible from shelly-manager's side. To
diagnose and iterate without a USB re-flash per change:

  * ota: (esphome platform) so future config changes push over WiFi from the
    ESPHome Device Builder. Bootstrapping costs one USB flash; set
    shelly_ble_proxy_ota_password in the dashboard secrets first.
  * logger DEBUG with esp32_ble_client=VERBOSE / esp32_ble_tracker,
    bluetooth_proxy=DEBUG, so a connect attempt logs its progress and the
    failure reason.

Takes effect on the (one) USB re-flash; thereafter iterate remotely.

Co-Authored-By: Claude Bot <claude-bot@renner.uno>
2026-07-14 09:19:59 +02:00
security-bot 1f1d8ea19a chore(image-automation): bump gitea.renner.uno/k.renner/shelly-manager:build.1784011854
Updates managed by image-automation-controller.
2026-07-14 07:12:44 +00:00
security-bot 32d66baf92 chore(image-automation): bump gitea.renner.uno/k.renner/shelly-manager:build.1784011282
Updates managed by image-automation-controller.
2026-07-14 06:42:44 +00:00
security-bot 5dafcb9f03 chore(image-automation): bump gitea.renner.uno/k.renner/shelly-manager:build.1784008879
Updates managed by image-automation-controller.
2026-07-14 06:12:44 +00:00
k.renner 7541ec5b23 Merge pull request 'fix(openbao): drop banned k. hostname → openbao.renner.uno + namespace CNP' (#180) from openbao-hostname-fix into master
Reviewed-on: gitea_admin/homelab#180
2026-07-14 06:06:31 +00:00
claude-botandClaude Fable 5 7cb7b9e0d1 fix(openbao): drop banned k.renner.uno hostname; fence namespace with CNP
openbao.k.renner.uno -> openbao.renner.uno. The k. subdomain is a
migration-era artifact, never a production convention, and is banned
per owner directive 2026-07-14 — the wiki note that claimed a
dual-hostname convention was wrong and is being corrected.

Non-public reachability is a real control, not a hostname: the public
edge serves only explicitly configured SNI (openbao is not configured),
and the new CiliumNetworkPolicy default-denies the namespace with
explicit grants (traefik->8200, ESO->8200, intra-ns for the snapshot
CronJob) matching the <app>-ns.yaml pattern.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-14 08:03:19 +02:00
security-bot 9dfe35ae8b chore(image-automation): bump gitea.renner.uno/k.renner/shelly-manager:build.1783990880
Updates managed by image-automation-controller.
2026-07-14 01:12:44 +00:00
k.renner 94a3d7736f Merge pull request 'fix(dns): repoint k8s-gateway fallthrough off the decommissioned PVE DNS VIP' (#179) from worktree-fix-k8s-gateway-dns-upstream into master
Reviewed-on: gitea_admin/homelab#179
2026-07-14 00:56:49 +00:00
k.rennerandClaude Opus 4.8 12c2668865 fix(dns): repoint k8s-gateway fallthrough off the decommissioned PVE DNS VIP
The renner.uno fallthrough forwarder still pointed at the Proxmox DNS HA VIP
10.2.40.53, which is decommissioned/unreachable. Every non-Ingress renner.uno
name (device/service hostnames like udm.renner.uno) therefore dead-ended in
SERVFAIL/timeout. A routine home-assistant pod restart on 2026-07-14 forced HA
to re-resolve its device hostnames and left ~1374 entities unavailable / ~30
config entries stuck (ZHA, Shelly, UniFi, Bluetooth, cloud integrations).

Point the fallthrough at the UDM (10.2.40.1 / fd00::1), which serves the
split-horizon renner.uno zone (verified: it answers udm.renner.uno). Also
scrub the stale 10.2.40.53 references in the CoreDNS comment, bootstrap.sh
DNS_SERVER, and the Gatus monitor (which was pointlessly probing the dead VIP).

A live hotfix has already been applied to the k8s-gateway ConfigMap to restore
resolution; this makes it durable so Flux does not revert it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PwcQMntG9y9XRkNMPDq2fe
2026-07-14 02:53:33 +02:00
security-bot 1db8aa8247 chore(image-automation): bump gitea.renner.uno/k.renner/shelly-manager:build.1783988815
Updates managed by image-automation-controller.
2026-07-14 00:42:44 +00:00
security-bot 5f7e10be51 chore(image-automation): bump gitea.renner.uno/k.renner/shelly-manager:build.1783987204
Updates managed by image-automation-controller.
2026-07-14 00:12:44 +00:00
k.renner 2e4fdff9e2 Merge pull request 'fix(openbao): restricted-PodSecurity compliance for snapshot CronJob' (#178) from openbao-snapshot-hardening into master
Reviewed-on: gitea_admin/homelab#178
2026-07-14 00:10:32 +00:00
claude-botandClaude Fable 5 476cfb2d12 fix(openbao): satisfy restricted PodSecurity in snapshot CronJob
allowPrivilegeEscalation=false + drop ALL capabilities on the snapshot
container — the manual verification run worked but tripped the
restricted:latest warning.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-14 02:08:36 +02:00
k.renner cb3894b2f4 Merge pull request 'feat(openbao): nightly raft snapshots + velero offsite shipping' (#177) from openbao-snapshots into master
Reviewed-on: gitea_admin/homelab#177
2026-07-14 00:06:54 +00:00
claude-botandClaude Fable 5 6afff75b6e feat(openbao): nightly raft-snapshot CronJob + velero offsite schedule
bao operator raft snapshot save nightly at 03:00 to a dedicated PVC
(keep 7), authenticated via a new k8s-auth role openbao-snapshot ->
policy raft-snapshot (read on sys/storage/raft/snapshot only; applied
2026-07-14). Velero openbao-daily (06:15) ships ONLY the snapshot PVC
offsite via label selector — the live raft data PVC stays unbacked
(crash-consistent files; the .snap is the restore artifact). A failed
Job doubles as the sealed-after-restart alarm.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-14 02:04:33 +02:00
k.renner 38e0be5415 Merge pull request 'feat(shelly-manager): discover BLE proxies via mDNS, drop static hostname' (#176) from feat/ble-proxy-mdns-env into master
Reviewed-on: gitea_admin/homelab#176
2026-07-13 23:44:12 +00:00
security-bot f8010f436e chore(image-automation): bump gitea.renner.uno/k.renner/shelly-manager:build.1783986017
Updates managed by image-automation-controller.
2026-07-13 23:42:43 +00:00
claude-bot d386df84be feat(shelly-manager): discover BLE proxies via mDNS, drop static hostname
shelly-manager now auto-discovers esphome bluetooth_proxy nodes on the IoT
VLAN via mDNS (_esphomelib._tcp) — see k.renner/shelly-manager#14. Replace
the static Ble__Proxies__0__{Name,Host,Port} env (which addressed the proxy
by shelly-ble-proxy-1.iot.renner.uno — poisoned over IPv6 by the
*.renner.uno wildcard) with a single shared fleet Noise key exposed as
Ble__Discovery__Key, from the same shelly-ble-proxy-key secret.

Merge after #14's image is live so discovery is present when the static
entry goes away.

Co-Authored-By: Claude Bot <claude-bot@renner.uno>
2026-07-14 01:41:13 +02:00
k.renner 815a710549 Merge pull request 'feat(secrets): final batch — authentik to OpenBao/ESO (repo is sops-free)' (#175) from openbao-authentik into master
Reviewed-on: gitea_admin/homelab#175
2026-07-13 23:38:48 +00:00
claude-botandClaude Fable 5 fa437a608c feat(secrets): migrate authentik secrets to OpenBao (final batch)
authentik-secrets + samba-bridge config: values in OpenBao KV, both
round-trip-verified text. The identity provider was deliberately last —
every other consumer proved the pipeline first. ZERO sops files remain
under kubernetes/; authentik KS decryption dropped. Phase 4 (age-key
retirement) is now unblocked pending soak.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-14 01:34:04 +02:00
k.renner 977880908b Merge pull request 'feat(secrets): seed batch — CNPG/backup seed secrets to OpenBao/ESO' (#174) from openbao-seed into master
Reviewed-on: gitea_admin/homelab#174
2026-07-13 23:27:08 +00:00
claude-botandClaude Fable 5 1c732045d5 feat(secrets): migrate seed secrets to OpenBao (seed batch)
seed/{authentik,immich,paperless} barman+hetzner creds and
seed/influxdb bootstrap: values in OpenBao KV (homelab/seed/*), all
round-trip-verified text. Future cold rebuilds no longer need the age
key for the seed phase. Decryption blocks dropped from every seed-* KS
(incl. dormant seed-audiobookshelf/seed-music-assistant and the
suspended, deprecated seed KS).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-14 01:25:28 +02:00
k.renner beaa6bf0d4 Merge pull request 'feat(secrets): stateful batch — home-assistant, immich, paperless to OpenBao/ESO' (#173) from openbao-stateful into master
Reviewed-on: gitea_admin/homelab#173
2026-07-13 23:19:57 +00:00
claude-botandClaude Fable 5 94aa3e2fda feat(secrets): migrate stateful app secrets to OpenBao (stateful batch)
home-assistant (5), immich, paperless (2): values in OpenBao KV, all
verified text-safe via base64 round-trip before load. ExternalSecrets
keep the old Secret names. Decryption blocks dropped from
home-assistant/immich/paperless KS plus the dormant one on
speech-to-phrase.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-14 01:19:12 +02:00
k.renner 5ba99ebac1 Merge pull request 'feat(secrets): apps batch — non-critical app secrets to OpenBao/ESO' (#172) from openbao-apps into master
Reviewed-on: gitea_admin/homelab#172
2026-07-13 17:21:58 +00:00
claude-botandClaude Fable 5 a76b18a887 feat(secrets): migrate non-critical app secrets to OpenBao (apps batch)
evcc, otbr, libation, external-dns (apps), monitoring (4), woodpecker:
values in OpenBao KV (homelab/apps/*, loaded 2026-07-13), manifests are
now ExternalSecrets keeping the old Secret names. libation's payload is
a binary SQLite db — stored base64 in KV with decodingStrategy: Base64
on the ES. Decryption blocks dropped from apps/evcc/otbr/libation/
monitoring KS (paths sops-free) plus the dormant one on grafana-db.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-13 19:21:27 +02:00
k.renner 871cbfd96d Merge pull request 'feat(secrets): warm-up migration — infrastructure secrets to OpenBao/ESO' (#171) from openbao-warmup into master
Reviewed-on: gitea_admin/homelab#171
2026-07-13 17:10:49 +00:00
claude-botandClaude Fable 5 85cb236270 feat(secrets): migrate infrastructure secrets to OpenBao (warm-up batch)
external-dns-unifi, netbird-ingress, velero (both), cloudflare-api-token:
values live in OpenBao KV (homelab/infrastructure/*, loaded 2026-07-13),
manifests become ExternalSecrets targeting the same Secret names so
consumers see no change. Both infra KS paths are now sops-free, so their
decryption blocks go too. Rollback per file = git revert (age key still
active until phase 4).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-13 19:07:14 +02:00
k.renner 5991607e1c Merge pull request 'feat(secrets): ClusterSecretStore + declarative audit — SOPS migration phase 2' (#170) from openbao-phase2 into master
Reviewed-on: gitea_admin/homelab#170
2026-07-13 17:00:02 +00:00
k.renner 5c28c5114c Merge pull request 'feat(esphome): enable IPv6 on the shelly BLE proxy' (#169) from feat/esphome-proxy-ipv6 into master
Reviewed-on: gitea_admin/homelab#169
2026-07-13 16:59:54 +00:00
claude-botandClaude Fable 5 98346b370e feat(secrets): ClusterSecretStore + declarative audit (SOPS migration phase 2)
OpenBao was initialized and configured today (kv-v2 at homelab/, k8s
auth, eso-read policy + role bound to the external-secrets SA); the
store can therefore turn Ready and no longer endangers the post-crds
wait gate. Audit device moves into the server HCL because OpenBao 2.5
rejects API-managed audit devices; log_raw stays off so Loki only ever
sees HMAC-redacted values.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-13 18:46:35 +02:00
claude-botandClaude Opus 4.8 ad35dc3189 feat(esphome): enable IPv6 on the shelly BLE proxy
The IoT VLAN advertises a global IPv6 prefix (RA/SLAAC), but the Atom Echo
ran v4-only because ESPHome defaults IPv6 off. Enable it so the device is a
proper dual-stack citizen of the segment and has a real global IPv6.

This is the prerequisite for the DNS-side fix: once the device has a real
AAAA, a `unifi_dns_record` AAAA for shelly-ble-proxy-1.iot.renner.uno can be
pinned to it (same pattern as the existing udm/captive records in
opentofu/dns_renner_uno.tf), so the name resolves to the device instead of
falling through to the *.renner.uno proxy wildcard.

Takes effect on the next USB re-flash (no OTA on this device by design).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 18:43:31 +02:00
k.renner 5e3c1fcff9 Merge pull request 'feat(secrets): OpenBao + External Secrets Operator — SOPS migration phase 1' (#168) from openbao-eso into master
Reviewed-on: gitea_admin/homelab#168
2026-07-13 16:30:29 +00:00
claude-botandClaude Fable 5 be59c4ae37 feat(secrets): deploy OpenBao + External Secrets Operator (SOPS migration phase 1)
Single-node raft OpenBao (5Gi ceph-block, UI at openbao.k.renner.uno,
internal-only ingress) and ESO 2.x. No ClusterSecretStore yet — it can
only turn Ready after manual init/unseal, and committing it now would
freeze the infrastructure-crds wait gate (2026-07-13 incident shape).
Full phased plan incl. per-file checklist and DR runbook in
kubernetes/MIGRATION-sops-openbao.md.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CRgBFn9m8a2ncFMLusikH6
2026-07-13 18:26:01 +02:00
k.renner 1210d0da7a Merge pull request 'feat(shelly-manager): wire the ESPHome proxy Noise key' (#166) from feat/shelly-proxy-key into master
Reviewed-on: gitea_admin/homelab#166
2026-07-13 16:01:59 +00:00
claude-botandClaude Opus 4.8 2f2b96905e feat(shelly-manager): wire the ESPHome proxy Noise key
shelly-manager's native ESPHome-API client (PR k.renner/shelly-manager#12)
does the real Noise_NNpsk0 handshake to the Atom Echo bluetooth_proxy when
it has the api.encryption.key. Provide it:

  * shelly-ble-proxy-key.sops.yaml — SOPS Secret holding api-key, the same
    value as the ESPHome dashboard's shelly_ble_proxy_api_key.
  * shelly-manager-deployment: inject it as Ble__Proxies__0__Key via
    secretKeyRef.

Effect: /ble-radios upgrades from a bare TCP :6053 check to a real
handshake + DeviceInfo (device name/version), which also validates the
Noise/frame stack on live hardware ahead of the BLE scan/GATT work.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 17:52:33 +02:00
security-bot 6025df7d1a chore(image-automation): bump gitea.renner.uno/k.renner/shelly-manager:build.1783956697
Updates managed by image-automation-controller.
2026-07-13 15:42:43 +00:00
k.renner 27adf660b0 Merge pull request 'fix(gitea): allow Prometheus to scrape in-cluster gitea /metrics' (#165) from fix/gitea-metrics-netpol into master
Reviewed-on: gitea_admin/homelab#165
2026-07-13 15:30:22 +00:00
claude-botandClaude Opus 4.8 c69fa9ac8a fix(gitea): allow Prometheus (monitoring ns) to scrape /metrics
After the LXC->in-cluster cutover the gitea scrape target became an in-cluster
pod, which the apps default-deny-ingress CiliumNetworkPolicy drops (it allows
only same-ns / home-assistant / host). Prometheus scrapes time out (context
deadline exceeded) and TargetDown keeps firing. Add a scoped CNP allowing the
monitoring namespace to reach the gitea pod on :3000. Monitoring egress is
unrestricted (its only policy is ingress-only), so this ingress allow is
sufficient.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HQhvu1mrQ7EgwLhrzdNyY7
2026-07-13 17:27:53 +02:00
k.renner 0d411be12a Merge pull request 'chore(ansible): retire gitea/woodpecker LXC provisioning + srv.renner.uno refs' (#164) from chore/retire-lxc-ansible into master
ci/woodpecker/push/deploy-woodpecker-agent Pipeline failed
Reviewed-on: gitea_admin/homelab#164
2026-07-13 15:16:41 +00:00
security-bot 9e7a7b175f chore(image-automation): bump gitea.renner.uno/k.renner/shelly-manager:build.1783933726
Updates managed by image-automation-controller.
2026-07-13 14:03:27 +00:00
claude-botandClaude Opus 4.8 d2c620f825 chore(ansible): drop remaining retired-runner/agent leftovers
Follow-up to the LXC retirement sweep:
- remove orphan inventory/group_vars/woodpecker_agents (group already deleted)
- drop the retired gitea-runner (root@10.2.40.214 act_runner) journalctl entry
  from .vscode/settings.json

Kept (live): the ci.renner.uno gatus check and the woodpecker-ci@homelab
authorized key, which belong to the in-cluster Woodpecker.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HQhvu1mrQ7EgwLhrzdNyY7
2026-07-13 15:47:00 +02:00
claude-botandClaude Opus 4.8 dc36653808 chore(ansible): retire gitea/woodpecker LXC provisioning + refs
Gitea and Woodpecker now run in-cluster (k8s); their Proxmox LXCs are retired.
Remove the provisioning that rebuilt them and every reference to the dead hosts:

- delete roles gitea-lxc, gitea-runner, woodpecker-agent, woodpecker-server
- delete plays install-gitea, install-gitea-runner, configure-gitea-runner-logging,
  install-woodpecker-server, install-woodpecker-agent
- drop [woodpecker_server]/[woodpecker_agents] inventory groups + group_vars
- monitoring: remove the gitea Prometheus scrape job + gitea:22 blackbox target;
  repoint the gatus / blackbox-dns / chaos-test / proxmox-dns dig probes and the
  dns-overview dashboard panel from gitea.srv.renner.uno to k8s-1.srv.renner.uno
- drop the retired gitea-runner journalctl entries from .vscode/settings.json

Live services keep their public hostnames (gitea.renner.uno, ci.renner.uno),
untouched. Other *.srv.renner.uno hosts untouched.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HQhvu1mrQ7EgwLhrzdNyY7
2026-07-13 15:44:56 +02:00
k.renner f5b46e7a28 Merge pull request 'fix(monitoring): scrape in-cluster Gitea, not retired LXC' (#163) from fix/prometheus-gitea-scrape into master
Reviewed-on: gitea_admin/homelab#163
2026-07-13 13:11:50 +00:00
k.renner 29416d7e05 Merge pull request 'feat(shelly-manager): register the Atom Echo BLE proxy as a radio' (#162) from feat/shelly-manager-ble-proxy into master
Reviewed-on: gitea_admin/homelab#162
2026-07-13 13:11:42 +00:00
claude-botandClaude Opus 4.8 59aa162a19 fix(monitoring): scrape in-cluster Gitea, not the retired LXC
Gitea moved in-cluster (apps ns StatefulSet); LXC 114 is stopped, so the static
`gitea` scrape target gitea.srv.renner.uno:3000 is down -> firing TargetDown.
Point it at the ClusterIP Service (gitea.apps.svc.cluster.local:3000), which
serves /metrics anonymously (verified HTTP 200 with gitea_* metrics).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HQhvu1mrQ7EgwLhrzdNyY7
2026-07-13 15:06:20 +02:00
claude-botandClaude Opus 4.8 0d7e530126 feat(shelly-manager): register the Atom Echo BLE proxy as a radio
Add Ble:Proxies[0] = { atom-echo-1, shelly-ble-proxy-1.iot.renner.uno, 6053 } to
the shelly-manager deployment so the flashed M5 Atom Echo esphome bluetooth_proxy
(now up at 10.2.30.109, ESPHome API :6053 open) shows on the /ble-radios page and
is liveness-probed. Reached over the same net1 macvlan route as the Shellys.
Provisioning THROUGH it is the native ESPHome-API client, still to come.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 15:04:07 +02:00
k.renner 365852efe4 Merge pull request 'chore(esphome): trim Shelly BLE proxy to WiFi + API only' (#161) from chore/esphome-proxy-trim into master
Reviewed-on: gitea_admin/homelab#161
2026-07-13 12:59:35 +00:00
claude-botandClaude Opus 4.8 fdddbe7e78 chore(esphome): trim Shelly BLE proxy to WiFi + API only
Per how it's actually run: drop OTA and the fallback AP/captive_portal — this is
a fixed, low-value proxy, so updates and any WiFi recovery are done by re-flashing
over USB. Secrets shrink to iot_wifi_ssid / iot_wifi_password /
shelly_ble_proxy_api_key (the api encryption key stays; it's the ble-agent
handoff). README secrets list + flashing note updated to match.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-13 11:01:51 +02:00