infra/scripts
Viktor Barzin 90ad6b9125 fan-control: presence-aware IPMI fan curve for the R730 PVE host
The iDRAC stock curve runs the CPU at ~72°C on the 7080 RPM floor even
under load (optimises for quiet, not cool). Add a bash daemon + systemd
unit that drives the chassis fans from CPU temp on two curves, picked by
garage occupancy (the server is in the garage): COOL when empty
(measured ~58-65°C under load), QUIET near the silent floor when the
ha-sofia garage door shows someone is there (open, or <15min since last
activity).

Manual fan mode is backstopped: bash EXIT trap + systemd ExecStopPost
hand fans back to Dell auto on stop/crash; CPU>=83°C or repeated IPMI
failures do the same. Pushgateway metrics (job=fan_control). 36 unit
tests cover the pure curve/hysteresis/presence/parse logic; DRY_RUN +
RUN_ONCE for integration checks. Deployed and verified on 192.168.1.127
(CPU 70->58°C in cool mode, hysteresis stepping confirmed).

Design:  docs/plans/2026-06-04-pve-fan-control-design.md
Runbook: docs/runbooks/fan-control.md

[ci skip]

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-05 09:19:11 +00:00
..
server_safe_poweroff move helper scripts in scripts dir [ci skip] 2025-10-11 17:14:59 +00:00
t3-dispatch t3code: dispatch — strip @domain from X-authentik-username (Authentik injects email) 2026-06-02 19:24:30 +00:00
apply-mbps-caps.service scripts: hook apply-mbps-caps into the PVE host as a systemd timer 2026-05-26 08:12:15 +00:00
apply-mbps-caps.sh scripts: hook apply-mbps-caps into the PVE host as a systemd timer 2026-05-26 08:12:15 +00:00
apply-mbps-caps.timer scripts: hook apply-mbps-caps into the PVE host as a systemd timer 2026-05-26 08:12:15 +00:00
check-ingress-auth-comments.py infra/scripts/tg: enforce ingress_factory auth-comment convention 2026-05-11 19:18:27 +00:00
cluster_healthcheck.sh cluster-health: ha_integrations — skip disabled + ignored config entries 2026-06-05 09:19:11 +00:00
cluster_manager.py chore: add untracked stacks, scripts, and agent configs 2026-04-15 09:33:06 +00:00
daily-backup.service backup: fix daily-backup silent failures, postiz pg_dump CronJob, doc reconcile 2026-05-09 17:41:04 +00:00
daily-backup.sh backup: stop offsite-copying regenerable data; shrink nextcloud backup; pin nextcloud image 2026-06-01 15:15:26 +00:00
daily-backup.timer rename weekly-backup → daily-backup across scripts, timers, services, and docs [ci skip] 2026-04-13 18:37:04 +00:00
extend_vm_storage.sh [ci skip] expand k8s worker nodes to 256G, update inventory and extend script 2026-02-28 16:00:16 +00:00
fan-control.env.example fan-control: presence-aware IPMI fan curve for the R730 PVE host 2026-06-05 09:19:11 +00:00
fan-control.service fan-control: presence-aware IPMI fan curve for the R730 PVE host 2026-06-05 09:19:11 +00:00
fan-control.sh fan-control: presence-aware IPMI fan curve for the R730 PVE host 2026-06-05 09:19:11 +00:00
forgejo-migrate-orphan-images.sh [forgejo] Migration script: exclude empty repos, all-images full mode 2026-05-07 17:21:39 +00:00
frigate-bulk-classify.js [ci skip] sync tfstate and add frigate helper scripts 2026-02-12 23:11:23 +00:00
frigate-inspect.mjs [ci skip] sync tfstate and add frigate helper scripts 2026-02-12 23:11:23 +00:00
gen_service_stacks.py cleanup: remove calibre and audiobookshelf stacks after ebooks migration [ci skip] 2026-03-25 23:56:07 +02:00
graceful-db-maintenance.sh add pod dependency management via Kyverno init container injection 2026-03-15 19:17:57 +00:00
image_pull.sh chore: add untracked stacks, scripts, and agent configs 2026-04-15 09:33:06 +00:00
image_pull_remote.sh chore: add untracked stacks, scripts, and agent configs 2026-04-15 09:33:06 +00:00
kill_ns.sh move helper scripts in scripts dir [ci skip] 2025-10-11 17:14:59 +00:00
lvm-pvc-snapshot.sh [backup] Fix lvm-pvc-snapshot Pushgateway push (stdout pollution in cmd_prune_count) 2026-04-25 14:30:58 +00:00
lvm-pvc-snapshot.timer add 3-2-1 backup pipeline: weekly PVC file copy, NFS mirror, pfsense, offsite sync 2026-04-06 14:53:28 +03:00
migrate-state-to-pg [infra] Migrate Terraform state from local SOPS to PostgreSQL backend 2026-04-16 19:33:12 +00:00
migrate_service_state.sh cleanup: remove calibre and audiobookshelf stacks after ebooks migration [ci skip] 2026-03-25 23:56:07 +02:00
nfs-change-tracker.service offsite-sync-backup + nfs-change-tracker: exclude /srv/nfs/anca-elements 2026-05-24 11:03:09 +00:00
nfs-mirror.service backup: consolidate to one local-mirror script + invert offsite filter 2026-05-24 12:49:20 +00:00
nfs-mirror.sh backup: stop offsite-copying regenerable data; shrink nextcloud backup; pin nextcloud image 2026-06-01 15:15:26 +00:00
nfs-mirror.timer nfs-mirror: weekly Mon 04:00 → daily 02:00 2026-05-26 19:00:10 +00:00
node_registry_manager.sh some nits on the registry manager script - note it is still not working correctly [ci skip] 2025-10-17 19:23:43 +00:00
offsite-sync-backup.service rename weekly-backup → daily-backup across scripts, timers, services, and docs [ci skip] 2026-04-13 18:37:04 +00:00
offsite-sync-backup.sh backup: stop offsite-copying regenerable data; shrink nextcloud backup; pin nextcloud image 2026-06-01 15:15:26 +00:00
offsite-sync-backup.timer switch backup + offsite sync from weekly to daily — RPO 7d → 1d [ci skip] 2026-04-13 18:24:38 +00:00
parse-postmortem-todos.sh fix: use sh instead of bash in pipeline (Alpine compat) 2026-04-14 17:29:14 +00:00
pfsense-haproxy-bootstrap.php mailserver: split healthcheck path off PROXY-aware listeners + book-search uses ClusterIP 2026-05-05 19:45:33 +00:00
pfsense-nat-mailserver-haproxy-flip.php [mailserver] Phase 4+5 — pfSense HAProxy cutover for all 4 mail ports [ci skip] 2026-04-19 12:24:50 +00:00
pfsense-nat-mailserver-haproxy-unflip.php [mailserver] Phase 4+5 — pfSense HAProxy cutover for all 4 mail ports [ci skip] 2026-04-19 12:24:50 +00:00
postmortem-pipeline.sh [claude-agent-service] Migrate all pipelines from DevVM SSH to K8s HTTP 2026-04-18 10:12:02 +00:00
provision-k8s-worker cloud-init: hands-off k8s worker provisioning + 5 bug fixes 2026-05-26 11:52:00 +00:00
pve-nfs-exports fix(post-mortem): add /etc/exports to git, NFS health check in daily-backup, document CSI requirements [PM-2026-04-14] 2026-04-14 18:08:24 +00:00
renew_worker_certs.sh move helper scripts in scripts dir [ci skip] 2025-10-11 17:14:59 +00:00
setup-containerd-pullthrough.sh chore: add untracked stacks, scripts, and agent configs 2026-04-15 09:33:06 +00:00
setup-forgejo-containerd-mirror.sh infra: fix containerd forgejo-registry redirect .200->.203 (+skip_verify) 2026-06-01 21:22:05 +00:00
setup-task-pipeline.sh [ci skip] add Forgejo task pipeline for OpenClaw AI agent 2026-03-07 21:11:07 +00:00
setup_containerd_mirrors.sh add upstream fallback to containerd registry mirrors 2026-04-02 11:05:30 +03:00
state-sync [infra] Migrate Terraform state from local SOPS to PostgreSQL backend 2026-04-16 19:33:12 +00:00
stop_storage_services.sh cleanup: remove calibre and audiobookshelf stacks after ebooks migration [ci skip] 2026-03-25 23:56:07 +02:00
sudoers-t3-autopair t3code: harden dispatch — dedicated user + validated t3-mint + scoped sudoers 2026-06-02 19:24:30 +00:00
t3-autoupdate.service t3code: track t3 nightly via health-checked auto-updater 2026-06-02 19:24:30 +00:00
t3-autoupdate.sh t3code: track t3 nightly via health-checked auto-updater 2026-06-02 19:24:30 +00:00
t3-autoupdate.timer t3code: track t3 nightly via health-checked auto-updater 2026-06-02 19:24:30 +00:00
t3-dispatch.service t3code: harden dispatch — dedicated user + validated t3-mint + scoped sudoers 2026-06-02 19:24:30 +00:00
t3-mint t3code: harden dispatch — dedicated user + validated t3-mint + scoped sudoers 2026-06-02 19:24:30 +00:00
t3-provision-users.service t3code: reconcile per-user t3 instances from /etc/ttyd-user-map 2026-06-02 19:24:30 +00:00
t3-provision-users.sh t3code: reconcile per-user t3 instances from /etc/ttyd-user-map 2026-06-02 19:24:30 +00:00
t3-provision-users.timer t3code: reconcile per-user t3 instances from /etc/ttyd-user-map 2026-06-02 19:24:30 +00:00
t3-serve@.service t3code: per-user t3-serve@ systemd template (User=%i file isolation) 2026-06-02 19:24:30 +00:00
task-processor.sh [ci skip] add Forgejo task pipeline for OpenClaw AI agent 2026-03-07 21:11:07 +00:00
test-fan-control.sh fan-control: presence-aware IPMI fan curve for the R730 PVE host 2026-06-05 09:19:11 +00:00
tg infra/scripts/tg: enforce ingress_factory auth-comment convention 2026-05-11 19:18:27 +00:00
update-istio-injection.sh move helper scripts in scripts dir [ci skip] 2025-10-11 17:14:59 +00:00
update_k8s.sh k8s-version-upgrade: tigera quiesce + etcd-skip retry + IO-wait alert ignore 2026-05-23 08:40:11 +00:00
update_node.sh k8s-version-upgrade: automated kubeadm/kubelet/kubectl upgrade pipeline 2026-05-10 19:07:42 +00:00
upgrade_state.sh upgrade-state: filter transient registry digest-check errors 2026-05-19 22:06:21 +00:00
vault-kubeconfig remove SOPS pipeline, deploy ESO + Vault DB/K8s engines 2026-03-15 16:37:38 +00:00
woodpecker-register-forgejo-repo.sh [woodpecker] Programmatic Forgejo repo registration 2026-05-07 23:33:26 +00:00