OpenWebUI & Monitor
超级版OpenWebUI,带有用户管理系统
首先我们需要对compose文件进行调整,需要使用host模式,抛弃端口映射逻辑来方便各个服务之间的通讯,以及方便我们后续使用 ufw 防火墙来组织直接通过IP+端口的方式访问,提高安全性。
services:
postgre:
image: docker.1panel.live/library/postgres:latest
container_name: postgre
restart: always
environment:
- POSTGRES_USER=st
- POSTGRES_PASSWORD=STshentong
- POSTGRES_DB=openwebui
volumes:
- /data/postgres_data:/var/lib/postgresql/data
- /data/postgres-init:/docker-entrypoint-initdb.d
network_mode: host #端口5432
open-webui:
image: docker.1panel.live/dyrnq/open-webui:latest
container_name: open-webui
volumes:
- /data/open-webui:/app/backend/data
restart: always
environment:
- DATABASE_URL=postgresql://st:STshentong@localhost:5432/openwebui # 连接到 openwebui 数据库
- ENABLE_WEBSOCKET_SUPPORT=True
- WEBSOCKET_REDIS_URL=redis://localhost:6379
- REDIS_URL=redis://localhost:6379
- WEBUI_NAME=ChatST
- AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST=1
- AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST=1
- USER_AGENT=${USER_AGENT:-Mozilla/5.0 (compatible; OpenWebUI/1.0; +https://github.com/open-webui)}
build:
args:
USER_AGENT: $USER_AGENT
network_mode: host #端口8080
depends_on:
- postgre
- redis
redis:
image: docker.1panel.live/library/redis:latest
container_name: redis
restart: always
network_mode: host #端口6379
watchtower:
image: docker.1panel.live/containrrr/watchtower
container_name: open-webui-watchtower
restart: always
volumes:
- /var/run/docker.sock:/var/run/docker.sock
command: --interval 3600 open-webui
depends_on:
- open-webui
network_mode: host在这个文件中我已经备注了各个服务的默认端口,注意OpenWebUI的默认端口是8080,而不是之前映射的3000;为了安装后面的监控,我们还需要一个数据库启动脚本,来创建 monitor 所需的数据库,先创建一个文件夹 /data/postgres-init ,然后在里面创建一个名为 init-extra-db.sql 的SQL文件,内容如下:
这样postgre在启动时就会创建这两个所需的数据库了。并且在这个compose文件中,我统一把所有的数据都存放在 /data 文件夹对应的目录中,而不是之前的docker volume,便于管理。
接下来我们开始部署监控系统,在 data 文件夹中创建一个 monitor 文件夹,里面放上两个文件,一个是compose文件,这个系统会用到我们刚才部署的数据库:
以及一个环境变量文件 .env ,注意前面的点 . :
注意这里的上面一个API,是需要在OpenWebUI中开启API密钥,然后生成一个API,这个API是用来获取模型列表的;下面一个API是OpenWebUI前端函数调用这个后台模块时使用的,可以自己随便写;这里还有个设置项是初始额度,我这里设置成了5,后续通过脚本可以实现每天定时刷新重置成5元:
都配置完成后再启动这个监控系统(先把OpenWebUI配置好,拿到API密钥),启动成功后再到OpenWebUI中添加函数(原链接: https://github.com/VariantConst/OpenWebUI-Monitor/blob/main/resources/functions/openwebui_monitor.py ):
然后我个人喜欢安装一个轻量化的系统监控 beszel ,方便我们实时掌握系统资源占用情况。同样在 /data 目录下创建一个文件夹 /beszel ,然后使用compose文件,我这里也修改成了统一使用host模式:
这个时候他数据的默认存放位置就是在compose文件的那个目录中,所以不需要修改了,启动后使用主机格式 /beszel_socket/beszel.sock 得到一个密钥,然后替换掉compose文件中的KEY,重新部署compose即可。
由于使用这个监控系统需要启用API,这使得别人外部调用我们的网站变得非常简单,因此必须增加防火墙,我们使用宝塔WAF,因为这似乎是免费开源WAF中性能最好的,安装脚本:
直接一键安装即可,安装完成后会给出登录链接和初始用户名密码,配置好WAF后我们就可以启动系统的ufw防火墙来阻止直接对端口的访问了。
一般来说放行这些端口就已经足够了,其他网站都通过宝塔WAF进行反代,对于数据库的外部连接,我不建议放行5432端口,防止被爆破,需要使用时可以通过SSH隧道连接数据库。对于错误添加的规则,可以用下面的方法删除:
全新重构的二开版本
改用方块佬的二开版本,带积分制度,带充值,以及对外部调用计费,项目地址: https://github.com/U8F69/open-webui
Docker Compose修改:
鉴于OpenWebUI频繁的bug问题,取消了自动更新,如果需要更新可以使用 docker compose pull 然后 docker compose up -d 来手动实现。
宝塔WAF的迁移:官方文档: https://www.kancloud.cn/kern123/cloudwaf/3209672
我的步骤汇总与优化:
将压缩后的文件下载上传到新服务器,然后解压(以下命令假设上传到了root目录下,根据实际修改):
在新服务器上安装宝塔WAF(同样基于root目录,可能需要修改):
特殊的脚本汇总:
数据库清理脚本:
容器监控脚本(因为现在有一段时间不知道为什么,OpenWebUI总会莫名其妙CPU占用100%或者0%,然后卡死崩溃,看日志啥也看不出来,只能写了个监控脚本检测到异常占用自动重启容器了):
创建完脚本后,使用系统进程的方式在后台运行,实现开机自启,先创建一个进程文件: /etc/systemd/system/openwebui-monitor.service :
然后启动系统进程:
抛弃 chat/files/credit/credit_logs 表进行迁移:
在恢复时也需要进行调整(记得修改恢复文件路径):
最后更新于