Docker 部署 lsky pro 兰空图床的教程

1. 使用 Docker 部署

1.1 命令行

命令比较简单,用下面的即可

bash
1
2
3
4
5
docker run -d \
--name lsky \
-p 14728:80 \
-v /root/docker/lsky:/var/www/html \
halcyonazure/lsky-pro-docker:latest
  • --name 设置容器名字为 lsky
  • -p 设置端口隐射,容器的 80 端口映射给本地的 14728 端口
  • -v 设置存储映射,本地的 /root/docker/lsky 映射给 /var/www/html

完成后,进入 IP:14728 即可打开你的图床页面

此命令在 CentOS7.2 云服务器上测试有效,但在我的 nas 上测试无效

2023.05.17 更新:最初写这篇博客的时候,使用的是旧版本的 lsky 容器。目前新版本的容器已经切换了内部端口为 8089,所以新版本的命令如下

bash
1
2
3
4
5
docker run -d \
--name lsky \
-p 14728:8089 \
-v /root/docker/lsky:/var/www/html \
halcyonazure/lsky-pro-docker:latest

这也是为什么当初我写下了 “在 nas 上测试无效” 的记录。因为容器内部端口并不是 80,所以原本的命令失效了。

2. 初始化

新用户直接用 sqlite 即可,如果对性能有更高要求,建议使用 mysql。

image-20230128115958361

因为我就是给自己作图床而已,所以直接用 sqlite 方便多了。除非你需要给非常多的用户使用,且有高并发的需求,否则不建议使用 MySQL,没有意义。

image-20230128120010907

后续打开 lsky 的主页面,就能上传图片了。

2.1 设置管理员用户总容量

首先当然是进入用户组设置,把自己这个管理员用户的总容量改成 5gb(默认 500mb)

image-20230128202120052

在系统设置里可以改用户的初始容量,看你的情况要不要增加

image-20230128205448834

2.2 新建角色组

其次,可以在角色组里面新增一个管理员组,设置一下单图大小限制(默认 5mb)以及每天 / 每周 / 每月的图片上传数量限制;同时,在角色组这里还可以修改命名格式

image-20230128202430451

个人建议去掉路径命名中的日期,这样能一定程度上的避免同一图片的二次存储

如果你上传了两个完全一样的图片,在我的图片里面会显示两个,但是只会有一个本地文件。

文件的命名除了随机字符串,还可以选择 md5、时间戳命名

image-20230128203010138

2.3 设置阿里云 OSS 为存储

这部分很简单,照着标识的填就行了。个人还是选择了本地存储的方式(阿里云 OSS 批量导出数据很麻烦)

image-20230128203243917

填了之后,上传的图片会直接返回阿里云 OSS 的链接

2.4 权限问题

如果你有一些本地的图片,想添加到 lsky 图床的根目录方便访问的话,就需要配置一下目录的图片

举个例子,我有一图片的压缩包,我想将其放入 lsky 的 stroage/appmy 文件夹里面,那么创建这个文件夹的时候,就需要修改它的权限

python
1
2
chown 33:tape my # 配置my文件夹的用户和用户组
## 33和tape是docker配置lsky的默认用户名和用户组

否则 lsky 图床没有办法正确读取或者往这个目录写入,从而导致上传错误

3.https 访问

3.1 修改代码

参考 https://github.com/lsky-org/lsky-pro/issues/321

需要添加代码,docker 用下面的方式添加后重启即可。这个修改的目的是让 lsky 中访问 url 的时候都用 https 而不是 http 去访问,并不是给 lsky 配置证书。

plaintext
1
docker exec -it 容器名字 sed -i '32 a \\\Illuminate\\Support\\Facades\\URL::forceScheme('"'"'https'"'"');' /var/www/html/app/Providers/AppServiceProvider.php

个人感觉,该 issue 已经提出了将近一年,lsky 还是不支持在前端后台或者配置文件中直接配置 https,实在有点不太应该。或许维护者是认为该修改代码的操作并不困难,就没有写入配置文件中。

不过这只是鸡蛋里挑骨头,lsky 整体还是非常好用的。

3.2 nginx 配置

安装 nginx,可以参考我的 nginx 安装博客

nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
server {
listen 443 ssl;
server_name img.text.top; # 域名
# 注意文件位置,是从/etc/nginx/下开始算起的
ssl_certificate cert/img.text.top.crt; # 域名证书文件crt
ssl_certificate_key cert/img.text.top.key; # 域名证书key
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

client_max_body_size 1024m;

location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header Upgrade-Insecure-Requests 1;
proxy_set_header X-Forwarded-Proto https;

# 因为是docker部署的nginx,所以要填云服务器公网ip
proxy_pass http://云服务器公网IP:端口;
}
}
## 强制重定向
server {
listen 80; # 监听80端口
server_name img.text.top; # 域名
#把http的域名请求转成https
return 301 https://$host$request_uri;
}

写入配置文件后,重启 nginx 容器,并将 img.text.top 域名的解析设置成你云服务器的公网 ip,就可以用 img.text.top 访问你的 lsky 图床了。

3.2.1 http 重写为 https

注意,默认情况下,lsky 的所有文件加载都会走 http,即便你打开了 https://img.musnow.top,那些 css 和 js 的资源还是走了 http://img.musnow.top,这种混合 http和https 的加载容易被浏览器拦截,导致 lsky 图床的界面显示的乱七八糟。

image-20230720111311071

image-20230720111254504

所以 nginx 配置文件的 location 中,一定要加上如下配置项,相当于将 http 重写为 https

nginx
1
proxy_set_header Upgrade-Insecure-Requests 1;

如果你像我一样使用了 1panel 来管理站点,此时 openresty(1panel 用的就是这个)的安装路径如下

plaintext
1
/opt/1panel/apps/openresty/openresty/www/sites/

在这里面你可以看到你配置好的站点(文件夹名字都是域名)

进入你想修改的域名站点中,可以看到下面几个文件夹

plaintext
1
index  log  proxy  ssl  waf

进入 proxy 文件夹,里面会有一个 root.conf,即为根路径的配置文件,你需要修改这个文件,在里面加上上述提到的配置项,否则 lsky 的界面会变乱。

修改好了以后,进入 1panel 的 web 页面,找到站点的配置文件选项框

image-20230720111145657

点击最下方的保存并重载,即可生效

image-20230720111151095

刷新界面,可以看到页面加载正常了

image-20230720111401774

3.3 又拍云 cdn

除了直接将域名映射至服务公网 IP,还可以通过 CDN 来访问我们的图片。这样用户 ping 我们的域名的时候,无法直接得到我们服务器的公网 IP,能在一定程度上防止被直接 ddos 攻击。

CDN 除了可以隐藏源站 IP,更重要的是区域分发加速。但对于访问量较低的个人站点而言,CDN 的区域加速功能基本无效,甚至可能会让加载速度变得更慢。

这里我使用的是又拍云 CDN,注意使用之前,你需要申请好这两个子域名的 https 证书,可以是单域名证书,也可以是通配符证书。单域名证书能在又拍云 CDN 中免费申请

推荐大家去申请一个又拍云联盟,只需要在网站页脚贴一个 logo,就能白嫖一年 67 元的代金券。新人用户也有有效期一个月的 61 元代金券

image-20230206165043971

3.3.1 创建 CDN 服务

进入控制台,点击创建 CDN 服务,按如下格式填写

image-20230206165412426

创建好了之后,如果访问 img1.text.top,那么就是经过了 cdn 的,如果访问 img.text.top 即为源站

此时你可以修改 lsky pro 存储策略中的图片访问 url,让 lsky 直接返回 img1.text.top 的连接

image-20230206172805650

3.3.2 回源 host

创建好了之后,还需要进一步配置。在回源管理中,修改回源 host 为源站域名。如果是👆图创建的样式,那么源站域名就是 img.text.top

image-20230206165553230

解释一下这里的回源 host,和 nginx 里面配置的域名有关系。

  • 简单来说就是浏览器在访问 img1.text.top 加速域名的时候,又拍云服务器会访问 img.text.top 进行回源操作;
  • 此时他会发送一个 host,如果这里不设置,默认的 host 就是访问域名,即 img1.text.top
  • 但是我们的云服务器中 nginx 可能没有配置 img1.text.top 的反代规则,此时就会被随机跳到一个配置了反代的端口上,无法正确跳转到 img.text.top(此情况是配置了多个 nginx 反代,如果只有一个 nginx 的服务,可能不会出现跳转错误)
  • 配置了 host 为 img.text.top 后,CDN 进行回源的时候,就会告诉服务器我是 img.text.top,服务器的 nginx 反代就能正确识别域名并返回服务;

这个回源 host 在加速诸如 vercel、netlify、GitHub Pages 等具有域名访问控制的服务的时候尤为重要。比如下图就是因为我没有配置 host,导致 CDN 加速发送的请求域名并没有被 vercel 收录,也就不知道要转到那个服务上,于是便 404 无法访问。

image-20230206170124139

3.3.3 https 设置

使用 cdn 加速后,即便你源站有 ssl 证书,cdn 加速后的域名也不一定能正常访问 https。

image-20230206170228828

此时就需要在 cdn 的配置中添加 https 证书

image-20230206170313358

这里可以添加自有证书,也可以在又拍云 CDN 申请单域名证书。又拍云申请 ssl 证书的操作还是挺快的,几分钟就好了,这点值得表扬

image-20230206170352912

3.3.4 缓存控制

这里还需要配置一下缓存控制,否则默认会是全站加速

image-20230206170455171

对于 lsky 来说,我们需要加速的只是图片资源你,并不需要加速管理页面

image-20230206170602751

如果配置了缓存规则之后,进入管理页面出现了问题,那就需要配置一下不缓存规则,把管理页面、设置页面给加入进去

image-20230206170634937

3.3.5 源站静态资源迁移

在回源设置里面有一条是静态资源迁移,这个还是很不错的!

image-20230206170824965

因为又拍云的 CDN 回源到 bucket 是不用钱的,这样就相当于只需要付存储的费用就行了。因为我的站点访问量小,对于 CDN 回源而产生的存储肯定少的可怜,完全不用担心费用问题

image-20230206171019126

需要操作的就是添加一个云存储

image-20230206170859282

配置一个操作员,提供写入和读取权限,就 OK 了。不需要绑定域名

image-20230206170911444

在静态资源迁移里面选择这个云存储即可

4.picgo

都用图床了,肯定不能少了老朋友 Picgo

在插件商店可以搜到 lankong 插件,开源地址 hellodk34/picgo-plugin-lankong

image-20230128204920775

配置插件参考 README,我这里发现 picgo 2.3.0 BATA8 无法正常运行插件,只有 2.3.1 版本的 picgo 可以用。

image-20230128205142099

其中关于 permission 需要注意的是,这个设置的是兰空图床的权限,也就是你上传的图片能不能在图床网站上直接被看到。并不是阿里云 OSS 那种外部无法直接访问的私有权限。

注意啊注意啊,token 需要你自己调用 curl 或者用 postman/apifox 调用 api 获取

别像我一样傻乎乎的,用这个示例值试了好久😥

image-20230128205239262

5.nsfwjs 鉴 h

除非你的图床不打算公开给任何人用,关闭了注册/游客上传的功能;那么我建议你设置一下鉴 h 操作。

兰空图床支持阿里云 / 腾讯云的内容安全,但是这俩玩意说实话,对于一个无人问津的小站点而言,价格太恐怖了。相比之下,nsfw 的 api 可以直接用 docker 部署,经过我的测试,效果还是不错的。

yaml
1
2
3
4
5
6
7
8
9
version: '3'
services:
nsfw-api:
image: penndu/nsfw-api:latest
restart: unless-stopped
hostname: nsfw-api
container_name: nsfw-api
ports:
- "14727:3000"

在角色组设置里面,可以设置图片审核。配置好 docker 之后,url 末尾需要带一个 /classify 才能正常调用。默认的阈值是 60,实在太够了,保险起见,阈值越低越好。

请注意,部署的 nsfw 的服务必须要能够外网访问,填机器内部 IP 是不行的。

这里我把阈值设置成了 15,能屏蔽掉很大一部分的 h 图,但是用户发违反其他规定的图片就需要你人工审核(或者去买阿里云 / 腾讯的内容审核)了。个人建议,直接关闭游客上传 / 注册功能,除非你打算建立一个完全公开的图床站点,并对你图床的内容负责。

image-20230128214435310

配置好了之后,如果有用户上传奇怪的图片,会直接禁止,上传失败。

image-20230128214820262

6. 修改页脚

使用 vscode(remote-ssh) 进入 lsky 的 docker 映射到本地的文件夹(如果你使用 nas 部署,则用 vscode 打开 smb 的文件夹,进入倒 lsky 映射到你 nas 本地的文件夹),搜索如下

plaintext
1
present Lsky Pro. All rights reserved.

有两个文件中都包含了页脚信息,都给他修改了就行;修改后重启容器就能生效

image-20230209171829880

如图,我的图床的页脚就是修改后的信息

image-20230506100045078

要是 lsky 后台配置项能直接加上这个配置项就好了,默认的页脚写的都还是 2018 年,太旧了。

More

有任何问题,欢迎在下方评论