领口微湿的博客迁移翻车记录:Mix-Space博客认证
😫 背景:一次“轻车熟路”的服务器迁移事故
最近,我在 Netcup 购买的服务器快到期了,于是我决定把我的博客迁移一下,顺便换个新域名。
之前已经折腾过一两次了,本以为这次会是轻车熟路,结果... ( ̄▽ ̄)".
在迁移域名的时候,我犯了个致命的错误:忘记修改 .env 文件里的域名了,同时也忘了更新认证服务里的域名。
这就很严重了!😱 在我一顿“骚操作”之后,我发现自己彻底登录不了博客后台了。
无奈之下,我决定“曲线救国”,回到旧服务器上看看能不能修复。结果你猜怎么着?
居然还是认证失败!Σ(っ °Д °;)っ 我在 GitHub OAuth 应用里把域名改了也无济于事。
x=x有点慌。。。
冷静下来想了想,认证相关的信息应该都存储在数据库里。那么,直接“动刀”数据库或许是唯一的办法了。
🚀 流程:手把手教你“修正”数据库
📦 第一步:备份!备份!备份!
重要的事情说三遍!在进行任何危险操作之前,一定要先备份。
备份主要有两种方式:
- “通通打包带走”:将整个项目目录打包。简单粗暴,我喜欢!
Mix-Space 自带备份:备份
~/data/mx-space/backup目录。理论上只备份这个目录就足够了。
备份完成后,就可以开始我们的“手术”了。
🔧 第二步:深入数据库容器
我的博客是使用 docker-compose 部署的,所以接下来的操作都将基于 docker-compose。
这是我的 docker-compose.yml 中 mongo 服务的部分配置:
mongo:
container_name: mongo
image: mongo
volumes:
- ./data/db:/data/db
networks:
- mx-space
restart: unless-stopped
通过 docker ps 可以看到正在运行的容器:
Shiroi ghcr.io/incohua/shiroi:latest "docker-entrypoint.s…" shiro 16 minutes ago Up 15 minutes 127.0.0.1:2323->2323/tcp, [::]:2323->2323/tcp
mongo mongo "docker-entrypoint.s…" mongo 16 minutes ago Up 15 minutes 27017/tcp
mx-server innei/mx-server:latest "./docker-entrypoint…" app 16 minutes ago Up 15 minutes (healthy) 127.0.0.1:2333->2333/tcp, [::]:2333->2333/tcp
redis redis:alpine "docker-entrypoint.s…" redis 16 minutes ago Up 15 minutes (healthy) 6379/tcp
接下来,我们进入 mongo 容器的 bash 环境:
docker compose exec mongo bash
🔍 第三步:定位并修改认证设置
成功进入容器后,我们使用 mongosh 连接到数据库:
root@592e3cc53c54:/# mongosh
Current Mongosh Log ID: 68cebxxxxxf87fd
Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.8
Using MongoDB: 8.0.13
Using Mongosh: 2.5.8
For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/
输入 show dbs 查看所有的数据库:
test> show dbs
admin 40.00 KiB
config 108.00 KiB
local 72.00 KiB
mx-space 2.39 MiB
test>mx-space 显然就是我们的目标数据库啦!( •̀ ω •́ )✧
切换到 mx-space 数据库,并使用 show collections 查看所有的集合(类似于传统数据库里的“表”):
test> use mx-space
switched to db mx-space
mx-space> show collections
accounts
activities
# ... (此处省略一堆集合名)
options
# ...
users
经过一番探索,我发现认证相关的配置应该在 options 这个集合里。
我们用 db.options.find().pretty() 来看看里面的内容。
顺便吐槽一下,MongoDB 里的好多数据都是明文存储的,没有经过加密或混淆,感觉不太安全呀... 😅
这里我截取了关键部分,也就是我们需要修改的地方:
{
"_id": ObjectId("679fxxxxxxxxxxxx93"),
"name": "oauth",
"__v": 0,
"value": {
"providers": [ { "type": "github", "enabled": true } ],
"secrets": {
"github": { "clientSecret": "fab4xxxxxxxxxx7be6b" }
},
"public": { "github": { "clientId": "Ov23lxxxxxxBcr36" } }
}
},
{
"_id": ObjectId("679fxxxxxxxxxxx4"),
"name": "authSecurity",
"__v": 0,
"value": { "disablePasswordLogin": true } // <-- 就是你!
},
我们的目标是先把密码登录功能打开,这样就能进入后台去修改其他设置了。
执行下面的命令,将 disablePasswordLogin 的值改为 false:
db.options.updateOne(
{name: 'authSecurity'},
{$set: {'value.disablePasswordLogin': false}}
)
最后,我们来验证一下是否修改成功:
mx-space> db.options.findOne({name: 'authSecurity'})
{
"_id": ObjectId("6xxxxxxxxxxxxxx94"),
"name": "authSecurity",
"__v": 0,
"value": { "disablePasswordLogin": false } // <-- 搞定!
}
可以看到,disablePasswordLogin 已经成功变为 false。
现在,理论上刷新一下博客的登录页面,就应该可以看到久违的密码登录框啦!🎉 Mission Complete