Lsky 兰空图床升级 V2 指南
Lsky Pro 兰空图床 是一个使用较为广泛的 php 🐘 开源图床程序。在微博图床、gitee、jsDelivr 陆续被 ban 的今天,很有必要搭建自己的图床系统了。
前不久,Lsky Pro 迎来重制的 v2 升级,界面焕然一新,也添加了更多的数据库支持。令人头疼的是,它与 v1 并不完全兼容,考虑到是一个个人项目,也不能苛求了。
本文记录一下升级 v2 的过程以及坑。这里的内容只对以下环境负责:
Ubuntu 系统
单用户使用;图片全部存在本地。
另附上 官方指南。
全新安装
是的,并不能「升级」。首选我们要全新安装一个 v2 的版本。
相比 v1,v2 对环境的要求有了变化,主要包括:
- PHP 不能低于 8.0.2
- 要求安装
Imagick
扩展。 - 开启这几个函数:exec, shell_exec, readlink, symlink, putenv, getenv
安装阶段带有环境检查,不用担心有忘记开启函数的情况。
部分要求包含敏感权限,故大部分虚拟主机(网站空间)用户怕是无缘了。
迁移数据库
作者花了亿点时间写了个 php 的迁移脚本,下载之,解压到任意目录下。然后编辑一下 config.yaml
修改新老数据库的连接参数。
新老数据库的参数都可以在对应安装目录下 .env
文件内找到。
有三点需要注意:
driver
字段为纯小写,而不是后边注释那样的大小写混合。- 对于 sqlite 数据库,
database
字段填写数据库文件的绝对路径。 - 记得关闭防盗链(如果有),因为迁移脚本需要读取每一个图片。
可以参考我的配置文件(省略非关键部分):
connections:
old: # lsky pro 1.x 版本数据库配置
driver: mysql # 数据库驱动(MySQL, Postgres, SQL Server, and SQLite)
host: 127.0.0.1 # 数据库连接地址
database: lskypro # 数据库名称
username: root # 数据库连接用户名
password: "xxxxxx" # 数据库密码
new: # lsky pro 2.0 版本数据库配置
driver: sqlite # 大道至简,我选择抛弃 mysql
host: 127.0.0.1
database: /www/wwwroot/xxxx/database/database.sqlite
username: root
password: root
然后执行:
php start.php migrate
就行了。迁移过程中需要解析图片元数据(例如尺寸),所以如果图片很多,特别是不在本地的情况下就很慢,耐心一点。
迁移文件
如果是本地存储的,将旧版本 ./public
目录下的图片文件(也就是以年份命名的文件夹)拷贝到新版 ./storage/app/uploads
目录下。
URL 变动
最坑的一点。本地存储的情况下,新版无法通过路径直接访问了,例如 https://img.chenhe.cc/2022/04/11/f09d85926bbe9.png
❌。默认情况下,需要加个 i
子目录,变成 https://img.chenhe.cc/i/2022/04/11/f09d85926bbe9.png
。这个 i
可以在管理后台「储存策略 - 本地策略 - 访问网址」处更改。(但是不能改成空!)
还好我的博客是 hugo 生成的,全是 md 源文件,可以写个脚本批量转换一下。但保不齐别的地方哪里又用到了图床,这下直接 404 可麻烦了。
那么就在 nginx 上做点手脚吧。其实很简单,加一个 rewrite 规则:
location ~ '^/\d{4}/\d{2}/\d{2}' {
rewrite ^(.*)$ /i/$1 break;
}
我们发现本地图片的储存目录规律是 年份/月份/日期/文件名
,所以可以通过正则轻松匹配图片 URI,然后给它加上一个前缀 i
,搞定~
客户端
我用的是 mac 系统下的 uPic,它内建支持 Lsky Pro,可惜 v2 版本 API 同样发生了巨大变动。于是乎,我们得自定义接口了。v2 的 API 格式在管理后台「接口」菜单清晰地写了出来。
首先得手动戳一下 tokens 接口来获取 token。使用 Postman 或某些 在线工具 发送一个 POST 请求,URI 是 api/v1/tokens
,包含两个 body 参数,分别是 email
和 password
,Content-Type 为 multipart/form-data
。
mac / linux 用户也可以 curl 一键获取:
curl -X POST -F "email=your_email@address" -F "password=your_passwd" https://your.domain/api/v1/tokens
拿到 Token 后再来配置 uPic:
- API 地址是
/api/v1/upload
,请求方式为 POST。 - 文件字段名为
file
。 - URL 路径为
["data", "links", "url"]
,它代表返回的 json 结构体中 data.links.url 字段。 - 保存路径直接写文件名,放在根目录。Lsky 会自动根据日期分类。
然后点击「其他字段」按钮,添加三个 Header 字段:
- Content-Type: multipart/form-data
- Accept: application/json
- Authorization: Bearer + 刚才拿到的 token。注意中间有个空格。例如
Bearer 1|2zxF05em0J2UcFxxxxxxxxxxxxxx
。
这样就可以啦,愉快地使用吧~