File size: 7,014 Bytes
abdc396 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 |
#!/bin/bash
# OpenWebUI Data Sync Script
# Syncs webui.db, uploads/, and vector_db/ to GitHub with optional WebDAV backup
set -e
# ============================================
# CONFIGURATION
# ============================================
# Set timezone
export TZ="${SYNC_TIMEZONE:-Asia/Kolkata}"
# Absolute paths (critical for reliability)
APP_DIR="/app/backend"
DATA_DIR="${APP_DIR}/data"
GITHUB_DATA_DIR="${DATA_DIR}/github_data"
# Configurable variables with defaults
SYNC_INTERVAL=${SYNC_INTERVAL:-3600}
GIT_USER_NAME=${GIT_USER_NAME:-"AutoSync Bot"}
GIT_USER_EMAIL=${GIT_USER_EMAIL:-"autosync@bot.com"}
# ============================================
# VALIDATION
# ============================================
echo "=========================================="
echo "OpenWebUI Data Sync Starting..."
echo "Timezone: $TZ"
echo "Current time: $(date '+%Y-%m-%d %H:%M:%S')"
echo "=========================================="
if [ -z "$G_NAME" ] || [ -z "$G_TOKEN" ]; then
echo "[ERROR] Missing required environment variables G_NAME or G_TOKEN"
echo "[WARN] Sync disabled. OpenWebUI will start without data sync."
exit 0 # Don't exit 1, let OpenWebUI start anyway
fi
echo "[INFO] GitHub Repo: $G_NAME"
echo "[INFO] Sync Interval: ${SYNC_INTERVAL}s"
# ============================================
# INITIAL CLONE & RESTORE
# ============================================
REPO_URL="https://${G_TOKEN}@github.com/${G_NAME}.git"
mkdir -p "$GITHUB_DATA_DIR"
echo "[INFO] Cloning repository..."
if git clone "$REPO_URL" "$GITHUB_DATA_DIR" 2>/dev/null; then
echo "[SUCCESS] Repository cloned"
# Configure Git LFS
cd "$GITHUB_DATA_DIR"
git lfs install --local 2>/dev/null || true
git lfs pull 2>/dev/null || true
cd "$APP_DIR"
else
echo "[WARN] Clone failed - initializing empty sync directory"
mkdir -p "$GITHUB_DATA_DIR"
cd "$GITHUB_DATA_DIR"
git init
git remote add origin "$REPO_URL" 2>/dev/null || true
cd "$APP_DIR"
fi
# Restore data from repository
echo "[INFO] Restoring data from repository..."
if [ -f "$GITHUB_DATA_DIR/webui.db" ]; then
cp "$GITHUB_DATA_DIR/webui.db" "$DATA_DIR/webui.db"
echo "[SUCCESS] Restored webui.db"
else
echo "[INFO] No webui.db found in repo, will create on first sync"
fi
if [ -d "$GITHUB_DATA_DIR/uploads" ]; then
mkdir -p "$DATA_DIR/uploads"
cp -r "$GITHUB_DATA_DIR/uploads/"* "$DATA_DIR/uploads/" 2>/dev/null || true
echo "[SUCCESS] Restored uploads directory"
fi
if [ -d "$GITHUB_DATA_DIR/vector_db" ]; then
mkdir -p "$DATA_DIR/vector_db"
cp -r "$GITHUB_DATA_DIR/vector_db/"* "$DATA_DIR/vector_db/" 2>/dev/null || true
echo "[SUCCESS] Restored vector_db directory"
fi
# ============================================
# SYNC FUNCTION
# ============================================
sync_data() {
while true; do
echo "[INFO] Next sync in ${SYNC_INTERVAL} seconds..."
sleep "$SYNC_INTERVAL"
CURRENT_TIME=$(date '+%Y-%m-%d %H:%M:%S')
echo ""
echo "=========================================="
echo "[SYNC] Starting sync at $CURRENT_TIME"
echo "=========================================="
# Navigate to GitHub data directory
cd "$GITHUB_DATA_DIR"
# Configure Git
git config user.name "$GIT_USER_NAME"
git config user.email "$GIT_USER_EMAIL"
# Ensure on correct branch
git checkout main 2>/dev/null || git checkout master 2>/dev/null || git checkout -b main
# Pull latest changes
git pull origin HEAD --rebase 2>/dev/null || echo "[WARN] Pull failed (might be empty repo)"
# ----------------------------------------
# 1. Safe Database Backup
# ----------------------------------------
if [ -f "$DATA_DIR/webui.db" ]; then
echo "[INFO] Creating safe backup of webui.db..."
if command -v sqlite3 &> /dev/null; then
sqlite3 "$DATA_DIR/webui.db" ".backup '$GITHUB_DATA_DIR/webui.db'"
echo "[SUCCESS] SQLite hot backup created"
else
cp "$DATA_DIR/webui.db" "$GITHUB_DATA_DIR/webui.db"
echo "[WARN] sqlite3 not found, used cp (potentially unsafe)"
fi
else
echo "[INFO] No webui.db found yet"
fi
# ----------------------------------------
# 2. Sync Uploads Directory
# ----------------------------------------
if [ -d "$DATA_DIR/uploads" ]; then
echo "[INFO] Syncing uploads directory..."
mkdir -p "$GITHUB_DATA_DIR/uploads"
cp -r "$DATA_DIR/uploads/"* "$GITHUB_DATA_DIR/uploads/" 2>/dev/null || true
fi
# ----------------------------------------
# 3. Sync Vector DB
# ----------------------------------------
if [ -d "$DATA_DIR/vector_db" ]; then
echo "[INFO] Syncing vector_db directory..."
mkdir -p "$GITHUB_DATA_DIR/vector_db"
cp -r "$DATA_DIR/vector_db/"* "$GITHUB_DATA_DIR/vector_db/" 2>/dev/null || true
fi
# ----------------------------------------
# 4. Git Commit & Push
# ----------------------------------------
if [[ -n $(git status -s) ]]; then
echo "[INFO] Changes detected, committing..."
git add .
git commit -m "Auto sync: $CURRENT_TIME"
if git push origin HEAD; then
echo "[SUCCESS] GitHub push successful"
else
echo "[WARN] Push failed, retrying..."
sleep 5
git pull origin HEAD --rebase 2>/dev/null || true
git push origin HEAD || echo "[ERROR] Retry failed"
fi
else
echo "[INFO] No changes detected"
fi
# Return to app directory
cd "$APP_DIR"
# ----------------------------------------
# 5. WebDAV Sync (Optional)
# ----------------------------------------
if [ -n "$WEBDAV_URL" ] && [ -n "$WEBDAV_USERNAME" ] && [ -n "$WEBDAV_PASSWORD" ]; then
echo "[INFO] Starting WebDAV sync..."
FILENAME="webui_$(date +'%Y%m%d_%H%M%S').db"
if [ -f "$DATA_DIR/webui.db" ]; then
if curl -s -T "$DATA_DIR/webui.db" \
--user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
"$WEBDAV_URL/$FILENAME"; then
echo "[SUCCESS] WebDAV upload successful: $FILENAME"
else
echo "[ERROR] WebDAV upload failed"
fi
fi
fi
echo "[SYNC] Completed at $(date '+%Y-%m-%d %H:%M:%S')"
done
}
# ============================================
# START BACKGROUND SYNC
# ============================================
echo "[INFO] Starting background sync process..."
sync_data &
SYNC_PID=$!
echo "[INFO] Sync process started with PID: $SYNC_PID" |