文章

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 参数,分别是 emailpassword,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

拿到 Token 后再来配置 uPic:

  1. API 地址是 /api/v1/upload,请求方式为 POST。
  2. 文件字段名为 file
  3. URL 路径为 ["data", "links", "url"],它代表返回的 json 结构体中 data.links.url 字段。
  4. 保存路径直接写文件名,放在根目录。Lsky 会自动根据日期分类。

uPic 配置

然后点击「其他字段」按钮,添加三个 Header 字段:

其他字段

  • Content-Type: multipart/form-data
  • Accept: application/json
  • Authorization: Bearer + 刚才拿到的 token。注意中间有个空格。例如 Bearer 1|2zxF05em0J2UcFxxxxxxxxxxxxxx

这样就可以啦,愉快地使用吧~