前言
某天我在测试站点时把Lobe Chat的账号退了,结果登录页面居然进不去了???
到服务器上一看,好家伙,怎么Logto压根就没启动???查Log,翻Issues,一条龙下去,足足折腾了几小时才搞定了Logto的罢工问题,今天就把这个坑分享出来,帮助大家少走弯路!
Logto曾经作为Lobe Chat DataBase版本主推的身份验证方案(由于总出现问题最新版已更换为Casdoor),经常出现使用docker compose启动所有容器后,logto的容器未正常启动的问题。
同时由于Lobe Chat登录后会一直保持登录状态,导致一直到用户退出并重新登录,或是在其他设备登录时才会发现Logto挂了。
本文将以主流的docker compose部署方案,详细讲解遇到该问题后如何解决。
问题现象
Logto无法访问

lobe chat登录页面显示“页面遇到一点问题”

解决流程
查看问题原因
1.首先进入docker-compose.yml的所在目录
2.执行以下命令查看容器启动log
docker logs lobe-logto
在错误信息中找到如下错误
error Found undeployed database alterations, you must deploy them first by npm run alteration deploy command.
这表明Logto在升级后数据库结构发生了变动,我们需要执行logto db alteration deploy的命令来进行数据库结构变更。

备份数据库
所谓有备无患,要对数据库进行改动,那第一步必然是备份数据库。
进入postgres容器
docker exec -it lobe-postgres /bin/bash
连接到 PostgreSQL
psql -U postgres
查看数据库列表
\l
退出postgres容器
\q
exit
备份数据库
docker exec -t lobe-postgres pg_dump -U postgres -F c lobe > backup_lobe.dump
docker exec -t lobe-postgres pg_dump -U postgres -F c logto > backup_logto.dump
这样就备份了lobe和logto两个数据库,备份目录为当前执行命令的目录。
理论上我们只需要备份logto的DB,但是保险起见我把lobechat的数据库一起进行了备份。
如果后续操作失败可以执行以下命令恢复数据库
docker exec -i lobe-postgres pg_restore -U postgres -d lobe < backup_lobe.dump
docker exec -i lobe-postgres pg_restore -U postgres -d logto < backup_logto.dump
开始改动数据库
查看相关Issues:bug: Error while updating Docker version 1.20.0 · Issue #6585 · logto-io/logto
查看官方文档:数据库更改 |Logto 文档
可以看到官方文档中的解决方式很简单,我们只需要执行一个CLI命令即可。
但是这里就出现了一个问题,我们通常是使用docker compose去启动容器的,但是此时logto容器没有办法启动,所以我们需要启动一个临时容器。
创建并进入临时的logto容器
docker run -it --rm --network="lobe-chat-db_default" --entrypoint sh svhd/logto
解释:
--network="host": 这让容器与主机共享网络,避免网络问题。--entrypoint sh: 强制容器进入 shell 环境,而不是运行默认的启动命令。-it: 交互模式,人机交互。--rm: 容器关闭后自动删除,保持系统干净。
注意这里的lobe-chat-db_default是docker的网络名称,如果不知道可以执行以下命令查看有哪些网络。
docker network ls
步骤 1:检查 CLI 是否可用
现在我们来到了容器内部,首先要先检查容器内的CLI命令是否可用。
执行命令:
logto --help
看到类似如下的输出,表明 logto CLI 工具已经安装
Usage: logto [options] [command]
Logto Command Line Interface
Options:
-h, --help display help for command
Commands:
db Database related commands
...
步骤 2:如果不可用,安装 CLI
如果 CLI 没有安装,你需要确保 logto CLI 工具可用。通常Logto CLI 是随 logto 管理包 @logto/cli 一起提供的,因此可以使用 npm 来安装 logto CLI。
npm install -g @logto/cli
安装时可能由于网络原因无法下载,此时需要配置npm镜像,以下两个选一个执行即可
# 阿里云镜像
npm config set registry https://registry.npmmirror.com
# 腾讯云镜像
npm config set registry https://mirrors.cloud.tencent.com/npm/
验证镜像源是否已配置成功
npm config get registry
重新执行CLI安装命令
npm install -g @logto/cli
检查是否安装成功
logto --help

执行CLI命令进行数据库变更
logto db alteration deploy
此时会提示输入PostgreSQL的URL,如果你直接按回车键就会使用默认URL,由于PostgreSQL是在docker中运行的,所以不应该使用默认的postgresql://localhost:5432/logto作为URL
正确的URL:
postgresql://postgres:你的密码@容器名:5432/logto
例如:postgresql://postgres:EHO2KYDG5DjN@lobe-postgres:5432/logto
也可以在docker-compose.yml中找到PostgreSQL的URL
输入URL后会提示Choose the alteration target version,一般来说选择最新版本即可

退出容器
执行命令:
exit
到这里就大功告成了,重启docker compose即可看到Logto已经正常启动
# 重启
docker compose up -d
# 查看docker状态
docker ps
