nbugs commited on
Commit
dce165e
·
verified ·
1 Parent(s): 3d5061a

Update sync_data.sh

Browse files
Files changed (1) hide show
  1. sync_data.sh +150 -176
sync_data.sh CHANGED
@@ -21,77 +21,77 @@ import sys
21
  import os
22
 
23
  def manage_backups(api, repo_id, max_files=50):
24
- """管理备份文件,保留最新的max_files个文件"""
25
- files = api.list_repo_files(repo_id=repo_id, repo_type="dataset")
26
  backup_files = [f for f in files if f.startswith('webui_backup_') and f.endswith('.db')]
27
-
28
  # 按日期分组文件(从文件名中提取日期)
29
  backup_by_date = {}
30
  for file in backup_files:
31
- try:
32
- # 从文件名格式 webui_backup_YYYYMMDD.db 中提取日期部分
33
- date_part = file.split('_')[2].split('.')[0] # 提取YYYYMMDD部分
34
- backup_by_date[date_part] = file
35
- except:
36
- # 如果文件名格式不符,则跳过
37
- continue
38
-
39
  # 日期排序并仅保留最新max_files个文件
40
  sorted_dates = sorted(backup_by_date.keys())
41
  if len(sorted_dates) > max_files:
42
- dates_to_delete = sorted_dates[:(len(sorted_dates) - max_files)]
43
- for date in dates_to_delete:
44
- try:
45
- api.delete_file(path_in_repo=backup_by_date[date], repo_id=repo_id, repo_type="dataset")
46
- print(f'已删除旧备份: {backup_by_date[date]}')
47
- except Exception as e:
48
- print(f'删除 {backup_by_date[date]} 时出错: {str(e)}')
49
 
50
  def upload_backup(file_path, file_name, token, repo_id):
51
  """上传备份文件到Hugging Face"""
52
  api = HfApi(token=token)
53
  try:
54
- # 检查同名文件是否已存在
55
- files = api.list_repo_files(repo_id=repo_id, repo_type="dataset")
56
- if file_name in files:
57
- # 上传前删除同名文件
58
- api.delete_file(path_in_repo=file_name, repo_id=repo_id, repo_type="dataset")
59
- print(f"已删除同名文件: {file_name}")
60
-
61
- api.upload_file(
62
- path_or_fileobj=file_path,
63
- path_in_repo=file_name,
64
- repo_id=repo_id,
65
- repo_type="dataset"
66
- )
67
- print(f"成功上传 {file_name}")
68
- manage_backups(api, repo_id)
69
  except Exception as e:
70
- print(f"文件上传出错: {str(e)}")
71
 
72
  # 下载最新备份
73
  def download_latest_backup(token, repo_id):
74
  try:
75
- api = HfApi(token=token)
76
- files = api.list_repo_files(repo_id=repo_id, repo_type="dataset")
77
- backup_files = [f for f in files if f.startswith('webui_backup_') and f.endswith('.db')]
78
- if not backup_files:
79
- print("未找到备份文件")
80
- return False
81
-
82
- latest_backup = sorted(backup_files)[-1]
83
- file = api.hf_hub_download(
84
- repo_id=repo_id,
85
- filename=latest_backup,
86
- repo_type="dataset"
87
- )
88
-
89
- if file and os.path.exists(file):
90
- os.makedirs('./data', exist_ok=True)
91
- os.system(f'cp "{file}" ./data/webui.db')
92
- print(f"成功从 {latest_backup} 恢复备份")
93
- return True
94
-
95
  return False
96
  except Exception as e:
97
  print(f"下载备份时出错: {str(e)}")
@@ -101,13 +101,13 @@ if __name__ == "__main__":
101
  action = sys.argv[1]
102
  token = sys.argv[2]
103
  repo_id = sys.argv[3]
104
-
105
  if action == "upload":
106
- file_path = sys.argv[4]
107
- file_name = sys.argv[5]
108
- upload_backup(file_path, file_name, token, repo_id)
109
  elif action == "download":
110
- download_latest_backup(token, repo_id)
111
  EOL
112
 
113
  # 首次启动时的数据恢复策略
@@ -121,82 +121,46 @@ echo "WebDAV 密码: $masked_password"
121
 
122
  # 首先尝试从 WebDAV 恢复最新文件
123
  echo "正在尝试从 WebDAV 获取文件列表..."
124
- echo "PROPFIND 请求: $WEBDAV_URL/open/"
125
 
126
  # 获取并打印 WebDAV 目录内容
127
- webdav_list_output=$(curl -v -X PROPFIND --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -H "Depth: 1" "$WEBDAV_URL/open/" 2>&1)
128
  echo "WebDAV 目录内容响应:"
129
  echo "$webdav_list_output"
130
 
131
  # 获取 WebDAV 目录中的文件列表并找出最新的备份文件
132
- webdav_files=$(echo "$webdav_list_output" | grep -o '<d:href>[^<]*webui_[0-9][0-9]-[0-9][0-9]\.db</d:href>' | sed 's/<d:href>//g' | sed 's/<\/d:href>//g')
133
 
134
  if [ -n "$webdav_files" ]; then
135
- # 找出最新的文件 (按文件名排序,取最后一个)
136
- latest_file=$(echo "$webdav_files" | sort | tail -n 1)
137
  echo "找到最新的 WebDAV 备份文件: $latest_file"
138
-
139
- # 构建并打印完整下载链接
140
- download_url="$WEBDAV_URL$latest_file"
141
  echo "下载 URL: $download_url"
142
-
143
  # 下载最新文件
144
  curl -v -L --fail --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$download_url" -o "./data/webui.db" && {
145
- echo "成功从 WebDAV 下载最新数据库文件: $latest_file"
146
-
147
- # 上传到 HuggingFace
148
- DATE_FORMAT=$(date +%Y%m%d)
149
- backup_file="webui_backup_${DATE_FORMAT}.db"
150
- cp ./data/webui.db "/tmp/${backup_file}"
151
- echo "正在上传初始备份到 Hugging Face..."
152
- python /tmp/hf_sync.py upload "${HF_TOKEN}" "${DATASET_ID}" "/tmp/${backup_file}" "${backup_file}"
153
- rm -f "/tmp/${backup_file}"
154
  } || {
155
- echo "从 WebDAV 下载最新文件失败,尝试下载 WebDAV webui.db..."
156
-
157
- # 打印 webui.db 下载链接
158
- main_db_url="$WEBDAV_URL/open/webui.db"
159
- echo "尝试下载主数据库文件 URL: $main_db_url"
160
-
161
- curl -v -L --fail --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$main_db_url" -o "./data/webui.db" && {
162
- echo "成功从 WebDAV 下载主数据库文件"
163
-
164
- # 上传到 HuggingFace
165
- DATE_FORMAT=$(date +%Y%m%d)
166
- backup_file="webui_backup_${DATE_FORMAT}.db"
167
- cp ./data/webui.db "/tmp/${backup_file}"
168
- echo "正在上传初始备份到 Hugging Face..."
169
- python /tmp/hf_sync.py upload "${HF_TOKEN}" "${DATASET_ID}" "/tmp/${backup_file}" "${backup_file}"
170
- rm -f "/tmp/${backup_file}"
171
- } || {
172
- echo "从 WebDAV 下载失败,尝试从 Hugging Face 恢复..."
173
- python /tmp/hf_sync.py download "${HF_TOKEN}" "${DATASET_ID}" || {
174
- echo "所有恢复方式均失败,将使用空数据库开始"
175
- }
176
- }
177
  }
178
  else
179
- echo "WebDAV 中没有找到符合格式的备份文件,尝试下载 webui.db..."
180
-
181
- # 打印 webui.db 下载链接
182
- main_db_url="$WEBDAV_URL/open/webui.db"
183
- echo "尝试下载主数据库文件 URL: $main_db_url"
184
-
185
- curl -v -L --fail --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$main_db_url" -o "./data/webui.db" && {
186
- echo "成功从 WebDAV 下载主数据库文件"
187
-
188
- # 上传到 HuggingFace
189
- DATE_FORMAT=$(date +%Y%m%d)
190
- backup_file="webui_backup_${DATE_FORMAT}.db"
191
- cp ./data/webui.db "/tmp/${backup_file}"
192
- echo "正在上传初始备份到 Hugging Face..."
193
- python /tmp/hf_sync.py upload "${HF_TOKEN}" "${DATASET_ID}" "/tmp/${backup_file}" "${backup_file}"
194
- rm -f "/tmp/${backup_file}"
195
- } || {
196
- echo "从 WebDAV 下载失败,尝试从 Hugging Face 恢复..."
197
- python /tmp/hf_sync.py download "${HF_TOKEN}" "${DATASET_ID}" || {
198
- echo "所有恢复方式均失败,将使用空数据库开始"
199
- }
200
  }
201
  fi
202
 
@@ -205,45 +169,55 @@ webdav_sync_() {
205
  SYNC_INTERVAL=${SYNC_INTERVAL:-7200} # 默认间隔时间为 7200 秒
206
  echo "WebDAV 同步进程启动,等待 ${SYNC_INTERVAL} 秒后开始同步..."
207
  sleep $SYNC_INTERVAL
208
-
209
  while true; do
210
- echo "开始 WebDAV 同步 $(date)"
211
-
212
- # 检查数据库文件是否存在
213
- if [ -f "./data/webui.db" ]; then
214
- # 生成仅含日期的文件名(月-日)
215
- FILE="webui_$(date +'%m-%d').db"
216
- echo "同步到 WebDAV..."
217
- upload_url="$WEBDAV_URL/open/$FILE"
218
- echo "上传 URL: $upload_url"
219
-
220
- # 上传以日期命名的数据库文件
221
- curl -v -L -T "./data/webui.db" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$upload_url" && {
222
- echo "WebDAV 上传成功: $FILE"
223
-
224
- # 覆盖Webdav目录下默认的webui.db文件
225
- main_file_url="$WEBDAV_URL/open/webui.db"
226
- echo "更新主文件 URL: $main_file_url"
227
- curl -v -L -T "./data/webui.db" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$main_file_url" && {
228
- echo "WebDAV 更新主文件成功"
229
- } || {
230
- echo "WebDAV 更新主文件失败"
231
- }
232
- } || {
233
- echo "WebDAV 上传失败,等待重试..."
234
- sleep 10
235
- echo "重试上传 URL: $upload_url"
236
- curl -v -L -T "./data/webui.db" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$upload_url" || {
237
- echo "重试失败,放弃上传。"
238
- }
239
- }
240
- else
241
- echo "未找到 webui.db 文件,跳过 WebDAV 同步"
242
- fi
243
-
244
- # 等待下一次同步间隔
245
- echo "WebDAV 同步完成,下次同步将在 ${SYNC_INTERVAL} 秒后进行..."
246
- sleep $SYNC_INTERVAL
 
 
 
 
 
 
 
 
 
 
247
  done
248
  }
249
 
@@ -252,29 +226,29 @@ hf_sync_() {
252
  SYNC_INTERVAL=${SYNC_INTERVAL:-7200}
253
  echo "Hugging Face 同步进程启动,等待 ${SYNC_INTERVAL} 秒后开始同步..."
254
  sleep $(($SYNC_INTERVAL / 2)) # 错开与 WebDAV 同步的时间
255
-
256
  while true; do
257
  echo "开始 Hugging Face 同步 $(date)"
258
-
259
- if [ -f "./data/webui.db" ]; then
260
- # 使用仅含日期的格式(年月日)
261
- DATE_FORMAT=$(date +%Y%m%d)
262
- backup_file="webui_backup_${DATE_FORMAT}.db"
263
-
264
- # 复制数据库文件
265
- cp ./data/webui.db "/tmp/${backup_file}"
266
- echo "正在上传备份到 Hugging Face..."
267
- python /tmp/hf_sync.py upload "${HF_TOKEN}" "${DATASET_ID}" "/tmp/${backup_file}" "${backup_file}"
268
- rm -f "/tmp/${backup_file}"
269
- else
270
- echo "数据库文件不存在,跳过 Hugging Face 同步"
271
- fi
272
-
273
  echo "Hugging Face 同步完成,下次同步将在 ${SYNC_INTERVAL} 秒后进行..."
274
- sleep $SYNC_INTERVAL
275
  done
276
  }
277
 
278
  # 后台启动同步进程
279
  webdav_sync_ &
280
- hf_sync_ &
 
21
  import os
22
 
23
  def manage_backups(api, repo_id, max_files=50):
24
+ """管理备份文件,保留最新的max_files个文件"""
25
+ files = api.list_repo_files(repo_id=repo_id, repo_type="dataset")
26
  backup_files = [f for f in files if f.startswith('webui_backup_') and f.endswith('.db')]
27
+
28
  # 按日期分组文件(从文件名中提取日期)
29
  backup_by_date = {}
30
  for file in backup_files:
31
+ try:
32
+ # 从文件名格式 webui_backup_YYYYMMDD.db 中提取日期部分
33
+ date_part = file.split('_')[2].split('.')[0] # 提取YYYYMMDD部分
34
+ backup_by_date[date_part] = file
35
+ except:
36
+ # 如果文件名格式不符,则跳过
37
+ continue
38
+
39
  # 日期排序并仅保留最新max_files个文件
40
  sorted_dates = sorted(backup_by_date.keys())
41
  if len(sorted_dates) > max_files:
42
+ dates_to_delete = sorted_dates[:(len(sorted_dates) - max_files)]
43
+ for date in dates_to_delete:
44
+ try:
45
+ api.delete_file(path_in_repo=backup_by_date[date], repo_id=repo_id, repo_type="dataset")
46
+ print(f'已删除旧备份: {backup_by_date[date]}')
47
+ except Exception as e:
48
+ print(f'删除 {backup_by_date[date]} 时出错: {str(e)}')
49
 
50
  def upload_backup(file_path, file_name, token, repo_id):
51
  """上传备份文件到Hugging Face"""
52
  api = HfApi(token=token)
53
  try:
54
+ # 检查同名文件是否已存在
55
+ files = api.list_repo_files(repo_id=repo_id, repo_type="dataset")
56
+ if file_name in files:
57
+ # 上传前删除同名文件
58
+ api.delete_file(path_in_repo=file_name, repo_id=repo_id, repo_type="dataset")
59
+ print(f"已删除同名文件: {file_name}")
60
+
61
+ api.upload_file(
62
+ path_or_fileobj=file_path,
63
+ path_in_repo=file_name,
64
+ repo_id=repo_id,
65
+ repo_type="dataset"
66
+ )
67
+ print(f"成功上传 {file_name}")
68
+ manage_backups(api, repo_id)
69
  except Exception as e:
70
+ print(f"文件上传出错: {str(e)}")
71
 
72
  # 下载最新备份
73
  def download_latest_backup(token, repo_id):
74
  try:
75
+ api = HfApi(token=token)
76
+ files = api.list_repo_files(repo_id=repo_id, repo_type="dataset")
77
+ backup_files = [f for f in files if f.startswith('webui_backup_') and f.endswith('.db')]
78
+ if not backup_files:
79
+ print("未找到备份文件")
80
+ return False
81
+
82
+ latest_backup = sorted(backup_files)[-1]
83
+ file = api.hf_hub_download(
84
+ repo_id=repo_id,
85
+ filename=latest_backup,
86
+ repo_type="dataset"
87
+ )
88
+
89
+ if file and os.path.exists(file):
90
+ os.makedirs('./data', exist_ok=True)
91
+ os.system(f'cp "{file}" ./data/webui.db')
92
+ print(f"成功从 {latest_backup} 恢复备份")
93
+ return True
94
+
95
  return False
96
  except Exception as e:
97
  print(f"下载备份时出错: {str(e)}")
 
101
  action = sys.argv[1]
102
  token = sys.argv[2]
103
  repo_id = sys.argv[3]
104
+
105
  if action == "upload":
106
+ file_path = sys.argv[4]
107
+ file_name = sys.argv[5]
108
+ upload_backup(file_path, file_name, token, repo_id)
109
  elif action == "download":
110
+ download_latest_backup(token, repo_id)
111
  EOL
112
 
113
  # 首次启动时的数据恢复策略
 
121
 
122
  # 首先尝试从 WebDAV 恢复最新文件
123
  echo "正在尝试从 WebDAV 获取文件列表..."
124
+ echo "PROPFIND 请求: $WEBDAV_URL/openwebui/"
125
 
126
  # 获取并打印 WebDAV 目录内容
127
+ webdav_list_output=$(curl -v -X PROPFIND --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -H "Depth: 1" "$WEBDAV_URL/openwebui/" 2>&1)
128
  echo "WebDAV 目录内容响应:"
129
  echo "$webdav_list_output"
130
 
131
  # 获取 WebDAV 目录中的文件列表并找出最新的备份文件
132
+ webdav_files=$(echo "$webdav_list_output" | grep -o '<d:href>[^<]*webui_[0-9]\{4\}[0-9]\{2\}[0-9]\{2\}\.db</d:href>' | sed 's/<d:href>//g' | sed 's/<\/d:href>//g')
133
 
134
  if [ -n "$webdav_files" ]; then
135
+ # 找出最新的文件 (按文件名排序,取最后一个)
136
+ latest_file=$(echo "$webdav_files" | sort | tail -n 1)
137
  echo "找到最新的 WebDAV 备份文件: $latest_file"
138
+
139
+ # 构建并打印完整下载链接
140
+ download_url="$WEBDAV_URL$latest_file"
141
  echo "下载 URL: $download_url"
142
+
143
  # 下载最新文件
144
  curl -v -L --fail --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$download_url" -o "./data/webui.db" && {
145
+ echo "成功从 WebDAV 下载最新数据库文件: $latest_file"
146
+
147
+ # 上传到 HuggingFace
148
+ DATE_FORMAT=$(date +%Y%m%d)
149
+ backup_file="webui_backup_${DATE_FORMAT}.db"
150
+ cp ./data/webui.db "/tmp/${backup_file}"
151
+ echo "正在上传初始备份到 Hugging Face..."
152
+ python /tmp/hf_sync.py upload "${HF_TOKEN}" "${DATASET_ID}" "/tmp/${backup_file}" "${backup_file}"
153
+ rm -f "/tmp/${backup_file}"
154
  } || {
155
+ echo "从 WebDAV 下载最新文件失败,尝试从 Hugging Face 恢复..."
156
+ python /tmp/hf_sync.py download "${HF_TOKEN}" "${DATASET_ID}" || {
157
+ echo "所有恢复方式均失败,将使用空数据库开始"
158
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
159
  }
160
  else
161
+ echo "WebDAV 中没有找到符合格式的备份文件,尝试从 Hugging Face 恢复..."
162
+ python /tmp/hf_sync.py download "${HF_TOKEN}" "${DATASET_ID}" || {
163
+ echo "从 Hugging Face 恢复失败,将使用空数据库开始"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
164
  }
165
  fi
166
 
 
169
  SYNC_INTERVAL=${SYNC_INTERVAL:-7200} # 默认间隔时间为 7200 秒
170
  echo "WebDAV 同步进程启动,等待 ${SYNC_INTERVAL} 秒后开始同步..."
171
  sleep $SYNC_INTERVAL
172
+
173
  while true; do
174
+ echo "开始 WebDAV 同步 $(date)"
175
+
176
+ # 检查数据库文件是否存在
177
+ if [ -f "./data/webui.db" ]; then
178
+ # 生成当天的日期文件名(YYYYMMDD格式)
179
+ DATE_FORMAT=$(date +%Y%m%d)
180
+ FILE="webui_${DATE_FORMAT}.db"
181
+ echo "同步到 WebDAV..."
182
+ upload_url="$WEBDAV_URL/openwebui/$FILE"
183
+ echo "上传 URL: $upload_url"
184
+
185
+ # 上传以日期命名的数据库文件
186
+ curl -v -L -T "./data/webui.db" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$upload_url" && {
187
+ echo "WebDAV 上传成功: $FILE"
188
+
189
+ # 删除较旧的文件以管理空间
190
+ echo "获取 WebDAV 目录以清理旧文件..."
191
+ webdav_files_list=$(curl -s -X PROPFIND --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" -H "Depth: 1" "$WEBDAV_URL/openwebui/" | grep -o '<d:href>[^<]*webui_[0-9]\{8\}\.db</d:href>' | sed 's/<d:href>//g' | sed 's/<\/d:href>//g')
192
+
193
+ # 保留最新的10个文件
194
+ if [ -n "$webdav_files_list" ]; then
195
+ files_to_keep=$(echo "$webdav_files_list" | sort | tail -n 10)
196
+
197
+ # 删除较旧的文件
198
+ for old_file in $webdav_files_list; do
199
+ if ! echo "$files_to_keep" | grep -q "$old_file"; then
200
+ echo "删除旧文件: $old_file"
201
+ curl -X DELETE --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL$old_file"
202
+ fi
203
+ done
204
+ fi
205
+
206
+ } || {
207
+ echo "WebDAV 上传失败,等待重试..."
208
+ sleep 10
209
+ echo "重试上传 URL: $upload_url"
210
+ curl -v -L -T "./data/webui.db" --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$upload_url" || {
211
+ echo "重试失败,放弃上传。"
212
+ }
213
+ }
214
+ else
215
+ echo "未找到 webui.db 文件,跳过 WebDAV 同步"
216
+ fi
217
+
218
+ # 等待下一次同步间隔
219
+ echo "WebDAV 同步完成,下次同步将在 ${SYNC_INTERVAL} 秒后进行..."
220
+ sleep $SYNC_INTERVAL
221
  done
222
  }
223
 
 
226
  SYNC_INTERVAL=${SYNC_INTERVAL:-7200}
227
  echo "Hugging Face 同步进程启动,等待 ${SYNC_INTERVAL} 秒后开始同步..."
228
  sleep $(($SYNC_INTERVAL / 2)) # 错开与 WebDAV 同步的时间
229
+
230
  while true; do
231
  echo "开始 Hugging Face 同步 $(date)"
232
+
233
+ if [ -f "./data/webui.db" ]; then
234
+ # 使用仅含日期的格式(年月日)
235
+ DATE_FORMAT=$(date +%Y%m%d)
236
+ backup_file="webui_backup_${DATE_FORMAT}.db"
237
+
238
+ # 复制数据库文件
239
+ cp ./data/webui.db "/tmp/${backup_file}"
240
+ echo "正在上传备份到 Hugging Face..."
241
+ python /tmp/hf_sync.py upload "${HF_TOKEN}" "${DATASET_ID}" "/tmp/${backup_file}" "${backup_file}"
242
+ rm -f "/tmp/${backup_file}"
243
+ else
244
+ echo "数据库文件不存在,跳过 Hugging Face 同步"
245
+ fi
246
+
247
  echo "Hugging Face 同步完成,下次同步将在 ${SYNC_INTERVAL} 秒后进行..."
248
+ sleep $SYNC_INTERVAL
249
  done
250
  }
251
 
252
  # 后台启动同步进程
253
  webdav_sync_ &
254
+ hf_sync_ &