#!/usr/bin/env bash set -Eeuo pipefail APP_DIR="/opt/1panel/apps/filecodebox/filecodebox" CUSTOM_DIR="$APP_DIR/custom" COMPOSE_FILE="$APP_DIR/docker-compose.yml" UPSTREAM_IMAGE="lanol/filecodebox:beta" LOCAL_IMAGE="local/filecodebox:50mb-chunk" CONTAINER_NAME="${CONTAINER_NAME:-filecodebox}" LOG_DIR="$APP_DIR/update-logs" LOG_FILE="$LOG_DIR/update-$(date +%Y%m%d-%H%M%S).log" mkdir -p "$CUSTOM_DIR" "$LOG_DIR" exec > >(tee -a "$LOG_FILE") 2>&1 echo "===== FileCodeBox custom image update start: $(date '+%F %T') =====" echo "APP_DIR=$APP_DIR" echo "UPSTREAM_IMAGE=$UPSTREAM_IMAGE" echo "LOCAL_IMAGE=$LOCAL_IMAGE" cd "$APP_DIR" if [ -f "$APP_DIR/data/filecodebox.db" ]; then cp -a "$APP_DIR/data/filecodebox.db" "$APP_DIR/data/filecodebox.db.bak.$(date +%Y%m%d%H%M%S)" echo "database backup created" fi echo "[1/6] Pull upstream image" docker pull "$UPSTREAM_IMAGE" echo "[2/6] Ensure deterministic Dockerfile patch" cat > "$CUSTOM_DIR/Dockerfile" <<'DOCKERFILE_EOF' FROM lanol/filecodebox:beta COPY fcb_extra_patch.py /tmp/fcb_extra_patch.py RUN python /tmp/fcb_extra_patch.py && rm -f /tmp/fcb_extra_patch.py DOCKERFILE_EOF test -f "$CUSTOM_DIR/fcb_extra_patch.py" echo "[3/6] Build local image" docker build --pull -t "$LOCAL_IMAGE" "$CUSTOM_DIR" echo "[4/6] Ensure docker-compose uses local image" cp -a "$COMPOSE_FILE" "$COMPOSE_FILE.bak.$(date +%Y%m%d%H%M%S)" python3 - <<'PY' from pathlib import Path p = Path('/opt/1panel/apps/filecodebox/filecodebox/docker-compose.yml') s = p.read_text(encoding='utf-8') lines = [] for line in s.splitlines(): if line.strip().startswith('image:'): indent = line[:len(line)-len(line.lstrip())] lines.append(indent + 'image: local/filecodebox:50mb-chunk') else: lines.append(line) p.write_text('\n'.join(lines) + ('\n' if s.endswith('\n') else ''), encoding='utf-8') PY echo "[5/6] Validate and recreate container" docker compose -f "$COMPOSE_FILE" config >/dev/null docker compose -f "$COMPOSE_FILE" up -d --no-build echo "[6/6] Verify running patch" docker inspect "$CONTAINER_NAME" --format 'Image={{.Config.Image}} Mounts={{json .Mounts}}' docker exec "$CONTAINER_NAME" sh -lc 'test -f /app/themes/2024/assets/fcb-analytics.js && grep -q "class TransferStats" /app/apps/base/models.py && grep -q "/analytics" /app/apps/admin/views.py && grep -q "downloadTraffic" /app/themes/2024/assets/fcb-analytics.js && echo "analytics files ok"' for i in $(seq 1 12); do if curl -fsS --max-time 10 "http://127.0.0.1:40157/" >/dev/null; then echo "http ok" break fi if [ "$i" = 12 ]; then echo "http health check failed after retries" >&2 exit 1 fi sleep 5 done echo "===== FileCodeBox custom image update done: $(date '+%F %T') =====" echo "Log: $LOG_FILE"