71
0
0

LGNewUi-Docker 部署指南

2026-09-03
2026-10-05
LGNewUi-Docker 部署指南
文章摘要

LGNewUi-Docker 是「LGNewUi 恋爱纪念主题网站程序」的 Docker 部署方案。它把这套程序需要的运行环境——PHP 8.0、十余个 PHP 扩展、ffmpeg、以及用于加载加密代码的 SourceGuardian 加载器——固化进一个镜像,并把部署流程压缩成一条交互式命令。

部署文件实际托管在 jsbat 仓库的 LGNewUi-Docker 目录,该目录下只有两个文件:

jsbat/LGNewUi-Docker/
├── install.sh      部署脚本(自动检测环境、测速选线路、构建并启动)
└── LGNewUi.zip     真正的部署包,解压后是 Dockerfile + .env

另有同名独立仓库 Freewind72/LGNewUi-Docker 存放说明文档与许可证。许可为 GPL-3.0。

一、为什么需要 Docker 版

这类 PHP 程序的部署难点从来不在 "装 PHP"——而在那些零碎的依赖:

  • imagick 不是 PHP 自带扩展,要单独编译;
  • gd 必须带 freetype / jpeg / webp 支持,编译参数写错就静默失效;
  • 媒体处理依赖系统级的 ffmpeg;
  • 程序代码经过 SourceGuardian 加密,必须加载对应 PHP 版本的解密扩展,版本对不上直接白屏;
  • 还要一长串扩展:bcmath、exif、gettext、gmp、intl、mysqli、opcache、pcntl、pdo_mysql、soap、sockets、sysvsem、zip……

手工装一遍要面对 "扩展版本不匹配""编译缺依赖""加密扩展加载失败" 三类问题。把它们全部固化进镜像,是这套方案存在的意义。

二、镜像构成

项目内容
基础镜像php:8.0-apache
PHP 扩展bcmath、exif、gettext、gmp、gd(含 freetype / jpeg / webp)、imagick、intl、mysqli、opcache、pcntl、pdo_mysql、shmop、soap、sockets、sysvsem、zip
系统工具ffmpeg(音视频处理)、unzip、curl
加密支持SourceGuardian Loader
镜像名 / 容器名lgnewui_zeph:latest / lgnewui_zeph
端口127.0.0.1:5200 → 容器 80(只绑本机回环,对外需反向代理)

base 镜像的寿命问题:程序要求 PHP 8.0,而它对应的 Debian 11(bullseye)已于 2026-08-31 结束支持,安全更新仓库被清空。install.sh 因此在构建前会自动探测可用的 apt 软件源——依次尝试阿里云、腾讯云,都不通才回落到 archive.debian.org,并把结果通过 --build-arg APT_MIRROR 传给构建过程。这是这套方案里最容易被忽略、却决定 "能不能装上" 的一步。

三、部署

3.1 环境要求

  • Docker 20.10+(脚本会检查 docker 命令是否存在、服务是否在运行)
  • 适用于 1Panel、飞牛等面板环境

3.2 建议使用 LGNewUi 作为项目目录名

推荐把项目目录命名为 LGNewUi,例如:

mkdir -p /opt/LGNewUi && cd /opt/LGNewUi

这么做有个直接好处:脚本用 $(pwd) 作为站点目录的挂载源,目录名统一之后,后续的日志路径、备份路径、反向代理配置、以及排查问题时对照文档,都能直接对上,不用再换算成你自己的目录名。

3.3 执行安装脚本

进入该目录后执行:

curl -fsSL https://cdn.jsdelivr.net/gh/Freewind72/jsbat@main/LGNewUi-Docker/install.sh -o install.sh && chmod +x install.sh && ./install.sh

jsDelivr 不稳定时可换 GitHub Raw:

curl -fsSL https://raw.githubusercontent.com/Freewind72/jsbat/main/LGNewUi-Docker/install.sh -o install.sh && chmod +x install.sh && ./install.sh

3.4 脚本会做哪些事

  1. 环境检测:确认 Docker 已安装且服务在运行,打印版本。
  2. 探测 apt 软件源:如上节所述,选一个还能用的 Debian 源。
  3. 八条线路测速:分别请求 jsDelivr、GitHub Raw、jasonzeng、gh-proxy 系列共 8 个地址,逐个测出毫秒延迟,并推荐最快的一条。
    请选择下载线路 (推荐 CDN3):
      [1] jsDelivr         1234ms
      [2] GitHub Raw       99999ms
      [3] jasonzeng          512ms
      ...
    输入数字 (1-8) 或直接回车选择推荐:

    直接回车即用推荐线路;输入无效值也会自动回落到推荐项。

  4. 下载并解压:拉取 LGNewUi.zip,用 unzip 解压(没有 unzip 时自动改用 python3 的 zipfile 模块),并校验 .env 是否存在。
  5. 清理旧容器:docker stop + docker rm 同名容器(不存在也不报错)。
  6. 构建镜像:docker build --build-arg APT_MIRROR=… -t lgnewui_zeph:latest .
  7. 启动容器:
docker run -d \
    --name lgnewui_zeph \
    --restart unless-stopped \
    -p 127.0.0.1:5200:80 \
    -v "$(pwd):/var/www/html" \
    -v /var/www/html/vendor \
    --env-file .env \
    --network 1panel-network \
    lgnewui_zeph:latest
  1. 清理临时文件:解压出来的文件按白名单清理,只保留 Dockerfile 与 .env,并删除 LGNewUi.zip 和 install.sh 自身。
  2. 打印结果:用 docker ps --filter 显示容器状态与端口。

四、数据放在哪里

这一点和很多容器化方案不一样:整个站点目录直接挂载在宿主机上。

-v "$(pwd):/var/www/html"

也就是说——你在哪个目录执行脚本,那个目录就是程序的运行目录:上传的文件、缓存、日志、备份、插件、授权文件,全都直接落在你的项目目录里。按上一节的建议用 /opt/LGNewUi 的话,所有数据就在这个目录下。

好处是:

  • 不需要记住十来个挂载点的对应关系,备份就是把目录打包;
  • 重建容器不会丢任何数据;
  • 想改配置、看日志、替换文件,直接在宿主机上操作即可,不用 docker exec 进去。

另外 -v /var/www/html/vendor 是一个匿名卷,用来把依赖目录与宿主机文件隔开。.env 与 Dockerfile 会被脚本保留下来,方便你改配置后重新构建。

五、可配置项(.env)

部署包里的 .env 项项都有注释,通过 --env-file 注入容器:

变量默认值说明
TZAsia/Shanghai容器时区
PHP_MEMORY_LIMIT256MPHP 内存上限
PHP_UPLOAD_MAX_FILESIZE100M单文件上传大小上限
PHP_POST_MAX_SIZE100MPOST 请求体上限
PHP_MAX_EXECUTION_TIME300脚本最长执行时间(秒)
PHP_MAX_INPUT_TIME300输入解析超时(秒)
PHP_DISPLAY_ERRORSOff是否在页面显示错误(生产用 Off,调试改 On)
PHP_ERROR_REPORTINGE_ALL错误报告级别
PHP_OPCACHE_TIMESTAMPS0OPCache 时间戳校验。生产建议 0(性能优先),开发改 1(改代码立即生效)

改完 .env 后重新执行一次 install.sh(或手动 docker build + docker run)即可生效。

六、访问与反向代理

容器只把端口绑在 127.0.0.1:5200 上——这是刻意的:不直接对外暴露,需要域名访问时由 Nginx 转发。

curl -I http://127.0.0.1:5200
location / {
    proxy_pass http://127.0.0.1:5200;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

容器默认接入外部网络 1panel-network(1Panel 环境自带)。用别的网络时,改 install.sh 顶部的 NETWORK_NAME。

七、更新

要更新到新的部署包或镜像,重新执行一次 install.sh 即可:

./install.sh

脚本会依次完成 "停旧容器 → 删旧容器 → 重新构建镜像 → 启动新容器"。因为站点目录是挂载的,重建不会影响任何已有数据。

如果你改过 .env,注意:install.sh 会重新下载并解压部署包,可能覆盖你手上的 .env——所以先把改动记下来,或者改完直接手动执行 docker build / docker run,不重跑脚本。

八、常见问题

脚本报"未检测到 Docker"或"Docker 服务未运行"

分别是没装 Docker、和装了但服务没起来(或当前用户无权限访问 docker socket)。用 systemctl status docker 看一下服务状态。

构建阶段卡在 apt 或大量 404

说明 Debian 源失效了(bullseye 已 EOL)。脚本已内置阿里云、腾讯云、archive.debian.org 三级探测;如果都不通,说明这台机器到这几个地址的网络有问题,需要手动指定可用的 APT_MIRROR。

八条线路全都很慢(显示 99999)

99999 表示该地址 3 秒内没连上。全部这样时,通常是服务器本身的出网受限——先在服务器上手动 curl 一下 GitHub 相关域名确认。

装完访问不到页面

先确认容器在跑、端口是否通:

docker ps --filter "name=lgnewui_zeph"
docker logs lgnewui_zeph
curl -I http://127.0.0.1:5200

注意端口是 5200,且只绑在 127.0.0.1 上——从外网直接访问 IP:5200 是不通的,必须经过反向代理。

为什么脚本最后把我下载的文件删了

这是刻意的白名单清理:解压出来的临时文件只保留 Dockerfile 与 .env,其余(包括 LGNewUi.zip、install.sh)都会删掉,避免项目目录里堆一堆用不上的文件。要重装就重新下载一次脚本。

想换部署目录怎么办

因为挂载用的是 $(pwd),换目录 = 在新目录里重新执行一遍 install.sh。所以第一次就按建议用 /opt/LGNewUi,能省掉迁移数据这一步;已经装到别处的,需要自己把旧目录的数据搬到新目录。

九、与独立仓库的关系

  • 实际托管(部署用):jsbat/LGNewUi-Docker —— 只放 install.sh 与 LGNewUi.zip,安装时下载的就是这里的包。
  • 同名独立仓库:Freewind72/LGNewUi-Docker —— 存放说明文档与 GPL-3.0 许可证。
  • 上级仓库:Freewind72/jsbat —— 一个脚本库,LGNewUi-Docker 只是它下面的一个目录。

十、许可

本项目基于 GNU General Public License v3.0 发布。

部署方案本身不分发任何第三方程序,只在构建时从各官方站点或镜像拉取依赖,因此各个组件仍受其原有许可证约束。LGNewUi 程序本体为第三方加密发布的商业程序,其授权与使用条款请以程序提供方为准。

如果你也在部署这套程序,被扩展编译、加密加载器或者 Debian 源过期折腾过,这个脚本想省下的就是那段时间。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

LGNewUi-Docker 部署指南
/archives/lgnewui-docker
作者
Zeph
发布于
2026-09-03
许可协议
CC BY-NC-SA 4.0

评论

欢迎来到我的博客!