From 92a0fd76cb886eb24d7ae7118bcc6a16f2089434 Mon Sep 17 00:00:00 2001 From: reachableceo Date: Thu, 30 Jul 2026 13:00:54 -0500 Subject: [PATCH] fix(demo): repair Kiwix service with catalog-based ZIM bootstrap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- demo/config/kiwix/bootstrap.sh | 45 ++++++++++++++++++++++++++++++++ demo/docker-compose.yml.template | 18 +++---------- 2 files changed, 48 insertions(+), 15 deletions(-) create mode 100755 demo/config/kiwix/bootstrap.sh diff --git a/demo/config/kiwix/bootstrap.sh b/demo/config/kiwix/bootstrap.sh new file mode 100755 index 0000000..09fec47 --- /dev/null +++ b/demo/config/kiwix/bootstrap.sh @@ -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 diff --git a/demo/docker-compose.yml.template b/demo/docker-compose.yml.template index 2a35fb0..893b33f 100644 --- a/demo/docker-compose.yml.template +++ b/demo/docker-compose.yml.template @@ -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}