1748 字
9 分钟
Docker部署LskyPro+开心版
本文主要信息本文提供了一套完整的 Docker 部署“兰空图床付费开心版”的教程,旨在解决官方 Dockerfile 无法打包及 PostgreSQL 数据库兼容性等问题。主要内容包括:
- 修复 Dockerfile:提供了一个可以直接构建成功的、包含所有必要依赖(如
vips,imagick)的Dockerfile。- 适配 PostgreSQL:通过修改数据库迁移文件(Migrations),解决了在 PostgreSQL 下因
json类型不兼容导致的部署问题。- 提供完整部署方案:包含
docker-compose.yaml配置文件和详细的 Nginx Proxy Manager 配置建议,支持更多图片格式。- 提供迁移指南:为使用 PostgreSQL 的用户提供了一套详细的、从开源版手动迁移数据(图片记录和缩略图)到付费版的 SQL 和 Python 脚本方案。
2025-09-21: 更新打包好的镜像地址,原Github账号死了
前端时间在Linux Do看到个开心版帖子:AcoFork 的兰空图床开心版 1panel 部署教程。但是我习惯Docker部署,所以折腾了一下。但是遇到了各种问题,首先是源码里提供的Dockerfile无法直接打包,会报错。此外由于MySQL占用较大,我想换PostgreSQL数据库,但是由于LskyPro初始化列的时候,会把在其他数据库里为text类型的列建成json类型不同,且没有进行处理,导致部署完成后有各种问题,且居然在含有json的列取distinct *,还是比较匪夷所思的。本文都会进行修复。
免费公益图床
- 需要Linux.Do三级账号,且分数达到60分
- 前往Linux.Do分发站领取账号
- 100个账号,每个账号默认20GB,最大允许50MB图片
已打包好的Docker镜像(amd64/arm64):
docker pull ghcr.io/walrus8364/lsky-pro:latest。不保证arm64可用性(因为我没用arm部署) 如果使用已打包好的镜像,请跳转部署容器部分
和原版区别
组件说明
- LskyPro+付费版源码:前往此位大佬的博客进行下载。lskypro+本地无需授权开心版!。
部署流程
代码修复
- 本文假设下载好了源码,同时解压内容到了一个名为
code的文件夹 - 修复
code/docker/Dockerfile。复制下面代码粘贴即可code/docker/Dockerfile FROM php:8.4-fpmENV DEBIAN_FRONTEND=noninteractiveENV TZ=Asia/ShanghaiRUN apt-get update && apt-get install -y \wget \gnupg \# software-properties-common \curl \zip \unzip \git \cron \supervisor \nginx \sqlite3 \netcat-openbsd \procps \htop \build-essential \pkg-config \autoconf \automake \libtool \imagemagick \libmagickwand-dev \libmagickcore-dev \libvips-dev \libvips-tools \libvips42 \libpng-dev \libjpeg-dev \libjpeg62-turbo-dev \libfreetype6-dev \libwebp-dev \libavif-dev \libtiff-dev \libgif-dev \libheif-dev \librsvg2-dev \libraw-dev \libzip-dev \zlib1g-dev \libonig-dev \libxml2-dev \libicu-dev \libxslt1-dev \libffi-dev \libsqlite3-dev \libpq-dev \fonts-dejavu-core \fontconfig \&& rm -rf /var/lib/apt/lists/*# 将所有 PHP 扩展相关的操作合并到一个 RUN 指令中RUN set -ex \# 1. 安装稳定且可以通过 pecl 安装的扩展&& pecl install imagick redis \# 2. 从源码编译安装 vips 扩展&& git clone https://github.com/libvips/php-vips-ext.git \&& cd php-vips-ext \&& phpize \&& ./configure \&& make \&& make install \&& cd .. \&& rm -rf php-vips-ext \&& docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \&& docker-php-ext-configure intl \&& docker-php-ext-install -j$(nproc) \pdo_mysql \pdo_sqlite \pdo_pgsql \mysqli \gd \zip \bcmath \opcache \exif \intl \xsl \pcntl \ftp \ffi \&& docker-php-ext-enable imagick redis vips \&& rm -rf /tmp/pearCOPY docker/config/php.ini /usr/local/etc/php/conf.d/custom.iniCOPY docker/config/www.conf /usr/local/etc/php-fpm.d/www.confCOPY docker/config/nginx.conf /etc/nginx/sites-available/defaultCOPY docker/config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf# 删除默认的 Docker 配置文件,避免配置冲突RUN rm -f /usr/local/etc/php-fpm.d/zz-docker.confWORKDIR /var/www/htmlCOPY . .RUN chown -R www-data:www-data /var/www/html \&& chmod -R 755 /var/www/html/storage \&& chmod -R 755 /var/www/html/bootstrap/cacheCOPY docker/entrypoint.sh /entrypoint.shRUN chmod +x /entrypoint.shRUN mkdir -p /var/log/supervisor \&& mkdir -p /var/www/html/database \&& chown -R www-data:www-data /var/www/html/databaseEXPOSE 80# 添加健康检查HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \CMD curl -f http://localhost:80/ || exit 1ENTRYPOINT ["/entrypoint.sh"] - 按下图,修改
code/database/migrations下相关文件的表结构
- 打包镜像:
cd code && docker build -f docker/Dockerfile -t lsky-pro:latest .
部署容器
- 创建
data文件夹,并同时创建docker-compose.yaml和.env文件Terminal window cd code && mkdir data && touch docker-compose.yaml && touch .env`services:lsky-pro:image: lsky-pro:latestcontainer_name: lsky-proports:- "9999:80" # 修改port mappingenv_file: .envenvironment:- APP_NAME=兰空图床- APP_URL=http://localhost:9999 # 改为你自己的域名- APP_LICENSE_KEY=xxxx-xxxx-xxxx-xxxx # 随便填- ADMIN_USERNAME=admin # 不设置则默认为 admin- ADMIN_PASSWORD=admin123 # 不设置则默认为 admin123volumes:- data:/var/www/htmlrestart: unless-stoppednetwork_mode: bridgevolumes:data:driver: localdriver_opts:type: noneo: binddevice: ./data - 配置
Openlist:参考Docker部署Lsky图床并配合Openlist网盘存储#配置Openlist部分 - 配置
Nginx Proxy Manager:大部分设置请参考Docker部署Lsky图床并配合Openlist网盘存储#配置Openlist#配置Nginx Proxy Manager部分。有一小点的变化:- 因为付费版支持更多的图片格式,因此要修改
localtion ~ ^/(.*\.(jpeg|jpg|png|gif|tif|bmp|ico|psd|webp))$为localtion ~* ^/(.*\.(jpeg|jpg|png|gif|tif|tiff|bmp|ico|psd|webp|avif|heic|heif|jp2|j2k|jp2k|jpf|jpm|jpg2|j2c|jpc|jpx))$
- 因为付费版支持更多的图片格式,因此要修改
开源版手动迁移至付费版
由于表结构变化非常大,且官方没有提供迁移办法,因此提供一个基础的迁移方法。此处默认开源版和付费版都是PG数据库部署的
- 先确认开源版
角色组的路径命名规则和文件命名规则
付费版内的储存管理里的命名规则需要设置为开源版的路径命名规则/文件命名规则。其余配置请和开源版的储存策略一致
-
同时假设你和我一样只有一个本地储存和一个Openlist WebDAV储存
- 在
开源版的public下,DataGrip里运行下面的sql:selectuser_id,group_id,strategy_id,split_part(origin_name, '.', 1) as name,'' as intro,origin_name as filename,concat_ws('/', path, name) as pathname,mimetype,extension,md5,sha1,'{}' as exif,size, width, height,false as is_public,'normal' as status,uploaded_ip::inet as uploaded_ip,null as expired_at,null as deleted_at,created_at,updated_atfrom images; - 去付费版数据库的
photos这个表,把数据粘贴进去即可
- 在
- 迁移开源版的
thumbnails文件- 在
收费版的public运行下面的sqlselectjson_agg(json_build_object(-- 请注意替换为你开源版本地实际缩略图路径'old_thumbnail_path', concat('/home/ubuntu/docker_data/lskypro/web/public/thumbnails/', md5, '.png'),-- 请注意替换为你付费版本地实际缩略图路径'new_thumbnail_path', concat('/home/ubuntu/docker_data/lskyproplus/data/storage/app/public/thumbnails/', pathname)))from photos; - 复制python代码并替换
data变量为上面sql的运行结果Terminal window nano thumbnail-migration.pyfrom pathlib import Pathimport shutildata = []for i in data:old_path = i["old_thumbnail_path"]new_path = i["new_thumbnail_path"]# 创建新目录if Path(new_path).parent.exists() is False:Path(new_path).parent.mkdir(parents=True, exist_ok=True)# 复制旧文件到新文件夹try:shutil.copy(old_path, new_path)print(f"Copied: {old_path} -> {new_path}")except Exception as e:print(f"Error copying {old_path} to {new_path}: {e}") - 运行:
python thumbnail-migration.py
- 在
- 开始愉快的使用吧
API文档
Docker部署LskyPro+开心版
https://blog.useforall.com/posts/19/ 最后更新于 2025-09-22,距今已过 55 天
部分内容可能已过时
Lim's Blog