| | #!/bin/bash |
| | |
| | |
| |
|
| | set -e |
| |
|
| | |
| | |
| | |
| |
|
| | |
| | export TZ="${SYNC_TIMEZONE:-Asia/Kolkata}" |
| |
|
| | |
| | APP_DIR="/app/backend" |
| | DATA_DIR="${APP_DIR}/data" |
| | GITHUB_DATA_DIR="${DATA_DIR}/github_data" |
| |
|
| | |
| | SYNC_INTERVAL=${SYNC_INTERVAL:-3600} |
| | GIT_USER_NAME=${GIT_USER_NAME:-"AutoSync Bot"} |
| | GIT_USER_EMAIL=${GIT_USER_EMAIL:-"autosync@bot.com"} |
| |
|
| | |
| | |
| | |
| |
|
| | 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 |
| | fi |
| |
|
| | echo "[INFO] GitHub Repo: $G_NAME" |
| | echo "[INFO] Sync Interval: ${SYNC_INTERVAL}s" |
| |
|
| | |
| | |
| | |
| |
|
| | 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" |
| | |
| | |
| | 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 |
| |
|
| | |
| | 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_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 "==========================================" |
| |
|
| | |
| | cd "$GITHUB_DATA_DIR" |
| | |
| | |
| | git config user.name "$GIT_USER_NAME" |
| | git config user.email "$GIT_USER_EMAIL" |
| |
|
| | |
| | git checkout main 2>/dev/null || git checkout master 2>/dev/null || git checkout -b main |
| |
|
| | |
| | git pull origin HEAD --rebase 2>/dev/null || echo "[WARN] Pull failed (might be empty repo)" |
| |
|
| | |
| | |
| | |
| | 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 |
| |
|
| | |
| | |
| | |
| | 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 |
| |
|
| | |
| | |
| | |
| | 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 |
| |
|
| | |
| | |
| | |
| | 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 |
| |
|
| | |
| | cd "$APP_DIR" |
| |
|
| | |
| | |
| | |
| | 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 |
| | } |
| |
|
| | |
| | |
| | |
| |
|
| | echo "[INFO] Starting background sync process..." |
| | sync_data & |
| | SYNC_PID=$! |
| | echo "[INFO] Sync process started with PID: $SYNC_PID" |