mole404 4085642695 fix(viewer): 切图动画起点固定为屏幕中心(强制回流),并删掉上一版无效的摘类补丁
老师反馈上一版没修好(附真机截图)。按 Claude 的静态分析复核后确认,根因是 view() 的时序竞态:
  · view() 每次都新建一个 <img>:先写成"屏幕中心的点"(宽高 0 + margin 居中),读自然尺寸后
    再加 viewer-transition 写最终尺寸,靠 CSS 过渡补间。
  · CSS 过渡的起点 = 浏览器"上一次真正渲染过的样式"。第 1 步默认样式是"满宽贴顶",第 2 步是
    "中心点",第 3 步是最终值。哪一帧被渲染过决定动画从哪开始:第 2、3 步之间有帧 ⇒ 从中心
    长出来;只渲染到第 1 步 ⇒ 从屏幕上方飞入;一帧都没渲染 ⇒ 无动画直接出现。取决于图片是否
    缓存、网络快慢、主线程是否空闲 —— 这就是"没规律"的来源。
  · 上一版在 pointerup 里 viewer.image.classList.remove('viewer-transition') 无效:view() 新建
    的是另一个 <img>,且 load() 会按 options.transition 给新图重新加类。已删除该段及错误注释
    (原注释"从上一张图 margin 滑过来"也不成立)。

修法(Claude 方案 A):包一层 viewer.initImage,在它读自然尺寸之前强制回流一次
(void viewer.image.offsetWidth),把"中心点"提交为已渲染样式 ⇒ 起点恒为屏幕中心。
覆盖手指滑动、缩略图条、键盘、底部按钮等所有切图路径(都在 view() 内)。

本机实测(延迟图片响应 + 限速,模拟"未缓存的大图",即 Claude 给的复现法):
  切换瞬间 top 与稳定后 top 的差值:A 组 0px / 0px,C 组重跑 0px / 0px ✓
  对照组(剥掉补丁)未取得有效数据(生成对照版本时脚本把页面切坏),"无补丁会飞"留待真机确认。
本机 9 套 jsdom 测试全绿。
2026-10-03 14:49:22 +08:00
2022-05-08 10:13:10 +08:00
2026-10-03 14:03:18 +08:00

基于 Lsky Pro 开源版大幅改动,全面面向个人自用优化,但仍保留多用户支持。
支持从上游开源版 Lsky-Pro V2.1 无损升级。

适配 iOS 长按菜单,交互优化,UI 全面焕新,适配亮色/暗色模式,升级 PHP 8.3 依赖,新增图片标签功能。
去除画廊功能,去除图片公开/私有权限设置,转为强制私有权限,多个用户不再支持通过画廊互相查看公开图片。


这是自维护镜像(非官方)。由于上游开源版停更,应用源码 vendored 在本仓库 src/ 里,构建不联网拉上游。

本仓库镜像地址:ghcr.io/mole404/lsky-pro-docker:latest

特性

  • 全平台适配:兼容所有平台浏览器,修复上游开源版无法在 iOS 长按的问题,优化交互。
  • 开箱即用:默认用 SQLite,不需要额外跑一个数据库服务;容器首次部署后浏览器打开就是安装向导。
  • 低配友好:默认 Web 服务并发参数专为低配服务器优化,参数都可以通过环境变量单项覆盖。
  • 安全加固:登录/注册等认证接口增加限流,不采信客户端伪造的转发头,移除了 SVG 上传,并淘汰了一批带 CVE 的依赖。
  • 界面清爽:整套前端 UI 重做,简洁风格 + 亮色/暗色/跟随系统。深度优化手机端查看图片的手势操作体验。
  • 图库功能:支持图片标签 —— 给单张或多张图片打标、在图片墙上按标签筛选、卡片上直接显示标签;标签按用户隔离,互相不可见。

快速开始

Docker Compose(推荐):

services:
  lsky-pro:
    image: ghcr.io/mole404/lsky-pro-docker:latest
    container_name: lsky-pro
    restart: unless-stopped
    ports:
      - "127.0.0.1:8089:8089"                 # 宿主端口:容器端口(WEB_PORT)
    volumes:
      - $PWD/lsky-pro/data:/var/www/html      # 站点数据全在这个目录里($PWD = 你执行 compose 时所在的目录)
    environment:
      - WEB_PORT=8089

或使用等价的 docker run:

docker run -d --name lsky-pro --restart unless-stopped \
    -p 127.0.0.1:8089:8089 \
    -v "$PWD/lsky-pro/data:/var/www/html" \
    -e WEB_PORT=8089 \
    ghcr.io/mole404/lsky-pro-docker:latest

容器挂载卷路径可按你的实际情况改(上例是 $PWD/lsky-pro/data,$PWD 就是你执行命令时所在目录)。
上面把端口只绑到 127.0.0.1:生产环境推荐这样,再在前面放一层 Nginx 反代来终结 TLS,容器本身不用直接对外。

全新安装

  1. 容器首次部署后访问 http://<主机>:8089/,会自动跳到安装向导,更推荐设置反代访问
  2. 按向导填写数据库(默认 SQLite,路径可留空)与管理员账号密码
  3. 安装完成,开始使用

正在使用开源版 Lsky-Pro V2.1? 从上游开源版无损升级

  1. docker stop 旧容器名(如 lsky-pro)
  2. 完整备份数据目录(必做,别嫌麻烦)
  3. docker rm 旧容器名(如 lsky-pro)
  4. 根据旧版容器数据挂载路径,编辑新容器挂载卷路径,新版与上游旧版读取路径完全相同,务必确保挂载卷与旧版容器一致,挂载错误进去会报 500(数据不会丢,只是读取失败)
  5. 容器挂载卷路径设置正确后,拉取本仓库镜像部署即可完成升级

常见配置

端口

环境变量 默认值 说明
WEB_PORT 8089 容器内 Web 服务的 HTTP 端口
HTTPS_PORT 8088 容器内 HTTPS 端口(自签证书,仅供内网调试,一般不需要设)

自签证书不随镜像发放、也不进数据卷:每个容器首次启动自己生成。想用自己的证书,把 .crt / .key 挂到容器内 /etc/apache2/ssl/lsky-selfsigned.crt 与 .key 覆盖即可。

并发与内存

镜像默认内置一套面向小内存单用户的参数。每一项都能用环境变量单独覆盖:

环境变量 默认值 说明
APACHE_START_SERVERS 2 启动时预建的子进程数
APACHE_MIN_SPARE_SERVERS 1 空闲子进程下限
APACHE_MAX_SPARE_SERVERS 3 空闲子进程上限
APACHE_MAX_REQUEST_WORKERS 5 并发请求上限(内存占用的主要来源)
APACHE_MAX_CONNECTIONS_PER_CHILD 5 单个子进程处理多少个请求后回收(0 = 永不回收)
APACHE_KEEP_ALIVE Off 只接受 On / Off;Off 最省内存

如果您不知道这些参数起什么作用,请不要随意修改,否则有爆内存风险。
面向个人自用以上参数保持默认值即可,多用户场景下可增大。


关于这个仓库

  • src/ 是 vendored 的上游应用源码(上游已声明停止维护),本仓库在自己的分支上做了维护性修改与功能补充。

  • 相对上游改了哪些文件、为什么改,全部登记在一份清单里,可随时自查:

    bash tools/diff-vs-upstream.sh
    

    它会把仓库里的 src/ 与上游快照逐文件对比,并校验所有偏差都落在"已知偏离清单"内 —— 只要它不报错,改动就恰好是清单里那些。

  • 标签数据自检(只读,检查有没有残留的关联行):

    docker cp tools/check-tag-integrity.php lsky-pro:/tmp/
    docker exec lsky-pro php /tmp/check-tag-integrity.php
    
  • 本地测试:cd test && npm test(用 jsdom + 真实 jQuery 跑图片页的交互路径)。

  • patches/ 里是一份"给人看的"补丁存档(不参与构建 —— 构建用的就是 src/ 里的文件)。


许可与致谢

非官方镜像,自用为主
使用前请自行判断是否符合你的需求与合规要求
如果有其他需求,请自行 Fork 修改,本人不提供维护保障,不保证处理 issue 和 PR

S
Description
兰空图床 个人自用修改版
Readme AGPL-3.0
18 MiB
0 Stars 1 Watchers 0 Forks
Languages
Blade 38.2%
JavaScript 24.7%
PHP 24.6%
Shell 6.9%
Less 2.7%
Other 2.9%