webui / backup_restore.sh
Nerdur's picture
Upload 10 files
d6c807d verified
Raw
History Blame Contribute Delete
2.64 kB
#!/bin/bash
# backup_restore.sh v3.1 — Poboljšana stabilnost i LFS podrška
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)
# Ako je baza veća od 100KB, pretpostavljamo da je već restorana ili korištena
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