Mobile wallpaper
1748 字
9 分钟

Docker部署LskyPro+开心版

2025-08-29
2025-09-22
浏览量 加载中...
本文主要信息

本文提供了一套完整的 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 *,还是比较匪夷所思的。本文都会进行修复。

免费公益图床#

  1. 需要Linux.Do三级账号,且分数达到60分
  2. 前往Linux.Do分发站领取账号
  3. 100个账号,每个账号默认20GB,最大允许50MB图片

已打包好的Docker镜像(amd64/arm64)docker pull ghcr.io/walrus8364/lsky-pro:latest。不保证arm64可用性(因为我没用arm部署) 如果使用已打包好的镜像,请跳转部署容器部分

和原版区别
  • 修复PG数据库问题
  • 完全重构相册分享页面UI。新分享页面
    1. 点击查看大图支持左右切换图片
    2. 支持按ID或上传时间进行
    3. 支持下载单个图片,同时新增下载全部按钮
    4. 支持聚类模式,实现SlowPics的所有功能(图片命名规则需满足AAA-x1, AAA-x2, BBB-1, BBB-x2这种形式才可使用聚类模式)
    5. 网站公告和站内公告的code block改为使用shiki代替highlight.js的代码高亮
      • 相册简介数据类型修改为TEXT,用以支持长MarkDown内容,使用marked解析,并支持shiki的代码高亮

组件说明#

部署流程#

代码修复#

  1. 本文假设下载好了源码,同时解压内容到了一个名为code的文件夹
  2. 修复code/docker/Dockerfile。复制下面代码粘贴即可
    code/docker/Dockerfile
    FROM php:8.4-fpm
    ENV DEBIAN_FRONTEND=noninteractive
    ENV TZ=Asia/Shanghai
    RUN 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/pear
    COPY docker/config/php.ini /usr/local/etc/php/conf.d/custom.ini
    COPY docker/config/www.conf /usr/local/etc/php-fpm.d/www.conf
    COPY docker/config/nginx.conf /etc/nginx/sites-available/default
    COPY docker/config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
    # 删除默认的 Docker 配置文件,避免配置冲突
    RUN rm -f /usr/local/etc/php-fpm.d/zz-docker.conf
    WORKDIR /var/www/html
    COPY . .
    RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 755 /var/www/html/storage \
    && chmod -R 755 /var/www/html/bootstrap/cache
    COPY docker/entrypoint.sh /entrypoint.sh
    RUN chmod +x /entrypoint.sh
    RUN mkdir -p /var/log/supervisor \
    && mkdir -p /var/www/html/database \
    && chown -R www-data:www-data /var/www/html/database
    EXPOSE 80
    # 添加健康检查
    HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
    CMD curl -f http://localhost:80/ || exit 1
    ENTRYPOINT ["/entrypoint.sh"]
  3. 按下图,修改code/database/migrations下相关文件的表结构 image.png
  4. 打包镜像:cd code && docker build -f docker/Dockerfile -t lsky-pro:latest .

部署容器#

  1. 创建data文件夹,并同时创建docker-compose.yaml.env文件
    Terminal window
    cd code && mkdir data && touch docker-compose.yaml && touch .env`
    services:
    lsky-pro:
    image: lsky-pro:latest
    container_name: lsky-pro
    ports:
    - "9999:80" # 修改port mapping
    env_file: .env
    environment:
    - APP_NAME=兰空图床
    - APP_URL=http://localhost:9999 # 改为你自己的域名
    - APP_LICENSE_KEY=xxxx-xxxx-xxxx-xxxx # 随便填
    - ADMIN_USERNAME=admin # 不设置则默认为 admin
    - [email protected] # 不设置则默认为 [email protected]
    - ADMIN_PASSWORD=admin123 # 不设置则默认为 admin123
    volumes:
    - data:/var/www/html
    restart: unless-stopped
    network_mode: bridge
    volumes:
    data:
    driver: local
    driver_opts:
    type: none
    o: bind
    device: ./data
  2. 配置Openlist:参考Docker部署Lsky图床并配合Openlist网盘存储#配置Openlist部分
  3. 配置Nginx Proxy Manager:大部分设置请参考Docker部署Lsky图床并配合Openlist网盘存储#配置Openlist#配置Nginx Proxy Manager部分。有一小点的变化:
    1. 因为付费版支持更多的图片格式,因此要修改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数据库部署的

  1. 先确认开源版角色组路径命名规则文件命名规则
  2. 付费版内的储存管理里的命名规则需要设置为开源版路径命名规则/文件命名规则。其余配置请和开源版的储存策略一致 image.png
  3. 同时假设你和我一样只有一个本地储存和一个Openlist WebDAV储存
    1. 开源版public下,DataGrip里运行下面的sql:
      select
      user_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_at
      from images;
    2. 去付费版数据库的photos这个表,把数据粘贴进去即可
  4. 迁移开源版的thumbnails文件
    1. 收费版public运行下面的sql
      select
      json_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;
    2. 复制python代码并替换data变量为上面sql的运行结果
      Terminal window
      nano thumbnail-migration.py
      from pathlib import Path
      import shutil
      data = []
      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}")
    3. 运行:python thumbnail-migration.py
  5. 开始愉快的使用吧

API文档#

最后更新于 2025-09-22,距今已过 55 天

部分内容可能已过时

评论区

目录