快速修复
假设容器名是 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 秒一段命令)→ 一步步排查(可跳读)→ 原理与变体(症状/原因/证据)。赶时间直接跳到「快速修复」。
为什么会这样
- 密码只存在本地数据库:Open WebUI 用 SQLite 存用户与密码(bcrypt 哈希,
$2b$12$...),不做邮箱找回,所以没有"忘记密码"流程。 - 新版密码表换了:
main(2026-08 起的新版本)把密码从user表拆到独立auth表(id / email / password / active),user表里没有password_hash列。网上大量教程还停留在旧版user.password_hash,照着改会报no such column。 - 默认禁止注册:生产默认
ENABLE_SIGNUP=false,注册接口直接 403——"忘密码后重新注册一个管理员接管"这条路默认走不通。 - 登录端点变了:新版登录接口是
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
按「前置 → 同根 / 同域 / 相关」读:
- 同根(同一根因):
- RAG 知识库检索不生效 / embedding 配置错(同根:webui.db 落库优先——auth 表改密码与 config 表改配置都覆盖 env/注册)
- 相关(报错相近,根因不同):
- Open WebUI 页面显示连不上 Ollama(相邻:WebUI 层账号登录 vs 模型通道)
参考资料
- 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来源与证据
← 大模型本地部署 问题域 | 问题货架 | 遇到其它问题?去 问题空间 提交求助卡