大模型本地部署 · 收录于 2026-08-30 · 适用 2 工具 ✓ 实测验证

Open WebUI 忘记管理员密码 / 登录不进去怎么办

已验证 2026-08-30Open WebUI 忘记管理员密码——docker exec 进容器跑一条 python 重置密码脚本(bcrypt + sqlite3 直改 webui.db)。

快速修复

假设容器名是 open-webui、数据在容器内 /app/backend/data/webui.db(Docker 部署默认数据卷就是挂在这里)。一条命令重置密码:

# 替换成你自己的容器名 / 邮箱 / 新密码
docker exec -it open-webui python3 <<'PY'
import bcrypt, sqlite3
EMAIL = "admin@example.com"        # 管理员登录邮箱
NEW = "你的新密码至少8位"           # 新密码
h = bcrypt.hashpw(NEW.encode, bcrypt.gensalt(rounds=12)).decode
con = sqlite3.connect("/app/backend/data/webui.db")
n = con.execute("UPDATE auth SET password=? WHERE email=?", (h, EMAIL)).rowcount
con.commit
print("updated rows:", n)          # 必须输出 1;0 说明邮箱不对
PY

改完不需要重启容器,直接去页面用新密码登录。updated rows: 0 就说明邮箱写错了,先查 SELECT email FROM user。

你会遇到什么

Open WebUI 装好后设过管理员密码,隔几天再登录想不起来。点"忘记密码"发现根本没有这个入口;想"重新注册一个账号"发现注册被拒(403);网上教程说改 user.password_hash,但你连不上数据库,或者表里根本没有这一列。最后只能把容器删了重建——数据(聊天记录、知识库、用户)全没。其实不用删:密码就是 SQLite 里一个 bcrypt 哈希,直改它就能恢复登录。

本文路径:快速修复(30 秒一段命令)→ 一步步排查(可跳读)→ 原理与变体(症状/原因/证据)。赶时间直接跳到「快速修复」。

为什么会这样

  1. 密码只存在本地数据库:Open WebUI 用 SQLite 存用户与密码(bcrypt 哈希,$2b$12$...),不做邮箱找回,所以没有"忘记密码"流程。
  2. 新版密码表换了:main(2026-08 起的新版本)把密码从 user 表拆到独立 auth 表(id / email / password / active),user 表里没有 password_hash 列。网上大量教程还停留在旧版 user.password_hash,照着改会报 no such column。
  3. 默认禁止注册:生产默认 ENABLE_SIGNUP=false,注册接口直接 403——"忘密码后重新注册一个管理员接管"这条路默认走不通。
  4. 登录端点变了:新版登录接口是 POST /api/v1/auths/signin(部分旧教程写 /login,新版返回 405)。

密码重置难的本质是「凭据只在本地、校验不可逆」:Open WebUI 用 SQLite 存 bcrypt 哈希($2b$12$...),登录时只做哈希比对,没有邮件服务也没有「重置」接口——「忘记密码」只能靠改库。

坑有三层:①表结构随版本演进——新版(2026-08 起)把密码从 user 表拆到独立 auth 表(id/email/password/active),旧教程的 user.password_hash 在新版直接 no such column;

②bcrypt 哈希不能手写——新密码必须用 bcrypt 生成(htpasswd/容器内 Python),直接 UPDATE ... SET password='明文' 会因校验失败永远登不进;

③默认禁注册——ENABLE_SIGNUP=false 时注册接口 403,「重注册管理员接管」默认走不通。确定性推论:先确认版本(docker ps 镜像 tag)决定改哪张表;新密码必须过 bcrypt 再入库;改库前备份 webui.db,改完重启生效。

官方做法(无 python 依赖,Docker 卷版)

官方文档(docs.openwebui.com/troubleshooting/password-reset/)用 htpasswd + socat 实现,不依赖容器内 python/bcrypt,适合不想进容器跑脚本的场景。改的仍是 auth 表(id / email / password / active),与本页主流程同一列。

第一步:生成本地 bcrypt 哈希(宿主机执行;htpasswd 来自 apache2-utils,macOS/Linux 一般自带):

# your-new-password 换成你的新密码;tr -d ':\n' 去掉换行,输出一行哈希
htpasswd -bnBC 10 "" "your-new-password" | tr -d ':\n'

注意:哈希里的 $ 字符放进下一条命令时要三转义(写成 \\\$),否则会被 shell 展开。

第二步:一条命令写入(open-webui 换成你的数据卷名,HASH 换成上一步输出,admin@example.com 换成管理员邮箱):

docker run --rm -v open-webui:/data alpine/socat EXEC:"bash -c 'apk add sqlite && echo UPDATE auth SET password='\''HASH'\'' WHERE email='\''admin@example.com'\''; | sqlite3 /data/webui.db'", STDIO

第二步(备选,一条命令失败时):部分环境 alpine/socat 镜像没有 bash,官方给了交替法——起一个 alpine 容器装工具再分步改:

docker run -it --rm -v open-webui:/data alpine
# 容器内依次执行:
apk add apache2-utils sqlite
htpasswd -bnBC 10 "" "your-new-password" | tr -d ':'
sqlite3 /data/webui.db
UPDATE auth SET password='HASH' WHERE email='admin@example.com';
# 退出 sqlite:Ctrl+D

本地(pip)安装:直接对数据文件跑 sqlite3,不用容器:

cd <open-webui 安装目录>
sqlite3 backend/data/webui.db "UPDATE auth SET password='HASH' WHERE email='admin@example.com';"

官方还明确了一条兜底:想完全重置(用户、设置、聊天、密码全清)就直接删 webui.db——这是唯一的"完全重置"路径,删前确认你真的不要数据。

一步步来

1. 确认你的部署方式,找到 webui.db — 必做(改错文件全白干)

  • Docker:数据在数据卷里,容器内路径固定 /app/backend/data/webui.db。
  • pip 直装:数据在 ~/.open-webui/data/webui.db(主进程运行中,sqlite3 或 python3 直接连)。
  • 无论哪种,改库前先备份:cp webui.db webui.db.bak。

2. 查表结构(旧版新版不一样,先确认再改) — 必做(新旧版表名不同,先确认再改)

docker exec open-webui python3 -c "import sqlite3; con=sqlite3.connect('/app/backend/data/webui.db'); [print(r) for r in con.execute('PRAGMA table_info(auth)')]"
  • 有 auth 表且含 password 列 → 新版,改 auth.password(本页主流程)。
  • auth 表不存在但 user 表有 password_hash → 旧版(0.5.x 及更早),把上面命令里的 UPDATE auth SET password=? WHERE email=? 换成 UPDATE user SET password_hash=? WHERE email=?。

3. 查管理员邮箱,别写错 — 必做(邮箱写错会 updated rows: 0)

docker exec open-webui python3 -c "import sqlite3; con=sqlite3.connect('/app/backend/data/webui.db'); [print(r) for r in con.execute('SELECT id,email,role FROM user')]"

记下 role=admin 那行的 email。

4. 生成 bcrypt 哈希并写入 — 必做

docker exec -it open-webui python3 <<'PY'
import bcrypt, sqlite3
EMAIL = "admin@example.com"
NEW = "你的新密码至少8位"
h = bcrypt.hashpw(NEW.encode, bcrypt.gensalt(rounds=12)).decode
con = sqlite3.connect("/app/backend/data/webui.db")
print("updated:", con.execute("UPDATE auth SET password=? WHERE email=?", (h, EMAIL)).rowcount)
con.commit
PY

5. 用新密码登录 — 必做

浏览器打开你的 Open WebUI 地址,用上面那个邮箱 + 新密码登录。如果开了多设备会话,旧会话会继续有效(不影响本次恢复登录)。

怎么确认修好了

  • 页面用新密码登录成功,且进去后仍是管理员(能进管理面板)。
  • 用错误的密码登录,仍然被拒(提示 email or password incorrect)——说明不是密码验证被绕过,而是哈希被正确替换。
  • 用 API 验证:curl -X POST http://localhost:3000/api/v1/auths/signin -H 'Content-Type: application/json' -d '{"email":"...","password":"新密码"}' 返回 200 和 token。

WEBUI_SECRET_KEY:为什么有时改完密码还是被登出

改密码本身不需要动 WEBUI_SECRET_KEY,旧会话继续有效(本页实测)。但以下情况会"强制全员下线",与密码无关:

  • 没设 WEBUI_SECRET_KEY:Open WebUI 每次启动生成随机 key,重启后旧会话 JWT 全部失效 → 全员重新登录(官方 FAQ 确认)。
  • 换了 key:除强制下线外,OAuth token / 工具 API key 用该 key 加密,换 key 后解密失败,报 Error decrypting tokens(官方 FAQ 确认)。
  • 多实例 / 复用同一数据卷:必须所有实例用同一个固定 key,否则实例间会话与 OAuth 状态互相失效。

所以恢复登录后建议把 WEBUI_SECRET_KEY 固定成一个长随机串(Docker 加 -e WEBUI_SECRET_KEY=...;Compose 写进 environment),一劳永逸。

其它环境的表现

  • 旧版 Open WebUI(0.5.x 及更早):密码列在 user.password_hash,其余流程相同。
  • Docker 卷在宿主机上:也可以挂载着直接在宿主机改(sqlite3 <卷路径>/webui.db + 任意 bcrypt 工具),但注意容器写缓存,改完再启动容器最稳。
  • 接了 LDAP / SSO / 企业登录:密码由身份提供方管,本地改 auth 表只对本地账号有效,域账号去 IdP 那边重置。
  • 忘记的是 WebUI 而非 Ollama 的密码:Ollama 本身默认无鉴权,连不上是 OLLAMA_BASE_URL / 容器内 localhost 问题,见 open-webui-ollama-connect。

症状

  • 登录页提示 The email or password provided is incorrect,且想不起来密码。
  • 注册接口报 403 You do not have permission to access this resource。
  • 按旧教程找 user.password_hash,sqlite 报 no such column: password_hash。

原因

  • 密码为本地 SQLite 中 bcrypt 哈希,无找回流程;新版拆到 auth 表(无 password_hash 列);默认禁止注册(ENABLE_SIGNUP=false),无法用新账号接管。

解法

  • 备份 webui.db → 容器内 python3(自带 bcrypt/sqlite3)生成新哈希 → UPDATE auth SET password=? WHERE email=?(旧版改 user.password_hash)→ 直接新密码登录,无需重启。
验证证据
  • 实测容器 owui-pw(ghcr.nju.edu.cn/open-webui/open-webui:main,2026-08-25 构建,端口 3002):
  • 错误密码登录 → HTTP 400 The email or password provided is incorrect;
  • 容器内 bcrypt.hashpw(..., gensalt(rounds=12)) 生成 $2b$12$ 哈希(bcrypt 5.0.0);
  • UPDATE auth SET password=? WHERE email=? → rows updated: 1(app 运行中直改,无需停服);
  • 改后错误密码 → 仍 400;新密码 → HTTP 200 返回 role: admin + JWT;
  • 新 token 调 GET /api/v1/auths/ → HTTP 200(会话真实有效);
  • bcrypt.checkpw(新密码, 库中哈希) = True,checkpw(错误密码) = False;
  • 测试容器与数据卷已清理(docker rm -f + docker volume rm)。
  • 完整日志:实测复现日志(2026-08-30)

相关 canonical

按「前置 → 同根 / 同域 / 相关」读:

参考资料

  • Open WebUI 官方文档:Reset Admin Password — <https://docs.openwebui.com/troubleshooting/password-reset/>
  • Open WebUI 官方 FAQ(WEBUI_SECRET_KEY 与登出 / 解密错误)— <https://docs.openwebui.com/faq/>

适用工具 (2)

本问题方案已挂到下列工具的方案页——从工具页也能回到这里,双向可达。

docker · 外部工具open-webui

来源与证据

收录 验证 ✓ 实测验证适用 2 工具
方案含本地实测或来源可复核的解法;未实测项已在文中如实标注。

← 大模型本地部署 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡