Skip to content

Commit a916428

Browse files
committed
feat(lobehub): 添加 LobeChat 自托管配置和文档
- 新增完整的 LobeChat Compose 使用说明文档,包含默认模式和回滚模式的配置 - 添加 bucket.config.json 配置文件用于 RustFS 桶权限管理 - 创建 deprecated 目录存放旧的内部服务配置文件(.env.with-internal-services 和 docker-compose.with-internal-db.yml) - 配置新的 docker-compose.yml 支持外部依赖服务模式,移除内置数据库依赖 - 添加 PostgreSQL/ParadeDB 容器使用说明文档,包含连接和查询操作指南 - 更新部署架构支持宿主机共享服务(PostgreSQL、Redis、RustFS)
1 parent ed981ba commit a916428

10 files changed

Lines changed: 3857 additions & 0 deletions

File tree

ai/self-hosted/lobehub/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.env.with-internal-services

ai/self-hosted/lobehub/README.md

Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,291 @@
1+
# LobeChat Compose 使用说明
2+
3+
这个仓库现在默认只编排 LobeChat 应用侧服务。
4+
5+
外部依赖已经从主 `docker-compose.yml` 中移出:
6+
7+
- ParadeDB / PostgreSQL
8+
- Redis
9+
- RustFS
10+
11+
当前项目仍然保留:
12+
13+
- `lobe`
14+
- `searxng`
15+
- `rustfs-init`
16+
17+
## 默认模式
18+
19+
默认模式使用以下文件:
20+
21+
- `docker-compose.yml`
22+
- `.env`
23+
24+
在这个模式下,LobeChat 会连接宿主机上的共享服务:
25+
26+
- PostgreSQL:`host.docker.internal:5432`
27+
- Redis:`host.docker.internal:6379`
28+
- RustFS API:`host.docker.internal:9000`
29+
30+
其中:
31+
32+
- `S3_ENDPOINT` 用于容器内访问宿主机 RustFS
33+
- `S3_PUBLIC_DOMAIN` 用于浏览器或外部访问对象文件
34+
- 当前默认值是 `http://macmini:9000`
35+
36+
如果你本机不是通过 `macmini` 访问,请同步修改:
37+
38+
- `.env` 里的 `APP_URL`
39+
- `.env` 里的 `S3_PUBLIC_DOMAIN`
40+
41+
启动命令:
42+
43+
```bash
44+
docker compose up -d
45+
```
46+
47+
也可以使用仓库里的启动脚本:
48+
49+
```bash
50+
bash start.sh start
51+
bash start.sh logs lobe
52+
bash start.sh status internal
53+
```
54+
55+
说明:
56+
57+
- `start.sh` 默认是 `external` 模式
58+
- 传入 `internal` 时会自动切到 `docker-compose.with-internal-db.yml + .env.with-internal-services`
59+
- 如果当前磁盘挂载方式不允许直接执行脚本,优先使用 `bash start.sh ...`
60+
61+
查看服务状态:
62+
63+
```bash
64+
docker compose ps
65+
```
66+
67+
查看日志:
68+
69+
```bash
70+
docker compose logs -f --tail=200 lobe
71+
```
72+
73+
数据库容器的进入方式、认证规则、常用查询命令,见:
74+
75+
- [docs/postgres-docker-usage.md](docs/postgres-docker-usage.md)
76+
77+
## 回滚模式
78+
79+
如果要切回“项目内置依赖”版本,使用以下文件:
80+
81+
- `docker-compose.with-internal-db.yml`
82+
- `.env.with-internal-services`
83+
84+
启动命令:
85+
86+
```bash
87+
docker compose -f docker-compose.with-internal-db.yml --env-file .env.with-internal-services up -d
88+
```
89+
90+
PowerShell 下可用:
91+
92+
```powershell
93+
./start.ps1 -Action start -Mode external
94+
./start.ps1 -Action status -Mode internal
95+
./start.ps1 -Action logs -Service lobe -Mode external
96+
```
97+
98+
这会重新使用项目内的:
99+
100+
- ParadeDB / PostgreSQL
101+
- Redis
102+
- RustFS
103+
104+
## rustfs-init
105+
106+
`rustfs-init` 仍然属于当前项目,用来确保 LobeChat 自己的 bucket 和访问策略存在。
107+
108+
如果宿主机 RustFS 已经启动,但 bucket 初始化失败,可以单独重跑:
109+
110+
```bash
111+
docker compose up --force-recreate rustfs-init
112+
```
113+
114+
## RustFS 数据在哪
115+
116+
LobeHub 在 RustFS 里的数据可以分成两层理解。
117+
118+
逻辑层:
119+
120+
- bucket 名是 `lobe`
121+
- 这个名字来自 `.env` 里的 `RUSTFS_LOBE_BUCKET=lobe`
122+
- `rustfs-init` 也会给 `lobe` bucket 设置访问策略
123+
124+
持久化层:
125+
126+
- 当前内置 RustFS 使用的 Docker volume 名是 `lobehub_rustfs-data`
127+
- Docker 记录的挂载点是 `/var/lib/docker/volumes/lobehub_rustfs-data/_data`
128+
129+
可以用下面命令确认:
130+
131+
```bash
132+
docker volume inspect lobehub_rustfs-data
133+
```
134+
135+
更直白地说:
136+
137+
- 你真正关心的 LobeHub 文件数据在 `lobe` bucket
138+
- 当前这份 bucket 数据落在 `lobehub_rustfs-data` 这个 volume 里
139+
140+
不建议直接拷贝底层 volume 目录做迁移,优先走 bucket 层导出/导入。
141+
142+
## RustFS 迁移指南
143+
144+
推荐做法是:
145+
146+
1. 先从旧的内置 RustFS 导出 `lobe` bucket
147+
2. 再启动新的宿主机 RustFS
148+
3. 把导出的 bucket 导入到新 RustFS
149+
4. 最后重跑 `rustfs-init`
150+
151+
### 迁移前确认
152+
153+
- 旧 bucket:`lobe`
154+
- 旧 volume:`lobehub_rustfs-data`
155+
- 新宿主机 RustFS 最终端口:
156+
- API `9000`
157+
- Console `9001`
158+
- 新宿主机 RustFS 的 access key / secret key 必须与 `.env` 一致
159+
160+
### 第 1 步:如果旧内置 RustFS 没在运行,先临时启动它
161+
162+
如果你当前旧容器还在运行,这一步可以跳过。
163+
164+
```bash
165+
docker compose -f docker-compose.with-internal-db.yml --env-file .env.with-internal-services up -d network-service rustfs rustfs-init
166+
```
167+
168+
注意:
169+
170+
- 旧内置 RustFS 会占用宿主机 `9000/9001`
171+
- 如果新的宿主机 RustFS 已经先启动了,请先停掉新的,避免端口冲突
172+
173+
### 第 2 步:导出旧 `lobe` bucket 到本地目录
174+
175+
```bash
176+
mkdir -p rustfs-migration
177+
178+
docker run --rm \
179+
-v "$PWD/rustfs-migration:/backup" \
180+
minio/mc \
181+
sh -c 'mc alias set old http://host.docker.internal:9000 admin 1cf7f374 && mc mirror --overwrite old/lobe /backup/lobe'
182+
```
183+
184+
如果你实际使用的 RustFS 凭证不是:
185+
186+
- access key `admin`
187+
- secret key `1cf7f374`
188+
189+
请把命令里的值换成你自己的。
190+
191+
导出成功后,本地会出现:
192+
193+
- `rustfs-migration/lobe`
194+
195+
### 第 3 步:停止旧内置 RustFS
196+
197+
```bash
198+
docker compose -f docker-compose.with-internal-db.yml --env-file .env.with-internal-services stop rustfs rustfs-init network-service
199+
```
200+
201+
### 第 4 步:启动新的宿主机 RustFS
202+
203+
这一步由你或胡子在宿主机完成,但要确保:
204+
205+
- 监听 `9000/9001`
206+
- 使用和 `.env` 一致的 `RUSTFS_ACCESS_KEY` / `RUSTFS_SECRET_KEY`
207+
- 已配置持久化目录或 volume
208+
209+
### 第 5 步:把导出的 `lobe` bucket 导入到新的 RustFS
210+
211+
```bash
212+
docker run --rm \
213+
-v "$PWD/rustfs-migration:/backup" \
214+
minio/mc \
215+
sh -c 'mc alias set new http://host.docker.internal:9000 admin 1cf7f374 && mc mb new/lobe --ignore-existing && mc mirror --overwrite /backup/lobe new/lobe'
216+
```
217+
218+
### 第 6 步:重跑项目里的 `rustfs-init`
219+
220+
这样可以把 bucket 策略重新对齐到当前项目配置。
221+
222+
```bash
223+
docker compose up --force-recreate rustfs-init
224+
```
225+
226+
### 第 7 步:启动当前项目
227+
228+
```bash
229+
docker compose up -d
230+
```
231+
232+
### 迁移完成后的核对项
233+
234+
- LobeChat 里的历史图片和文件可以打开
235+
- 新上传文件可以正常写入
236+
- `rustfs-init` 没有鉴权错误
237+
- `.env` 里的 `S3_PUBLIC_DOMAIN` 仍然是浏览器可访问地址
238+
239+
## 端口要求
240+
241+
默认模式下,这个项目自身只占用:
242+
243+
- `3210`:LobeChat
244+
245+
宿主机共享服务需要提前可用:
246+
247+
- `5432`:PostgreSQL / ParadeDB
248+
- `6379`:Redis
249+
- `9000`:RustFS API
250+
- `9001`:RustFS Console
251+
252+
## 常见排查
253+
254+
### 1. 数据库连不上
255+
256+
检查宿主机 PostgreSQL 是否已启动:
257+
258+
```bash
259+
docker ps --format '{{.Names}}\t{{.Ports}}'
260+
```
261+
262+
确认 `.env` 中的 `DATABASE_URL` 用户名、密码、库名与宿主机 ParadeDB 一致。
263+
264+
### 2. Redis 连不上
265+
266+
确认宿主机 Redis 正在监听 `6379`,并且 `.env` 中的 `REDIS_URL` 没有写错。
267+
268+
### 3. RustFS 初始化失败
269+
270+
先确认宿主机 RustFS 健康检查可访问:
271+
272+
```bash
273+
docker run --rm alpine sh -c 'wget -qO- http://host.docker.internal:9000/health'
274+
```
275+
276+
如果健康检查正常,再重跑:
277+
278+
```bash
279+
docker compose up --force-recreate rustfs-init
280+
```
281+
282+
### 4. 浏览器里文件地址打不开
283+
284+
`host.docker.internal` 主要给容器内访问宿主机使用,宿主机浏览器不一定能直接解析它。
285+
286+
如果页面里资源地址打不开,优先检查 `.env` 中的:
287+
288+
- `S3_PUBLIC_DOMAIN`
289+
- `APP_URL`
290+
291+
把它们改成你本机浏览器可以直接访问的地址即可。
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"ID": "",
3+
"Statement": [
4+
{
5+
"Sid": "",
6+
"Effect": "Allow",
7+
"Principal": {
8+
"AWS": ["*"]
9+
},
10+
"Action": ["s3:GetObject"],
11+
"NotAction": [],
12+
"Resource": ["arn:aws:s3:::lobe/*"],
13+
"NotResource": [],
14+
"Condition": {}
15+
}
16+
],
17+
"Version": "2012-10-17"
18+
}

0 commit comments

Comments
 (0)