authorgravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-06-11 00:33:49-07:00
committergravatar for git@paperclover.netclover caruso <git@paperclover.net> 2026-06-11 01:38:21-07:00
logdb792ebc5ec23d7de27231d6584eeb01a89a5f78
tree77f8c993265383797ede93dbfd77f5a3fddd5a0a
parent7724489e4f16f750a945aef25084e7b30bbde95b
signaturebadge-check Signed by SSH key SHA256:xbd+BjjhyBfwk7GVoURf9Yx0gzDerHbvYv7SddNWmAs

chore: healthchecks on everything

closes #19 probe commands verified by exec'ing them in the running containers: forgejo + evil-forgejo (/api/healthz), jellyfin (/health), copyparty, qbittorrent, jackett (/health), sonarr + radarr (/ping), syncthing (/rest/noauth/health), docker-in-docker (docker version over tcp). fixes caddy's healthcheck: 'caddy healthcheck' is not a real subcommand, so caddy reported unhealthy for 2 weeks — now probes the admin endpoint. skipped: navidrome (scratch image, no shell), pgadmin (/misc/ping 401s in this config), anubis + forward-auth (distroless), and the broken dawarich / technitium / openspeedtest (see follow-up). also tags knot, spindle, xmpp with net.paperclover.list.web=false so the app list page skips them.

1 files changed, 67 insertions(+), 4 deletions(-)

compose.yaml+67-4
...@@ -18,11 +18,11 @@ services:...@@ -18,11 +18,11 @@ services:
18 - path: ./config/Caddyfile18 - path: ./config/Caddyfile
19 action: restart19 action: restart
20 healthcheck:20 healthcheck:
21 test: ["CMD", "caddy", "healthcheck", "--address", ":2019"]21 test: ["CMD-SHELL", "wget -qO /dev/null http://127.0.0.1:2019/config/"]
22 interval: 10s22 interval: 30s
23 timeout: 5s23 timeout: 10s
24 retries: 324 retries: 3
25 start_period: 5s25 start_period: 10s
26 # SSO26 # SSO
27 keycloak: # port 80, 44327 keycloak: # port 80, 443
28 container_name: keycloak28 container_name: keycloak
...@@ -111,6 +111,12 @@ services:...@@ -111,6 +111,12 @@ services:
111 - "${STORE_ROOT}:/w"111 - "${STORE_ROOT}:/w"
112 - "${APP_ROOT}/copyparty:/cfg"112 - "${APP_ROOT}/copyparty:/cfg"
113 - ./config/copyparty.conf:/cfg/copyparty.conf:ro113 - ./config/copyparty.conf:/cfg/copyparty.conf:ro
114 healthcheck:
115 test: ["CMD-SHELL", "wget -qO /dev/null http://127.0.0.1:80/?h"]
116 interval: 30s
117 timeout: 10s
118 retries: 3
119 start_period: 60s
114 restart: unless-stopped120 restart: unless-stopped
115 labels:121 labels:
116 net.paperclover.list.name: Copyparty File Storage122 net.paperclover.list.name: Copyparty File Storage
...@@ -175,6 +181,12 @@ services:...@@ -175,6 +181,12 @@ services:
175 - "/etc/localtime:/etc/localtime:ro"181 - "/etc/localtime:/etc/localtime:ro"
176 - ./config/forgejo/public:/custom/public:ro182 - ./config/forgejo/public:/custom/public:ro
177 - ./config/forgejo/init:/custom/init:ro183 - ./config/forgejo/init:/custom/init:ro
184 healthcheck:
185 test: ["CMD-SHELL", "curl -fsS http://localhost:3000/api/healthz >/dev/null"]
186 interval: 30s
187 timeout: 10s
188 retries: 3
189 start_period: 60s
178 labels:190 labels:
179 net.paperclover.list.name: Clover Git Forge191 net.paperclover.list.name: Clover Git Forge
180 net.paperclover.list.domain: git192 net.paperclover.list.domain: git
...@@ -247,6 +259,7 @@ services:...@@ -247,6 +259,7 @@ services:
247 net.paperclover.list.name: Tangled Knot259 net.paperclover.list.name: Tangled Knot
248 net.paperclover.list.domain: knot260 net.paperclover.list.domain: knot
249 net.paperclover.list.priority: 106261 net.paperclover.list.priority: 106
262 net.paperclover.list.web: "false"
250 knot-init:263 knot-init:
251 container_name: knot-init264 container_name: knot-init
252 image: alpine:3.22265 image: alpine:3.22
...@@ -285,10 +298,17 @@ services:...@@ -285,10 +298,17 @@ services:
285 net.paperclover.list.name: Tangled Spindle298 net.paperclover.list.name: Tangled Spindle
286 net.paperclover.list.domain: spindle299 net.paperclover.list.domain: spindle
287 net.paperclover.list.priority: 107300 net.paperclover.list.priority: 107
301 net.paperclover.list.web: "false"
288 docker-in-docker:302 docker-in-docker:
289 container_name: docker-in-docker303 container_name: docker-in-docker
290 image: docker:dind304 image: docker:dind
291 privileged: "true"305 privileged: "true"
306 healthcheck:
307 test: ["CMD-SHELL", "docker -H tcp://localhost:2375 version >/dev/null"]
308 interval: 30s
309 timeout: 10s
310 retries: 3
311 start_period: 60s
292 command:312 command:
293 - dockerd313 - dockerd
294 - -H314 - -H
...@@ -311,6 +331,12 @@ services:...@@ -311,6 +331,12 @@ services:
311 - "${APP_ROOT}/jellyfin/cache:/cache:rw"331 - "${APP_ROOT}/jellyfin/cache:/cache:rw"
312 - "./config/jellyfin:/config/custom:ro"332 - "./config/jellyfin:/config/custom:ro"
313 - "./config/jellyfin/branding.xml:/config/config/branding.xml:ro"333 - "./config/jellyfin/branding.xml:/config/config/branding.xml:ro"
334 healthcheck:
335 test: ["CMD-SHELL", "curl -fsS http://localhost:8096/health >/dev/null"]
336 interval: 30s
337 timeout: 10s
338 retries: 3
339 start_period: 60s
314 labels:340 labels:
315 net.paperclover.list.name: Cloverfin341 net.paperclover.list.name: Cloverfin
316 net.paperclover.list.domain: jelly342 net.paperclover.list.domain: jelly
...@@ -378,6 +404,12 @@ services:...@@ -378,6 +404,12 @@ services:
378 - "${APP_ROOT}/qbittorrent:/config"404 - "${APP_ROOT}/qbittorrent:/config"
379 - "./config/openvpn:/config/openvpn:ro"405 - "./config/openvpn:/config/openvpn:ro"
380 - "/etc/localtime:/etc/localtime:ro"406 - "/etc/localtime:/etc/localtime:ro"
407 healthcheck:
408 test: ["CMD-SHELL", "curl -fsS http://localhost:23938 >/dev/null"]
409 interval: 30s
410 timeout: 10s
411 retries: 3
412 start_period: 180s
381 labels:413 labels:
382 net.paperclover.list.name: qBittorrent414 net.paperclover.list.name: qBittorrent
383 net.paperclover.list.domain: qbt415 net.paperclover.list.domain: qbt
...@@ -393,6 +425,12 @@ services:...@@ -393,6 +425,12 @@ services:
393 restart: unless-stopped425 restart: unless-stopped
394 volumes:426 volumes:
395 - "${APP_ROOT}/jackett:/config/Jackett"427 - "${APP_ROOT}/jackett:/config/Jackett"
428 healthcheck:
429 test: ["CMD-SHELL", "curl -fsS http://localhost:9117/health >/dev/null"]
430 interval: 30s
431 timeout: 10s
432 retries: 3
433 start_period: 60s
396 labels:434 labels:
397 net.paperclover.list.name: Jackett API Adapter435 net.paperclover.list.name: Jackett API Adapter
398 net.paperclover.list.domain: jkt436 net.paperclover.list.domain: jkt
...@@ -412,6 +450,12 @@ services:...@@ -412,6 +450,12 @@ services:
412 - "PGID=$GROUP_ID"450 - "PGID=$GROUP_ID"
413 - "TZ=America/Los_Angelas"451 - "TZ=America/Los_Angelas"
414 image: lscr.io/linuxserver/sonarr:latest452 image: lscr.io/linuxserver/sonarr:latest
453 healthcheck:
454 test: ["CMD-SHELL", "curl -fsS http://localhost:8989/ping >/dev/null"]
455 interval: 30s
456 timeout: 10s
457 retries: 3
458 start_period: 60s
415 volumes:459 volumes:
416 - "${APP_ROOT}/sonarr:/config"460 - "${APP_ROOT}/sonarr:/config"
417 - "${TORRENT_TEMP:-${APP_ROOT}/qbittorrent/tmp}:/data/tmp"461 - "${TORRENT_TEMP:-${APP_ROOT}/qbittorrent/tmp}:/data/tmp"
...@@ -429,6 +473,12 @@ services:...@@ -429,6 +473,12 @@ services:
429 - "PGID=$GROUP_ID"473 - "PGID=$GROUP_ID"
430 - "TZ=America/Los_Angelas"474 - "TZ=America/Los_Angelas"
431 image: lscr.io/linuxserver/radarr:latest475 image: lscr.io/linuxserver/radarr:latest
476 healthcheck:
477 test: ["CMD-SHELL", "curl -fsS http://localhost:7878/ping >/dev/null"]
478 interval: 30s
479 timeout: 10s
480 retries: 3
481 start_period: 60s
432 volumes:482 volumes:
433 - "${APP_ROOT}/radarr:/config"483 - "${APP_ROOT}/radarr:/config"
434 - "${TORRENT_TEMP:-${APP_ROOT}/qbittorrent/tmp}:/data/tmp"484 - "${TORRENT_TEMP:-${APP_ROOT}/qbittorrent/tmp}:/data/tmp"
...@@ -660,6 +710,12 @@ services:...@@ -660,6 +710,12 @@ services:
660 - 22000:22000/tcp710 - 22000:22000/tcp
661 - 22000:22000/udp711 - 22000:22000/udp
662 - 21027:21027/udp712 - 21027:21027/udp
713 healthcheck:
714 test: ["CMD-SHELL", "curl -fsS http://localhost:8384/rest/noauth/health >/dev/null"]
715 interval: 30s
716 timeout: 10s
717 retries: 3
718 start_period: 60s
663 restart: unless-stopped719 restart: unless-stopped
664 labels:720 labels:
665 net.paperclover.list.name: Syncthing721 net.paperclover.list.name: Syncthing
...@@ -703,6 +759,7 @@ services:...@@ -703,6 +759,7 @@ services:
703 net.paperclover.list.name: Paper Clover XMPP759 net.paperclover.list.name: Paper Clover XMPP
704 net.paperclover.list.domain: xmpp760 net.paperclover.list.domain: xmpp
705 net.paperclover.list.priority: 108761 net.paperclover.list.priority: 108
762 net.paperclover.list.web: "false"
706 depends_on:763 depends_on:
707 caddy:764 caddy:
708 condition: service_started765 condition: service_started
...@@ -792,6 +849,12 @@ services:...@@ -792,6 +849,12 @@ services:
792 - "/etc/localtime:/etc/localtime:ro"849 - "/etc/localtime:/etc/localtime:ro"
793 - ./config/evil-infra/forgejo/public:/custom/public:ro850 - ./config/evil-infra/forgejo/public:/custom/public:ro
794 - ./config/evil-infra/forgejo/init:/custom/init:ro851 - ./config/evil-infra/forgejo/init:/custom/init:ro
852 healthcheck:
853 test: ["CMD-SHELL", "curl -fsS http://localhost:3000/api/healthz >/dev/null"]
854 interval: 30s
855 timeout: 10s
856 retries: 3
857 start_period: 60s
795 depends_on:858 depends_on:
796 postgres:859 postgres:
797 condition: service_healthy860 condition: service_healthy