Fix restore: sentinel file logika — restore jednom, pa cuva podatke
Browse files- backup_restore.sh +17 -23
backup_restore.sh
CHANGED
|
@@ -8,6 +8,7 @@ BACKUP_INTERVAL_SECONDS="${HF_BACKUP_INTERVAL_SECONDS:-300}"
|
|
| 8 |
BACKUP_NAME="openwebui-data.tar.gz"
|
| 9 |
BACKUP_URL=""
|
| 10 |
UPLOAD_URL=""
|
|
|
|
| 11 |
|
| 12 |
if [ -n "$HF_REPO" ]; then
|
| 13 |
BACKUP_URL="https://huggingface.co/datasets/${HF_REPO}/resolve/main/${BACKUP_NAME}"
|
|
@@ -15,16 +16,10 @@ if [ -n "$HF_REPO" ]; then
|
|
| 15 |
fi
|
| 16 |
|
| 17 |
if [ -z "$HF_REPO" ] || [ -z "$HF_TOKEN" ]; then
|
| 18 |
-
echo "HF backup nije omogucen: postavi HF_BACKUP_REPO i HF_TOKEN u Space Secrets
|
| 19 |
exit 0
|
| 20 |
fi
|
| 21 |
|
| 22 |
-
# Provjera: da li /data vec ima sadrzaj (persistent volume nije prazan)
|
| 23 |
-
data_is_populated() {
|
| 24 |
-
FILE_COUNT=$(find "$DATA_DIR" -mindepth 1 -maxdepth 2 2>/dev/null | wc -l)
|
| 25 |
-
[ "$FILE_COUNT" -ge 2 ]
|
| 26 |
-
}
|
| 27 |
-
|
| 28 |
backup_archive() {
|
| 29 |
local archive_path="$1"
|
| 30 |
mkdir -p "$(dirname "$archive_path")"
|
|
@@ -34,13 +29,13 @@ backup_archive() {
|
|
| 34 |
do_restore() {
|
| 35 |
mkdir -p "$DATA_DIR"
|
| 36 |
|
| 37 |
-
#
|
| 38 |
-
if
|
| 39 |
-
echo "
|
| 40 |
return
|
| 41 |
fi
|
| 42 |
|
| 43 |
-
echo "
|
| 44 |
|
| 45 |
HTTP_STATUS=$(curl -s -o /tmp/openwebui_restore.tar.gz -w "%{http_code}" \
|
| 46 |
-L \
|
|
@@ -50,14 +45,17 @@ do_restore() {
|
|
| 50 |
if [ "$HTTP_STATUS" = "200" ]; then
|
| 51 |
FILESIZE=$(wc -c < /tmp/openwebui_restore.tar.gz)
|
| 52 |
if [ "$FILESIZE" -gt 1000 ]; then
|
| 53 |
-
|
|
|
|
| 54 |
tar -xzf /tmp/openwebui_restore.tar.gz -C "$DATA_DIR"
|
| 55 |
-
|
|
|
|
|
|
|
| 56 |
else
|
| 57 |
-
echo "Backup je premalen, preskacem restore."
|
| 58 |
fi
|
| 59 |
else
|
| 60 |
-
echo "Backup
|
| 61 |
fi
|
| 62 |
}
|
| 63 |
|
|
@@ -72,7 +70,7 @@ backup_archive_to_hf() {
|
|
| 72 |
|
| 73 |
FILESIZE=$(wc -c < "$ARCHIVE_PATH")
|
| 74 |
if [ "$FILESIZE" -lt 1000 ]; then
|
| 75 |
-
echo "Arhiva
|
| 76 |
return
|
| 77 |
fi
|
| 78 |
|
|
@@ -86,31 +84,27 @@ backup_archive_to_hf() {
|
|
| 86 |
if [ "$HTTP_STATUS" = "200" ] || [ "$HTTP_STATUS" = "201" ]; then
|
| 87 |
echo "Backup uspesan."
|
| 88 |
else
|
| 89 |
-
echo "Backup
|
| 90 |
cat /tmp/backup_response.json 2>/dev/null || true
|
| 91 |
fi
|
| 92 |
}
|
| 93 |
|
| 94 |
-
# Podrska za mode argument: restore | loop | all (default)
|
| 95 |
MODE="${1:-all}"
|
| 96 |
|
| 97 |
case "$MODE" in
|
| 98 |
restore)
|
| 99 |
-
# Samo uradi restore, pa izadji (za sekvencijalni startup)
|
| 100 |
do_restore
|
| 101 |
;;
|
| 102 |
loop)
|
| 103 |
-
|
| 104 |
-
echo "Periodicki backup svakih ${BACKUP_INTERVAL_SECONDS} sekundi je aktivan."
|
| 105 |
while true; do
|
| 106 |
sleep "$BACKUP_INTERVAL_SECONDS"
|
| 107 |
backup_archive_to_hf
|
| 108 |
done
|
| 109 |
;;
|
| 110 |
all|*)
|
| 111 |
-
# Legacy mode: restore pa loop
|
| 112 |
do_restore
|
| 113 |
-
echo "Periodicki backup svakih ${BACKUP_INTERVAL_SECONDS} sekundi
|
| 114 |
while true; do
|
| 115 |
sleep "$BACKUP_INTERVAL_SECONDS"
|
| 116 |
backup_archive_to_hf
|
|
|
|
| 8 |
BACKUP_NAME="openwebui-data.tar.gz"
|
| 9 |
BACKUP_URL=""
|
| 10 |
UPLOAD_URL=""
|
| 11 |
+
SENTINEL="${DATA_DIR}/.hf_backup_restored"
|
| 12 |
|
| 13 |
if [ -n "$HF_REPO" ]; then
|
| 14 |
BACKUP_URL="https://huggingface.co/datasets/${HF_REPO}/resolve/main/${BACKUP_NAME}"
|
|
|
|
| 16 |
fi
|
| 17 |
|
| 18 |
if [ -z "$HF_REPO" ] || [ -z "$HF_TOKEN" ]; then
|
| 19 |
+
echo "HF backup nije omogucen: postavi HF_BACKUP_REPO i HF_TOKEN u Space Secrets."
|
| 20 |
exit 0
|
| 21 |
fi
|
| 22 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 23 |
backup_archive() {
|
| 24 |
local archive_path="$1"
|
| 25 |
mkdir -p "$(dirname "$archive_path")"
|
|
|
|
| 29 |
do_restore() {
|
| 30 |
mkdir -p "$DATA_DIR"
|
| 31 |
|
| 32 |
+
# Ako sentinel postoji, backup je vec jednom uspjesno restorovan — preskoci
|
| 33 |
+
if [ -f "$SENTINEL" ]; then
|
| 34 |
+
echo "Sentinel pronadjen — backup vec restorovan, preskacemo. Za force restore: obrisi ${SENTINEL}"
|
| 35 |
return
|
| 36 |
fi
|
| 37 |
|
| 38 |
+
echo "Sentinel nije pronadjen — pokusavam restore iz ${HF_REPO}..."
|
| 39 |
|
| 40 |
HTTP_STATUS=$(curl -s -o /tmp/openwebui_restore.tar.gz -w "%{http_code}" \
|
| 41 |
-L \
|
|
|
|
| 45 |
if [ "$HTTP_STATUS" = "200" ]; then
|
| 46 |
FILESIZE=$(wc -c < /tmp/openwebui_restore.tar.gz)
|
| 47 |
if [ "$FILESIZE" -gt 1000 ]; then
|
| 48 |
+
echo "Brisem stare podatke i raspakovavam backup (${FILESIZE} bytes)..."
|
| 49 |
+
find "$DATA_DIR" -mindepth 1 -maxdepth 1 -not -name '.hf_backup_restored' -exec rm -rf {} +
|
| 50 |
tar -xzf /tmp/openwebui_restore.tar.gz -C "$DATA_DIR"
|
| 51 |
+
# Kreiraj sentinel — sljedeci restart ce preskociti restore
|
| 52 |
+
touch "$SENTINEL"
|
| 53 |
+
echo "✅ Restore uspesan! Sentinel kreiran."
|
| 54 |
else
|
| 55 |
+
echo "Backup je premalen (${FILESIZE} bytes), preskacem restore."
|
| 56 |
fi
|
| 57 |
else
|
| 58 |
+
echo "Backup nije dostupan (HTTP ${HTTP_STATUS}) — pokrecemo WebUI bez restore."
|
| 59 |
fi
|
| 60 |
}
|
| 61 |
|
|
|
|
| 70 |
|
| 71 |
FILESIZE=$(wc -c < "$ARCHIVE_PATH")
|
| 72 |
if [ "$FILESIZE" -lt 1000 ]; then
|
| 73 |
+
echo "Arhiva premala (${FILESIZE} bytes), preskacem backup."
|
| 74 |
return
|
| 75 |
fi
|
| 76 |
|
|
|
|
| 84 |
if [ "$HTTP_STATUS" = "200" ] || [ "$HTTP_STATUS" = "201" ]; then
|
| 85 |
echo "Backup uspesan."
|
| 86 |
else
|
| 87 |
+
echo "Backup neuspesan (HTTP ${HTTP_STATUS})."
|
| 88 |
cat /tmp/backup_response.json 2>/dev/null || true
|
| 89 |
fi
|
| 90 |
}
|
| 91 |
|
|
|
|
| 92 |
MODE="${1:-all}"
|
| 93 |
|
| 94 |
case "$MODE" in
|
| 95 |
restore)
|
|
|
|
| 96 |
do_restore
|
| 97 |
;;
|
| 98 |
loop)
|
| 99 |
+
echo "Periodicki backup svakih ${BACKUP_INTERVAL_SECONDS} sekundi aktivan."
|
|
|
|
| 100 |
while true; do
|
| 101 |
sleep "$BACKUP_INTERVAL_SECONDS"
|
| 102 |
backup_archive_to_hf
|
| 103 |
done
|
| 104 |
;;
|
| 105 |
all|*)
|
|
|
|
| 106 |
do_restore
|
| 107 |
+
echo "Periodicki backup svakih ${BACKUP_INTERVAL_SECONDS} sekundi aktivan."
|
| 108 |
while true; do
|
| 109 |
sleep "$BACKUP_INTERVAL_SECONDS"
|
| 110 |
backup_archive_to_hf
|