Files
esh-pfi-infrastructure/stacks/seafile/compose.yaml
T
vh 42c594c29f 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.
2026-08-18 22:27:15 -07:00

92 lines
3.4 KiB
YAML

# seafile — file sync service on ana-docker, fronted by Traefik at
# seafile.phasefinal.com.
#
# ⚠️ RESTART POLICY IS LOAD-BEARING HERE. None of these three services
# declared one until 2026-08-18, which means Docker defaulted them to `no`.
# On 2026-05-06T21:27:45Z the daemon stopped all three within 200ms of each
# other — a daemon restart or host reboot — and because the policy was `no`,
# nothing brought them back. Seafile then sat dead for three months and the
# only trace was an EXITED card on the dashboard that nobody read as an
# outage. The exit code was 255 on all three, which is just what a container
# that ignores SIGTERM reports when the daemon stops it; it is NOT evidence
# of a crash, and reading it as one sends you looking for a bug that does
# not exist. `unless-stopped` on all three is the fix.
#
# Data lives in two local named volumes (`seafile_seafile_db`,
# `seafile_seafile_datastore`) — NOT on ana-nas NFS, so this stack is not
# exposed to the NAS SPOF that affects postgres/rest-server/PBS.
services:
db:
image: mariadb:10.6
container_name: seafile-mysql
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PW}
- MYSQL_LOG_CONSOLE=true
volumes:
- seafile_db:/var/lib/mysql # Requested, specifies the path to MySQL data persistent store.
networks:
- tnet
# Required so seafile can wait for InnoDB to initialize before
# starting seahub. Without it, after a daemon restart seahub races
# mysql, hits "Connection refused", and the container's start.py
# gives up — leaving nginx serving seafile but proxying to a dead
# python backend. Image ships /usr/local/bin/healthcheck.sh.
healthcheck:
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
interval: 5s
timeout: 5s
retries: 30
start_period: 30s
memcached:
image: memcached:1.6.18
container_name: seafile-memcached
restart: unless-stopped
entrypoint: memcached -m 256
networks:
- tnet
seafile:
image: seafileltd/seafile-mc:11.0-latest
container_name: seafile
restart: unless-stopped
ports:
- 9180:80
volumes:
- seafile_datastore:/shared # Requested, specifies the path to Seafile data persistent store.
environment:
- DB_HOST=db
- DB_ROOT_PASSWD=${DB_ROOT_PW}
- TIME_ZONE=America/Los_Angeles
- SEAFILE_ADMIN_EMAIL=${SEAFILE_ADMIN_EMAIL}
- SEAFILE_ADMIN_PASSWORD=${SEAFILE_ADMIN_PW}
# Long-form depends_on with condition: service_healthy on db.
# Compose waits for the mariadb healthcheck above to pass before
# starting this container, so seahub never sees the
# "Connection refused" race that wedges it on daemon restart.
depends_on:
db:
condition: service_healthy
memcached:
condition: service_started
labels:
- homepage.group=Apps
- homepage.name=SeaFile
- homepage.icon=mdi-sync-circle
- homepage.description=File Sync Service (ana)
- homepage.href=https://seafile.phasefinal.com
- traefik.enable=true
- traefik.http.routers.seafile.tls=true
- traefik.http.routers.seafile.rule=Host(`seafile.phasefinal.com`)
- traefik.http.routers.seafile.tls.certresolver=anaprod
networks:
- tnet
env_file:
- .env
volumes:
seafile_db: null
seafile_datastore: null
networks:
tnet:
name: traefik-net
external: true