常用的图床程序 Lsky Pro 最近更新了2.0版本。这个版本换用新的底层以支持多种数据库,带来全新的更加美观的瀑布流样式和图片管理页面,新增了水印配置、原图保护,等等。但最叫人欣喜的还是新增的多种逻辑形式的角色组和策略组。

2.0版本之前,一种存储方式只能存在一个。举个简单的栗子:使用腾讯云COS的话,只能存在一个帐号的一个存储桶。而现在不仅可以设置多个帐号,还支持将这些存储策略分配给多个用户。这对于非个人用户来说,是个极佳的升级理由。不过由于我改用 Docker,更新的迁移过程有些坎坷,好在一一解决了。

使用 docker compose 安装

现在,有大佬为 lskypro 编写了 docker 镜像,所以我们可以直接用 docker compose 一把梭:

version: '3.4'
services:

  lskypro:
    image: halcyonazure/lsky-pro-docker:latest
    container_name: lskypro
    ports:
      - 9080:80
    volumes:
      - ./lskypro:/var/www/html
    restart: unless-stopped

之后,再用 nginx 反向代理,举个简单的例子:

server {
    listen 80 ;
    listen 443 ssl http2 ;
    server_name himiku.com;
    index index.html index.php;
    include addssl/himiku.com.conf;
    location / {
        proxy_pass http://lskypro:80;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }

    access_log /var/log/nginx/himiku.com.log;
}

环境处理

相比1.x版本,这次的安装要求增添了不少。需要满足以下条件:

  • PHP >= 8.0.2
  • 安装BCMathCtypeDOMFileinfoJSONMbstringOpenSSLPDOTokenizer PHPXML PHPImagick 拓展
  • 解禁execshell_execreadlinksymlinkputenvgetenv函数

函数还好说,在php.ini里删除一下就好。但扩展就头疼了,没有在一开始把这些扩展编译进 PHP 的话,后续一个个塞很麻烦。还好我用的是Docker,可以一把梭。

PHP 部分

安装所需拓展

我的 PHP7 用到的Dockerfile如下:

FROM php:7.4.27-fpm-alpine

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
    && apk update \
    && apk add --virtual .build-tools --no-cache autoconf gcc g++ make \
    && apk --no-cache add ffmpeg graphicsmagick zip zlib-dev libjpeg-turbo-dev libpng-dev freetype-dev imagemagick-dev imagemagick libzip-dev icu-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install gd \
    && docker-php-ext-install exif mysqli pdo_mysql zip bcmath intl pcntl \
    && pecl install redis imagick \
    && docker-php-ext-enable redis imagick \
    && apk del .build-tools \
    && curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer \
    && apk add --no-cache git

这里有个小插曲。在初次测试的时候,上传图片程序一直在报错:

Unable to read image from path

我一直怀疑是程序权限的原因,反复检查了好几次没法解决。正当灰心的时候,注意到控制台的报错与imagick有关,最后在GitHub Issue上找到了解决方法。是因为imagemagick扩展没有安装相应图片格式支持所导致的。

原先是这样的,少安了个imagemagick

apk --no-cache add ffmpeg graphicsmagick zip zlib-dev libjpeg-turbo-dev libpng-dev freetype-dev imagemagick-dev libzip-dev icu-dev

故可以再加确认,是否成功安装了imagick扩展:

docker exec php php --ri imagick

若输出以下内容,则表示成功安装了支持解析所有图片格式的imagick

imagick

imagick module => enabled
imagick module version => 3.7.0
imagick classes => Imagick, ImagickDraw, ImagickPixel, ImagickPixelIterator, ImagickKernel
Imagick compiled with ImageMagick version => ImageMagick 7.1.0-16 Q16-HDRI x86_64 2021-11-21 https://imagemagick.org
Imagick using ImageMagick library version => ImageMagick 7.1.0-16 Q16-HDRI x86_64 2021-11-21 https://imagemagick.org
ImageMagick copyright => (C) 1999-2021 ImageMagick Studio LLC
ImageMagick release date => 2021-11-21
ImageMagick number of supported formats:  => 246
ImageMagick supported formats => 3FR, 3G2, 3GP, AAI, AI, APNG, ART, ARW, ASHLAR, AVI, AVIF, AVS, BGR, BGRA, BGRO, BMP, BMP2, BMP3, BRF, CAL, CALS, CANVAS, CAPTION, CIN, CIP, CLIP, CMYK, CMYKA, CR2, CR3, CRW, CUBE, CUR, CUT, DATA, DCM, DCR, DCRAW, DCX, DDS, DFONT, DNG, DOT, DPX, DXT1, DXT5, EPDF, EPI, EPS, EPS2, EPS3, EPSF, EPSI, EPT, EPT2, EPT3, ERF, FARBFELD, FAX, FF, FILE, FITS, FL32, FLV, FRACTAL, FTP, FTS, G3, G4, GIF, GIF87, GRADIENT, GRAY, GRAYA, GROUP4, GV, HALD, HDR, HEIC, HEIF, HISTOGRAM, HRZ, HTM, HTML, HTTP, HTTPS, ICB, ICO, ICON, IIQ, INFO, INLINE, IPL, ISOBRL, ISOBRL6, JNG, JNX, JPE, JPEG, JPG, JPS, JSON, K25, KDC, KERNEL, LABEL, M2V, M4V, MAC, MAP, MASK, MAT, MATTE, MEF, MIFF, MKV, MNG, MONO, MOV, MP4, MPC, MPEG, MPG, MRW, MSL, MSVG, MTV, MVG, NEF, NRW, NULL, ORA, ORF, OTB, OTF, PAL, PALM, PAM, PANGO, PATTERN, PBM, PCD, PCDS, PCL, PCT, PCX, PDB, PDF, PDFA, PEF, PES, PFA, PFB, PFM, PGM, PGX, PHM, PICON, PICT, PIX, PJPEG, PLASMA, PNG, PNG00, PNG24, PNG32, PNG48, PNG64, PNG8, PNM, POCKETMOD, PPM, PS, PS2, PS3, PSB, PSD, PTIF, PWP, RADIAL-GRADIENT, RAF, RAS, RAW, RGB, RGB565, RGBA, RGBO, RGF, RLA, RLE, RMF, RSVG, RW2, SCR, SCT, SFW, SGI, SHTML, SIX, SIXEL, SPARSE-COLOR, SR2, SRF, STEGANO, SUN, SVG, SVGZ, TEXT, TGA, THUMBNAIL, TIFF, TIFF64, TILE, TIM, TM2, TTC, TTF, TXT, UBRL, UBRL6, UIL, UYVY, VDA, VICAR, VID, VIFF, VIPS, VST, WBMP, WEBM, WEBP, WMV, WPG, X, X3F, XBM, XC, XCF, XPM, XPS, XV, XWD, YAML, YCbCr, YCbCrA, YUV

Directive => Local Value => Master Value
imagick.locale_fix => 0 => 0
imagick.skip_version_check => 0 => 0
imagick.progress_monitor => 0 => 0
imagick.set_single_thread => 1 => 1
imagick.shutdown_sleep_count => 10 => 10
imagick.allow_zero_dimension_images => 0 => 0

多版本PHP

因为 Tyeocho 对 PHP8 的支持仍在测试环节,而 VOID 还不支持 PHP8 。故我主要使用的还是 PHP7。但为了能用上Lsky Pro 2.0,需要添加一个 PHP8。

新建一个文件夹,重命名为php8,丢一个Dockerfile进去。其实内容与上一节的PHP7 只有版本号上的不同:

FROM php:8.1.3-fpm-alpine

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
    && apk update \
    && apk add --virtual .build-tools --no-cache autoconf gcc g++ make \
    && apk --no-cache add ffmpeg graphicsmagick zip zlib-dev libjpeg-turbo-dev libpng-dev freetype-dev imagemagick-dev imagemagick libzip-dev icu-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install gd \
    && docker-php-ext-install exif mysqli pdo_mysql zip bcmath intl pcntl \
    && pecl install redis imagick \
    && docker-php-ext-enable redis imagick \
    && apk del .build-tools \
    && curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer \
    && apk add --no-cache git

接着,在docker-compose.yml里加一项php8,随后部署起来即可。

  php:
    build: ./php
    volumes:
      - ./www:/home/wwwroot
      - ./php/php.ini:/usr/local/etc/php/php.ini
    environment:
      - TZ=Asia/Shanghai
    user: 101:101
    restart: unless-stopped
    container_name: php

  php8:
    build: ./php8
    volumes:
      - ./www:/home/wwwroot
      - ./php8/php.ini:/usr/local/etc/php/php.ini
    environment:
      - TZ=Asia/Shanghai
    user: 101:101
    restart: unless-stopped
    container_name: php8

Nginx 部分

程序的 Nginx 配置,除了需要按照官方文档使用伪静态,还需要注释掉 Nginx 自身对图片的缓存才能启用原图保护。

不过,我的 Nginx 环境用的还是LNMP脚本中的配置,和直接从官方 Nginx 拉的配置不太一样。但思路是一致的,如:

server {
    listen 80 ;
    listen 443 ssl http2 ;
    server_name xxx.com; 
    这里是证书;
    index index.html index.php ;
    root /home/wwwroot/lsky/public;
……
# 伪静态
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
# 需要注释掉的东西
    # location ~ .*\.(gif|webp|jpg|jpeg|png|bmp|swf)$ {
    #     expires 30d;
    # }
……
# 使用php8
        location ~ [^/]\.php(/|$)
        {
            try_files $uri =404;
            fastcgi_pass  php8:9000;
            fastcgi_index index.php;
            include fastcgi.conf;
        }
……
}

建议先测试完毕再上线生产环境。

安装 Lsky Pro 2.0

程序的安装就十分简单了。直接从官方 GitHub Releases 页面下载压缩包,解压到服务器上设置好权限就行。一开始会自检一遍,提示缺失的模块或未启用的函数。如果无法满足条件,是不能进行下一步的。

如果是新用户,那么建议选择SQlite。老用户肯定没得选,为了能用上数据转移脚本,需要选择MySQL

只要数据库配置没写错,很快就能搞定。

老用户需要在这一步停下,以进行数据库迁移。

根据官方文档,下载好迁移脚本后,Docker下的部分命令是不一样的。

例如,我将脚本解压至映射的www文件夹,需要根据docker-compose.yml中设置的映射路径,写完整这个脚本具体的位置。

docker exec php8 php /home/wwwroot/migrate/start.php migrate

这其实官方文档中「使用 ssh 工具登录到服务器,cd 到脚本根目录(与 start.php 文件同级)然后执行迁移命令 php start.php migrate」的步骤,但我忘了我用的是 Docker,反复复制粘贴了好几遍。

如果 config.yaml 配置文件填写无误,会出现如下的转移进度。

数据库转换成功之后,就能继续设置图床了。

主界面是这样的。

而图库是这样的。

存储策略的话,不在本文介绍范围内。写了就离题了。

就先到这里了。

参考