AList + 云盘 + LskyPro · 搭建大容量图床服务

写在前面
“图床” 是用于存放图片的空间,基于图床可以快捷地实现图片分享,便于日常使用和前端开发。
Lsky Pro(兰空图床) 是一款基于 PHP 开发的开源图床项目,界面美观且易于操作,目前支持本地存储AWS S3阿里云 OSS腾讯云 COS七牛云又拍云SFTPFTPWebDAVMinio 等多类存储服务。
Lsky Pro 的优势在于其支持 WebDAV 协议,因此我们可以使用 AList 绑定个人网盘(如阿里云盘、百度网盘、天翼云盘、夸克网盘等),将 AList 提供的 WebDAV 服务作为图床的存储策略,进而充分利用云盘空间,通过图床将图片托管到个人网盘。
注意:一个良好的图床服务应当与 CDN 搭配以实现更快的加载速度,本文搭建的图床仅作为个人使用的图片托管平台。

I. 效果展示

传送门 → LeoHao’ s Image Hub

https://pic3.zhimg.com/v2-dfec3d0292548141e0bf9d8adc659196_r.jpg

https://pic3.zhimg.com/v2-b2cf7bdd46b95fa9d0027378804adffa_r.jpg

https://pic1.zhimg.com/v2-16d1c622438c354d973fe341870452fc_r.jpg

II. 官方文档

LskyPro 兰空图床官方文档:https://docs.lsky.pro

AList 官方文档:https://alist.nn.ci

III. 部署步骤

注意:在部署开始前你应该拥有一台公网服务器,另外,以下步骤依赖于 Docker、Nginx 和 AList,请提前安装相关依赖并配置,本文档只对 LskyPro 图床的搭建步骤和必要的注意事项进行介绍。

Step1. 配置 AList WebDAV 服务

在个人网盘中创建 lskypro-image 文件夹,这里以天翼云盘为例,并在 AList 中将该文件夹挂载到路径 /image,如下图所示:

https://pic1.zhimg.com/v2-d2ced0de8208958afca516c4a8bbae4c_r.jpg

以上步骤完成后,访问 DAV 链接并通过身份校验后,即可进行图片的上传与访问。假设 AList 绑定的公网域名为 alist.domain.name.cn,则图片存储服务的 DAV 链接为:https://alist.domain.name.cn/dav/image

Step2. 启动 LskyPro 图床容器服务

LskyPro 图床服务依赖于多个 PHP 插件,为了方便部署,我们采用 Docker 的方式安装 ,命令如下:

# 创建容器并启动(宿主机4003端口可自行更改)
sudo docker run -d --name lskypro --restart unless-stopped -p 4003:80 -v /data/lskypro:/var/www/html coldpig/lskypro-docker:latest

📢: 这里采用的事

docker run -d \
  --name lsky_pro \
  -p 9080:80 \
  -v /opt/docker/lsky/data:/var/www/html \
  --restart unless-stopped \
  halcyonazure/lsky-pro-docker:latest

Step3. 修改 Nginx 配置项

注意,如果在 Nginx 配置中开启了 HTTPS ,需要执行以下命令修改图床项目源码,否则前端页面布局将被打乱:

sudo docker exec -it lskypro sed -i '32 a \\\Illuminate\\Support\\Facades\\URL::forceScheme('"'"'https'"'"');' /var/www/html/app/Providers/AppServiceProvider.php

📢: 这里采用端口转发就可以不用设置AppServiceProvider.php

假设图床服务的域名为 image.domain.name.cn,AList 部署在本地端口 4015,在 nginx.conf 中添加如下配置项:

    #Lsky Pro | Image Hub
    server {
        listen 80;
        listen 443 ssl;
        server_name image.domain.name.cn;
        # HTTPS 需要指定 SSL/TLS 证书路径
        ssl_certificate cert/image.domain.name.cn.pem;
        ssl_certificate_key cert/image.domain.name.cn.key;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 5m;
        # 转发图床服务请求
        location / {
        	# 转发端口 4003 与 Step2 中设定的宿主机端口保持一致
            proxy_pass http://localhost:4003;
            proxy_read_timeout 600s;
        }
        # 转发 AList 图片直链访问请求 注意是d 不是dav!!!
        location /img {
            proxy_pass http://localhost:4015/d/image;
            proxy_read_timeout 600s;
        }
    }

📢:这里借助Nginx Proxy Manger进行配置

65509030554f8.png

Nginx 配置说明

上传至图床的图片应该是可公开访问的,为此我们在以上 Nginx 配置中增加了 “转发 AList 图片直链访问请求” 配置项。经过以上配置,客户端通过访问 https://image.domain.name.cn/img/${img_path} 即可直接获取图片,无需进行身份验证。
6550886764dce.png
Step4. 配置 LskyPro 图床

A. 数据库配置

以上步骤完成后,浏览器访问图床服务(https://image.domain.name.cn)可进入如下图所示的配置页面。配置页面将引导我们设置数据库服务,为了减轻工作量,我们直接使用本地 SQLite 数据库,数据库路径留空即可(将自动在服务根目录的 database 目录下创建 database.sqlite 文件),同时需要设定管理员邮箱和登录密码。

https://pic2.zhimg.com/v2-15f3414400a859d6abe1e0f0757e5f4d_r.jpg
配置完成后根据引导进入图床首页。

https://pic2.zhimg.com/v2-7fe2f3a48c45507d3a7c5ec452a51a91_r.jpg

B. 设置存储策略

登录管理员账户,点击侧边栏的 “存储策略” 进入图片文件存储的相关配置,创建一个新的存储策略。

https://pic1.zhimg.com/v2-df949168b0c09d32c7f949ea7765e6c0_r.jpg

默认存储策略为本地存储,为了不占用服务器空间,我们这里使用 AList 提供的 WebDAV 服务创建一个新的存储策略,配置项如表所示,其中访问域名即为图片直链对应的域名和路径。

注意:记得选中角色组,否则存储策略不会生效。

https://pic4.zhimg.com/v2-818ff1ed5e91d0661e088436c9f1ceef_r.jpg

https://pic1.zhimg.com/v2-c8450796121cc4f67ae55bc6f5124654_r.jpg

https://pic4.zhimg.com/v2-12d3436c0f4960180343462b43c3da07_r.jpg

C. 设置 WebDAV 为默认存储策略

WebDAV 存储策略添加后可以将默认本地存储策略删除,防止用户将图片上传至本地服务器。

Reference

原文简悦 SimpRead

另外特殊说明

对于兰空图床免费开源版,需要自己或者联系使用的图床的管理员修改源代码,才可以使APP内的相册ID参数生效,否则即使填写了相册ID,上传图片时也会上传到默认相册。

具体修改方式为打开 /兰空图床目录/app/Services/ImageService.php文件,修改第139行,原文件为

    if ($albumId = $user->configs->get(UserConfigKey::DefaultAlbum)) {
        if ($user->albums()->where('id', $albumId)->exists()) {
            $image->album_id = $albumId;
        }
    }

修改为:

    if ($request->has('album_id')) {
        $image->album_id = $request->input('album_id');
    } else {
    if ($albumId = $user->configs->get(UserConfigKey::DefaultAlbum)) {
        if ($user->albums()->where('id', $albumId)->exists()) {
            $image->album_id = $albumId;
        }
    }
    }