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
+11
View File
@@ -1,5 +1,16 @@
# Changelog # Changelog
## 2026-07-06 — healthcheck sweep: `localhost` → `127.0.0.1` across all 48 templates
Escalation of the re-run vaultwarden observation
(`felhom.eu/documentation/audits/RERUN-p1p3-2026-07-06.md`) from an instance to a **class**: 48/53
templates used `localhost` in their docker healthcheck `test:` line. BusyBox `wget` (and the node /
python / curl one-shot forms, incl. mealie's `socket.create_connection`) resolve `localhost`→IPv6
`::1` with no cross-address-family fallback, so an IPv4-only-binding app reads docker-`unhealthy`
while fully serving. Mechanical sweep `localhost``127.0.0.1`, scoped strictly to the healthcheck
`test:` lines (diff-reviewed: no app env/config/label line changed; `.felhom.yml` files were already
clean). Industry practice — never `localhost` in container healthchecks. New REUSE.md convention row.
## 2026-07-06 — vaultwarden F1 fix: _ENABLE_SMTP boot-gate (campaign finding, pilot-blocking) ## 2026-07-06 — vaultwarden F1 fix: _ENABLE_SMTP boot-gate (campaign finding, pilot-blocking)
The no-mercy campaign (felhom.eu `audits/CAMPAIGN-nomercy-2026-07-06.md`, finding F1) proved that a The no-mercy campaign (felhom.eu `audits/CAMPAIGN-nomercy-2026-07-06.md`, finding F1) proved that a
+1
View File
@@ -16,6 +16,7 @@ None — this repo is templates/config, not code. See §2/§5.
| `.felhom.yml` required fields | `templates/paperless-ngx/.felhom.yml` | All 53 apps: `display_name`, `description` (Hungarian), `category`, `subdomain`, `slug`, `resources{mem_request, mem_limit, pi_compatible, needs_hdd}`, `deploy_fields`, `app_info{tagline, use_cases, first_steps, ...}`, `healthcheck`. Optional: `smtp_mapping` (email-capable apps), `open_path` (non-root landing page, e.g. ghost). | | `.felhom.yml` required fields | `templates/paperless-ngx/.felhom.yml` | All 53 apps: `display_name`, `description` (Hungarian), `category`, `subdomain`, `slug`, `resources{mem_request, mem_limit, pi_compatible, needs_hdd}`, `deploy_fields`, `app_info{tagline, use_cases, first_steps, ...}`, `healthcheck`. Optional: `smtp_mapping` (email-capable apps), `open_path` (non-root landing page, e.g. ghost). |
| deploy_fields conventions | `templates/paperless-ngx/.felhom.yml` (`deploy_fields:` block) | Every app starts with `DOMAIN` (type `domain`) + `SUBDOMAIN` (type `subdomain`, `locked_after_deploy: true`). Secrets: `type: secret` + `generate:` — dominant generators `password:24` (DB passwords) and `hex:32` (app secret keys); `password:16` for shown admin passwords (`type: password`). HDD apps add `HDD_PATH` (`type: path`, placeholder `/mnt/felhom-drives/hdd_1`, locked). Labels/descriptions in Hungarian. | | deploy_fields conventions | `templates/paperless-ngx/.felhom.yml` (`deploy_fields:` block) | Every app starts with `DOMAIN` (type `domain`) + `SUBDOMAIN` (type `subdomain`, `locked_after_deploy: true`). Secrets: `type: secret` + `generate:` — dominant generators `password:24` (DB passwords) and `hex:32` (app secret keys); `password:16` for shown admin passwords (`type: password`). HDD apps add `HDD_PATH` (`type: path`, placeholder `/mnt/felhom-drives/hdd_1`, locked). Labels/descriptions in Hungarian. |
| Controller-side health probe | `templates/vaultwarden/.felhom.yml` (`healthcheck:` block) | `healthcheck.checks[]` with `type: http` (port only), `type: api` (port + `path` + `expect.status: 200`), or `type: tcp` (port only — mealie, crafty-controller). Prefer `api` with a real health path when the app has one. | | Controller-side health probe | `templates/vaultwarden/.felhom.yml` (`healthcheck:` block) | `healthcheck.checks[]` with `type: http` (port only), `type: api` (port + `path` + `expect.status: 200`), or `type: tcp` (port only — mealie, crafty-controller). Prefer `api` with a real health path when the app has one. |
| Docker healthcheck host | ALL `templates/*/docker-compose.yml` (`healthcheck.test:`) | **Always `127.0.0.1`, never `localhost`.** BusyBox `wget` (and node/python/curl one-shots) resolve `localhost`→IPv6 `::1` with NO cross-address-family fallback; an app that binds IPv4-only then reads docker-`unhealthy` while fully serving (vaultwarden, re-run 2026-07-06 — swept all 48 templates). |
| Docker healthcheck — BusyBox/wget images | `templates/vaultwarden/docker-compose.yml` (~L49) | `test: ["CMD", "wget", "--spider", "-q", "http://localhost:<port>/<path>"]`. Most common family (~20 apps, e.g. homebox, glance). | | Docker healthcheck — BusyBox/wget images | `templates/vaultwarden/docker-compose.yml` (~L49) | `test: ["CMD", "wget", "--spider", "-q", "http://localhost:<port>/<path>"]`. Most common family (~20 apps, e.g. homebox, glance). |
| Docker healthcheck — curl-capable images | `templates/paperless-ngx/docker-compose.yml` (~L76) | `test: ["CMD", "curl", "-f", "http://localhost:<port>/<path>"]` (~18 apps: jellyfin, immich, sonarr…). | | Docker healthcheck — curl-capable images | `templates/paperless-ngx/docker-compose.yml` (~L76) | `test: ["CMD", "curl", "-f", "http://localhost:<port>/<path>"]` (~18 apps: jellyfin, immich, sonarr…). |
| Docker healthcheck — Node images (no wget/curl) | `templates/rallly/docker-compose.yml` (~L49) | `test: ["CMD", "node", "-e", "require('http').get(...)"]` — used when the image lacks wget (that was rallly's actual bug). | | Docker healthcheck — Node images (no wget/curl) | `templates/rallly/docker-compose.yml` (~L49) | `test: ["CMD", "node", "-e", "require('http').get(...)"]` — used when the image lacks wget (that was rallly's actual bug). |
+1 -1
View File
@@ -25,7 +25,7 @@ services:
limits: limits:
memory: 256M memory: 256M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -39,7 +39,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:80/healthcheck"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:80/healthcheck"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -20,7 +20,7 @@ services:
limits: limits:
memory: 384M memory: 384M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -37,7 +37,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80"] test: ["CMD", "curl", "-f", "http://127.0.0.1:80"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -42,7 +42,7 @@ services:
memory: 768M memory: 768M
healthcheck: healthcheck:
# GET (-O /dev/null), not --spider (HEAD): the Next.js API route rejects HEAD, so --spider flaps unhealthy. # 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -37,7 +37,7 @@ services:
limits: limits:
memory: 768M memory: 768M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8083"] test: ["CMD", "curl", "-f", "http://127.0.0.1:8083"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -30,7 +30,7 @@ services:
limits: limits:
memory: 384M memory: 384M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:4000"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:4000"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -27,7 +27,7 @@ services:
limits: limits:
memory: 1024M memory: 1024M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8443/healthz"] test: ["CMD", "curl", "-f", "http://127.0.0.1:8443/healthz"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -39,7 +39,7 @@ services:
limits: limits:
memory: 384M memory: 384M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -29,7 +29,7 @@ services:
limits: limits:
memory: 2048M memory: 2048M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -26,7 +26,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 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 # 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. # fresh deploy. The gitea image ships curl (verified). 90s start_period covers first-boot DB migration.
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/healthz"] test: ["CMD", "curl", "-f", "http://127.0.0.1:3000/api/healthz"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -22,7 +22,7 @@ services:
limits: limits:
memory: 128M memory: 128M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -39,7 +39,7 @@ services:
limits: limits:
memory: 128M memory: 128M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:53842"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:53842"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -25,7 +25,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -27,7 +27,7 @@ services:
limits: limits:
memory: 384M memory: 384M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5000"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:5000"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -40,7 +40,7 @@ services:
limits: limits:
memory: 1024M memory: 1024M
healthcheck: healthcheck:
test: ["CMD", "curl", "-sf", "http://localhost:8123/manifest.json"] test: ["CMD", "curl", "-sf", "http://127.0.0.1:8123/manifest.json"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -28,7 +28,7 @@ services:
limits: limits:
memory: 256M memory: 256M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits: limits:
memory: 256M memory: 256M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:3000"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+2 -2
View File
@@ -54,7 +54,7 @@ services:
limits: limits:
memory: 2048M memory: 2048M
healthcheck: 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 interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
@@ -83,7 +83,7 @@ services:
limits: limits:
memory: 1536M memory: 1536M
healthcheck: 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 interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
+1 -1
View File
@@ -28,7 +28,7 @@ services:
limits: limits:
memory: 2048M memory: 2048M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8096/health"] test: ["CMD", "curl", "-f", "http://127.0.0.1:8096/health"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -32,7 +32,7 @@ services:
limits: limits:
memory: 384M memory: 384M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8001"] test: ["CMD", "curl", "-f", "http://127.0.0.1:8001"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 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 # (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. # ships curl (verified), so curl -f on the unauthenticated endpoint is the correct probe.
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:25600/actuator/health"] test: ["CMD", "curl", "-f", "http://127.0.0.1:25600/actuator/health"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -44,7 +44,7 @@ services:
limits: limits:
memory: 1000M memory: 1000M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -27,7 +27,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/healthz"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:5678/healthz"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -30,7 +30,7 @@ services:
limits: limits:
memory: 256M memory: 256M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:4533/ping"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:4533/ping"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -53,7 +53,7 @@ services:
limits: limits:
memory: 1024M memory: 1024M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/status.php"] test: ["CMD", "curl", "-f", "http://127.0.0.1:80/status.php"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -25,7 +25,7 @@ services:
limits: limits:
memory: 2048M memory: 2048M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/healthcheck"] test: ["CMD", "curl", "-f", "http://127.0.0.1:80/healthcheck"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits: limits:
memory: 128M memory: 128M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:6157/healthcheck"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:6157/healthcheck"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -39,7 +39,7 @@ services:
limits: limits:
memory: 768M memory: 768M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -73,7 +73,7 @@ services:
limits: limits:
memory: 768M memory: 768M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000"] test: ["CMD", "curl", "-f", "http://127.0.0.1:8000"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 5 retries: 5
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits: limits:
memory: 256M memory: 256M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:1221"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:1221"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -28,7 +28,7 @@ services:
limits: limits:
memory: 256M memory: 256M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -30,7 +30,7 @@ services:
limits: limits:
memory: 2048M memory: 2048M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:32400/identity"] test: ["CMD", "curl", "-f", "http://127.0.0.1:32400/identity"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits: limits:
memory: 128M memory: 128M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -34,7 +34,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:7878/ping"] test: ["CMD", "curl", "-f", "http://127.0.0.1:7878/ping"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 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). # 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. # rallly's "/" returns 307 → /login, so accept any status < 500.
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -29,7 +29,7 @@ services:
limits: limits:
memory: 128M memory: 128M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -74,7 +74,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080/"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
+1 -1
View File
@@ -22,7 +22,7 @@ services:
limits: limits:
memory: 384M memory: 384M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -33,7 +33,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8989/ping"] test: ["CMD", "curl", "-f", "http://127.0.0.1:8989/ping"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -36,7 +36,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -23,7 +23,7 @@ services:
limits: limits:
memory: 128M memory: 128M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:8080"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -53,7 +53,7 @@ services:
limits: limits:
memory: 256M memory: 256M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:80/alive"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:80/alive"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+2 -2
View File
@@ -30,7 +30,7 @@ services:
limits: limits:
memory: 384M memory: 384M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:3000"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
@@ -59,7 +59,7 @@ services:
limits: limits:
memory: 256M memory: 256M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:7700/health"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:7700/health"]
interval: 10s interval: 10s
timeout: 5s timeout: 5s
retries: 5 retries: 5
+1 -1
View File
@@ -27,7 +27,7 @@ services:
limits: limits:
memory: 384M memory: 384M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:80"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:80"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -22,7 +22,7 @@ services:
limits: limits:
memory: 128M memory: 128M
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:3000"] test: ["CMD", "wget", "--spider", "-q", "http://127.0.0.1:3000"]
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3
+1 -1
View File
@@ -31,7 +31,7 @@ services:
limits: limits:
memory: 512M memory: 512M
healthcheck: 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 interval: 30s
timeout: 5s timeout: 5s
retries: 3 retries: 3