OpenWebUI

目前最强大的AI前后端(但是也很吃性能)

docker compose:

services:
  open-webui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    ports:
      - "3000:8080"
    volumes:
      - open-webui:/app/backend/data
    environment:
      - STORAGE_PROVIDER=s3
      - S3_ACCESS_KEY_ID=581c5b7e7304837ffa6b0c5410e869ed
      - S3_BUCKET_NAME=web
      - S3_ENDPOINT_URL=https://fccb494a4985b211afbfe26e87e1c7bc.r2.cloudflarestorage.com
      - S3_KEY_PREFIX=openwebui
      - S3_REGION_NAME=auto
      - S3_SECRET_ACCESS_KEY=f40fe409cea27d970660a1abe1fcea06f701d56306adf347bfd26f0c0ed251e2
      - DATABASE_URL=postgresql://openwebui_owner:npg_dStx0e3KNgEM@ep-late-snow-a192dz9a-pooler.ap-southeast-1.aws.neon.tech/openwebui?sslmode=require
      - ENABLE_WEBSOCKET_SUPPORT=True
      - WEBSOCKET_REDIS_URL=redis://redis:6379  # 修改为服务名 "redis"
      - REDIS_URL=redis://redis:6379            # 修改为服务名 "redis"
      - WEBUI_NAME=ChatWeb ST
      - USER_AGENT=${USER_AGENT:-Mozilla/5.0 (compatible; OpenWebUI/1.0; +https://github.com/open-webui)}
    build:
      args:
        USER_AGENT: $USER_AGENT
    networks:
      - openwebui  # 指定自定义网络
    depends_on:
      - redis      # 确保 Redis 先启动

  redis:  # 新增 Redis 服务
    image: redis:latest
    container_name: redis
    networks:
      - openwebui

  watchtower:
    image: containrrr/watchtower
    container_name: open-webui-watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    command: --interval 3600 open-webui
    depends_on:
      - open-webui
    networks:
      - openwebui

networks:
  openwebui:  # 定义自定义网络
    driver: bridge

volumes:
  open-webui:

经过几天的探索进行的优化,我们特别优化了一个很少有人提及的点,就是OpenWebUI默认会启用langchain但是又没有设置UA,导致会在那一步卡很久,我们设置了UA就成功过了langchain的检查(仅适用于国内服务器配置,海外服务器仍然使用上面的)

如果还想进一步简化,可以去掉S3服务,但是去掉后文件上传等等可能会出现问题,最核心的就是数据库的问题,数据库是影响性能的核心要素,所以我在国内的服务器专门新建了一个postgresql数据库,链接也直接换成了IP的方式,并且去掉了SSL

P.S. 如果是运行在本地的数据库,修改成:host.docker.internal:5432 路径即可(有时候用这个会出现无法连接的情况,那就先用 docker network inspect bridge 查看桥接网络IP(一般是172.17.0.1),然后替换即可

但是需要自己搭建数据库,并且服务器到期之后需要手动迁移数据库,先说说怎么搭建:

PostgreSQL官网下载页:https://www.postgresql.org/download/

Ubuntu直接安装即可:

如果要安装别的版本的下方也有教程,不过还有一种方案是也在同一个docker网络中进行安装,示例如下:

外部也同样可以通过5432端口访问数据库,同样可以借助DBreaver进行备份和恢复(另外,如果要指定版本,将latest标签改成16即可)

(本地部署,不方便)但是Ubuntu版本不同的情况下,自带的软件仓库中的PostgreSQL版本也不同,如果要为了迁移时保证版本相同来最大化兼容性,建议用官方仓库指定版本,比如我开始部署时的最新版本17:

安装完成后验证一下服务状态:

然后需要修改配置文件(路径:/etc/postgresql/版本号/main/postgresql.conf)

修改连接认证文件(路径同上,文件名pg_hba.conf),用这些把原有的规则全部替换掉:

重启服务让配置生效:

然后创建用户和数据库:

然后就可以用DBeaver连接数据库了,连接后可以对数据库进行备份、恢复等操作

在备份PostgreSQL数据库时,强烈建议备份成PostgreSQL专属的 .backup 格式而不是 .sql 格式,兼容性会好很多,只是恢复时稍微麻烦些。使用DBeaver备份时,如下图所示,格式选择Custom,并在文件名后自行加上后缀 .backup 不然默认会备份成 .sql 格式。

得到 backup 文件后,可以直接在DBreaver进行恢复,但在某些特殊的情景下,需要到服务器的终端进行恢复,SSH链接服务器后,将备份文件上传,然后使用 pg_restore 命令进行恢复(需要注意要先创建openwebui数据库):

输入密码即可覆盖恢复,注意这里的 --clean命令会清除原先数据库中的所有内容,来确保恢复时不会产生冲突。

一些另外的附加事项:

经过实际使用发现这个项目容器运行久了会变得非常卡顿,重启容器即可恢复,对于大多数服务器,直接使用 crontab 即可:

默认使用nano编辑,直接在末尾添加:

添加后按 Ctrl+O 保存,回车确认,然后 Ctrl+X 退出编辑器。注意这里的路径是docker服务的路径,使用命令 which docker 即可查看,多数机器一般是没有local的。这个crontab的意思是在每天凌晨3点重启容器。

对于一些比较特别的机器,无法使用crontab的(比如腾讯Cloud Studio),我的解决方案是使用另一台服务器,创建SSH连接脚本,然后使用crontab自动化执行,具体如下:

创建 restart.sh 文件,填入脚本(注意替换成实际的SSH连接命令):

然后再到crontab中创建自动执行该脚本的计划:

另外顺便讲讲 CloudStudio保活 也是这个思路,使用脚本:

创建每分钟连接SSH的计划:

不过要注意在设置这些重启计划时有一个细节,就是要注意系统时间,大多数Ubuntu系统默认使用的是UTC标准时间,可以使用 date 命令查看当前时间,修改成北京时间如下:

然后检查一下系统时区设置:

超级进阶配置

自动备份数据库backup脚本(注意修改本地保存路径):

这是我写的一个在一台服务器上自动连接到主数据库进行备份的脚本,备份文件会自动覆盖到S3兼容的R2对象存储。运行脚本的环境需要安装awscli和postgresql客户端工具:(对于海外服务器)

(对于国内服务器使用阿里云镜像安装postgresql客户端工具)

不过这里需要注意的是阿里云的镜像仓库貌似没有17版本的客户端,还是要用官方仓库安装:

环境配置完成后需要给脚本权限然后运行:

自动恢复backup文件到其他服务器数据库脚本(请自行替换链接地址):

同样的也要记得先赋予权限:

如果这两个脚本测试运行一段时间都没有问题的话还可以整合起来成一个 sync.sh,下面这个脚本进行了很多改进,包括并行处理(需要根据你运行该脚本的服务器内核数调整并行处理数)、时间戳多版本管理、dump自定义压缩等,大大加快了整体执行速度:

同样的也要记得先赋予权限:

然后可以添加crontab自动执行(比如我下面的每天凌晨0点30自动执行):

数据库清理

当我逐步壮大到拥有了600用户之后,每天产生的聊天记录就有超过3GB,同时也会有很多无关的人注册,这时就需要通过数据库清理来提高系统的稳定性了。

首先进入容器数据库(如果是本地安装就不需要):

清理所有未激活的用户:

清理所有超过10天未登录的用户(但是排除某些特定用户):

清理所有超过7天未更新、且未归档、未置顶的聊天记录:

一些脚本汇总

上面有很多的条目,找起来可能比较繁琐,并且我陆续将很多命令都整合成了sh脚本,方便运行。

数据库清理脚本(仅适用于docker容器安装的数据库,直接进入docker,因此与端口无关):

本地备份脚本(备份到本地data数据盘/backup目录,并仅保留最近3天的备份):

数据库恢复脚本(需指定恢复文件,调整线程数):

备份文件迁移脚本:

这个命令需要安装sshpass ,直接 apt-get install sshpass即可

最后更新于