#!/bin/bash # Install an exported model and the vendored browser runtime into a static web # root. Both directories are immutable once published (they are meant to be # served with a long-lived immutable cache header): ship a new model id or # runtime name instead of replacing files. # # Usage: publish.sh MODEL_DIR MODEL_ID RUNTIME_DIR RUNTIME_NAME # Env: STATIC_ROOT web root to publish into (required) # BASE directory under it for the app (default: tokenling) # FILE_MODE mode for published files (default: 0644) # DIR_MODE mode for created directories (default: 0755) # Result: $STATIC_ROOT/$BASE/models/MODEL_ID/ and $STATIC_ROOT/$BASE/runtime/RUNTIME_NAME/ set -euo pipefail [ $# -eq 4 ] || { echo "usage: $0 MODEL_DIR MODEL_ID RUNTIME_DIR RUNTIME_NAME" >&2; exit 2; } SRC=$1 ID=$2 RT=$3 RTNAME=$4 : "${STATIC_ROOT:?set STATIC_ROOT to the web root to publish into}" ROOT=$STATIC_ROOT/${BASE:-tokenling} FMODE=${FILE_MODE:-0644} DMODE=${DIR_MODE:-0755} (cd "$SRC" && sha256sum -c --quiet SHA256SUMS) install -d -m "$DMODE" "$ROOT" "$ROOT/models" "$ROOT/runtime" if [ -e "$ROOT/models/$ID" ]; then echo "$ROOT/models/$ID exists; refusing to replace a published model" >&2; exit 1; fi MODEL_PARTIAL=$ROOT/models/$ID.partial RUNTIME_PARTIAL= trap 'rm -rf "$MODEL_PARTIAL"; [ -z "$RUNTIME_PARTIAL" ] || rm -rf "$RUNTIME_PARTIAL"' EXIT trap 'exit 1' HUP INT TERM rm -rf "$MODEL_PARTIAL" install -d -m "$DMODE" "$MODEL_PARTIAL" "$MODEL_PARTIAL/onnx" for f in "$SRC"/*.json "$SRC"/SHA256SUMS; do install -m "$FMODE" "$f" "$MODEL_PARTIAL/"; done for f in "$SRC"/onnx/*.onnx; do install -m "$FMODE" "$f" "$MODEL_PARTIAL/onnx/"; done (cd "$MODEL_PARTIAL" && sha256sum -c --quiet SHA256SUMS) if [ ! -e "$ROOT/runtime/$RTNAME" ]; then RUNTIME_PARTIAL=$ROOT/runtime/$RTNAME.partial rm -rf "$RUNTIME_PARTIAL" install -d -m "$DMODE" "$RUNTIME_PARTIAL" for f in "$RT"/*; do install -m "$FMODE" "$f" "$RUNTIME_PARTIAL/"; done # Generate the manifest from the copied payload, not from an old manifest. rm -f "$RUNTIME_PARTIAL/SHA256SUMS" (cd "$RUNTIME_PARTIAL" && sha256sum -- * > SHA256SUMS && chmod "$FMODE" SHA256SUMS && sha256sum -c --quiet SHA256SUMS) fi # Both copies are complete. Publish a newly needed runtime first, so a failed # runtime copy never consumes the immutable model id and a retry can reuse it. if [ -n "$RUNTIME_PARTIAL" ]; then mv -T -n "$RUNTIME_PARTIAL" "$ROOT/runtime/$RTNAME" fi mv -T -n "$MODEL_PARTIAL" "$ROOT/models/$ID" [ ! -e "$MODEL_PARTIAL" ] || { echo "$ROOT/models/$ID exists; refusing to replace a published model" >&2; exit 1; } du -sh "$ROOT/models/$ID" "$ROOT/runtime/$RTNAME"