1. 前言

通过docker镜像拉取安装就不介绍了,官方的命令很多。本节主要撸一撸源码,所以,本地构建。

当前项目基于main分钟2025-5-30日的最新提交进行分析。随着后续的升级过程中,可能会出现差异。

2. 技术框架和启动环境

后端python,前端svelte

环境要求:python > = 3.11  ,Node.js > = 20.10

3. 源码目录

3.1 根目录

目录说明

  • backend目录:后端代码目录,包含API服务、数据库操作等
  • cypress 目录:包含Cypress测试框架的配置和测试脚本,用于端到端测试
  • docs 目录:文档目录,包含项目说明、安全指南等。
  • kubernetes : 包含Kubernetes部署配置文件。
  • scripts : 包含各种脚本文件,用于自动化部署、测试或其他任务的脚本。
  • src :前端代码目录,存放Svelte组件和相关资源的地方。
  • static : 静态文件目录,如图片、CSS、客户端JavaScript等。
  • test/test_files/image_gen : 测试目录下的子目录,包含用于测试的图像生成器。

3.2. 后端目录

  • data文件夹:用于存储后端服务需要的数据文件,如数据库、文档等
  • open-webui文件夹:包含后端服务的主要代码和配置文件
  • dev.sh:用于本地开发环境的启动脚本
  • start.sh 和 start_windows.bat - 用于启动后端服务的脚本,分别适用于类Unix系统和Windows系统。 

3.2.1 data目录

3.2.1.1 cache - 用于存储应用程序的缓存数据。
(1)audio
(2)functions  包含一些后端服务使用的函数或脚本

(3)image
(4)tools包含一些用于后端服务的工具或脚本

3.2.1.2 uploads - 用于存储用户上传的文件

知识库上传的文件在此处

3.2.1.3 vector_db - 用于存储向量数据库或类似的数据结构

sqlite数据库

3.2.1.4  webui.db后端服务使用的数据库文件

3.2.1.5  readme.txt - 包含文件夹的说明或使用指南

3.2.2 dev.sh文件

用于本地开发环境的启动脚本

PORT="${PORT:-8080}"
uvicorn open_webui.main:app --port $PORT --host 0.0.0.0 --forwarded-allow-ips '*' --reload
uvicorn是web服务器,可以理解为javaweb中Tomcat

如果你用了conda来创建的虚拟环境。虚拟环境指定了python版本,就可以通过pip安装uvicorn。其中requirements.txt文件中指定了uvicorn包版本。国内pip源可以指定华为的,清华源感觉总是出错,不知是本人配置问题还是怎样。

如何启动后端服务?

(1)通过命令行启动。conda创建虚拟环境后,激活虚拟环境。然后进入到项目backend目录喜下,运行命令:

D:\GiteeDownloadProject\AIStudyProject\open-webui\backend>uvicorn open_webui.main:app --port 8080 --host 0.0.0.0 --forwarded-allow-ips '*' --reload

(2)如果使用PyCharm软件,配置如下

3.2.3 requirements.txt文件

python依赖包

3.2.4 start.sh文件

启动后端服务的window脚本。

相较于开发环境dev.sh 多了一些配置项,最终都是通过uvicorn命令启动,来运行 open-webui/backend/open_webui/main.py 文件中的FastAPI的 app 应用对象,监听在指定的主机和端口上,并允许所有的转发 IP 地址。

 流程:

(1)识别当前脚本所在目录为项目的工作目录

(2)设置访问地址和端口,访问地址允许全部IP

(3)webui_secret_key配置,用于系统session和token访问鉴权,如果负载多节点部署,同一个key能够保证用户访问的时候,会话一致性,否则可能造成认证失败,重新登录。如果不做配置,在系统env.py文件中会默认一个key值

(4)是否安装ollama配置(这个是linux启动命令中配置,window启动命令start_windows.bat没有),linux环境下open-webui的启动命令支持,直接命令方式安装ollama

(5)是否配置huggingFace的space_id,如果设置了HuggingFace的space id,则进行web应用配置,以适应 HuggingFace space 的部署要求。

(6)通过uvicorn启动python服务

#!/usr/bin/env bash
# 这行代码的作用是获取当前脚本文件所在的目录路径,并赋值给 SCRIPT_DIR 变量。它常用于确保后续操作是在脚本所在目录下执行的
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
cd "$SCRIPT_DIR" || exit

# Add conditional Playwright browser installation
if [[ "${WEB_LOADER_ENGINE,,}" == "playwright" ]]; then
    if [[ -z "${PLAYWRIGHT_WS_URL}" ]]; then
        echo "Installing Playwright browsers..."
        playwright install chromium
        playwright install-deps chromium
    fi

    python -c "import nltk; nltk.download('punkt_tab')"
fi

KEY_FILE=.webui_secret_key

# 设置主机端口号 和 主机地址
PORT="${PORT:-8080}"
HOST="${HOST:-0.0.0.0}"

# 若秘钥为空 生成新的秘钥  ,如果没有该文件,在程序env.py中默认值=t0p-s3cr3t
if test "$WEBUI_SECRET_KEY $WEBUI_JWT_SECRET_KEY" = " "; then
  echo "Loading WEBUI_SECRET_KEY from file, not provided as an environment variable."

  if ! [ -e "$KEY_FILE" ]; then
    echo "Generating WEBUI_SECRET_KEY"
    # Generate a random value to use as a WEBUI_SECRET_KEY in case the user didn't provide one.
    echo $(head -c 12 /dev/random | base64) > "$KEY_FILE"
  fi

  echo "Loading WEBUI_SECRET_KEY from $KEY_FILE"
  WEBUI_SECRET_KEY=$(cat "$KEY_FILE")
fi

# 如果当前docker镜像中有ollama镜像,则启动ollama服务 (在此前的dockerfile中如果用户使用docker内ollama,则在镜像制作阶段,已经下载ollama安装)
if [[ "${USE_OLLAMA_DOCKER,,}" == "true" ]]; then
    echo "USE_OLLAMA is set to true, starting ollama serve."
    ollama serve &
fi
# 如果在docker内安装cuda,则将 PyTorch 和 CUDA 相关的库路径添加到 LD_LIBRARY_PATH,以确保程序能正确加载这些动态库。
if [[ "${USE_CUDA_DOCKER,,}" == "true" ]]; then
  echo "CUDA is enabled, appending LD_LIBRARY_PATH to include torch/cudnn & cublas libraries."
  export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/lib/python3.11/site-packages/torch/lib:/usr/local/lib/python3.11/site-packages/nvidia/cudnn/lib"
fi

# 如果设置了HuggingFace的space id,则进行web应用配置,以适应 HuggingFace space 的部署要求。
# Check if SPACE_ID is set, if so, configure for space
if [ -n "$SPACE_ID" ]; then
  echo "Configuring for HuggingFace Space deployment"
  if [ -n "$ADMIN_USER_EMAIL" ] && [ -n "$ADMIN_USER_PASSWORD" ]; then
    echo "Admin user configured, creating"
    WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" uvicorn open_webui.main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' &
    webui_pid=$!
    echo "Waiting for webui to start..."
    while ! curl -s http://localhost:8080/health > /dev/null; do
      sleep 1
    done
    echo "Creating admin user..."
    curl \
      -X POST "http://localhost:8080/api/v1/auths/signup" \
      -H "accept: application/json" \
      -H "Content-Type: application/json" \
      -d "{ \"email\": \"${ADMIN_USER_EMAIL}\", \"password\": \"${ADMIN_USER_PASSWORD}\", \"name\": \"Admin\" }"
    echo "Shutting down webui..."
    kill $webui_pid
  fi

  export WEBUI_URL=${SPACE_HOST}
fi

# 查找系统中可用的 Python 3 解释器路径,优先查找 python3,若未找到则尝试查找 python。 最终将查找到的路径赋值给变量 PYTHON_CMD。
PYTHON_CMD=$(command -v python3 || command -v python)

# ##############################################################################################
#  该Shell命令启动了一个Uvicorn Web服务器,用于运行Open WebUI应用。具体功能如下:
#  1.  WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY":将环境变量 WEBUI_SECRET_KEY 传递给即将执行的进程。
#  2.  exec "$PYTHON_CMD" -m uvicorn:使用指定的Python解释器运行Uvicorn模块。
#  3.  open_webui.main:app:指定要运行的应用模块和实例(即 app 对象)。
#  4.  --host "$HOST" 和 --port "$PORT":绑定服务器监听的主机和端口。
#  5.  --forwarded-allow-ips '*':允许所有IP通过反向代理访问。
#  6.  --workers "${UVICORN_WORKERS:-1}":设置工作进程数,默认为1
# #############################################################################################
WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" exec "$PYTHON_CMD" -m uvicorn open_webui.main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' --workers "${UVICORN_WORKERS:-1}"

3.2.5 start_windows.bat文件

同start.sh。

3.2.6 open_webui目录

3.2.6.1 data目录

用于存储后端服务需要的数据文件。

3.2.6.2 internal目录

针对项目早期或部分模块中仍在使用 Peewee ORM 的数据库模型。

是项目早期使用的 Peewee 数据库迁移机制,主要用于用户、聊天、标签等功能模块。

这部分是原来旧的迁移方式,具体对比如下一节说明

3.2.6.3 migrations目录

数据库迁移脚本,用于数据库结构的版本控制

 在 FastAPI 项目中集成 Alembic 和 SQLAlchemy 的迁移机制

FastAPI 中集成 Alembic 和 SQLAlchemy 的核心原理是通过 env.py 配置文件来协调数据库连接、模型元数据以及迁移脚本的执行方式。Alembic 利用 SQLAlchemy 提供的引擎和连接能力,确保数据库结构能够与模型定义保持同步。

当前迁移脚本使用的技术和internal目录下使用数据库迁移技术对比

从目录结构和内容来看:

  • internal/migrations 是项目早期使用的 Peewee 数据库迁移机制,主要用于用户、聊天、标签等功能模块。
  • migrations 是后来引入的 Alembic + SQLAlchemy 的迁移机制,用于更现代的数据库模式管理和自动化迁移。

这表明项目正在逐步从 Peewee 向 SQLAlchemy 过渡,两个迁移系统并存是过渡阶段的一种合理设计。未来可能会逐渐淘汰 internal/migrations,完全转向 migrations。


3.2.6.4 models目录

详细介绍如下文章

OpenWebUI(3)源码学习-后端models数据模型模块-CSDN博客本文介绍了项目中SQLAlchemy数据库模型的定义文件,包含18个主要模型文件。这些模型分别管理用户认证(auths.py)、聊天频道(channels.py)、对话记录(chats.py)、用户反馈(feedbacks.py)、文件管理(files.py)、文件夹结构(folders.py)等功能模块。所有模型继承自统一Base类,包含id、user_id、created_at等公共字段,支持与FastAPI的ORM集成。这些模型为项目提供数据库表结构定义,支持Alembic自动迁移,并与路由接口、数据 https://blog.csdn.net/yilvqingtai/article/details/149179154

3.2.6.5 retrieval目录(检索模块)

详细介绍如下文章

OpenWebUI(2)源码学习-后端retrieval检索模块-CSDN博客本文介绍了AI对话系统中的一个检索模块目录结构及其功能。该模块主要包含数据加载器(如PDF/URL加载)、检索模型(如ColBERT)、向量数据库操作(支持Chroma/Elasticsearch等)和网络搜索(集成Bing/Brave等引擎)四个核心组件,为AI系统提供外部知识检索能力。通过统一的接口设计,模块实现了多源数据加载、语义向量检索和搜索结果重排序等功能,有效提升对话系统的知识获取效率。 https://blog.csdn.net/yilvqingtai/article/details/149178945?


3.2.6.6 routers目录

详解介绍如下文章

OpenWebUI(4)源码学习-后端routers路由模块-CSDN博客openwebui后端routers目录下路由功能介绍 https://blog.csdn.net/yilvqingtai/article/details/149200242


3.2.6.7 socket目录

详细介绍如下文章

OpenWebUI(5)源码学习-后端socket通信模块-CSDN博客Open WebUI的WebSocket通信模块由main.py和utils.py构成,实现前后端实时交互功能。main.py提供Socket.IO服务,支持用户状态管理、模型监控、频道消息和聊天事件分发;utils.py提供Redis工具支持,包括分布式锁和数据结构封装。该模块支持单机和分布式部署,通过JWT进行安全认证,维护会话池、用户池和模型使用池,并定时清理过期连接。技术亮点包括实时通信、分布式支持、状态同步和事件驱动机制,为AI对话平台提供关键基础设施支撑。 https://blog.csdn.net/yilvqingtai/article/details/149201184


3.2.6.8 static目录

3.2.6.9 storage目录

详细介绍如下文章

 OpenWebUI(6)源码学习-后端storage文件存储管理模块-CSDN博客文章浏览阅读444次,点赞13次,收藏16次。摘要 Open WebUI的存储管理模块provider.py提供了统一的文件存储接口,支持本地磁盘、Amazon S3、Google Cloud Storage和Azure Blob Storage等多种后端。该模块定义了抽象类StorageProvider及其具体实现类,包含文件上传、下载、删除等核心方法。配置参数来自环境变量和系统配置,支持多种安全认证机制。该模块与文件管理、知识库构建等核心功能紧密集成,为Open WebUI提供灵活、安全的存储解决方案。 https://blog.csdn.net/yilvqingtai/article/details/149202124


3.2.6.10 test目录

 Open WebUI 项目的 测试目录,它包含用于验证系统关键模块功能的集成测试和单元测试。该目录结构清晰、模块化良好,便于开发者进行自动化测试与持续集成。

test/
├── apps
│   └── webui
│       ├── routers
│       │   ├── test_auths.py      → 测试认证相关接口
│       │   ├── test_chats.py       → 测试聊天记录管理接口
│       │   ├── test_models.py      → 测试模型管理接口
│       │   ├── test_prompts.py     → 测试提示词模板接口
│       │   └── test_users.py       → 测试用户管理接口
│       └── storage
│           └── test_provider.py    → 测试文件存储抽象层(local, s3, gcs, azure)
├── util
│   ├── abstract_integration_test.py → 提供通用测试基类与 Postgres 测试容器管理
│   └── mock_user.py                 → 提供模拟用户上下文工具函数
└── __init__.py

3.2.6.11 utils目录
(1)images/comfyui.py文生图模块

OpenWebUI(5)源码学习-后端socket通信模块-CSDN博客文章浏览阅读821次,点赞14次,收藏16次。Open WebUI的WebSocket通信模块由main.py和utils.py构成,实现前后端实时交互功能。main.py提供Socket.IO服务,支持用户状态管理、模型监控、频道消息和聊天事件分发;utils.py提供Redis工具支持,包括分布式锁和数据结构封装。该模块支持单机和分布式部署,通过JWT进行安全认证,维护会话池、用户池和模型使用池,并定时清理过期连接。技术亮点包括实时通信、分布式支持、状态同步和事件驱动机制,为AI对话平台提供关键基础设施支撑。 https://blog.csdn.net/yilvqingtai/article/details/149201184

(2)utils/telemetry追踪遥测模块

OpenWebUI(8)源码学习-后端utils/telemetry追踪遥测模块-CSDN博客文章浏览阅读309次,点赞4次,收藏7次。Open WebUI项目的telemetry模块基于OpenTelemetry实现分布式追踪功能,提供系统运行状态的可观测性支持。该模块包含四个核心文件:constants.py定义统一Span属性,exporters.py实现异步Span导出,instrumentors.py对FastAPI、数据库、Redis等组件进行插桩追踪,setup.py提供系统初始化入口。该架构支持HTTP请求、数据库操作、Redis调用和第三方API的链路追踪,通过统一字段命名和异步导出机制提升系统监控能力,可对接Jaeger https://blog.csdn.net/yilvqingtai/article/details/149225809

 (3)utils常用特定功能模块

OpenWebUI(9)源码学习-后端utils常用特定功能模块-CSDN博客文章浏览阅读194次。该项目包含20个功能模块文件,涵盖权限控制、审计日志、用户认证、聊天功能、代码执行等核心功能。主要模块包括:access_control.py处理用户权限,audit.py管理审计日志,auth.py负责认证机制,chat.py实现聊天功能,code_interpreter.py提供代码执行环境。此外还包含PDF生成、插件加载、Redis连接、安全防护、任务处理等辅助功能模块。系统采用FastAPI框架,支持JWT/OAuth认证,兼容OpenAI/Ollama格式转换,并集成了Slack等平台的Webho https://blog.csdn.net/yilvqingtai/article/details/149228974


3.2.6.12 __init__.py文件

python生命文件


3.2.6.13 alembic.ini文件

OpenWebUI(10)源码学习-后端alembic.ini数据库迁移配置文件-CSDN博客文章浏览阅读745次,点赞28次,收藏12次。摘要: alembic.ini 是用于 SQLAlchemy 数据库迁移工具 Alembic 的配置文件,主要功能包括: 脚本管理:定义迁移脚本路径(migrations)、文件名模板(支持时间戳)及多版本目录。 环境配置:设置 Python 路径、时区(可选)和文件编码(UTF-8)。 自动化处理:支持生成后自动格式化(如 black)或语法检查(如 ruff)。 日志控制:配置日志级别和输出格式。 扩展性:通过 sqlalchemy.url 可指定数据库连接。 该文件是数据库版本控制的核心,确保迁移脚本 https://blog.csdn.net/yilvqingtai/article/details/149229953


3.2.6.14 config.py文件

后端服务的配置文件。对于标记为PersistentConfig的环境变量,它们的值被持久化并存储在内部。下次启动后,他会去数据库寻找,而不会因为你重启时修改环境变量而改变。没有被PersistentConfig标记的配置项可以修改更新

官方对此文件中相关配置项说明:

🌍 Environment Variable Configuration | Open WebUIOverviewhttps://docs.openwebui.com/getting-started/env-configuration


3.2.6.15 constants.py文件

OpenWebUI(12)源码学习-后端constants.py常量定义文件-CSDN博客文章浏览阅读1k次,点赞21次,收藏16次。constants.py是Open WebUI的常量定义文件,集中管理系统提示消息、错误信息和任务类型。主要包含四类枚举:MESSAGES(成功操作提示)、WEBHOOK_MESSAGES(Webhook通知)、ERROR_MESSAGES(各类错误提示)和TASKS(任务类型标识)。该设计实现消息统一管理,支持多语言扩展,提升代码可维护性,典型应用包括模型操作反馈(如"Model added successfully")、用户注册通知、错误处理(如"Invalid crede https://blog.csdn.net/yilvqingtai/article/details/149230629


3.2.6.16 env.py文件

包含环境变量的配置,此文件中变量值,可以通过docker-compose.*.yaml中进行覆盖

官方文档变量解释如下:

📊 Observability & OpenTelemetry | Open WebUIOpen WebUI (v0.4.0+) supports distributed tracing and metrics export via the OpenTelemetry (OTel) protocol (OTLP). This enables integration with monitoring systems like Grafana LGTM Stack, Jaeger, Tempo, and Prometheus to monitor request flows, database/Redis queries, response times, and more in real-time.https://docs.openwebui.com/getting-started/advanced-topics/observability#%EF%B8%8F-environment-variables


3.2.6.17 functions.py文件

OpenWebUI(14)源码学习-后端functions.py函数调用文件-CSDN博客文章浏览阅读742次,点赞13次,收藏13次。Open WebUI的核心功能模块functions.py详解 该文件是Open WebUI后端的关键模块,主要负责AI管道系统的核心功能实现。主要功能包括: 函数管道管理:支持动态加载和执行插件化函数模块,包括同步/异步调用方式 模型交互:提供与AI模型的完整交互流程,从参数绑定到结果生成 流式处理:支持实时流式输出,采用SSE协议实现逐字显示效果 工具集成:可调用外部工具或插件,并自动注入所需参数 事件通知:内置事件发射机制,支持实时状态更新和进度反馈 格式兼容:将内部处理结果转换为标准OpenAI A https://blog.csdn.net/yilvqingtai/article/details/149231006


3.2.6.18 main.py文件

OpenWebUI(16)源码学习-后端main.py项目的主入口文件-CSDN博客文章浏览阅读982次,点赞10次,收藏26次。这是整个 **Open WebUI 项目的主入口文件**,负责以下关键任务:1. **初始化 FastAPI 应用**2. **加载配置、中间件、路由**3. **管理模型与工具的注册**4. **处理聊天完成、任务控制等核心功能**5. **集成认证、审计日志、WebSocket 等系统组件**这个文件是整个项目的核心调度中枢,决定了系统的启动流程、全局状态、接口结构和运行逻辑。 https://blog.csdn.net/yilvqingtai/article/details/149231211


3.2.6.19 tasks.py文件

OpenWebUI(15)源码学习-后端tasks.py异步任务管理模块-CSDN博客文章浏览阅读701次,点赞25次,收藏8次。📌 任务管理模块 (tasks.py) 该文件是Open WebUI的异步任务管理核心,主要功能包括: 1️⃣ 异步任务管理 通过create_task()创建任务并绑定唯一ID 自动清理已完成任务(cleanup_task回调) 支持按ID或chat_id查询任务 2️⃣ 任务控制 stop_task()安全终止任务 list_tasks()监控所有活跃任务 支持按chat_id批量管理任务 3️⃣ 应用场景 用户取消聊天请求 会话结束时的任务清理 系统任务监控与调试 采用全局字典存储任务对象,结合as https://blog.csdn.net/yilvqingtai/article/details/149231144

3.3 前端目录

  • lib:包含可重用的JavaScript或Svelte组件、工具函数、实用程序等
  • routes:包含Svelte路由文件,用于定义应用程序的页面路由。
  • app.css:包含全局样式表,定义了样式重置、通用样式或主题。
  • app.d.ts:TypeScript的声明文件,用于为项目提供类型定义。
  • app.html:项目的HTML模板文件,通常是应用程序的入口点。
  • tailwind.css:使用Tailwind CSS时的全局样式文件

OpenWebUI(17)源码学习-前端src目录模块-CSDN博客文章浏览阅读705次,点赞9次,收藏13次。该项目采用的技术栈,具有良好的模块化设计和国际化的支持。主要功能模块分布在lib目录下,涵盖了 API 调用、UI 组件、状态管理、工具函数等。此外,还利用了 Web Worker 和 Pyodide 来增强前端性能和功能扩展性。define: {功能说明✅ 启动 SvelteKit 支持支持 SvelteKit 的 SSR、客户端路由等特性✅ WASM 资源复制将 ONNX Runtime 的 WASM 文件复制到构建目录✅ 全局常量注入注入和到代码中✅ Sourcemap 生成。 https://blog.csdn.net/yilvqingtai/article/details/149249728

待续:

Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)_openwebui二次开发-CSDN博客

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐