# 忘记密码 (/zh/docs/operations/password-reset)

内置管理员忘记密码时，清空密码哈希并重启以恢复出厂密码；管理员为其他用户重置密码。

## 内置管理员忘记密码 [#内置管理员忘记密码]

密码在数据库里是 argon2id 哈希，无法手写。但内置管理员的出厂密码是在启动时播种的：**内置管理员尚未设置密码时**，启动会把它设为出厂密码 `imgyoung123` 并标记为必须改密。所以清空它的 `password_hash` 再重启，就回到首次登录的状态。

没有专门的重置命令：一条 SQL 就能完成。这条路径需要服务器的 shell 或数据库的访问权限，也就是对机器的控制权，不构成远程攻击面。

内置管理员在 `users` 表里的 ID 固定为 `default`。它的登录名可以在后台改，所以下面按 ID 定位，而不是按登录名。

<Callout type="warn">
重启后到你改掉密码之前，任何人都能用公开的出厂密码登录并抢先改密。重启后立即登录改密。
</Callout>

<Tabs items={['二进制', 'Docker', 'Compose', 'systemd']}>
<Tab value="二进制">

需要本机装有 `sqlite3`。先停止 `imgyoung` 进程，对数据目录（默认是启动目录下的 `data/`，或 `IMGYOUNG_DATA_DIR` 指定的目录）里的数据库执行：

```bash title="终端"
sqlite3 data/imgyoung.db "UPDATE users SET password_hash = '' WHERE id = 'default';"
```

然后重新启动 `imgyoung`。

</Tab>
<Tab value="Docker">

镜像里没有 shell 和 `sqlite3`，借一个临时 Alpine 容器挂上同一个数据卷执行，结束后把数据库文件属主改回镜像的运行用户：

```bash title="终端"
docker stop imgyoung
docker run --rm -i --volumes-from imgyoung alpine:3.24 sh -c \
  'apk add -q sqlite && sqlite3 /data/imgyoung.db && chown 65532:65532 /data/imgyoung.db*' <<'SQL'
UPDATE users SET password_hash = '' WHERE id = 'default';
SQL
docker start imgyoung
```

`imgyoung` 换成你的容器名。

</Tab>
<Tab value="Compose">

在 `compose.yaml` 所在目录执行：

```bash title="终端"
docker compose stop imgyoung
docker run --rm -i --volumes-from "$(docker compose ps -a -q imgyoung)" alpine:3.24 sh -c \
  'apk add -q sqlite && sqlite3 /data/imgyoung.db && chown 65532:65532 /data/imgyoung.db*' <<'SQL'
UPDATE users SET password_hash = '' WHERE id = 'default';
SQL
docker compose start imgyoung
```

</Tab>
<Tab value="systemd">

数据目录是 `/var/lib/imgyoung`，需要本机装有 `sqlite3`：

```bash title="终端"
sudo systemctl stop imgyoung
sudo sqlite3 /var/lib/imgyoung/imgyoung.db "UPDATE users SET password_hash = '' WHERE id = 'default';"
sudo systemctl start imgyoung
```

</Tab>
</Tabs>

启动日志里出现 `已初始化默认管理员密码,请登录后立即在后台修改` 即表示播种完成。用内置管理员的登录名（默认 `admin`）和 `imgyoung123` 登录，页面会直接进入「设置管理员密码」，改完后用新密码重新登录。

强制改密由服务端执行：在改掉出厂密码之前，这个会话只能退出、查看自己的账号（`GET /api/admin/me`）和改密，其余后台接口一律返回 403 `须先修改出厂默认密码`，用脚本直接调接口也一样。

这个办法只对内置管理员有效。其他用户的 `password_hash` 被清空后只会变成无法登录，不会恢复任何密码。

## 为其他用户重置密码 [#为其他用户重置密码]

管理员可以在后台为任何用户（包括另一个管理员）重置密码：「用户」页，在该用户行末尾点开操作菜单（「更多操作」），选「重置密码」，输入新密码（至少 8 位）。

- 重置立即生效，该用户的全部会话随即失效，需要用新密码重新登录；
- 重置的密码不要求用户登录后再改；
- 每次重置记一条审计日志（动作 `user.update`，详情 `password.reset`）。

用户自己记得旧密码时，可以在侧栏的账号菜单里选「修改密码」自行修改。对应接口见[接口参考](../api/admin-users.mdx)。
