81 lines
2.7 KiB
Bash
Executable File
81 lines
2.7 KiB
Bash
Executable File
#!/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"
|