owlninjam commited on
Commit
abdc396
·
verified ·
1 Parent(s): 6121f2e

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +17 -0
  2. README.md +76 -6
  3. sync_data.sh +204 -0
Dockerfile ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ FROM ghcr.io/open-webui/open-webui:main
2
+
3
+ # Install required tools
4
+ RUN apt-get update && apt-get install -y \
5
+ git \
6
+ git-lfs \
7
+ sqlite3 \
8
+ curl \
9
+ && git lfs install \
10
+ && rm -rf /var/lib/apt/lists/*
11
+
12
+ COPY sync_data.sh sync_data.sh
13
+
14
+ RUN chmod -R 777 ./data && \
15
+ chmod -R 777 /app/backend/open_webui/static && \
16
+ chmod +x sync_data.sh && \
17
+ sed -i "1r sync_data.sh" ./start.sh
README.md CHANGED
@@ -1,10 +1,80 @@
1
  ---
2
- title: Openwebui
3
- emoji: 🌍
4
- colorFrom: green
5
- colorTo: gray
6
  sdk: docker
7
- pinned: false
 
 
 
 
 
 
 
 
 
 
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
+ title: OpenWebUI
3
+ emoji: 🤖
4
+ colorFrom: blue
5
+ colorTo: purple
6
  sdk: docker
7
+ pinned: true
8
+ app_port: 8080
9
+ suggested_hardware: cpu-basic
10
+ suggested_storage: medium
11
+ short_description: OpenWebUI with automated GitHub data sync
12
+ tags:
13
+ - openwebui
14
+ - chat
15
+ - llm
16
+ - ai
17
+ - docker
18
+ - data-sync
19
+ - backup
20
  ---
21
 
22
+ # OpenWebUI with Data Synchronization
23
+
24
+ A self-hosted OpenWebUI instance with automated data backup and synchronization to GitHub.
25
+
26
+ ## Features
27
+
28
+ - 🤖 **Full OpenWebUI**: Chat interface for AI models
29
+ - 🔄 **Auto Sync**: Backs up `webui.db`, `uploads/`, `vector_db/` to GitHub
30
+ - 🛡️ **Safe Backups**: SQLite hot backups prevent corruption
31
+ - 📦 **Git LFS**: Handles large files in uploads/vector_db
32
+ - ⏰ **Configurable**: Custom sync intervals and timezone
33
+ - 🌐 **WebDAV Support**: Optional secondary backup location
34
+
35
+ ## Environment Variables
36
+
37
+ Set these in your Space's **Repository Secrets**:
38
+
39
+ ### Required
40
+
41
+ | Variable | Description | Example |
42
+ |----------|-------------|---------|
43
+ | `G_NAME` | GitHub repo | `username/openwebui-db` |
44
+ | `G_TOKEN` | GitHub PAT | `github_pat_xxx...` |
45
+
46
+ ### Optional
47
+
48
+ | Variable | Description | Default |
49
+ |----------|-------------|---------|
50
+ | `SYNC_INTERVAL` | Sync frequency (seconds) | `3600` |
51
+ | `SYNC_TIMEZONE` | Timezone for logs | `Asia/Kolkata` |
52
+ | `GIT_USER_NAME` | Commit author | `AutoSync Bot` |
53
+ | `GIT_USER_EMAIL` | Commit email | `autosync@bot.com` |
54
+ | `WEBDAV_URL` | WebDAV server URL | - |
55
+ | `WEBDAV_USERNAME` | WebDAV user | - |
56
+ | `WEBDAV_PASSWORD` | WebDAV password | - |
57
+
58
+ ## GitHub Token Setup
59
+
60
+ 1. Go to [GitHub Token Settings](https://github.com/settings/tokens)
61
+ 2. Create a **Fine-grained token**
62
+ 3. Select your backup repository
63
+ 4. Grant **Contents**: Read and Write
64
+
65
+ ## Setup
66
+
67
+ 1. Create a private GitHub repository for backups
68
+ 2. Generate a GitHub Personal Access Token
69
+ 3. Add `G_NAME` and `G_TOKEN` to Space secrets
70
+ 4. Deploy and enjoy persistent storage!
71
+
72
+ ## How It Works
73
+
74
+ 1. **Startup**: Clones your GitHub repo and restores data
75
+ 2. **Runtime**: Syncs every `SYNC_INTERVAL` seconds
76
+ 3. **Backup**: Creates SQLite hot backup, syncs uploads/vector_db
77
+ 4. **Push**: Commits and pushes changes to GitHub
78
+ 5. **WebDAV**: Optionally uploads timestamped backup to WebDAV
79
+
80
+ Check out the [configuration reference](https://huggingface.co/docs/hub/spaces-config-reference) for more details.
sync_data.sh ADDED
@@ -0,0 +1,204 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ # OpenWebUI Data Sync Script
3
+ # Syncs webui.db, uploads/, and vector_db/ to GitHub with optional WebDAV backup
4
+
5
+ set -e
6
+
7
+ # ============================================
8
+ # CONFIGURATION
9
+ # ============================================
10
+
11
+ # Set timezone
12
+ export TZ="${SYNC_TIMEZONE:-Asia/Kolkata}"
13
+
14
+ # Absolute paths (critical for reliability)
15
+ APP_DIR="/app/backend"
16
+ DATA_DIR="${APP_DIR}/data"
17
+ GITHUB_DATA_DIR="${DATA_DIR}/github_data"
18
+
19
+ # Configurable variables with defaults
20
+ SYNC_INTERVAL=${SYNC_INTERVAL:-3600}
21
+ GIT_USER_NAME=${GIT_USER_NAME:-"AutoSync Bot"}
22
+ GIT_USER_EMAIL=${GIT_USER_EMAIL:-"autosync@bot.com"}
23
+
24
+ # ============================================
25
+ # VALIDATION
26
+ # ============================================
27
+
28
+ echo "=========================================="
29
+ echo "OpenWebUI Data Sync Starting..."
30
+ echo "Timezone: $TZ"
31
+ echo "Current time: $(date '+%Y-%m-%d %H:%M:%S')"
32
+ echo "=========================================="
33
+
34
+ if [ -z "$G_NAME" ] || [ -z "$G_TOKEN" ]; then
35
+ echo "[ERROR] Missing required environment variables G_NAME or G_TOKEN"
36
+ echo "[WARN] Sync disabled. OpenWebUI will start without data sync."
37
+ exit 0 # Don't exit 1, let OpenWebUI start anyway
38
+ fi
39
+
40
+ echo "[INFO] GitHub Repo: $G_NAME"
41
+ echo "[INFO] Sync Interval: ${SYNC_INTERVAL}s"
42
+
43
+ # ============================================
44
+ # INITIAL CLONE & RESTORE
45
+ # ============================================
46
+
47
+ REPO_URL="https://${G_TOKEN}@github.com/${G_NAME}.git"
48
+ mkdir -p "$GITHUB_DATA_DIR"
49
+
50
+ echo "[INFO] Cloning repository..."
51
+ if git clone "$REPO_URL" "$GITHUB_DATA_DIR" 2>/dev/null; then
52
+ echo "[SUCCESS] Repository cloned"
53
+
54
+ # Configure Git LFS
55
+ cd "$GITHUB_DATA_DIR"
56
+ git lfs install --local 2>/dev/null || true
57
+ git lfs pull 2>/dev/null || true
58
+ cd "$APP_DIR"
59
+ else
60
+ echo "[WARN] Clone failed - initializing empty sync directory"
61
+ mkdir -p "$GITHUB_DATA_DIR"
62
+ cd "$GITHUB_DATA_DIR"
63
+ git init
64
+ git remote add origin "$REPO_URL" 2>/dev/null || true
65
+ cd "$APP_DIR"
66
+ fi
67
+
68
+ # Restore data from repository
69
+ echo "[INFO] Restoring data from repository..."
70
+
71
+ if [ -f "$GITHUB_DATA_DIR/webui.db" ]; then
72
+ cp "$GITHUB_DATA_DIR/webui.db" "$DATA_DIR/webui.db"
73
+ echo "[SUCCESS] Restored webui.db"
74
+ else
75
+ echo "[INFO] No webui.db found in repo, will create on first sync"
76
+ fi
77
+
78
+ if [ -d "$GITHUB_DATA_DIR/uploads" ]; then
79
+ mkdir -p "$DATA_DIR/uploads"
80
+ cp -r "$GITHUB_DATA_DIR/uploads/"* "$DATA_DIR/uploads/" 2>/dev/null || true
81
+ echo "[SUCCESS] Restored uploads directory"
82
+ fi
83
+
84
+ if [ -d "$GITHUB_DATA_DIR/vector_db" ]; then
85
+ mkdir -p "$DATA_DIR/vector_db"
86
+ cp -r "$GITHUB_DATA_DIR/vector_db/"* "$DATA_DIR/vector_db/" 2>/dev/null || true
87
+ echo "[SUCCESS] Restored vector_db directory"
88
+ fi
89
+
90
+ # ============================================
91
+ # SYNC FUNCTION
92
+ # ============================================
93
+
94
+ sync_data() {
95
+ while true; do
96
+ echo "[INFO] Next sync in ${SYNC_INTERVAL} seconds..."
97
+ sleep "$SYNC_INTERVAL"
98
+
99
+ CURRENT_TIME=$(date '+%Y-%m-%d %H:%M:%S')
100
+ echo ""
101
+ echo "=========================================="
102
+ echo "[SYNC] Starting sync at $CURRENT_TIME"
103
+ echo "=========================================="
104
+
105
+ # Navigate to GitHub data directory
106
+ cd "$GITHUB_DATA_DIR"
107
+
108
+ # Configure Git
109
+ git config user.name "$GIT_USER_NAME"
110
+ git config user.email "$GIT_USER_EMAIL"
111
+
112
+ # Ensure on correct branch
113
+ git checkout main 2>/dev/null || git checkout master 2>/dev/null || git checkout -b main
114
+
115
+ # Pull latest changes
116
+ git pull origin HEAD --rebase 2>/dev/null || echo "[WARN] Pull failed (might be empty repo)"
117
+
118
+ # ----------------------------------------
119
+ # 1. Safe Database Backup
120
+ # ----------------------------------------
121
+ if [ -f "$DATA_DIR/webui.db" ]; then
122
+ echo "[INFO] Creating safe backup of webui.db..."
123
+ if command -v sqlite3 &> /dev/null; then
124
+ sqlite3 "$DATA_DIR/webui.db" ".backup '$GITHUB_DATA_DIR/webui.db'"
125
+ echo "[SUCCESS] SQLite hot backup created"
126
+ else
127
+ cp "$DATA_DIR/webui.db" "$GITHUB_DATA_DIR/webui.db"
128
+ echo "[WARN] sqlite3 not found, used cp (potentially unsafe)"
129
+ fi
130
+ else
131
+ echo "[INFO] No webui.db found yet"
132
+ fi
133
+
134
+ # ----------------------------------------
135
+ # 2. Sync Uploads Directory
136
+ # ----------------------------------------
137
+ if [ -d "$DATA_DIR/uploads" ]; then
138
+ echo "[INFO] Syncing uploads directory..."
139
+ mkdir -p "$GITHUB_DATA_DIR/uploads"
140
+ cp -r "$DATA_DIR/uploads/"* "$GITHUB_DATA_DIR/uploads/" 2>/dev/null || true
141
+ fi
142
+
143
+ # ----------------------------------------
144
+ # 3. Sync Vector DB
145
+ # ----------------------------------------
146
+ if [ -d "$DATA_DIR/vector_db" ]; then
147
+ echo "[INFO] Syncing vector_db directory..."
148
+ mkdir -p "$GITHUB_DATA_DIR/vector_db"
149
+ cp -r "$DATA_DIR/vector_db/"* "$GITHUB_DATA_DIR/vector_db/" 2>/dev/null || true
150
+ fi
151
+
152
+ # ----------------------------------------
153
+ # 4. Git Commit & Push
154
+ # ----------------------------------------
155
+ if [[ -n $(git status -s) ]]; then
156
+ echo "[INFO] Changes detected, committing..."
157
+ git add .
158
+ git commit -m "Auto sync: $CURRENT_TIME"
159
+
160
+ if git push origin HEAD; then
161
+ echo "[SUCCESS] GitHub push successful"
162
+ else
163
+ echo "[WARN] Push failed, retrying..."
164
+ sleep 5
165
+ git pull origin HEAD --rebase 2>/dev/null || true
166
+ git push origin HEAD || echo "[ERROR] Retry failed"
167
+ fi
168
+ else
169
+ echo "[INFO] No changes detected"
170
+ fi
171
+
172
+ # Return to app directory
173
+ cd "$APP_DIR"
174
+
175
+ # ----------------------------------------
176
+ # 5. WebDAV Sync (Optional)
177
+ # ----------------------------------------
178
+ if [ -n "$WEBDAV_URL" ] && [ -n "$WEBDAV_USERNAME" ] && [ -n "$WEBDAV_PASSWORD" ]; then
179
+ echo "[INFO] Starting WebDAV sync..."
180
+ FILENAME="webui_$(date +'%Y%m%d_%H%M%S').db"
181
+
182
+ if [ -f "$DATA_DIR/webui.db" ]; then
183
+ if curl -s -T "$DATA_DIR/webui.db" \
184
+ --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
185
+ "$WEBDAV_URL/$FILENAME"; then
186
+ echo "[SUCCESS] WebDAV upload successful: $FILENAME"
187
+ else
188
+ echo "[ERROR] WebDAV upload failed"
189
+ fi
190
+ fi
191
+ fi
192
+
193
+ echo "[SYNC] Completed at $(date '+%Y-%m-%d %H:%M:%S')"
194
+ done
195
+ }
196
+
197
+ # ============================================
198
+ # START BACKGROUND SYNC
199
+ # ============================================
200
+
201
+ echo "[INFO] Starting background sync process..."
202
+ sync_data &
203
+ SYNC_PID=$!
204
+ echo "[INFO] Sync process started with PID: $SYNC_PID"