fix(healthcheck): sweep localhost -> 127.0.0.1 across all 48 templates

BusyBox wget (+ node/python/curl one-shots, incl mealie's socket tuple) resolve
localhost -> IPv6 ::1 with no cross-family fallback; an IPv4-only-binding app
reads docker-unhealthy while serving (vaultwarden, re-run 2026-07-06). Escalates
that instance to the class. Scoped strictly to healthcheck test: lines
(diff-reviewed: no env/config/label changed; .felhom.yml already clean). New
REUSE.md convention row.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
This commit is contained in:
2026-07-06 20:25:54 +02:00
parent d86e25662f
commit 8ddd3c9da5
50 changed files with 62 additions and 50 deletions
+1 -1
View File
@@ -25,7 +25,7 @@ services:
limits:
memory: 256M
healthcheck:
test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://localhost:5006/', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"]
test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://127.0.0.1:5006/', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -39,7 +39,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:80/healthcheck"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:80/healthcheck"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -20,7 +20,7 @@ services:
limits:
memory: 384M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -37,7 +37,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:80"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -42,7 +42,7 @@ services:
memory: 768M
healthcheck:
# GET (-O /dev/null), not --spider (HEAD): the Next.js API route rejects HEAD, so --spider flaps unhealthy.
test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://localhost:3000/api/auth/providers"]
test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:3000/api/auth/providers"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -37,7 +37,7 @@ services:
limits:
memory: 768M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8083"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:8083"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -30,7 +30,7 @@ services:
limits:
memory: 384M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:4000"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:4000"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -27,7 +27,7 @@ services:
limits:
memory: 1024M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8443/healthz"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:8443/healthz"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -39,7 +39,7 @@ services:
limits:
memory: 384M
healthcheck:
test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://localhost:3000/', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"]
test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://127.0.0.1:3000/', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -29,7 +29,7 @@ services:
limits:
memory: 2048M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8096/emby/system/ping"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:8096/emby/system/ping"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -26,7 +26,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "node", "-e", "require('http').get('http://localhost:2368/',r=>{process.exit(r.statusCode<400?0:1)}).on('error',()=>process.exit(1))"]
test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:2368/',r=>{process.exit(r.statusCode<400?0:1)}).on('error',()=>process.exit(1))"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -37,7 +37,7 @@ services:
# 404 until the install wizard is completed (INSTALL_LOCK), so it falsely reported unhealthy on a
# fresh deploy. The gitea image ships curl (verified). 90s start_period covers first-boot DB migration.
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/healthz"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:3000/api/healthz"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -22,7 +22,7 @@ services:
limits:
memory: 128M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -39,7 +39,7 @@ services:
limits:
memory: 128M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:53842"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:53842"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -25,7 +25,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000/api/health"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:3000/api/health"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -27,7 +27,7 @@ services:
limits:
memory: 384M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5000"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:5000"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -40,7 +40,7 @@ services:
limits:
memory: 1024M
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:8123/manifest.json"]
test: ["CMD", "curl", "-sf", "http://127.0.0.1:8123/manifest.json"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -28,7 +28,7 @@ services:
limits:
memory: 256M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:7745/api/v1/status"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:7745/api/v1/status"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits:
memory: 256M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:3000"]
interval: 30s
timeout: 5s
retries: 3
+2 -2
View File
@@ -54,7 +54,7 @@ services:
limits:
memory: 2048M
healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:2283/api/server/ping"]
test: ["CMD", "curl", "-sf", "http://127.0.0.1:2283/api/server/ping"]
interval: 30s
timeout: 10s
retries: 3
@@ -83,7 +83,7 @@ services:
limits:
memory: 1536M
healthcheck:
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:3003/ping')"]
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:3003/ping')"]
interval: 30s
timeout: 10s
retries: 3
+1 -1
View File
@@ -28,7 +28,7 @@ services:
limits:
memory: 2048M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8096/health"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:8096/health"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -32,7 +32,7 @@ services:
limits:
memory: 384M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8001"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:8001"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -40,7 +40,7 @@ services:
# (exit 22) and the container reported "unhealthy" despite serving fine. The gotson/komga image
# ships curl (verified), so curl -f on the unauthenticated endpoint is the correct probe.
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:25600/actuator/health"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:25600/actuator/health"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -44,7 +44,7 @@ services:
limits:
memory: 1000M
healthcheck:
test: ["CMD-SHELL", "python3 -c \"import socket; s=socket.create_connection(('localhost',9000),2); s.close()\""]
test: ["CMD-SHELL", "python3 -c \"import socket; s=socket.create_connection(('127.0.0.1',9000),2); s.close()\""]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -27,7 +27,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/healthz"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:5678/healthz"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -30,7 +30,7 @@ services:
limits:
memory: 256M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:4533/ping"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:4533/ping"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -53,7 +53,7 @@ services:
limits:
memory: 1024M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/status.php"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:80/status.php"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -25,7 +25,7 @@ services:
limits:
memory: 2048M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/healthcheck"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:80/healthcheck"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits:
memory: 128M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:6157/healthcheck"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:6157/healthcheck"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -39,7 +39,7 @@ services:
limits:
memory: 768M
healthcheck:
test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://localhost:3000/_health', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"]
test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://127.0.0.1:3000/_health', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -73,7 +73,7 @@ services:
limits:
memory: 768M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:8000"]
interval: 30s
timeout: 10s
retries: 5
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits:
memory: 256M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:1221"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:1221"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -28,7 +28,7 @@ services:
limits:
memory: 256M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/api/info"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080/api/info"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -30,7 +30,7 @@ services:
limits:
memory: 2048M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:32400/identity"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:32400/identity"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits:
memory: 128M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -34,7 +34,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7878/ping"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:7878/ping"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -46,7 +46,7 @@ services:
# container unhealthy, which made Traefik refuse to publish a route to it. Use Node (always present).
# rallly's "/" returns 307 → /login, so accept any status < 500.
healthcheck:
test: ["CMD", "node", "-e", "require('http').get('http://localhost:3000',r=>process.exit(r.statusCode<500?0:1)).on('error',()=>process.exit(1))"]
test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000',r=>process.exit(r.statusCode<500?0:1)).on('error',()=>process.exit(1))"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -29,7 +29,7 @@ services:
limits:
memory: 128M
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health')"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -74,7 +74,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080/"]
interval: 30s
timeout: 10s
retries: 3
+1 -1
View File
@@ -22,7 +22,7 @@ services:
limits:
memory: 384M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5055/api/v1/status"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:5055/api/v1/status"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -33,7 +33,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8989/ping"]
test: ["CMD", "curl", "-f", "http://127.0.0.1:8989/ping"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -36,7 +36,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/accounts/login/"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080/accounts/login/"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits:
memory: 128M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -53,7 +53,7 @@ services:
limits:
memory: 256M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:80/alive"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:80/alive"]
interval: 30s
timeout: 5s
retries: 3
+2 -2
View File
@@ -30,7 +30,7 @@ services:
limits:
memory: 384M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:3000"]
interval: 30s
timeout: 5s
retries: 3
@@ -59,7 +59,7 @@ services:
limits:
memory: 256M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:7700/health"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:7700/health"]
interval: 10s
timeout: 5s
retries: 5
+1 -1
View File
@@ -27,7 +27,7 @@ services:
limits:
memory: 384M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:80"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:80"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -22,7 +22,7 @@ services:
limits:
memory: 128M
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000"]
test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:3000"]
interval: 30s
timeout: 5s
retries: 3
+1 -1
View File
@@ -31,7 +31,7 @@ services:
limits:
memory: 512M
healthcheck:
test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://localhost:3000/api/health', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"]
test: ["CMD", "node", "-e", "const http = require('http'); http.get('http://127.0.0.1:3000/api/health', (r) => { process.exit(r.statusCode === 200 ? 0 : 1) }).on('error', () => process.exit(1))"]
interval: 30s
timeout: 5s
retries: 3