| | FROM hectorqin/reader:openj9-latest |
| |
|
| | USER root |
| |
|
| | |
| | |
| | RUN apt-get update && apt-get install -y socat python3 python3-pip && \ |
| | pip3 install --no-cache-dir huggingface_hub |
| |
|
| | RUN mkdir -p /storage /app/bin/logs && chmod -R 777 /storage /app/bin/logs |
| |
|
| | EXPOSE 7860 |
| |
|
| | RUN cat > /app/run.sh <<'SH' |
| | |
| | set -u |
| |
|
| | : "${BACKUP_REPO:=yourname/reader-backup}" |
| | : "${BACKUP_FILENAME:=reader_backup_min.tgz}" |
| | : "${BACKUP_INTERVAL:=1800}" |
| | : "${STORAGE_DIR:=/storage}" |
| |
|
| | echo "==== Reader minimal backup via HF Dataset ====" |
| | echo "BACKUP_REPO=$BACKUP_REPO" |
| | echo "BACKUP_FILENAME=$BACKUP_FILENAME" |
| | echo "BACKUP_INTERVAL=$BACKUP_INTERVAL" |
| | echo "STORAGE_DIR=$STORAGE_DIR" |
| |
|
| | mkdir -p "$STORAGE_DIR" |
| | chmod -R 777 "$STORAGE_DIR" || true |
| |
|
| | |
| | echo "[1/3] Try restore from dataset..." |
| | RESTORE_PATH="$(python3 - <<PY |
| | import os, sys |
| | from huggingface_hub import hf_hub_download |
| | repo=os.environ.get("BACKUP_REPO") |
| | token=os.environ.get("HF_TOKEN") |
| | fname=os.environ.get("BACKUP_FILENAME","reader_backup_min.tgz") |
| | try: |
| | p = hf_hub_download(repo_id=repo, repo_type="dataset", filename=fname, token=token) |
| | sys.stdout.write(p) |
| | except Exception: |
| | sys.exit(1) |
| | PY |
| | )" || RESTORE_PATH="" |
| |
|
| | if [ -n "$RESTORE_PATH" ] && [ -f "$RESTORE_PATH" ]; then |
| | echo "Restore file found: $RESTORE_PATH" |
| | tar -xzf "$RESTORE_PATH" -C "$STORAGE_DIR" || true |
| | else |
| | echo "No backup yet. (First run is normal.)" |
| | fi |
| |
|
| | |
| | backup_loop() { |
| | while true; do |
| | TS="$(date -u +%Y%m%d_%H%M%S)" |
| | TMP_DIR="/tmp/reader_min_backup_$TS" |
| | TMP_TGZ="/tmp/$BACKUP_FILENAME" |
| |
|
| | mkdir -p "$TMP_DIR" |
| |
|
| | |
| | ( |
| | cd "$STORAGE_DIR" || exit 0 |
| | |
| | [ -f "data/users.json" ] && echo "data/users.json" |
| |
|
| | |
| | |
| | find data -maxdepth 2 -type f \( -name "bookSource.json" -o -name "bookshelf.json" \) 2>/dev/null || true |
| | ) > "$TMP_DIR/filelist.txt" |
| |
|
| | if [ -s "$TMP_DIR/filelist.txt" ]; then |
| | (cd "$STORAGE_DIR" && tar -czf "$TMP_TGZ" -T "$TMP_DIR/filelist.txt") || true |
| |
|
| | if [ -f "$TMP_TGZ" ]; then |
| | echo "[backup $TS] Uploading minimal backup..." |
| | python3 - <<PY |
| | import os |
| | from huggingface_hub import HfApi |
| | |
| | api = HfApi() |
| | api.upload_file( |
| | path_or_fileobj=os.environ["TMP_TGZ"], |
| | path_in_repo=os.environ["BACKUP_FILENAME"], |
| | repo_id=os.environ["BACKUP_REPO"], |
| | repo_type="dataset", |
| | token=os.environ.get("HF_TOKEN"), |
| | commit_message=f"reader minimal backup {os.environ.get('TS')}", |
| | ) |
| | print("upload ok") |
| | PY |
| | fi |
| | else |
| | echo "[backup $TS] Nothing to backup yet." |
| | fi |
| |
|
| | rm -rf "$TMP_DIR" || true |
| | sleep "$BACKUP_INTERVAL" |
| | done |
| | } |
| |
|
| | export TS TMP_TGZ |
| | backup_loop & |
| |
|
| | |
| | echo "[2/3] Start socat 7860->8080" |
| | socat TCP-LISTEN:7860,fork TCP:127.0.0.1:8080 & |
| |
|
| | |
| | echo "[3/3] Start Reader..." |
| | exec java -Dreader.app.storagePath=/storage -jar /app/bin/reader.jar --server.port=8080 |
| | SH |
| |
|
| | RUN chmod +x /app/run.sh |
| | ENTRYPOINT ["/app/run.sh"] |