@lobehub/lobehub 2.0.13 → 2.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +50 -0
- package/changelog/v2.json +18 -0
- package/docker-compose/deploy/.env.example +35 -0
- package/docker-compose/deploy/.env.zh-CN.example +31 -0
- package/docker-compose/deploy/bucket.config.json +18 -0
- package/docker-compose/deploy/docker-compose.yml +148 -0
- package/docker-compose/deploy/searxng-settings.yml +2582 -0
- package/docker-compose/setup.sh +37 -88
- package/docs/self-hosting/advanced/auth/providers/casdoor.mdx +110 -0
- package/docs/self-hosting/advanced/auth/providers/casdoor.zh-CN.mdx +165 -0
- package/docs/self-hosting/platform/docker-compose.mdx +43 -561
- package/docs/self-hosting/platform/docker-compose.zh-CN.mdx +40 -537
- package/locales/en-US/setting.json +16 -0
- package/locales/zh-CN/setting.json +16 -0
- package/package.json +1 -1
- package/packages/const/src/url.ts +1 -1
- package/src/app/[variants]/(main)/agent/_layout/Sidebar/Cron/index.tsx +4 -2
- package/src/app/[variants]/(main)/agent/cron/[cronId]/features/CronJobContentEditor.tsx +39 -44
- package/src/app/[variants]/(main)/agent/cron/[cronId]/features/CronJobHeader.tsx +27 -20
- package/src/app/[variants]/(main)/agent/cron/[cronId]/features/CronJobSaveButton.tsx +4 -2
- package/src/app/[variants]/(main)/agent/cron/[cronId]/features/CronJobScheduleConfig.tsx +183 -145
- package/src/app/[variants]/(main)/agent/profile/features/AgentCronJobs/hooks/useAgentCronJobs.ts +3 -4
- package/src/app/[variants]/(main)/agent/profile/features/AgentCronJobs/index.tsx +4 -3
- package/src/app/[variants]/(main)/agent/profile/features/ProfileEditor/index.tsx +4 -3
- package/src/features/Conversation/Messages/AssistantGroup/components/MessageContent.tsx +6 -1
- package/src/locales/default/setting.ts +16 -0
- package/src/store/agent/slices/cron/action.ts +6 -4
|
@@ -29,13 +29,13 @@ tags:
|
|
|
29
29
|
|
|
30
30
|
- 一键启动脚本为首次部署专用,非首次部署请参考 [自定义部署](#自定义部署) 章节
|
|
31
31
|
|
|
32
|
-
- 端口占用检查:确保 `3210`、`
|
|
32
|
+
- 端口占用检查:确保 `3210`、`9000`、`9001` 端口可用
|
|
33
33
|
</Callout>
|
|
34
34
|
|
|
35
|
-
执行以下命令初始化部署环境,目录 `
|
|
35
|
+
执行以下命令初始化部署环境,目录 `lobehub` 将用于存放你的配置文件和后续的数据库文件。
|
|
36
36
|
|
|
37
37
|
```sh
|
|
38
|
-
mkdir
|
|
38
|
+
mkdir lobehub && cd lobehub
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
获取并执行部署脚本:
|
|
@@ -64,21 +64,13 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
64
64
|
|
|
65
65
|
### 查看配置生成报告
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
<Callout type="warning">请使用用户账号登录 LobeHub,管理员账号仅用于管理 Casdoor。</Callout>
|
|
67
|
+
你需要在脚本运行结束后查看配置生成报告,包括各服务的访问地址和密码。
|
|
70
68
|
|
|
71
69
|
```log
|
|
72
70
|
安全密钥生成结果如下:
|
|
73
71
|
LobeHub:
|
|
74
72
|
- URL: http://localhost:3210
|
|
75
|
-
|
|
76
|
-
- Password: c66f8c
|
|
77
|
-
Casdoor:
|
|
78
|
-
- URL: http://localhost:8000
|
|
79
|
-
- Username: admin
|
|
80
|
-
- Password: c66f8c
|
|
81
|
-
Minio:
|
|
73
|
+
RustFS:
|
|
82
74
|
- URL: http://localhost:9000
|
|
83
75
|
- Username: admin
|
|
84
76
|
- Password: 8c82ea41
|
|
@@ -93,7 +85,7 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
93
85
|
### 检查日志
|
|
94
86
|
|
|
95
87
|
```sh
|
|
96
|
-
docker logs -f
|
|
88
|
+
docker logs -f lobehub
|
|
97
89
|
```
|
|
98
90
|
|
|
99
91
|
如果你在容器中看到了以下日志,则说明已经启动成功:
|
|
@@ -102,7 +94,7 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
102
94
|
[Database] Start to migration...
|
|
103
95
|
✅ database migration pass.
|
|
104
96
|
-------------------------------------
|
|
105
|
-
▲ Next.js
|
|
97
|
+
▲ Next.js 16.x.x
|
|
106
98
|
- Local: http://localhost:3210
|
|
107
99
|
- Network: http://0.0.0.0:3210
|
|
108
100
|
|
|
@@ -112,7 +104,7 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
112
104
|
|
|
113
105
|
### 访问应用
|
|
114
106
|
|
|
115
|
-
通过 [http://localhost:3210](http://localhost:3210) 访问你的 LobeHub
|
|
107
|
+
通过 [http://localhost:3210](http://localhost:3210) 访问你的 LobeHub 服务。
|
|
116
108
|
</Steps>
|
|
117
109
|
|
|
118
110
|
### 端口模式
|
|
@@ -127,21 +119,13 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
127
119
|
|
|
128
120
|
### 查看配置生成报告
|
|
129
121
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
<Callout type="warning">请使用用户账号登录 LobeHub,管理员账号仅用于管理 Casdoor。</Callout>
|
|
122
|
+
你需要在脚本运行结束后查看配置生成报告,包括各服务的访问地址和密码。
|
|
133
123
|
|
|
134
124
|
```log
|
|
135
125
|
安全密钥生成结果如下:
|
|
136
126
|
LobeHub:
|
|
137
127
|
- URL: http://your_server_ip:3210
|
|
138
|
-
|
|
139
|
-
- Password: 837e26
|
|
140
|
-
Casdoor:
|
|
141
|
-
- URL: http://your_server_ip:8000
|
|
142
|
-
- Username: admin
|
|
143
|
-
- Password: 837e26
|
|
144
|
-
Minio:
|
|
128
|
+
RustFS:
|
|
145
129
|
- URL: http://your_server_ip:9000
|
|
146
130
|
- Username: admin
|
|
147
131
|
- Password: dbac8440
|
|
@@ -156,7 +140,7 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
156
140
|
### 检查日志
|
|
157
141
|
|
|
158
142
|
```sh
|
|
159
|
-
docker logs -f
|
|
143
|
+
docker logs -f lobehub
|
|
160
144
|
```
|
|
161
145
|
|
|
162
146
|
如果你在容器中看到了以下日志,则说明已经启动成功:
|
|
@@ -165,7 +149,7 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
165
149
|
[Database] Start to migration...
|
|
166
150
|
✅ database migration pass.
|
|
167
151
|
-------------------------------------
|
|
168
|
-
▲ Next.js
|
|
152
|
+
▲ Next.js 16.x.x
|
|
169
153
|
- Local: http://your_server_ip:3210
|
|
170
154
|
- Network: http://0.0.0.0:3210
|
|
171
155
|
✓ Starting...
|
|
@@ -174,11 +158,7 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
174
158
|
|
|
175
159
|
### 访问应用
|
|
176
160
|
|
|
177
|
-
你可以通过 `http://your_server_ip:3210` 访问你的 LobeHub
|
|
178
|
-
|
|
179
|
-
<Callout type="warning">
|
|
180
|
-
请注意,如果你的服务能够被公网访问,我们强烈建议你参考 [文档](https://lobehub.com/zh/docs/self-hosting/advanced/auth/providers/casdoor) 关闭注册功能。
|
|
181
|
-
</Callout>
|
|
161
|
+
你可以通过 `http://your_server_ip:3210` 访问你的 LobeHub 服务。
|
|
182
162
|
</Steps>
|
|
183
163
|
|
|
184
164
|
### 域名模式
|
|
@@ -188,39 +168,18 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
188
168
|
|
|
189
169
|
在域名模式中,你需要完成反向代理配置,并确保局域网 / 公网能访问到以下服务。请使用反向代理将以下服务端口映射到域名:
|
|
190
170
|
|
|
191
|
-
| 域名
|
|
192
|
-
|
|
|
193
|
-
| `lobe.example.com`
|
|
194
|
-
| `
|
|
195
|
-
| `
|
|
196
|
-
| `minio-ui.example.com` | `9001` | |
|
|
197
|
-
|
|
198
|
-
<Callout type="important">
|
|
199
|
-
如果你使用如 [宝塔面板](https://www.bt.cn/) 等面板软件进行反向代理配置,
|
|
200
|
-
你需要确保其对 `.well-known` 路径的请求不进行拦截,以确保 Casdoor 的 OAuth2 配置能够正常工作。
|
|
201
|
-
这里提供一份针对 Casdoor 服务的 Nginx server 块的路径白名单配置:
|
|
202
|
-
|
|
203
|
-
```nginx
|
|
204
|
-
location /.well-known/openid-configuration {
|
|
205
|
-
proxy_pass http://localhost:8000; # 转发到 localhost:8000
|
|
206
|
-
proxy_set_header Host $host; # 保留原始主机头
|
|
207
|
-
proxy_set_header X-Real-IP $remote_addr; # 保留客户端真实IP
|
|
208
|
-
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 保留转发的IP
|
|
209
|
-
proxy_set_header X-Forwarded-Proto $scheme; # 保留请求协议
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
⚠️ 请不要在此类面板软件的反向代理设置中开启任何形式的缓存,以免影响服务的正常运行。
|
|
214
|
-
详情请见 [https://github.com/lobehub/lobe-chat/discussions/5986](https://github.com/lobehub/lobe-chat/discussions/5986)
|
|
215
|
-
</Callout>
|
|
171
|
+
| 域名 | 反代端口 | 是否必选 |
|
|
172
|
+
| ------------------- | ------ | ---- |
|
|
173
|
+
| `lobe.example.com` | `3210` | 必选 |
|
|
174
|
+
| `s3.example.com` | `9000` | 必选 |
|
|
175
|
+
| `s3-ui.example.com` | `9001` | |
|
|
216
176
|
|
|
217
177
|
### 在交互式脚本中完成剩余配置
|
|
218
178
|
|
|
219
179
|
在域名模式中,你需要根据脚本提示完成:
|
|
220
180
|
|
|
221
181
|
- LobeHub 服务的域名设置:`lobe.example.com`
|
|
222
|
-
-
|
|
223
|
-
- Casdoor 服务的域名设置:`auth.example.com`
|
|
182
|
+
- S3 服务的域名设置:`s3.example.com`
|
|
224
183
|
- 选择访问协议:`http` 或 `https`
|
|
225
184
|
- 安全密钥重新生成:我们强烈建议你重新生成安全密钥,如果你缺少脚本所需的密钥生成库,我们建议你参考 [自定义部署](#自定义部署) 章节对密钥进行修改。
|
|
226
185
|
|
|
@@ -236,22 +195,14 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
236
195
|
|
|
237
196
|
### 查看配置生成报告
|
|
238
197
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
<Callout type="warning">请使用用户账号登录 LobeHub,管理员账号仅用于管理 Casdoor。</Callout>
|
|
198
|
+
你需要在脚本运行结束后查看配置生成报告,包括各服务的访问地址和密码。
|
|
242
199
|
|
|
243
200
|
```log
|
|
244
201
|
安全密钥生成结果如下:
|
|
245
202
|
LobeHub:
|
|
246
203
|
- URL: https://lobe.example.com
|
|
247
|
-
|
|
248
|
-
-
|
|
249
|
-
Casdoor:
|
|
250
|
-
- URL: https://auth.example.com
|
|
251
|
-
- Username: admin
|
|
252
|
-
- Password: 837e26
|
|
253
|
-
Minio:
|
|
254
|
-
- URL: https://minio.example.com
|
|
204
|
+
RustFS:
|
|
205
|
+
- URL: https://s3.example.com
|
|
255
206
|
- Username: admin
|
|
256
207
|
- Password: dbac8440
|
|
257
208
|
```
|
|
@@ -265,7 +216,7 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
265
216
|
### 检查日志
|
|
266
217
|
|
|
267
218
|
```sh
|
|
268
|
-
docker logs -f
|
|
219
|
+
docker logs -f lobehub
|
|
269
220
|
```
|
|
270
221
|
|
|
271
222
|
如果你在容器中看到了以下日志,则说明已经启动成功:
|
|
@@ -274,7 +225,7 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
274
225
|
[Database] Start to migration...
|
|
275
226
|
✅ database migration pass.
|
|
276
227
|
-------------------------------------
|
|
277
|
-
▲ Next.js
|
|
228
|
+
▲ Next.js 16.x.x
|
|
278
229
|
- Local: https://localhost:3210
|
|
279
230
|
- Network: http://0.0.0.0:3210
|
|
280
231
|
✓ Starting...
|
|
@@ -283,20 +234,16 @@ bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
|
283
234
|
|
|
284
235
|
### 访问应用
|
|
285
236
|
|
|
286
|
-
你可以通过 `https://lobe.example.com` 访问你的 LobeHub
|
|
287
|
-
|
|
288
|
-
<Callout type="warning">
|
|
289
|
-
请注意,如果你的服务能够被公网访问,我们强烈建议你参考 [文档](https://lobehub.com/zh/docs/self-hosting/advanced/auth/providers/casdoor) 关闭注册功能。
|
|
290
|
-
</Callout>
|
|
237
|
+
你可以通过 `https://lobe.example.com` 访问你的 LobeHub 服务。
|
|
291
238
|
</Steps>
|
|
292
239
|
|
|
293
240
|
## 自定义部署
|
|
294
241
|
|
|
295
|
-
该章节主要为你介绍在不同的网络环境下自定义部署 LobeHub 服务必须要修改的配置。在开始前,你可以先下载 [Docker Compose 配置文件](https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/
|
|
242
|
+
该章节主要为你介绍在不同的网络环境下自定义部署 LobeHub 服务必须要修改的配置。在开始前,你可以先下载 [Docker Compose 配置文件](https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/deploy/docker-compose.yml) 以及 [环境变量配置文件](https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/deploy/.env.zh-CN.example)。
|
|
296
243
|
|
|
297
244
|
```sh
|
|
298
|
-
curl -O https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/
|
|
299
|
-
curl -O https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/
|
|
245
|
+
curl -O https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/deploy/docker-compose.yml
|
|
246
|
+
curl -O https://raw.githubusercontent.com/lobehub/lobe-chat/HEAD/docker-compose/deploy/.env.zh-CN.example
|
|
300
247
|
mv .env.zh-CN.example .env
|
|
301
248
|
```
|
|
302
249
|
|
|
@@ -307,16 +254,15 @@ mv .env.zh-CN.example .env
|
|
|
307
254
|
|
|
308
255
|
### 预备知识
|
|
309
256
|
|
|
310
|
-
一般来讲,想要完整的运行 LobeHub
|
|
257
|
+
一般来讲,想要完整的运行 LobeHub 数据库版本,你需要至少拥有如下三个服务:
|
|
311
258
|
|
|
312
259
|
- LobeHub 数据库版本自身
|
|
313
260
|
- 带有 PGVector 插件的 PostgreSQL 数据库
|
|
314
261
|
- 支持 S3 协议的对象存储服务
|
|
315
|
-
- 受 LobeHub 支持的 SSO 登录鉴权服务
|
|
316
262
|
|
|
317
263
|
这些服务可以通过自建或者在线云服务组合搭配,以满足不同层次的部署需求。本文中,我们提供了完全基于开源自建服务的 Docker Compose 配置,你可以直接使用这份配置文件来启动 LobeHub 数据库版本,也可以对之进行修改以适应你的需求。
|
|
318
264
|
|
|
319
|
-
我们默认使用 [
|
|
265
|
+
我们默认使用 [RustFS](https://github.com/rustfs/rustfs) 作为本地 S3 对象存储服务。如需配置 SSO 登录鉴权服务,请参考 [身份验证服务](/zh/docs/self-hosting/advanced/auth) 文档。
|
|
320
266
|
|
|
321
267
|
<Callout type="warning">
|
|
322
268
|
如果你的网络拓扑较为复杂,请先确保在你的网络环境中这些服务能够正常通讯。
|
|
@@ -326,40 +272,16 @@ mv .env.zh-CN.example .env
|
|
|
326
272
|
|
|
327
273
|
以下我们将介绍运行这些服务的必要配置:
|
|
328
274
|
|
|
329
|
-
1.
|
|
275
|
+
1. S3 对象存储
|
|
330
276
|
|
|
331
|
-
|
|
277
|
+
LobeHub 需要为 LLM 服务提供商提供文件对象的公网访问地址,因此你需要配置 S3 的 Endpoint:
|
|
332
278
|
|
|
333
279
|
```env
|
|
334
|
-
|
|
280
|
+
S3_PUBLIC_DOMAIN=https://s3.example.com
|
|
281
|
+
S3_ENDPOINT=https://s3.example.com
|
|
335
282
|
```
|
|
336
283
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
- 同时,你也需要在 Casdoor 中允许回调地址为 LobeHub 的地址:
|
|
340
|
-
|
|
341
|
-
请在 Casdoor 的 Web 面板的 `身份认证 -> 应用` -> `<应用ID,默认为 app-built-in>` -> `重定向URL` 中添加一行:
|
|
342
|
-
|
|
343
|
-
```
|
|
344
|
-
https://auth.example.com/api/auth/callback/casdoor
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
- Casdoor 需要在环境变量中提供访问的 Origin 信息:
|
|
348
|
-
|
|
349
|
-
```env
|
|
350
|
-
origin=https://auth.example.com
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
2. MinIO
|
|
354
|
-
|
|
355
|
-
- LobeHub 需要为 LLM 服务提供商提供文件对象的公网访问地址,因此你需要配置 MinIO 的 Endpoint 。
|
|
356
|
-
|
|
357
|
-
```env
|
|
358
|
-
S3_PUBLIC_DOMAIN=https://minio.example.com
|
|
359
|
-
S3_ENDPOINT=https://minio.example.com
|
|
360
|
-
```
|
|
361
|
-
|
|
362
|
-
3. PostgreSQL
|
|
284
|
+
2. PostgreSQL
|
|
363
285
|
|
|
364
286
|
该配置位于 `docker-compose.yml` 文件中,你需要配置数据库的名称和密码:
|
|
365
287
|
|
|
@@ -372,216 +294,16 @@ services:
|
|
|
372
294
|
|
|
373
295
|
## 常见问题
|
|
374
296
|
|
|
375
|
-
####
|
|
376
|
-
|
|
377
|
-
请根据容器日志检查是否存在以下错误
|
|
378
|
-
|
|
379
|
-
```sh
|
|
380
|
-
docker logs -f lobe-chat
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
- r3: "response" is not a conform Authorization Server Metadata response (unexpected HTTP status code)
|
|
384
|
-
|
|
385
|
-
```log
|
|
386
|
-
lobe-chat | [auth][error] r3: "response" is not a conform Authorization Server Metadata response (unexpected HTTP status code)
|
|
387
|
-
```
|
|
388
|
-
|
|
389
|
-
成因:该问题一般是由于你的反向代理配置不正确导致的,你需要确保你的反向代理配置不会拦截 Casdoor 的 OAuth2 配置请求。
|
|
390
|
-
|
|
391
|
-
解决方案:
|
|
392
|
-
|
|
393
|
-
- 请参考 [域名模式](#域名模式) 章节中的反向代理配置注意事项。
|
|
394
|
-
|
|
395
|
-
- 一个直接的排查方式,你可以直接访问 `https://auth.example.com/.well-known/openid-configuration`,如果
|
|
396
|
-
|
|
397
|
-
- 返回了非 JSON 格式的数据,则说明你的反向代理配置错误。
|
|
398
|
-
- 如果返回的 JSON 格式数据中的 `"issuer": "URL"` 字段不是你配置的 `https://auth.example.com`,则说明你的环境变量配置错误。
|
|
399
|
-
|
|
400
|
-
- TypeError: fetch failed
|
|
401
|
-
|
|
402
|
-
```log
|
|
403
|
-
lobe-chat | [auth][error] TypeError: fetch failed
|
|
404
|
-
```
|
|
405
|
-
|
|
406
|
-
成因:LobeHub 无法访问鉴权服务。
|
|
407
|
-
|
|
408
|
-
解决方案:
|
|
409
|
-
|
|
410
|
-
- 请检查你的鉴权服务是否正常运行,以及 LobeHub 所在的网络是否能够访问到鉴权服务。
|
|
411
|
-
|
|
412
|
-
- 一个直接的排查方式,你可以在 LobeHub 容器的终端中,使用 `curl` 命令访问你的鉴权服务 `https://auth.example.com/.well-known/openid-configuration`,如果返回了 JSON 格式的数据,则说明你的鉴权服务正常运行。
|
|
413
|
-
|
|
414
|
-
#### 反向代理下 OAuth 令牌交换失败
|
|
415
|
-
|
|
416
|
-
如果在反向代理后使用 Docker 时 OAuth 认证在令牌交换阶段失败,这通常是由默认的 `MIDDLEWARE_REWRITE_THROUGH_LOCAL=1` 设置引起的,该设置会将 URL 重写为 `127.0.0.1:3210`。
|
|
417
|
-
|
|
418
|
-
**解决方案**: 在 `.env` 文件中设置 `MIDDLEWARE_REWRITE_THROUGH_LOCAL=0` 并重启 Docker 容器:
|
|
419
|
-
|
|
420
|
-
```bash
|
|
421
|
-
docker compose down
|
|
422
|
-
docker compose up -d
|
|
423
|
-
```
|
|
424
|
-
|
|
425
|
-
## 拓展配置
|
|
426
|
-
|
|
427
|
-
为了完善你的 LobeHub 服务,你可以根据你的需求进行以下拓展配置。
|
|
428
|
-
|
|
429
|
-
### 使用 MinIO 存储 Casdoor 头像
|
|
430
|
-
|
|
431
|
-
允许用户在 Casdoor 中更换头像
|
|
432
|
-
|
|
433
|
-
1. 你需要首先在 `buckets` 中创建一个名为 `casdoor` 的桶,选择自定义策略,复制并粘贴如下内容(如果你修改了桶名,请自行查找替换)
|
|
434
|
-
|
|
435
|
-
```json
|
|
436
|
-
{
|
|
437
|
-
"Statement": [
|
|
438
|
-
{
|
|
439
|
-
"Effect": "Allow",
|
|
440
|
-
"Principal": {
|
|
441
|
-
"AWS": ["*"]
|
|
442
|
-
},
|
|
443
|
-
"Action": ["s3:GetBucketLocation"],
|
|
444
|
-
"Resource": ["arn:aws:s3:::casdoor"]
|
|
445
|
-
},
|
|
446
|
-
{
|
|
447
|
-
"Effect": "Allow",
|
|
448
|
-
"Principal": {
|
|
449
|
-
"AWS": ["*"]
|
|
450
|
-
},
|
|
451
|
-
"Action": ["s3:ListBucket"],
|
|
452
|
-
"Resource": ["arn:aws:s3:::casdoor"],
|
|
453
|
-
"Condition": {
|
|
454
|
-
"StringEquals": {
|
|
455
|
-
"s3:prefix": ["files/*"]
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
},
|
|
459
|
-
{
|
|
460
|
-
"Effect": "Allow",
|
|
461
|
-
"Principal": {
|
|
462
|
-
"AWS": ["*"]
|
|
463
|
-
},
|
|
464
|
-
"Action": ["s3:PutObject", "s3:DeleteObject", "s3:GetObject"],
|
|
465
|
-
"Resource": ["arn:aws:s3:::casdoor/**"]
|
|
466
|
-
}
|
|
467
|
-
],
|
|
468
|
-
"Version": "2012-10-17"
|
|
469
|
-
}
|
|
470
|
-
```
|
|
471
|
-
|
|
472
|
-
2. 创建一个新的访问密钥,将生成的 `Access Key` 和 `Secret Key` 存储之
|
|
473
|
-
|
|
474
|
-
3. 在 Casdoor 的 `身份认证 -> 提供商` 中关联 MinIO S3 服务,以下是一个示例配置:
|
|
475
|
-
|
|
476
|
-

|
|
477
|
-
|
|
478
|
-
其中,客户端 ID、客户端密钥为上一步创建的访问密钥中的 `Access Key` 和 `Secret Key`,`192.168.31.251` 应当被替换为 `your_server_ip`。
|
|
479
|
-
|
|
480
|
-
4. 在 Casdoor 的 `身份认证 -> 应用` 中,对 `app-built-in` 应用添加提供商,选择 `minio`,保存并退出
|
|
481
|
-
|
|
482
|
-
5. 你可以在 Casdoor 的 `身份认证 -> 资源` 中,尝试上传文件以测试配置是否正确
|
|
483
|
-
|
|
484
|
-
### 生产部署下从 `logto` 迁移至 `Casdoor`
|
|
485
|
-
|
|
486
|
-
适用于已经在生产环境下使用 `logto` 作为登录鉴权服务的用户
|
|
487
|
-
|
|
488
|
-
<Callout type="info">
|
|
489
|
-
由于使用[Logto](https://logto.io/) 作为登录鉴权服务存在比较大的不稳定性。 因此,下文基于发布到 IP
|
|
490
|
-
模式的教程,实现了使用 Casdoor 作为鉴权服务提供商的域名发布方案。
|
|
491
|
-
本文剩余部分也将以其为例进行说明。如果你使用其他诸如 Logto
|
|
492
|
-
等其他登录鉴权服务,流程应当相近,但请注意不同的登录鉴权服务的端口配置可能有所差异。
|
|
493
|
-
</Callout>
|
|
494
|
-
|
|
495
|
-
在下文中,我们假设在上述服务之外,你还运行了一层 **Nginx** 来进行反向代理、配置 SSL。
|
|
496
|
-
|
|
497
|
-
域名和配套服务端口说明如下:
|
|
498
|
-
|
|
499
|
-
- `lobe.example.com`:为你的 LobeHub 服务端域名,需要反向代理到 LobeHub 服务端口,默认为 `3210`
|
|
500
|
-
- `auth.example.com`:为你的 Logto UI 域名,需要反向代理到 Logto WebUI 服务端口,默认为 `8000`
|
|
501
|
-
- `minio.example.com`:为你的 MinIO API 域名,需要反向代理到 MinIO API 服务端口,默认为 `9000`
|
|
502
|
-
- `minio-ui.example.com`:可选,为你的 MinIO UI 域名,需要反向代理到 MinIO WebUI 服务端口,默认为 `9001`
|
|
503
|
-
|
|
504
|
-
#### 配置文件
|
|
505
|
-
|
|
506
|
-
```sh
|
|
507
|
-
bash <(curl -fsSL https://lobe.li/setup.sh) -l zh_CN
|
|
508
|
-
docker compose up -d
|
|
509
|
-
```
|
|
510
|
-
|
|
511
|
-
注意保存此时生成的新密码!
|
|
512
|
-
|
|
513
|
-
运行后会获得三个文件
|
|
514
|
-
|
|
515
|
-
- init\_data.json
|
|
516
|
-
- docker-compose.yml
|
|
517
|
-
- .env
|
|
518
|
-
|
|
519
|
-
接下来,修改配置文件以实现域名发布
|
|
520
|
-
|
|
521
|
-
1. 修改 `docker-compose.yml` 文件
|
|
522
|
-
|
|
523
|
-
1. 修改 `minio`的`MINIO_API_CORS_ALLOW_ORIGIN`字段。
|
|
524
|
-
|
|
525
|
-
```yaml
|
|
526
|
-
'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.example.com'
|
|
527
|
-
```
|
|
528
|
-
|
|
529
|
-
2. 修改`casdoor`的`origin`字段。
|
|
530
|
-
|
|
531
|
-
```yaml
|
|
532
|
-
origin: 'https://auth.example.com'
|
|
533
|
-
```
|
|
534
|
-
|
|
535
|
-
3. 修改`lobe`的`environment`字段。
|
|
536
|
-
|
|
537
|
-
```yaml
|
|
538
|
-
# - 'APP_URL=http://localhost:3210'
|
|
539
|
-
- 'APP_URL=https://lobe.example.com'
|
|
540
|
-
|
|
541
|
-
- 'AUTH_SSO_PROVIDERS=casdoor'
|
|
542
|
-
- 'KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ='
|
|
543
|
-
- 'AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg'
|
|
544
|
-
# - 'AUTH_URL=http://localhost:${LOBE_PORT}/api/auth'
|
|
545
|
-
- 'AUTH_URL=https://lobe.example.com/api/auth'
|
|
546
|
-
|
|
547
|
-
# - 'AUTH_CASDOOR_ISSUER=http://localhost:${CASDOOR_PORT}'
|
|
548
|
-
- 'AUTH_CASDOOR_ISSUER=https://auth.example.com'
|
|
549
|
-
|
|
550
|
-
- 'DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgresql:5432/${LOBE_DB_NAME}'
|
|
551
|
-
# - 'S3_ENDPOINT=http://localhost:${MINIO_PORT}'
|
|
552
|
-
- 'S3_ENDPOINT=https://minio.example.com'
|
|
553
|
-
|
|
554
|
-
- 'S3_BUCKET=${MINIO_LOBE_BUCKET}'
|
|
555
|
-
# - 'S3_PUBLIC_DOMAIN=http://localhost:${MINIO_PORT}'
|
|
556
|
-
- 'S3_PUBLIC_DOMAIN=https://minio.example.com'
|
|
557
|
-
|
|
558
|
-
- 'S3_ENABLE_PATH_STYLE=1'
|
|
559
|
-
- 'LLM_VISION_IMAGE_USE_BASE64=1'
|
|
560
|
-
```
|
|
561
|
-
|
|
562
|
-
2. 修改 `.env` 文件
|
|
563
|
-
|
|
564
|
-
<Callout type="info">为了安全起见,修改 `.env` 文件中的 ROOT USER 的字段</Callout>
|
|
565
|
-
|
|
566
|
-
```sh
|
|
567
|
-
# MinIO S3 configuration
|
|
568
|
-
MINIO_ROOT_USER=XXXX
|
|
569
|
-
MINIO_ROOT_PASSWORD=XXXX
|
|
570
|
-
```
|
|
571
|
-
|
|
572
|
-
#### Postgres 数据库配置
|
|
297
|
+
#### 数据库迁移问题
|
|
573
298
|
|
|
574
299
|
你可以使用下述指令检查日志:
|
|
575
300
|
|
|
576
301
|
```sh
|
|
577
|
-
docker logs -f
|
|
302
|
+
docker logs -f lobehub
|
|
578
303
|
```
|
|
579
304
|
|
|
580
305
|
<Callout type="tip">
|
|
581
|
-
在我们官方的 Docker 镜像中,会在启动镜像前自动执行数据库 schema 的 migration
|
|
582
|
-
,我们的官方镜像承诺「空数据库 ->
|
|
583
|
-
完整表」这一段自动建表的稳定性。因此我们建议你的数据库实例使用一个空表实例,进而省去手动维护表结构或者
|
|
584
|
-
migration 的麻烦。
|
|
306
|
+
在我们官方的 Docker 镜像中,会在启动镜像前自动执行数据库 schema 的 migration,我们的官方镜像承诺「空数据库 -> 完整表」这一段自动建表的稳定性。因此我们建议你的数据库实例使用一个空表实例,进而省去手动维护表结构或者 migration 的麻烦。
|
|
585
307
|
</Callout>
|
|
586
308
|
|
|
587
309
|
如果你在建表的时候出现了问题,你可以尝试使用如下命令强制移除数据库容器并重新启动:
|
|
@@ -592,66 +314,6 @@ sudo rm -rf ./data # 移除挂载的数据库数据
|
|
|
592
314
|
docker compose up -d # 重新启动
|
|
593
315
|
```
|
|
594
316
|
|
|
595
|
-
#### 登录鉴权服务配置
|
|
596
|
-
|
|
597
|
-
你需要首先访问 WebUI 来进行配置:
|
|
598
|
-
|
|
599
|
-
- 如果你按照前文配置了反向代理,打开 `https://auth.example.com`
|
|
600
|
-
- 否则,请在进行端口映射后,打开 `http://localhost:8000`
|
|
601
|
-
|
|
602
|
-
登录管理员账户
|
|
603
|
-
|
|
604
|
-
- 默认用户名为 admin
|
|
605
|
-
- 默认密码为 下载配置文件时生成的随机密码。如忘记可到 `init_data.json` 文件中找回
|
|
606
|
-
|
|
607
|
-
登入后执行如下操作
|
|
608
|
-
|
|
609
|
-
1. 在 `用户管理 -> 组织` 中,添加一个新的组织。名称与显示名称为 `Lobe Users`。其余保持默认即可。
|
|
610
|
-
2. 在 `身份认证 -> 应用` 中,添加一个新的应用。
|
|
611
|
-
|
|
612
|
-
- 名称与显示名称为 `LobeHub`。
|
|
613
|
-
- 组织为 `Lobe Users`。
|
|
614
|
-
- 重定向 URLS 中添加一行 为 `https://lobe.example.com/api/auth/callback/casdoor`。
|
|
615
|
-
- 关闭除密码外的登录方式 。
|
|
616
|
-
- 将客户端 ID 和客户端密钥分别填入 `.env`中的 `AUTH_CASDOOR_ID` 和 `AUTH_CASDOOR_SECRET` 中。
|
|
617
|
-
- (可选) 仿照`built-in`应用的配置,来设计登录和注册的页面外观。
|
|
618
|
-
- 保存并退出。
|
|
619
|
-
|
|
620
|
-
<Callout type="info">
|
|
621
|
-
通过上述步骤,可以避免默认情况下所有用户均为管理员导致的不安全的情况。
|
|
622
|
-
</Callout>
|
|
623
|
-
|
|
624
|
-
#### S3 对象存储服务配置
|
|
625
|
-
|
|
626
|
-
本文以 MinIO 为例,解释配置过程,如果你使用的是其他 S3 服务商,请参照其文档进行配置。
|
|
627
|
-
|
|
628
|
-
<Callout type="warning">
|
|
629
|
-
请记得注意配置对应 S3 服务商的 CORS 跨域配置,以确保 LobeHub 能够正常访问 S3 服务。
|
|
630
|
-
|
|
631
|
-
在本文中,你需要允许 `https://lobe.example.com` 的跨域请求。这既可以在 MinIO WebUI 的 `Configuration - API - Cors Allow Origin` 中配置,也可以在 Docker Compose 中的 `minio - environment - MINIO_API_CORS_ALLOW_ORIGIN` 中配置。
|
|
632
|
-
|
|
633
|
-
如果你使用第二种方法(这也是默认的方法)进行配置,你将无法再在 MinIO WebUI 中配置。
|
|
634
|
-
</Callout>
|
|
635
|
-
|
|
636
|
-
你需要首先访问 WebUI 来进行配置:
|
|
637
|
-
|
|
638
|
-
- 如果你按照前文配置了反向代理,打开 `https://minio-ui.example.com`
|
|
639
|
-
- 否则,请在进行端口映射后,打开 `http://localhost:9001`
|
|
640
|
-
|
|
641
|
-
1. 在登录界面输入你设置的 `MINIO_ROOT_USER` 和 `MINIO_ROOT_PASSWORD`,然后点击登录
|
|
642
|
-
|
|
643
|
-
2. 在左侧面板 User / Access Keys 处,点击 `Create New Access Key`,无需额外修改,将生成的 `Access Key` 和 `Secret Key` 填入你的 `.env` 文件中的 `S3_ACCESS_KEY_ID` 和 `S3_SECRET_ACCESS_KEY` 中
|
|
644
|
-
|
|
645
|
-
<Image alt="创建 MinIO 访问密钥" src="/blog/assetsfa2c650be15522ac2fd71a3e434a1b2e.webp" />
|
|
646
|
-
|
|
647
|
-
3. 重启 LobeHub 服务:
|
|
648
|
-
|
|
649
|
-
```sh
|
|
650
|
-
docker compose up -d
|
|
651
|
-
```
|
|
652
|
-
|
|
653
|
-
至此,你已经成功部署了 LobeHub 数据库版本,你可以通过 `https://lobe.example.com` 访问你的 LobeHub 服务。
|
|
654
|
-
|
|
655
317
|
#### 使用 `INTERNAL_APP_URL` 配置内部服务器通信
|
|
656
318
|
|
|
657
319
|
<Callout type="info">
|
|
@@ -683,168 +345,9 @@ environment:
|
|
|
683
345
|
对于使用 `network_mode: 'service:network-service'` 的 Docker Compose 部署,请使用 `http://localhost:3210` 作为 `INTERNAL_APP_URL`。
|
|
684
346
|
</Callout>
|
|
685
347
|
|
|
686
|
-
|
|
348
|
+
## 配置身份验证
|
|
687
349
|
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
- `.env`
|
|
691
|
-
|
|
692
|
-
```sh
|
|
693
|
-
# Proxy, if you need it
|
|
694
|
-
# HTTP_PROXY=http://localhost:7890
|
|
695
|
-
# HTTPS_PROXY=http://localhost:7890
|
|
696
|
-
|
|
697
|
-
# Other environment variables, as needed. You can refer to the environment variables configuration for the client version.
|
|
698
|
-
# OPENAI_API_KEY=sk-xxxx
|
|
699
|
-
# OPENAI_PROXY_URL=https://api.openai.com/v1
|
|
700
|
-
# OPENAI_MODEL_LIST=...
|
|
701
|
-
|
|
702
|
-
# ===========================
|
|
703
|
-
# ====== Preset config ======
|
|
704
|
-
# ===========================
|
|
705
|
-
# if no special requirements, no need to change
|
|
706
|
-
LOBE_PORT=3210
|
|
707
|
-
CASDOOR_PORT=8000
|
|
708
|
-
MINIO_PORT=9000
|
|
709
|
-
|
|
710
|
-
# Postgres related, which are the necessary environment variables for DB
|
|
711
|
-
LOBE_DB_NAME=LobeHub
|
|
712
|
-
POSTGRES_PASSWORD=uWNZugjBqixf8dxC
|
|
713
|
-
|
|
714
|
-
# Casdoor secret
|
|
715
|
-
AUTH_CASDOOR_ID=943e627d79d5dd8a22a1
|
|
716
|
-
AUTH_CASDOOR_SECRET=6ec24ac304e92e160ef0d0656ecd86de8cb563f1
|
|
717
|
-
|
|
718
|
-
# MinIO S3 configuration
|
|
719
|
-
MINIO_ROOT_USER=Joe
|
|
720
|
-
MINIO_ROOT_PASSWORD=Crj1570768
|
|
721
|
-
|
|
722
|
-
# Configure the bucket information of MinIO
|
|
723
|
-
MINIO_LOBE_BUCKET=lobe
|
|
724
|
-
S3_ACCESS_KEY_ID=dB6Uq9CYZPdWSZouPyEd
|
|
725
|
-
S3_SECRET_ACCESS_KEY=aPBW8CVULkh8bw1GatlT0GjLihcXHLNwRml4pieS
|
|
726
|
-
```
|
|
727
|
-
|
|
728
|
-
- `docker-compose.yml`
|
|
729
|
-
|
|
730
|
-
```yaml
|
|
731
|
-
name: lobehub
|
|
732
|
-
services:
|
|
733
|
-
network-service:
|
|
734
|
-
image: alpine
|
|
735
|
-
container_name: lobe-network
|
|
736
|
-
ports:
|
|
737
|
-
- '${MINIO_PORT}:${MINIO_PORT}' # MinIO API
|
|
738
|
-
- '9001:9001' # MinIO Console
|
|
739
|
-
- '${CASDOOR_PORT}:${CASDOOR_PORT}' # Casdoor
|
|
740
|
-
- '${LOBE_PORT}:3210' # LobeHub
|
|
741
|
-
command: tail -f /dev/null
|
|
742
|
-
networks:
|
|
743
|
-
- lobe-network
|
|
744
|
-
|
|
745
|
-
postgresql:
|
|
746
|
-
image: pgvector/pgvector:pg17
|
|
747
|
-
container_name: lobe-postgres
|
|
748
|
-
ports:
|
|
749
|
-
- '5432:5432'
|
|
750
|
-
volumes:
|
|
751
|
-
- './data:/var/lib/postgresql/data'
|
|
752
|
-
environment:
|
|
753
|
-
- 'POSTGRES_DB=${LOBE_DB_NAME}'
|
|
754
|
-
- 'POSTGRES_PASSWORD=${POSTGRES_PASSWORD}'
|
|
755
|
-
healthcheck:
|
|
756
|
-
test: ['CMD-SHELL', 'pg_isready -U postgres']
|
|
757
|
-
interval: 5s
|
|
758
|
-
timeout: 5s
|
|
759
|
-
retries: 5
|
|
760
|
-
restart: always
|
|
761
|
-
networks:
|
|
762
|
-
- lobe-network
|
|
763
|
-
|
|
764
|
-
minio:
|
|
765
|
-
image: minio/minio
|
|
766
|
-
container_name: lobe-minio
|
|
767
|
-
network_mode: 'service:network-service'
|
|
768
|
-
volumes:
|
|
769
|
-
- './s3_data:/etc/minio/data'
|
|
770
|
-
environment:
|
|
771
|
-
- 'MINIO_ROOT_USER=${MINIO_ROOT_USER}'
|
|
772
|
-
- 'MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD}'
|
|
773
|
-
# - 'MINIO_API_CORS_ALLOW_ORIGIN=http://localhost:${LOBE_PORT}'
|
|
774
|
-
- 'MINIO_API_CORS_ALLOW_ORIGIN=https://lobe.example.com'
|
|
775
|
-
restart: always
|
|
776
|
-
command: >
|
|
777
|
-
server /etc/minio/data --address ":${MINIO_PORT}" --console-address ":9001"
|
|
778
|
-
|
|
779
|
-
casdoor:
|
|
780
|
-
image: casbin/casdoor
|
|
781
|
-
container_name: lobe-casdoor
|
|
782
|
-
entrypoint: /bin/sh -c './server --createDatabase=true'
|
|
783
|
-
network_mode: 'service:network-service'
|
|
784
|
-
depends_on:
|
|
785
|
-
postgresql:
|
|
786
|
-
condition: service_healthy
|
|
787
|
-
environment:
|
|
788
|
-
RUNNING_IN_DOCKER: 'true'
|
|
789
|
-
driverName: 'postgres'
|
|
790
|
-
dataSourceName: 'user=postgres password=${POSTGRES_PASSWORD} host=postgresql port=5432 sslmode=disable dbname=casdoor'
|
|
791
|
-
# origin: 'http://localhost:${CASDOOR_PORT}'
|
|
792
|
-
origin: 'https://auth.example.com'
|
|
793
|
-
runmode: 'dev'
|
|
794
|
-
volumes:
|
|
795
|
-
- ./init_data.json:/init_data.json
|
|
796
|
-
|
|
797
|
-
lobe:
|
|
798
|
-
image: lobehub/lobehub
|
|
799
|
-
container_name: lobehub
|
|
800
|
-
network_mode: 'service:network-service'
|
|
801
|
-
depends_on:
|
|
802
|
-
postgresql:
|
|
803
|
-
condition: service_healthy
|
|
804
|
-
network-service:
|
|
805
|
-
condition: service_started
|
|
806
|
-
minio:
|
|
807
|
-
condition: service_started
|
|
808
|
-
casdoor:
|
|
809
|
-
condition: service_started
|
|
810
|
-
|
|
811
|
-
environment:
|
|
812
|
-
# - 'APP_URL=http://localhost:3210'
|
|
813
|
-
- 'APP_URL=https://lobe.example.com'
|
|
814
|
-
|
|
815
|
-
- 'AUTH_SSO_PROVIDERS=casdoor'
|
|
816
|
-
- 'KEY_VAULTS_SECRET=Kix2wcUONd4CX51E/ZPAd36BqM4wzJgKjPtz2sGztqQ='
|
|
817
|
-
- 'AUTH_SECRET=NX2kaPE923dt6BL2U8e9oSre5RfoT7hg'
|
|
818
|
-
# - 'AUTH_URL=http://localhost:${LOBE_PORT}/api/auth'
|
|
819
|
-
- 'AUTH_URL=https://lobe.example.com/api/auth'
|
|
820
|
-
|
|
821
|
-
# - 'AUTH_CASDOOR_ISSUER=http://localhost:${CASDOOR_PORT}'
|
|
822
|
-
- 'AUTH_CASDOOR_ISSUER=https://auth.example.com'
|
|
823
|
-
|
|
824
|
-
- 'DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@postgresql:5432/${LOBE_DB_NAME}'
|
|
825
|
-
# - 'S3_ENDPOINT=http://localhost:${MINIO_PORT}'
|
|
826
|
-
- 'S3_ENDPOINT=https://minio.example.com'
|
|
827
|
-
|
|
828
|
-
- 'S3_BUCKET=${MINIO_LOBE_BUCKET}'
|
|
829
|
-
# - 'S3_PUBLIC_DOMAIN=http://localhost:${MINIO_PORT}'
|
|
830
|
-
- 'S3_PUBLIC_DOMAIN=https://minio.example.com'
|
|
831
|
-
|
|
832
|
-
- 'S3_ENABLE_PATH_STYLE=1'
|
|
833
|
-
- 'LLM_VISION_IMAGE_USE_BASE64=1'
|
|
834
|
-
env_file:
|
|
835
|
-
- .env
|
|
836
|
-
restart: always
|
|
837
|
-
|
|
838
|
-
volumes:
|
|
839
|
-
data:
|
|
840
|
-
driver: local
|
|
841
|
-
s3_data:
|
|
842
|
-
driver: local
|
|
843
|
-
|
|
844
|
-
networks:
|
|
845
|
-
lobe-network:
|
|
846
|
-
driver: bridge
|
|
847
|
-
```
|
|
350
|
+
如需配置 SSO 登录鉴权服务(如 Casdoor、Logto 等),请参考 [身份验证服务](/zh/docs/self-hosting/advanced/auth) 文档。
|
|
848
351
|
|
|
849
352
|
[docker-pulls-link]: https://hub.docker.com/r/lobehub/lobehub
|
|
850
353
|
[docker-pulls-shield]: https://img.shields.io/docker/pulls/lobehub/lobehub?color=45cc11&labelColor=black&style=flat-square
|