| #!/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" |