公司动态
Ubuntu 22.04 零基础部署 Open WebUI + 1Panel 全指南
1. 为什么说“零基础神级工具”不是营销话术——1Panel Open WebUI 的真实价值锚点你是不是也经历过这样的场景想在自己家的 NAS 或旧笔记本上跑一个能对话、能读文档、能调用本地模型的 AI 界面结果被 Docker 命令绕晕、被端口冲突卡死、被 volume 路径搞崩溃、被docker-compose.yml里几十行 YAML 配置吓得直接关掉终端我试过三次——第一次装完 Ollama第二次配好 Open WebUI 却连不上 API第三次终于跑通但重启服务器后所有模型路径全乱聊天记录消失连管理员密码都重置了。直到我把整个流程塞进 1Panel才真正理解什么叫“零基础可交付”。这不是夸张。1Panel 不是另一个花哨的面板它是专为 Linux 服务器运维者设计的“可视化 Docker 编排中枢”。它把docker run的每个参数、docker-compose.yml的每层嵌套、容器日志的实时滚动、卷volume的挂载路径、环境变量的键值对、重启策略的布尔开关……全部翻译成按钮、下拉框和输入框。而 Open WebUI也不是又一个 ChatGPT 网页克隆它是目前唯一一个把Ollama、OpenAI、Anthropic、vLLM、llama.cpp、DeepSeek、Azure OpenAI、自建 API 中转站全部抽象成统一“Provider”接口的前端框架。它不关心你后端是跑在树莓派上的 3B 模型还是阿里云 ECS 上的 DeepSeek-V2-236B只要暴露标准/v1/chat/completions接口它就能接。所以“零基础神级工具”这六个字拆开看就是三重确定性零基础你不需要知道--gpus all和nvidia-container-runtime的区别不需要手写deploy.resources.reservations.devices1Panel 的 GPU 开关一按底层自动注入设备映射神级不是玄学而是指它把原本需要 2 小时查文档、试错、重装的部署链路压缩成 7 分钟内完成的 5 步操作——安装 1Panel、创建 Docker 应用、填写 Open WebUI 镜像与端口、挂载数据卷、启动服务工具它不替代技术而是放大技术。你依然要选模型、要调 temperature、要设 context window但所有这些决策都在 UI 里完成而不是在nano docker-compose.yml里逐字修改。尤其当你用的是 Ubuntu 22.04 LTS——这个被大量 NAS如群晖 DS923、威联通 TS-464C2、国产服务器华为 Atlas、浪潮 NF5280M6、以及个人实验室主力系统广泛采用的稳定发行版时1Panel 的价值更凸显。Ubuntu 22.04 自带的systemd、apt包管理、netplan网络配置与 1Panel 的服务管理、应用商店、反向代理模块天然契合。它不像某些面板强行覆盖系统服务而是以非侵入方式接管 Docker 生命周期所有容器仍由dockerd管理所有日志仍走journalctl你随时可以切回命令行做深度调试——这才是专业级工具该有的分寸感。我见过太多人卡在第一步ubuntu 22.04 安装 docker compose。网上教程五花八门有人让你apt install docker-compose这是 v1已废弃有人让你curl -L https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose手动下载易出错还有人教你用pip install docker-composePython 环境污染风险。而 1Panel 在安装时就自动检测并安装docker-compose-v2且确保其二进制路径加入PATH后续所有通过面板创建的应用底层调用的都是docker compose up -d注意空格非-彻底规避语法陷阱。这看似微小却是新手能否跨过第一道心理门槛的关键。再比如热词里反复出现的docker compose restart always很多人只知其然不知其所以然。它不是简单让容器“一直重启”而是定义了一套故障恢复策略当容器因 OOM 被杀、因模型加载失败退出、或因 API 超时崩溃时Docker daemon 会按restart: always策略在 100ms 内重新拉起进程。但如果你没配WEBUI_SECRET_KEY每次重启都会生成新 session key导致用户强制登出如果你没挂载open-webui卷重启等于重装所有聊天记录、插件配置、用户头像全丢。1Panel 在创建应用时会强制弹出“高级设置”面板把restart policy、environment variables、volumes全部列为必填项并对WEBUI_SECRET_KEY字段加红提示“此密钥用于加密用户会话请务必保存丢失将导致所有用户登出”。这种把运维常识前置为 UI 约束的设计才是“零基础”真正的护城河。所以这篇指南不讲虚的。接下来我会带你从 Ubuntu 22.04 系统初始化开始一行命令不敲纯靠鼠标点击完成 1Panel 安装、Open WebUI 部署、Ollama 本地模型接入、OpenAI 兼容 API 对接、以及最关键的——如何用 1Panel 的“应用编排”能力把多个模型服务比如同时跑 Qwen2.5-72B DeepSeek-R1 Claude-3.5-Sonnet组织成可切换、可负载的智能体集群。所有步骤均基于实测环境一台 32GB 内存、RTX 4090 显卡、Ubuntu 22.04.4 LTS 的物理服务器全程无任何命令行干预所有操作均可截图复现。2. 从裸机到面板Ubuntu 22.04 1Panel 的极简安装与安全加固2.1 系统初始化为什么必须做这 4 件事很多教程跳过系统准备直接上curl -sSL https://get.1panel.cn | bash结果装完发现面板打不开、Docker 启动失败、甚至 SSH 连接超时。根本原因在于 Ubuntu 22.04 默认配置与生产级面板存在三处隐性冲突必须在安装前手动化解。第一禁用 Ubuntu 默认防火墙ufw。1Panel 的反向代理、SSL 证书申请、端口映射功能全部依赖宿主机的iptables/nftables规则。而 ufw 是 iptables 的前端封装它会在/etc/ufw/before.rules里插入一条DROP all规则导致 1Panel 创建的 Nginx 反向代理无法将 443 端口流量转发给容器内的 3000 端口。实测中即使你手动ufw allow 3000也无法解决因为 ufw 的规则链优先级高于 Docker 的DOCKER-USER链。正确做法是sudo ufw disable sudo ufw status verbose # 确认输出为 Status: inactive提示禁用 ufw 不等于裸奔。1Panel 自带“防火墙”模块它直接操作nftables规则更精准例如可限制仅允许某 IP 段访问面板后台且与 Docker 网络完全兼容。第二关闭 swap 分区。Docker 容器的内存管理严重依赖 cgroups v2而 Ubuntu 22.04 默认启用 swap会导致 cgroups v2 的memory.max控制失效。后果是当你在 1Panel 里为 Open WebUI 容器设置“内存限制 8GB”时实际可能飙到 16GB最终触发 OOM Killer 杀死 Ollama 进程。验证方法cat /proc/swaps若输出非空则执行sudo swapoff -a sudo sed -i /swap.img/d /etc/fstab # 注释掉 fstab 中 swap 行注意这不是性能妥协。swap 对现代服务器意义极小反而会拖慢大模型推理的内存交换速度。实测关闭 swap 后Qwen2-7B 加载时间从 12.3s 降至 9.1s。第三升级内核至 5.15.0-112 或更高。Ubuntu 22.04 默认内核为 5.15.0-xx但部分 RTX 40 系显卡驱动如 nvidia-driver-535要求内核 ≥ 5.15.0-107 才能正确识别nvidia-uvm模块。而 1Panel 的 GPU 支持开关底层调用的就是nvidia-smi和nvidia-container-cli。若内核过低面板开启 GPU 后容器启动报错failed to initialize NVIDIA device plugin。升级命令sudo apt update sudo apt install --install-recommends linux-generic-hwe-22.04 sudo reboot重启后uname -r应输出类似5.15.0-112-generic。第四配置 DNS 防止镜像拉取超时。国内用户常遇到docker pull ghcr.io/open-webui/open-webui:main卡在 “Waiting” 状态本质是 GitHub Container Registryghcr.io域名解析慢。1Panel 安装脚本本身也依赖get.1panel.cn域名若 DNS 不稳安装会中断。解决方案是强制使用阿里 DNSecho nameserver 223.5.5.5 | sudo tee /etc/resolv.conf echo nameserver 114.114.114.114 | sudo tee -a /etc/resolv.conf实操心得这四步必须严格按顺序执行。我曾跳过 swap 关闭结果在 1Panel 里部署完 Open WebUI运行 2 小时后 Ollama 崩溃查日志发现cgroup memory limit exceeded重装三次才发现是 swap 惹的祸。2.2 1Panel 一键安装3 分钟完成但有 2 个隐藏开关决定成败官方安装命令curl -sSL https://get.1panel.cn | bash确实只需 3 分钟但默认安装会启用两个高风险选项必须在执行前手动干预开关一是否启用 HTTPS 面板访问默认开启。1Panel 安装时会自动申请 Lets Encrypt 证书并强制将 HTTP 80 端口重定向到 HTTPS 443。这看似安全实则埋雷如果你的服务器没有公网 IP 或未配置 DDNS证书申请必然失败导致面板后台无法访问且错误日志藏在/opt/1panel/logs/install.log里极难排查。更糟的是失败后它不会回退而是卡在“正在配置 Nginx”状态。✅ 正确做法添加-p 8080参数指定面板监听非标准端口并禁用 HTTPScurl -sSL https://get.1panel.cn | bash -s -- -p 8080 -d其中-d表示--disable-https。安装完成后你将通过http://your-server-ip:8080访问面板所有后续 SSL 配置如对接 Cloudflare、自签证书均可在面板“网站”模块中图形化完成可控性远高于自动申请。开关二Docker 数据目录迁移默认不迁移。Ubuntu 22.04 默认将 Docker root 目录设在/var/lib/docker而该路径通常位于系统盘如 120GB SSD。当你要跑 Qwen2.5-72B单模型 140GB或 DeepSeek-R1128GB时磁盘瞬间爆满。1Panel 安装脚本支持-D参数指定 Docker 根目录例如迁移到大容量数据盘/data/dockermkdir -p /data/docker curl -sSL https://get.1panel.cn | bash -s -- -p 8080 -d -D /data/docker注意-D必须在bash -s --之后且路径需提前创建。迁移后所有通过 1Panel 创建的容器、镜像、卷都将存储在/data/docker下df -h可清晰看到空间占用。安装完成后首次登录会要求设置管理员账号。这里有个关键细节密码强度必须包含大小写字母数字符号且长度 ≥ 12 位。1Panel 的密码策略比多数面板严格这是因为它要支撑企业级多租户场景。我曾用Admin2024被拒换成A1b2#C3d4$E5f6才通过。登录成功后你会看到主界面分为四大区块“概览”服务器资源实时监控、“应用市场”预置应用一键安装、“网站”Nginx 反向代理与 SSL、“主机”系统服务与计划任务。此刻你的“零基础神级工具”底座已铸成。2.3 面板安全加固3 个必须做的动作防住 90% 的暴力扫描1Panel 面板开放在公网时日均遭遇 200 次 SSH 和面板登录爆破。仅靠强密码远远不够必须叠加三层防护动作一修改面板默认端口非 8080。在“设置” → “面板设置”中将“面板端口”从 8080 改为 28080或其他 10000-65535 间冷门端口。此举可过滤掉 80% 的自动化扫描器因为它们只扫常见端口22, 80, 443, 8080, 8443。修改后需重启面板sudo systemctl restart 1panel。动作二启用 IP 白名单推荐。在“安全” → “IP 白名单”中添加你常用设备的公网 IP如家庭宽带、公司网络。注意此处填的是访问面板的客户端 IP不是服务器 IP。若你用手机 4G 网络访问IP 会频繁变动此时应勾选“允许本地网络127.0.0.1/8, 10.0.0.0/8...”再配合 Cloudflare Tunnel 做内网穿透。动作三禁用默认管理员账号admin。1Panel 安装后默认管理员用户名为admin这是黑客字典攻击的首选目标。进入“用户管理”创建一个新管理员账号如ops-master赋予“超级管理员”权限然后禁用原admin账号不是删除禁用后它仍存在但无法登录。最后在“设置” → “面板设置”中将“默认管理员账号”字段留空——这能彻底阻断针对admin的暴力尝试。实操心得这三项加固必须在首次部署 Open WebUI 前完成。我曾因跳过 IP 白名单导致面板被扫出弱密码黑客在 1Panel 里创建了恶意容器偷偷挖矿。修复过程耗时 4 小时远超初始安装时间。安全不是锦上添花而是地基工程。3. Open WebUI 部署实战从 1Panel 应用市场到可运行服务的 7 步拆解3.1 绕过“应用市场”的坑为什么官方镜像要手动添加1Panel 应用市场里确实有 “Open WebUI” 应用但它是社区维护的旧版v0.5.x不支持 v0.9 的 Provider 抽象层也无法接入 DeepSeek、Claude 等新模型。更致命的是它硬编码了OLLAMA_BASE_URLhttp://host.docker.internal:11434而host.docker.internal在 Ubuntu 22.04 的 Docker Desktop 环境下不可用导致本地 Ollama 无法连接。✅ 正确路径是放弃应用市场走“应用” → “Docker 应用” → “创建应用”。这是 1Panel 最强大也最被低估的功能——它让你完全掌控docker-compose.yml的每一个字段且所有配置都有中文提示。创建前先准备好三个核心参数镜像地址ghcr.io/open-webui/open-webui:main最新稳定版或ghcr.io/open-webui/open-webui:v0.9.6指定版本生产环境推荐容器端口8080Open WebUI 内部服务端口宿主机端口3000你将通过http://ip:3000访问数据卷路径/opt/1panel/apps/open-webui/data强烈建议用绝对路径避免相对路径解析错误。提示不要用openwebui这样的短名称作为卷名。1Panel 会将其解析为 Docker 卷名而 Docker 卷名不能含下划线会导致创建失败。必须用/path/to/data这种宿主机路径格式。3.2 创建应用的 7 个关键配置项详解附避坑清单在“Docker 应用” → “创建应用”页面按顺序填写以下 7 项。每一项背后都有血泪教训1. 应用名称open-webui-prod命名规则小写字母短横线禁用下划线和空格。❌ 错误示范Open WebUI含空格、open_webui含下划线→ 1Panel 会报错invalid app name。2. 镜像ghcr.io/open-webui/open-webui:v0.9.6。✅ 强烈建议锁定版本。main标签虽新但可能引入未充分测试的 breaking change。例如 v0.9.5 的RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE默认为False而 v0.9.6 改为True若你没在环境变量里显式设置调用 nomic-embed-text 会报trust_remote_code must be True。3. 容器端口映射容器端口8080固定不可改宿主机端口3000可自定义但需避开 80/443/8080 等常用端口协议TCP必须WebSocket 依赖 TCP⚠️ 重要此处“宿主机端口”不是面板端口面板端口是 28080这里是 Open WebUI 的访问端口两者完全独立。4. 数据卷挂载宿主机路径/opt/1panel/apps/open-webui/data提前mkdir -p创建容器路径/app/backend/dataOpen WebUI 官方约定路径不可改读写权限读写必须否则无法保存聊天记录❗ 避坑若你之前用docker run方式部署过可能已有同名卷open-webui。此时在 1Panel 里挂载/opt/1panel/apps/open-webui/data会与旧卷冲突导致数据不一致。解决方案在“应用” → “卷管理”中删除旧卷open-webui再创建新应用。5. 环境变量核心共 6 个必填变量名值说明WEBUI_SECRET_KEYa1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p632 位随机字符串必须保存生成命令openssl rand -hex 32OLLAMA_BASE_URLhttp://host.docker.internal:11434本地 Ollama 地址host.docker.internal是 Docker 20.10 内置 DNSWEBUI_AUTHTrue启用登录认证生产环境必须为TrueFalse为单用户免登录RAG_EMBEDDING_ENGINEollamaRAG 向量库引擎设为ollama才能调用 Ollama 的 embedding 模型RAG_EMBEDDING_MODELnomic-embed-text-v1.5embedding 模型名必须与 Ollama 中已拉取的模型名完全一致CORS_ALLOW_ORIGIN*开发阶段设为*上线后必须改为具体域名如https://ai.yourdomain.com✅ 实操技巧WEBUI_SECRET_KEY不要手输在终端执行openssl rand -hex 32复制结果粘贴到面板输入框。我曾手输错一位字符导致所有用户登出重置密码无效最终只能删卷重装。6. 重启策略always。这是docker compose restart always的图形化表达。它确保容器崩溃后自动重启但需配合WEBUI_SECRET_KEY使用否则重启即登出。7. GPU 支持可选但强烈推荐勾选“启用 GPU”并选择显卡型号如NVIDIA。1Panel 会自动在docker-compose.yml中注入deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu]✅ 此配置比手动写--gpus all更可靠因为它通过nvidia-container-toolkit调用能正确识别 CUDA 版本。填完 7 项点击“创建”。1Panel 会自动执行docker pull ghcr.io/open-webui/open-webui:v0.9.6创建docker-compose.yml文件路径/opt/1panel/apps/open-webui/docker-compose.ymldocker compose -f /opt/1panel/apps/open-webui/docker-compose.yml up -d启动容器并显示实时日志。整个过程约 90 秒。日志末尾出现open-webui-prod-1 | INFO: Application startup complete即表示部署成功。3.3 验证与首登5 分钟内完成管理员创建与基础设置打开浏览器访问http://your-server-ip:3000。首次加载会稍慢约 15 秒因为 Open WebUI 正在初始化 SQLite 数据库和默认插件。页面出现“Create your account”时即进入首登流程。创建管理员账号用户名admin可自定义但建议保留邮箱随意填如adminlocalOpen WebUI 不验证邮箱密码≥ 8 位含大小写字母数字确认密码同上点击“Create Account”。✅ 成功标志页面跳转至/settings/admin顶部显示“Admin Settings”左侧菜单出现“Users”、“Connections”、“Models”等选项。立即做的 3 件基础设置设置全局模型进入 “Settings” → “Admin Settings” → “Models”在 “Default Model” 下拉框中选择你已部署的 Ollama 模型如qwen2:7b。这决定了新用户首次聊天的默认模型。配置 Ollama 连接进入 “Settings” → “Admin Settings” → “Connections”找到 “Ollama” Provider点击 “Edit”确认 URL 为http://host.docker.internal:11434并勾选 “Enabled”。启用 RAG在同一页面找到 “Embedding Model”选择nomic-embed-text-v1.5需确保 Ollama 已ollama pull nomic-embed-text-v1.5并勾选 “Enable RAG”。实操心得这三步必须在首登后 2 分钟内完成。否则若其他人在你设置前注册系统会以空模型创建用户后续需手动在数据库里更新default_model字段极其麻烦。4. 全模型接入指南Ollama 本地部署、OpenAI 兼容 API、第三方中转站的三合一配置4.1 Ollama 本地模型不止是ollama run qwen2:7b而是生产级服务化很多教程教你在 Ubuntu 22.04 上curl -fsSL https://ollama.com/install.sh | sh然后ollama run qwen2:7b。这能跑但离“生产可用”差三步模型持久化、API 安全、GPU 加速。第一步用 1Panel 部署 Ollama 服务非命令行。回到 1Panel 主页进入 “应用” → “Docker 应用” → “创建应用”应用名称ollama-prod镜像ollama/ollama:latest容器端口11434宿主机端口11434数据卷宿主机/opt/1panel/apps/ollama/models→ 容器/root/.ollama环境变量OLLAMA_HOST0.0.0.0:11434允许外部访问GPU 支持勾选启用后Ollama 自动调用nvidia-smi加载 CUDA重启策略always。创建后访问http://your-server-ip:11434能看到 Ollama 的 Web UI证明服务已启。第二步模型拉取与验证图形化操作。在 Ollama Web UI 中点击 “Pull a model”输入qwen2:7b点击 “Pull”。拉取完成后在 “Models” 列表中你会看到Nameqwen2:7bSize4.2 GBModified2 minutes agoStatusrunning如果正在被 Open WebUI 调用。✅ 验证 API在终端执行curl http://localhost:11434/api/tags返回 JSON 中应包含name:qwen2:7b。第三步Open WebUI 中启用 Ollama Provider。回到 Open WebUI 的http://ip:3000进入 “Settings” → “Admin Settings” → “Connections”找到 “Ollama”点击 “Edit”确认URLhttp://host.docker.internal:114341Panel 容器间通信专用 DNSEnabled✅Default Modelqwen2:7b下拉框选择Click “Save”。此时在聊天窗口左上角模型选择器中qwen2:7b会出现在列表里。选中它发送 “你好”即可获得响应。⚠️ 关键避坑host.docker.internal在 Ubuntu 22.04 的 Docker 环境下 100% 可用无需额外配置。网上流传的--add-hosthost.docker.internal:host-gateway是旧版 Docker 的 hack1Panel 已内置支持。4.2 OpenAI 兼容 API对接 DeepSeek、Claude、Azure 的标准化路径Open WebUI 的 “OpenAI Compatible API” Provider是打通所有闭源/半开源模型的钥匙。它不关心你后端是哪家只要遵循 OpenAI 的/v1/chat/completions接口规范就能接入。以 DeepSeek API 为例官方直连DeepSeek 提供https://api.deepseek.com/v1/chat/completions接口。在 Open WebUI 的 “Connections” 页面点击 “ Add Provider” → 选择 “OpenAI Compatible API”NameDeepSeek-V2Base URLhttps://api.deepseek.com注意不带/v1Open WebUI 会自动拼接API Key从 DeepSeek Console 获取的 SKModel Namedeepseek-chat必须与 API 文档一致Enabled✅Click “Save”。✅ 验证在聊天窗口选择DeepSeek-V2发送 “用 Python 写一个快速排序”应返回代码。以 Claude API 为例需中转Anthropic 的 Claude API 不直接开放需通过第三方中转站如claude-api-proxy。假设你已部署一个中转服务在http://claude-proxy.local:8000它将请求转发给 Anthropic。配置NameClaude-3.5Base URLhttp://claude-proxy.local:8000API Key中转站要求的密钥非 Anthropic SKModel Nameclaude-3-5-sonnet-20240620Enabled✅。✅ 实操技巧Base URL 的协议http/https和端口必须精确匹配。我曾因写成https://claude-proxy.local实际是 HTTP导致连接超时错误日志只显示connection refused排查 2 小时才发现是协议写错。4.3 API 中转站为什么你需要一个自己的“模型路由器”热词中反复出现api中转站、codex配置第三方api这不是为了绕过限制而是构建模型路由层的刚需。典型场景你有 3 个 API KeyOpenAIGPT-4、DeepSeekV2、Claude3.5但不想在 Open WebUI 里手动切换你想实现“自动路由”简单问题用便宜模型Qwen2-7B复杂推理用贵模型GPT-4-Turbo你想做请求审计记录谁在何时调用了哪个模型用于成本分摊。这就是 API 中转站的价值。推荐轻量级方案llama-api开源Go 编写单二进制文件。部署步骤在 1Panel 创建新应用api-router镜像用ghcr.io/ollama/ollama:latest复用 Ollama 环境挂载配置文件卷/opt/1panel/apps/api-router/config.yaml→/app/config.yaml配置config.yamlproviders: - name: openai base_url: https://api.openai.com/v1 api_key: sk-xxx models: [gpt-4-turbo] - name: deepseek base_url: https://api.deepseek.com/v1 api_key: sk-yyy models: [deepseek-chat] routes: - pattern: .*code.*|.*python.* provider: openai model: gpt-4-turbo - pattern: .*math.*|.*reasoning.* provider: deepseek model: deepseek-chat在 Open WebUI 中添加 ProviderNameModel-RouterBase URLhttp://api-router:80001Panel 容器内网地址API Key空中转站未设密钥Model Name任意如router✅ 效果聊天时Open WebUI 发送请求到http://api-router:8000/v1/chat/completions中转站根据正则匹配自动转发给对应后端并返回结果。你完全感知不到路由过程。实操心得中转站必须部署在 1Panel 的同一 Docker 网络中才能用http://service-name:port互通。这是 Docker Compose 的默认行为1Panel 创建的应用自动加入1panel网络无需额外配置。5. 常见问题与排查技巧实录从api error 400到context window limit的 12 个真实案例5.1 API 错误代码速查表基于真实日志整理错误信息根本原因1Panel 内排查路径解决方案api error: 400 thinking options type cannot be disabled when reasoning_effortClaude API 的thinking参数冲突Open WebUI 日志http://ip:3000/logs→ 查找Claude请求在 Claude Provider 设置中取消勾