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.shjsDelivr 不稳定时可换 GitHub Raw:
curl -fsSL https://raw.githubusercontent.com/Freewind72/jsbat/main/LGNewUi-Docker/install.sh -o install.sh && chmod +x install.sh && ./install.sh3.4 脚本会做哪些事
- 环境检测:确认 Docker 已安装且服务在运行,打印版本。
- 探测 apt 软件源:如上节所述,选一个还能用的 Debian 源。
- 八条线路测速:分别请求 jsDelivr、GitHub Raw、jasonzeng、gh-proxy 系列共 8 个地址,逐个测出毫秒延迟,并推荐最快的一条。
请选择下载线路 (推荐 CDN3): [1] jsDelivr 1234ms [2] GitHub Raw 99999ms [3] jasonzeng 512ms ... 输入数字 (1-8) 或直接回车选择推荐:直接回车即用推荐线路;输入无效值也会自动回落到推荐项。
- 下载并解压:拉取
LGNewUi.zip,用unzip解压(没有 unzip 时自动改用python3的 zipfile 模块),并校验.env是否存在。 - 清理旧容器:
docker stop+docker rm同名容器(不存在也不报错)。 - 构建镜像:
docker build --build-arg APT_MIRROR=… -t lgnewui_zeph:latest . - 启动容器:
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- 清理临时文件:解压出来的文件按白名单清理,只保留
Dockerfile与.env,并删除LGNewUi.zip和install.sh自身。 - 打印结果:用
docker ps --filter显示容器状态与端口。
四、数据放在哪里
这一点和很多容器化方案不一样:整个站点目录直接挂载在宿主机上。
-v "$(pwd):/var/www/html"也就是说——你在哪个目录执行脚本,那个目录就是程序的运行目录:上传的文件、缓存、日志、备份、插件、授权文件,全都直接落在你的项目目录里。按上一节的建议用 /opt/LGNewUi 的话,所有数据就在这个目录下。
好处是:
- 不需要记住十来个挂载点的对应关系,备份就是把目录打包;
- 重建容器不会丢任何数据;
- 想改配置、看日志、替换文件,直接在宿主机上操作即可,不用
docker exec进去。
另外 -v /var/www/html/vendor 是一个匿名卷,用来把依赖目录与宿主机文件隔开。.env 与 Dockerfile 会被脚本保留下来,方便你改配置后重新构建。
五、可配置项(.env)
部署包里的 .env 项项都有注释,通过 --env-file 注入容器:
| 变量 | 默认值 | 说明 |
|---|---|---|
TZ | Asia/Shanghai | 容器时区 |
PHP_MEMORY_LIMIT | 256M | PHP 内存上限 |
PHP_UPLOAD_MAX_FILESIZE | 100M | 单文件上传大小上限 |
PHP_POST_MAX_SIZE | 100M | POST 请求体上限 |
PHP_MAX_EXECUTION_TIME | 300 | 脚本最长执行时间(秒) |
PHP_MAX_INPUT_TIME | 300 | 输入解析超时(秒) |
PHP_DISPLAY_ERRORS | Off | 是否在页面显示错误(生产用 Off,调试改 On) |
PHP_ERROR_REPORTING | E_ALL | 错误报告级别 |
PHP_OPCACHE_TIMESTAMPS | 0 | OPCache 时间戳校验。生产建议 0(性能优先),开发改 1(改代码立即生效) |
改完 .env 后重新执行一次 install.sh(或手动 docker build + docker run)即可生效。
六、访问与反向代理
容器只把端口绑在 127.0.0.1:5200 上——这是刻意的:不直接对外暴露,需要域名访问时由 Nginx 转发。
curl -I http://127.0.0.1:5200location / {
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 源过期折腾过,这个脚本想省下的就是那段时间。





