| #!/bin/bash |
| |
|
|
| DATA_DIR="${OPENWEBUI_DATA_DIR:-/data}" |
| HF_REPO="${HF_BACKUP_REPO:-}" |
| HF_TOKEN="${HF_TOKEN:-}" |
| BACKUP_INTERVAL=$(printf '%s' "${HF_BACKUP_INTERVAL_SECONDS:-300}" | tr -d '[:space:]') |
| DB_FILE="webui.db" |
| DB_PATH="${DATA_DIR}/${DB_FILE}" |
| DB_URL="https://huggingface.co/datasets/${HF_REPO}/resolve/main/${DB_FILE}" |
|
|
| mkdir -p "$DATA_DIR" |
|
|
| if [ -z "$HF_REPO" ] || [ -z "$HF_TOKEN" ]; then |
| echo "[backup] HF_BACKUP_REPO ili HF_TOKEN nisu postavljeni. Backup onemogućen." |
| exit 0 |
| fi |
|
|
| do_restore() { |
| local FORCE="${FORCE_RESTORE:-0}" |
| |
| if [ "$FORCE" != "1" ] && [ -f "$DB_PATH" ]; then |
| local SIZE |
| SIZE=$(wc -c < "$DB_PATH" 2>/dev/null || echo 0) |
| |
| if [ "$SIZE" -gt 100000 ]; then |
| echo "[restore] webui.db postoji (${SIZE} bytes). Preskačem download." |
| echo "[restore] INFO: Ako želiš prisiliti restore, postavi FORCE_RESTORE=1 u Variables." |
| return 0 |
| fi |
| fi |
|
|
| echo "[restore] Pokušavam skinuti bazu sa ${HF_REPO}..." |
| local STATUS |
| STATUS=$(curl -s -L -o /tmp/webui_restore.db -w "%{http_code}" -H "Authorization: Bearer ${HF_TOKEN}" "$DB_URL") |
| |
| if [ "$STATUS" = "200" ]; then |
| local DL_SIZE |
| DL_SIZE=$(wc -c < /tmp/webui_restore.db 2>/dev/null || echo 0) |
| if [ "$DL_SIZE" -gt 50000 ]; then |
| cp /tmp/webui_restore.db "$DB_PATH" |
| echo "[restore] USPJEH: Baza restorana (${DL_SIZE} bytes)." |
| else |
| echo "[restore] ERROR: Skinuti fajl je premali (${DL_SIZE} bytes). Vjerojatno LFS pointer." |
| fi |
| else |
| echo "[restore] ERROR: Server vratio status ${STATUS}. Provjeri HF_TOKEN i putanju." |
| fi |
| rm -f /tmp/webui_restore.db |
| } |
|
|
| do_backup() { |
| if [ ! -f "$DB_PATH" ]; then return 0; fi |
| |
| local SIZE |
| SIZE=$(wc -c < "$DB_PATH" 2>/dev/null || echo 0) |
| if [ "$SIZE" -lt 10000 ]; then return 0; fi |
|
|
| echo "[backup] Pokrećem upload baze (${SIZE} bytes)..." |
| python3 - <<PYEOF |
| import sys |
| from huggingface_hub import HfApi |
| try: |
| api = HfApi(token="${HF_TOKEN}") |
| api.upload_file( |
| path_or_fileobj="${DB_PATH}", |
| path_in_repo="${DB_FILE}", |
| repo_id="${HF_REPO}", |
| repo_type="dataset", |
| commit_message="Automatski backup baze" |
| ) |
| print("[backup] USPJEH: Backup završen.") |
| except Exception as e: |
| print(f"[backup] GREŠKA: {e}", file=sys.stderr) |
| PYEOF |
| } |
|
|
| case "$1" in |
| restore) do_restore ;; |
| loop) |
| echo "[backup] Loop aktivan na svake ${BACKUP_INTERVAL}s." |
| while true; do |
| sleep "${BACKUP_INTERVAL}" |
| do_backup |
| done |
| ;; |
| esac |
|
|