Summary
The Whisper-WebUI app's readiness probe fetches the full Gradio index page (≈482 KB) every 3 seconds, forever. On an otherwise idle Olares this produces a constant ~160 KB/s of internal network traffic and keeps the Whisper backend at a constant ~6% CPU re-rendering the page, which contributes to the device never cooling down / fans never stopping overnight.
Observed on Olares 1.12.6-rc.2 (Olares One), app whisperwebuiv2 (image beclab/harveyff-whisper-webui:v1.0.7). The same probe ships in whisperwebuiv3.
Root cause
The probe on the openresty client-proxy container:
readinessProbe:
exec:
command:
- /bin/sh
- -c
- |
http_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080)
[ $http_code -ge 200 ] && [ $http_code -lt 500 ]
initialDelaySeconds: 2
timeoutSeconds: 3
periodSeconds: 3
successThreshold: 1
failureThreshold: 60
curl -o /dev/null discards the body but still downloads it. openresty proxies GET / to the Gradio backend in the whisperwebuiv2server-shared namespace, so every 3 s:
- Gradio renders the complete UI page (~482 KB) — measurable CPU on the backend (
whisper_openai_api.py sits at a constant ~6% CPU on the host while completely idle, ~76 CPU-minutes/day);
- the page crosses the pod network from the server namespace to the client-proxy pod (~160 KB/s sustained, ~13 GB/day of internal traffic).
Evidence
Client-proxy nginx access log — one entry every 3 s, around the clock, 127.0.0.1 (the probe) is the only client:
127.0.0.1 - - [30/Jul/2026:04:11:59 +0000] "GET / HTTP/1.1" 200 482429 "-" "curl/7.88.1"
127.0.0.1 - - [30/Jul/2026:04:12:02 +0000] "GET / HTTP/1.1" 200 482429 "-" "curl/7.88.1"
127.0.0.1 - - [30/Jul/2026:04:12:05 +0000] "GET / HTTP/1.1" 200 482429 "-" "curl/7.88.1"
Dashboard shows the app receiving ~200 KB/s "network in" while nobody is using it.
Suggested fix
Any of these removes ~all of the idle load while keeping the readiness signal:
- probe with
HEAD instead of GET (curl -s -o /dev/null -I -w "%{http_code}" http://localhost:8080) — Gradio answers HEAD without streaming the page body, or
- probe a lightweight endpoint that doesn't render the UI, e.g. Gradio's
/gradio_api/heartbeat (or an nginx stub_status/static location that only proves the proxy chain is up), and/or
- relax
periodSeconds from 3 to something like 15–30 once the app is up (the tight 3 s period × failureThreshold: 60 looks like it was tuned for fast startup detection; a separate startupProbe would cover that).
Happy to open a PR if a maintainer confirms which direction is preferred.
Summary
The Whisper-WebUI app's readiness probe fetches the full Gradio index page (≈482 KB) every 3 seconds, forever. On an otherwise idle Olares this produces a constant ~160 KB/s of internal network traffic and keeps the Whisper backend at a constant ~6% CPU re-rendering the page, which contributes to the device never cooling down / fans never stopping overnight.
Observed on Olares
1.12.6-rc.2(Olares One), appwhisperwebuiv2(imagebeclab/harveyff-whisper-webui:v1.0.7). The same probe ships inwhisperwebuiv3.Root cause
The probe on the openresty client-proxy container:
whisperwebuiv2/whisperwebuiv2/templates/clientproxy.yamlL181–L193whisperwebuiv3/templates/whisperwebuiv3.yamlL246–L256curl -o /dev/nulldiscards the body but still downloads it. openresty proxiesGET /to the Gradio backend in thewhisperwebuiv2server-sharednamespace, so every 3 s:whisper_openai_api.pysits at a constant ~6% CPU on the host while completely idle, ~76 CPU-minutes/day);Evidence
Client-proxy nginx access log — one entry every 3 s, around the clock,
127.0.0.1(the probe) is the only client:Dashboard shows the app receiving ~200 KB/s "network in" while nobody is using it.
Suggested fix
Any of these removes ~all of the idle load while keeping the readiness signal:
HEADinstead ofGET(curl -s -o /dev/null -I -w "%{http_code}" http://localhost:8080) — Gradio answers HEAD without streaming the page body, or/gradio_api/heartbeat(or an nginxstub_status/static location that only proves the proxy chain is up), and/orperiodSecondsfrom 3 to something like 15–30 once the app is up (the tight 3 s period ×failureThreshold: 60looks like it was tuned for fast startup detection; a separatestartupProbewould cover that).Happy to open a PR if a maintainer confirms which direction is preferred.