init aichat
Browse files- Dockerfile +6 -0
- README.md +4 -5
- sync_data.sh +144 -0
Dockerfile
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM ghcr.io/open-webui/open-webui:main
|
2 |
+
|
3 |
+
COPY sync_data.sh sync_data.sh
|
4 |
+
|
5 |
+
RUN chmod -R 777 ./data && \
|
6 |
+
sed -i "1r sync_data.sh" ./start.sh
|
README.md
CHANGED
@@ -1,10 +1,9 @@
|
|
1 |
---
|
2 |
title: AiChat
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
colorTo: red
|
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: AiChat
|
3 |
+
emoji: 😻
|
4 |
+
colorFrom: purple
|
5 |
colorTo: red
|
6 |
sdk: docker
|
7 |
pinned: false
|
8 |
+
app_port: 8080
|
9 |
+
---
|
|
sync_data.sh
ADDED
@@ -0,0 +1,144 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/bin/bash
|
2 |
+
|
3 |
+
# 检查必要的WebDAV环境变量
|
4 |
+
if [ -z "$WEBDAV_URL" ] || [ -z "$WEBDAV_USERNAME" ] || [ -z "$WEBDAV_PASSWORD" ]; then
|
5 |
+
echo "缺少必要的WebDAV环境变量: WEBDAV_URL, WEBDAV_USERNAME 或 WEBDAV_PASSWORD"
|
6 |
+
exit 1
|
7 |
+
fi
|
8 |
+
|
9 |
+
# 去除WEBDAV_URL末尾的斜杠(如果有的话)
|
10 |
+
WEBDAV_URL=$(echo "$WEBDAV_URL" | sed 's/\/$//')
|
11 |
+
|
12 |
+
# 创建数据目录
|
13 |
+
mkdir -p ./data/webdav
|
14 |
+
|
15 |
+
check_webdav_webui_latest_exists() {
|
16 |
+
http_code=$(curl --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" --head --silent --write-out "%{http_code}" "$WEBDAV_URL/OpenWebUI/webui_latest.db" -o /dev/null)
|
17 |
+
if [ "$http_code" -eq 200 ]; then
|
18 |
+
return 0 # 文件存在
|
19 |
+
else
|
20 |
+
return 1 # 文件不存在
|
21 |
+
fi
|
22 |
+
}
|
23 |
+
|
24 |
+
# 从WebDAV拉取最新的webui_latest.db文件
|
25 |
+
download_latest_db() {
|
26 |
+
echo "检查云端是否存在webui_latest.db文件..."
|
27 |
+
|
28 |
+
if check_webdav_webui_latest_exists; then
|
29 |
+
echo "云端存在webui_latest.db文件,开始拉取..."
|
30 |
+
curl -o ./data/webdav/webui_latest.db \
|
31 |
+
--user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" \
|
32 |
+
"$WEBDAV_URL/OpenWebUI/webui_latest.db" && {
|
33 |
+
echo "最新的webui_latest.db文件拉取成功"
|
34 |
+
cp ./data/webdav/webui_latest.db ./data/webui.db
|
35 |
+
} || {
|
36 |
+
echo "拉取webui_latest.db文件失败"
|
37 |
+
}
|
38 |
+
else
|
39 |
+
echo "云端不存在webui_latest.db文件,跳过拉取"
|
40 |
+
fi
|
41 |
+
}
|
42 |
+
|
43 |
+
# 比较两个文件的hash值
|
44 |
+
compare_hashes() {
|
45 |
+
local file1=$1
|
46 |
+
local file2=$2
|
47 |
+
local hash1
|
48 |
+
local hash2
|
49 |
+
|
50 |
+
# 检查文件是否存在
|
51 |
+
if [ ! -f "$file1" ] || [ ! -f "$file2" ]; then
|
52 |
+
echo "文件 $file1 或 $file2 不存在,无法比较哈希值"
|
53 |
+
return 1
|
54 |
+
fi
|
55 |
+
|
56 |
+
# 计算文件的hash值
|
57 |
+
hash1=$(sha256sum "$file1" | awk '{print $1}')
|
58 |
+
hash2=$(sha256sum "$file2" | awk '{print $1}')
|
59 |
+
|
60 |
+
# 比较hash值
|
61 |
+
if [ "$hash1" == "$hash2" ]; then
|
62 |
+
return 0 # 哈希值相同
|
63 |
+
else
|
64 |
+
return 1 # 哈希值不同
|
65 |
+
fi
|
66 |
+
}
|
67 |
+
|
68 |
+
# 上传备份文件到WebDAV
|
69 |
+
upload_to_webdav() {
|
70 |
+
echo "检查是否需要上传文件到 WebDAV..."
|
71 |
+
|
72 |
+
# 如果 ./data/webui.db 文件不存在,跳过上传
|
73 |
+
if [ ! -f ./data/webui.db ]; then
|
74 |
+
echo "数据库未初始化,跳过上传"
|
75 |
+
return
|
76 |
+
fi
|
77 |
+
|
78 |
+
# 检查云端是否存在webui_latest.db文件
|
79 |
+
if check_webdav_webui_latest_exists; then
|
80 |
+
# 比较本地和云端的webui.db文件hash值
|
81 |
+
if compare_hashes ./data/webui.db ./data/webdav/webui_latest.db; then
|
82 |
+
echo "本地和云端的webui.db文件哈希值一致,跳过上传"
|
83 |
+
return
|
84 |
+
fi
|
85 |
+
echo "本地和云端的webui.db文件哈希值不同,准备上传..."
|
86 |
+
else
|
87 |
+
echo "云端不存在webui_latest.db文件,直接上传文件"
|
88 |
+
fi
|
89 |
+
|
90 |
+
# 上传最新的webui_latest.db到 WebDAV
|
91 |
+
cp ./data/webui.db ./data/webdav/webui_latest.db
|
92 |
+
curl -T ./data/webdav/webui_latest.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/webui_latest.db" && {
|
93 |
+
echo "最新的webui_latest.db上传成功"
|
94 |
+
} || {
|
95 |
+
echo "上传webui_latest.db失败"
|
96 |
+
}
|
97 |
+
|
98 |
+
# 上传以日期命名的备份文件
|
99 |
+
FILENAME="webui_$(date +'%m_%d').db"
|
100 |
+
curl -T ./data/webdav/webui_latest.db --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/$FILENAME" && {
|
101 |
+
echo "备份文件 $FILENAME 上传成功"
|
102 |
+
} || {
|
103 |
+
echo "上传备份文件 $FILENAME 失败"
|
104 |
+
}
|
105 |
+
|
106 |
+
# 获取当前 WebDAV 目录中的所有备份文件,按时间排序
|
107 |
+
echo "检查云端备份文件..."
|
108 |
+
backup_files=$(curl -s --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/" | grep -o 'webui_.*\.db' | grep -v 'webui_latest.db' | sort)
|
109 |
+
|
110 |
+
# 如果备份文件超过 5 个,则删除最旧的一个
|
111 |
+
backup_count=$(echo "$backup_files" | wc -l)
|
112 |
+
if [ "$backup_count" -gt 5 ]; then
|
113 |
+
oldest_file=$(echo "$backup_files" | head -n 1)
|
114 |
+
echo "云端备份文件超过5个,删除最旧的备份文件: $oldest_file"
|
115 |
+
|
116 |
+
curl -X DELETE --user "$WEBDAV_USERNAME:$WEBDAV_PASSWORD" "$WEBDAV_URL/OpenWebUI/$oldest_file" && {
|
117 |
+
echo "删除最旧备份文件成功"
|
118 |
+
} || {
|
119 |
+
echo "删除最旧备份文件失败"
|
120 |
+
}
|
121 |
+
fi
|
122 |
+
}
|
123 |
+
|
124 |
+
# 定义同步函数
|
125 |
+
sync_data() {
|
126 |
+
while true; do
|
127 |
+
echo "正在开始同步"
|
128 |
+
|
129 |
+
# 上传文件到WebDAV
|
130 |
+
upload_to_webdav
|
131 |
+
|
132 |
+
# 等待时间间隔
|
133 |
+
SYNC_INTERVAL=${SYNC_INTERVAL:-7200}
|
134 |
+
echo "当前时间 $(date '+%Y-%m-%d %H:%M:%S')"
|
135 |
+
echo "等待 ${SYNC_INTERVAL} 秒后进行下一次同步..."
|
136 |
+
sleep $SYNC_INTERVAL
|
137 |
+
done
|
138 |
+
}
|
139 |
+
|
140 |
+
# 初始拉取最新的webui_latest.db文件
|
141 |
+
download_latest_db
|
142 |
+
|
143 |
+
# 后台启动同步进程
|
144 |
+
sync_data &
|