fix(demo): repair Kiwix service with catalog-based ZIM bootstrap
Kiwix was failing to start: its inline bootstrap command had a shell
syntax error (a YAML-wrapped multi-line wget left a dangling `||`), and
the hard-coded sample-ZIM URL returned 404 because Kiwix rotates the
date-stamped filenames monthly.
Replace the inline command with a bind-mounted bootstrap script that
resolves the current ZIM filename from the Kiwix OPDS catalog at startup,
so the download URL never rots. kiwix-serve is also started on port 8080
to match the container port mapping and healthcheck (it defaults to 80).
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
This commit is contained in:
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#!/bin/sh
|
||||
# Kiwix bootstrap: ensure a sample ZIM file is present, then serve it.
|
||||
#
|
||||
# ZIM filenames on download.kiwix.org are date-stamped and rotate monthly,
|
||||
# so hard-coded URLs rot quickly. Instead this script resolves the current
|
||||
# filename from the Kiwix OPDS catalog, which always points at the live file.
|
||||
|
||||
set -u
|
||||
|
||||
ZIM_DIR=/data
|
||||
ZIM_FILE=devdocs_en_lit.zim
|
||||
CATALOG_URL='https://library.kiwix.org/catalog/v2/entries?name=devdocs_en_lit&count=1'
|
||||
MAX_ATTEMPTS=6
|
||||
RETRY_DELAY=5
|
||||
|
||||
if ! ls "$ZIM_DIR"/*.zim >/dev/null 2>&1; then
|
||||
echo "[kiwix] No ZIM files found; resolving a sample ZIM from the Kiwix catalog..."
|
||||
attempt=0
|
||||
while [ "$attempt" -lt "$MAX_ATTEMPTS" ]; do
|
||||
attempt=$((attempt + 1))
|
||||
zim_url=$(wget -q -O - "$CATALOG_URL" 2>/dev/null \
|
||||
| grep -o 'https://[^"]*\.zim\.meta4' | head -n1 \
|
||||
| sed 's/\.meta4$//')
|
||||
if [ -n "$zim_url" ]; then
|
||||
echo "[kiwix] Downloading: $zim_url"
|
||||
if wget -q --timeout=60 -O "$ZIM_DIR/$ZIM_FILE" "$zim_url"; then
|
||||
echo "[kiwix] Download complete."
|
||||
break
|
||||
fi
|
||||
rm -f "$ZIM_DIR/$ZIM_FILE"
|
||||
echo "[kiwix] Download failed; retrying in ${RETRY_DELAY}s..."
|
||||
else
|
||||
echo "[kiwix] Catalog lookup failed; retrying in ${RETRY_DELAY}s..."
|
||||
fi
|
||||
sleep "$RETRY_DELAY"
|
||||
done
|
||||
fi
|
||||
|
||||
if ls "$ZIM_DIR"/*.zim >/dev/null 2>&1; then
|
||||
echo "[kiwix] Starting kiwix-serve..."
|
||||
exec kiwix-serve --port 8080 "$ZIM_DIR"/*.zim
|
||||
else
|
||||
echo "[kiwix] No ZIM files available; sleeping indefinitely."
|
||||
exec sleep infinity
|
||||
fi
|
||||
@@ -750,23 +750,11 @@ services:
|
||||
- "${KIWIX_PORT}:8080"
|
||||
volumes:
|
||||
- ${COMPOSE_PROJECT_NAME}_kiwix_data:/data
|
||||
- ./config/kiwix/bootstrap.sh:/bootstrap.sh:ro
|
||||
entrypoint: []
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
if ! ls /data/*.zim 1>/dev/null 2>&1; then
|
||||
echo 'No ZIM files found. Downloading sample ZIM...';
|
||||
wget -q -O /data/demo.zim
|
||||
'https://download.kiwix.org/zim/other/bleedingedge_climate-change_en.zim'
|
||||
|| echo 'Download failed';
|
||||
fi
|
||||
if ls /data/*.zim 1>/dev/null 2>&1; then
|
||||
exec kiwix-serve /data/*.zim
|
||||
else
|
||||
echo 'No ZIM files available, sleeping indefinitely'
|
||||
exec sleep infinity
|
||||
fi
|
||||
- sh
|
||||
- /bootstrap.sh
|
||||
environment:
|
||||
- PUID=${DEMO_UID}
|
||||
- PGID=${DEMO_GID}
|
||||
|
||||
Reference in New Issue
Block a user