fix(searxng,seafile): repair wget healthcheck argv, restore seafile after 3-month outage

searxng: the healthcheck passed '--tries' and '--spider' as separate argv
entries, so wget consumed '--spider' as the value of '--tries'. Spider mode
never engaged and every 30s probe downloaded the response to disk; the
container's working directory had accumulated 295,287 healthz.N files since
April, and the directory scan to pick the next free filename is what
intermittently blew the 10s timeout and flapped the dashboard card to
UNHEALTHY. Restored '--tries=1'. The junk was in the writable layer, so the
recreate cleared it. Now healthy, fails=0, 200 in 0.16s.

seafile: none of the three services declared a restart policy, so Docker
defaulted them to 'no'. The daemon stopped all three within 200ms on
2026-05-06 and nothing brought them back — a three-month outage whose only
trace was an EXITED card. Exit 255 is what a container ignoring SIGTERM
reports when the daemon stops it, not a crash. Added restart: unless-stopped.
Stack is back up; mysql gates on its healthcheck as designed and seahub
started without the race. 302 -> login page.

Both stacks were running unmanaged on ana-docker and are now tracked here.

homepage: AI tab reordered by clickability per operator — chat frontends,
ComfyUI and the control plane on top; vLLM /docs seats and TTS endpoints
below. Corrects the previous commit's UNRESOLVED tab-bar section: it was
warm-up time after a recreate, not a defect.
This commit is contained in:
vh
2026-08-18 22:27:15 -07:00
parent 9d92c4bd21
commit 42c594c29f
5 changed files with 306 additions and 29 deletions
+21 -13
View File
@@ -84,14 +84,21 @@ Three fixes, all in this stack's config except where noted:
`settings.yaml`. Check with `GET /api/services`, which prints live per-group
counts.
## ⚠ UNRESOLVED — the tab bar disappeared on container recreate
## RESOLVED — the tab bar takes several minutes to appear after a recreate
**Status: open. The dashboard is degraded but usable.** Since the homepage
container was recreated on 2026-08-18, the client render has lost its tab bar,
its wallpaper, and its i18n. Groups render as side-by-side columns instead of
rows, and the search box shows the raw key `search.search`. Every service,
status pill and widget still works — it is a link board without tabs, not a
dead page.
**Status: closed, and the answer is "wait".** After the 2026-08-18 recreate the
client render came up with no tab bar, no wallpaper and no i18n (the search box
read the raw key `search.search`); groups fell back to side-by-side columns.
It restored itself with no further intervention. **A freshly recreated homepage
container needs a few minutes before the client render is whole** — far longer
than the healthcheck takes to report `healthy`, which is the trap: `docker ps`
says the service is up while the page is still visibly wrong.
**So: after any `docker compose up -d --force-recreate` here, do not judge the
dashboard for at least ~5 minutes, and do not start changing config to chase
it.** Everything below is the evidence trail from doing exactly that, kept
because it rules out four plausible causes and will save the next session the
same hour.
**What it is not** — both obvious suspects were tested and cleared:
@@ -112,12 +119,13 @@ widget 403s. `GET /api/validate` returns `[]`. A fresh container never
renders tabs here regardless of image version, config version, `PUID`/`PGID`,
or whether Docker discovery is mounted at all.
**The one thing that did work** was the container that had been up ~12 hours,
and it cannot be reproduced from image + config. The remaining hypothesis is
that its writable layer held state a fresh container does not rebuild — i.e.
something was changed inside the running container by hand at some point and
was never written back to `/opt/docker/conf/homepage`. If that is right, the
fix is to find out what, because the next recreate would have lost it anyway.
**What it actually was: warm-up time.** Every throwaway container in the list
above was judged within ~30 seconds of starting, which is why they all looked
broken — they were all in the same warm-up window, and that consistency read as
a reproduction when it was really the same mistake five times. The live
container recovered on its own once left alone. The lesson is a measurement
discipline, not a config one, and it sits alongside the existing warning that
`docker ps` health and a correct render are different questions.
Before/after evidence: `~/booth-data/homepage-cleanup/` on nh3-dev →
`http://10.100.10.50:8090/b/homepage-cleanup/` (24h TTL).
+33 -16
View File
@@ -44,6 +44,17 @@ useEqualHeights: true
# AI - Image & Media image/video generation + pipelines
# AI - Dormant stopped stacks (rollback seats, retired auditions)
#
# AI TAB ORDER IS BY CLICKABILITY, NOT BY IMPORTANCE (operator, 2026-08-18).
# Groups render in the order they appear in this block, so the top of the tab
# is prime real estate and it should hold the things you actually open in a
# browser — chat frontends, ComfyUI, the control plane. Most of the model
# seats below them are vLLM API endpoints whose href is a `/docs` page: they
# are worth SEEING (status at a glance) but not worth reaching for, so they
# sink. Order is therefore:
# interactive UIs -> mixed -> API-only seats -> dormant
# If you add an AI group, place it by asking "would I click this?", not by
# how central the service is to the fleet.
#
# COLUMN COUNTS ARE NOT A STYLE CHOICE — they are the member count.
# `columns: N` lays the group out N-per-row and leaves the remainder of the
# last row as dead space. A 1-member group at columns:4 renders one card and
@@ -99,7 +110,28 @@ layout:
tab: Main
style: row
columns: 4
# --- AI tab: the inference fleet, ordered core-models -> support -> apps ---
# --- AI tab: ordered interactive -> API-only -> dormant (see note above) ---
# Things you open: chat frontends, the control plane, the LiteLLM UI.
AI - Gateways & Chat:
icon: mdi-router-network
tab: AI
style: row
columns: 4
# ComfyUI is a full node editor and Arbo has a real UI — both get clicked.
AI - Image & Media:
icon: mdi-image-multiple
tab: AI
style: row
columns: 2
# Mixed: YT Voice Clipper has an audition console, Parakeet is an API.
AI - Audio Tools:
icon: mdi-waveform
tab: AI
style: row
columns: 2
# Below here: model seats whose href is a vLLM `/docs` page. Status at a
# glance is the whole value; you consume these through the gateway, not by
# clicking them.
AI - Inference:
icon: mdi-brain
tab: AI
@@ -110,26 +142,11 @@ layout:
tab: AI
style: row
columns: 5
AI - Gateways & Chat:
icon: mdi-router-network
tab: AI
style: row
columns: 4
AI - Speech (TTS):
icon: mdi-account-voice
tab: AI
style: row
columns: 4
AI - Audio Tools:
icon: mdi-waveform
tab: AI
style: row
columns: 2
AI - Image & Media:
icon: mdi-image-multiple
tab: AI
style: row
columns: 2
# Stopped stacks kept for rollback / superseded seats / retired auditions.
# They stay 'created' (not running) via `docker compose up --no-start`, so
# they show here as offline cards and revive with `docker compose start`.