Docker 安装与部署
本指南适用于 LCP4 单机 Docker 部署。前端、Nginx 和 Java 引擎已合并为统一应用服务 app,由 Docker Compose 管理应用和中间件。旧版 V3 的安装脚本、独立 web / engine 容器和默认登录密码不适用于全新安装。
1. 部署前准备
- 推荐 Ubuntu 24.04 LTS、8 核 CPU、16 GB 内存、200 GB 可用磁盘。
- 安装 Docker Engine 和 Docker Compose v2;以下命令使用
docker compose。 - 在线部署需能访问代码仓库、应用镜像仓库和中间件镜像源,私有仓库需具备读取权限;离线部署按第 10 节提前准备安装包、部署文件和全部镜像。
- 默认网站端口为 90,确认未占用,并在防火墙或云安全组放行实际网站端口。
- Compose 固定子网为
172.66.3.0/24,确认不与现有网络冲突。
CentOS 在线安装 Docker
以下为使用 yum 和 Docker CE CentOS 软件源的安装方式。CentOS 7、CentOS Linux 8 已停止维护,旧系统的软件源和可安装版本可能受限;已有环境应选择与系统版本兼容的 Docker Engine 和 Compose v2 软件包。
sudo yum install -y yum-utils ca-certificates curl git openssl
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version
软件源访问异常时参考 yum 镜像无法访问,并检查网络、DNS 和系统版本。源中缺少 Compose v2 插件时使用第 10 节的独立插件安装方式;旧版 docker-compose v1 不能替代本指南使用的 Compose v2。
Ubuntu 在线安装 Docker
使用 Docker 官方 Ubuntu 软件源安装:
sudo apt-get update
sudo apt-get install -y ca-certificates curl git openssl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
. /etc/os-release
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu ${UBUNTU_CODENAME:-$VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version
华为欧拉(openEuler)
按实际 openEuler 版本和 CPU 架构选择兼容的 Docker Engine 软件包,不直接套用 Ubuntu 的 apt 命令或 CentOS 软件源。保留原文档的 openEuler 安装参考,安装后执行 docker version 和 docker compose version 核对。参考资料中的旧 Compose 命令需改为本指南的 Compose v2;离线部署准备该系统兼容的 RPM 包及依赖。
后续命令以具有 Docker 操作权限的账号执行。
配置镜像仓库
默认应用镜像为 125.75.152.167:5001/lcp4:latest,仓库使用 HTTP。编辑 /etc/docker/daemon.json,将以下内容合并到已有配置:
{
"insecure-registries": ["125.75.152.167:5001"],
"log-driver": "json-file",
"log-opts": {"max-size": "500m", "max-file": "3"}
}
新服务器如需指定存储位置,可在同一个 JSON 对象中增加 "data-root": "/data2/docker"。已有服务器需先迁移原 Docker 数据,不能仅修改路径。
sudo systemctl restart docker
重启会影响服务器上的容器,请安排维护时间。仓库要求认证时,执行 docker login 125.75.152.167:5001。
2. 获取部署文件
从 LCP4 仓库检出 deploy/,无需在服务器编译前后端:
git clone --depth 1 --filter=blob:none --sparse --branch main http://git.zhoujusoft.com/products/lcp4.git lcp4
cd lcp4
git sparse-checkout set deploy
chmod +x deploy/install deploy/scripts/lcp-deploy.sh
服务器无法访问仓库时,由维护人员提供同一版本的完整 deploy/ 部署包,包括隐藏文件 .env.example、脚本、Nginx 配置、配置模板和数据库初始化文件。
3. 初始化并填写配置
填写环境:运行 Docker 的 Linux 部署服务器(宿主机)。 通过 SSH 登录该服务器,在下载或解压的 lcp4/ 目录中执行以下命令,编辑服务器上的 lcp4/deploy/.env 文件。不是在本地 Windows 环境变量、容器内部或平台页面中填写。
例如项目放在 /data/lcp4,配置文件的完整路径就是 /data/lcp4/deploy/.env:
cd /data/lcp4 # 替换为服务器上的实际项目路径
./deploy/scripts/lcp-deploy.sh init
chmod 600 deploy/.env
vi deploy/.env
全新安装初始化会创建配置和数据目录,不覆盖已有 .env 或配置文件。
在 .env 中找到对应配置项,将值填写在等号后并保存。以下仅展示填写格式,文字占位值必须替换为实际密码、独立生成的密钥和部署标识:
LCP_INITIAL_USER_PASSWORD=你设置的管理员密码
LCP_JWT_SECRET=生成的JWT密钥
LCP_AES_SECRET=生成的AES密钥
LCP_SM3_KEY=生成的SM3密钥
LCP_SM2_PRIVATE_KEY=生成的单行Base64私钥
LCP_LICENSE_DEVICE_CODE=稳定的部署标识
后文的 openssl 命令也在该 Linux 服务器终端执行,将生成结果填入此文件。首次配置保存后,再按第 4 节运行 ./install;Docker Compose 会读取 .env,将配置传入相应容器。已有服务修改 .env 后需重新创建相应容器,仅执行 docker compose restart 不会加载新的环境变量。
首次安装必填项
| 配置项 | 说明 |
|---|---|
LCP_INITIAL_USER_PASSWORD | 首次创建管理员的密码,没有内置默认密码 |
LCP_JWT_SECRET | 独立的签名密钥,至少 32 个随机字节 |
LCP_AES_SECRET | 持久保存的加密密钥 |
LCP_SM3_KEY | 持久保存的主 SM3 密钥 |
LCP_SM2_PRIVATE_KEY | SM2 私钥,PKCS#8 DER 格式的单行 Base64 |
LCP_LICENSE_DEVICE_CODE | 授权申请前设置稳定部署标识,容器重建时保持一致 |
新安装可分别执行 openssl rand -hex 32 生成 JWT、AES、SM3 的随机值,每项使用独立值。支持 SM2 的 OpenSSL 可生成参数加密私钥:
umask 077
openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:SM2 -out lcp-sm2.pem
openssl pkcs8 -topk8 -nocrypt -in lcp-sm2.pem -outform DER | openssl base64 -A
将输出的单行 Base64 填入 LCP_SM2_PRIVATE_KEY,妥善保存私钥与 .env。升级保留原有密钥;读取旧密文时保留原部署的 LCP_LEGACY_DES_KEY 和实际使用的 LCP_SM3_BAK_KEY。不要在升级、重建或重启时重新生成密钥。
常用配置
| 配置项 | 默认值 / 用途 |
|---|---|
LCP_IMAGE | 125.75.152.167:5001/lcp4:latest;可固定已发布标签 |
LCP_COMPOSE_PROJECT | 新安装为 lcp;升级填写原 Compose 项目名 |
WEB_PORT | 90,宿主机网站端口 |
LCP_TENANT_TYPE | single;多租户用 multiple 并设置 LCP_DOMAIN_NAME |
LCP_PUBLIC_API_URL | / |
LCP_HTTP_PROXY_PROJECTS | web,mobile,manage |
LCP_STORAGE_TYPE | mongo,可选 minio |
USE_YAML_TENANT_DATABASE | 生产部署保持 false |
启用 HTTP 代理时,LCP_PUBLIC_API_URL 必须为 /,不能改为 /api,否则会拼接为 /api/api/proxy。config/engine/application-local.yml 中的 db.proxyAddress 保持 http://127.0.0.1:8080/,不改为宿主机地址,也不追加 /api。
中间件账号和连接项以 .env.example 为准。新安装修改 MySQL 密码时同步修改 MYSQL_ROOT_PASSWORD 和对应 LCP_DB_*_PASSWORD;RabbitMQ 同步修改 RABBITMQ_DEFAULT_PASS 与 LCP_MQ_PASSWORD;Redis 同步修改 config/redis/redis.conf 与 LCP_REDIS_PASSWORD。已有数据库修改 .env 不会自动修改库内密码。
已有租户使用主库保存的中间件配置,生产修改数据库、Mongo、MQ、Redis 连接应通过平台配置后重启应用,不要开启开发隔离开关 USE_YAML_TENANT_DATABASE。
4. 安装并访问
配置完成后执行:
cd deploy
./install
./install status
./install log
安装入口执行幂等初始化,从应用镜像补齐缺失的前端运行资源,并启动服务。首次启动时 MySQL 初始化三个数据库;单机离线模式下,引擎发现没有默认租户时自动创建 00000000 租户、业务表、管理员和内置菜单,无需手工导入初始数据库包。
容器运行且应用日志无启动错误后访问:
- 平台入口:
http://服务器IP:90/ - 管理后台:
http://服务器IP:90/backstage/ - 移动端:
http://服务器IP:90/mobile/
实际端口以 WEB_PORT 为准。首次管理员为 administrator,密码为自行填写的 LCP_INITIAL_USER_PASSWORD。已有部署升级继续使用原账号密码,修改该变量不会重置已有用户。
验证登录、后台页面和接口正常后,按平台提示配置授权。容器运行状态不代表应用已完成初始化,需结合日志和实际页面验证。
5. 网络与数据目录
| 服务 | 固定容器地址 | 默认宿主机端口 |
|---|---|---|
app | 172.66.3.22,别名 web、engine | 90 → 容器 8080 |
mongo | 172.66.3.4 | 50007 → 容器 27017 |
mq | 172.66.3.5 | 5672、管理端 15672 |
redis | 172.66.3.6 | 6379 |
mysql | 172.66.3.7 | 3306 |
minio(可选) | 172.66.3.8 | 9000、控制台 9001 |
应用通过服务名连接中间件。容器内 Nginx 将 /api/ 转发到同容器引擎 127.0.0.1:5000,无需额外发布引擎端口。中间件端口按运维需要限制访问,不必全部对公网开放。
以下路径均相对于 deploy/:
| 路径 | 内容 |
|---|---|
.env | 部署变量、账号和持久密钥 |
config/engine/ | 引擎配置 |
config/redis/redis.conf | Redis 配置 |
config/mysql/ | MySQL 首次初始化脚本 |
config/logs/engine/ | 引擎日志 |
config/drivers/、config/fonts/ | 扩展驱动、字体 |
config/imgs/config/、config/languages/ | 前端运行时配置和语言资源 |
data/db/ | MySQL 数据 |
data/mongo/、data/mongo-config/ | Mongo 数据与配置数据 |
data/minio/ | 可选 MinIO 文件数据 |
备份数据库、文件存储、配置和密钥,并验证可恢复性。不要挂载旧 config/nginx-web 覆盖统一应用的 Nginx 配置。
6. 修改端口与日常升级
在 deploy/ 编辑 .env 的 WEB_PORT,然后重建应用:
docker compose up -d --no-deps app
日常镜像升级:
./install upgrade
./install status
./install log
upgrade 只拉取并重建 app,不会重启 MySQL、MQ、Redis、Mongo。它使用 --remove-orphans,会删除同一 Compose 项目中不再定义的旧容器,执行前确认项目名正确。升级前备份,升级后验证登录、接口、后台和文件读写。
指定版本时,将 LCP_IMAGE 改为已发布标签,再执行 ./install upgrade。涉及数据库结构变更的回退需评估数据兼容性,不能仅切换镜像。
7. 从 3.0 迁移到 4.0
迁移采用重新安装 4.0 服务,再迁移或备份还原历史数据的方式。应用及其他服务按本指南重新安装;必须保留的数据分为两部分:MySQL 平台及业务数据库,以及 Mongo 或 MinIO 中的文件数据。文件存储按 3.0 实际使用的类型迁移;两种存储均有历史数据时,两者都要迁移。
7.1 停写与备份准备
- 记录 3.0 使用的 MySQL 版本、全部平台数据库与租户数据库、文件存储类型、Mongo 数据库或 MinIO Bucket,以及连接账号和地址。
- 安排维护窗口,停止旧应用及其他写入任务,保留旧 MySQL、Mongo / MinIO 运行以完成备份。数据库与文件数据应在同一停写窗口备份,避免附件记录与实际文件不一致。
- 另行保存原配置、加密密钥和授权信息,用于恢复连接与读取历史密文;不要直接用旧配置覆盖 4.0 配置模板。
- 保留原服务和数据供回退,迁移验收前不要删除旧数据。
7.2 重新安装 4.0 的基础服务
按第 2、3 节获取部署文件并初始化配置。新服务使用新的部署目录;同机迁移需先停止冲突的旧服务,或调整端口及网络,避免 172.66.3.0/24 和固定地址冲突。
先启动新中间件并恢复数据,再启动应用,不要让应用对空库创建新的平台数据。在新 lcp4/deploy/ 目录执行:
docker compose up -d mysql mq redis mongo
# 原部署使用 MinIO 时,先在 .env 设置 LCP_STORAGE_TYPE=minio 和 MinIO 密码,再执行:
docker compose --profile minio up -d --wait minio
7.3 MySQL 数据迁移或备份还原
推荐逻辑备份还原,将 3.0 的平台主库、全部租户业务库、日志库及其他实际使用的业务数据库完整恢复到新 MySQL。不能只迁移默认租户,也不要把旧 mysql 系统库直接覆盖到新服务。
使用与源 MySQL 版本匹配的客户端备份;以下示例的数据库名需替换或补齐为实际清单。密码使用交互输入:
# 在能连接旧 MySQL 的服务器上执行
mysqldump -h OLD_MYSQL_HOST -P 3306 -u root -p \
--single-transaction --routines --triggers --events --hex-blob \
--databases lcpmaster_java lcp_00000000 lcplog_00000000 \
--result-file=lcp3-mysql.sql
# 将备份文件传到新服务器,再恢复到新 MySQL
mysql -h NEW_MYSQL_HOST -P 3306 -u root -p -e 'source /backup/lcp3-mysql.sql'
/backup/lcp3-mysql.sql 是运行 MySQL 客户端的机器上的备份路径。恢复前确认备份命令成功、文件完整,恢复后检查数据库、关键表与记录数量。非事务表需在停写状态下采用适合的锁表或备份方案。
新服务重新创建应用所需的数据库账号和授权,并同步 .env 中连接密码。主库保存的租户数据库地址、Mongo / MinIO 连接配置也需按新服务地址核对,不能继续指向已停用的旧服务。
也可以迁移 MySQL 数据目录到 deploy/data/db/,但仅用于已确认版本及数据格式兼容的物理迁移:先正常停止源和目标 MySQL,完整复制数据目录并保留权限,再启动目标。不要复制运行中的数据目录,也不要把不同版本的数据文件直接混用;版本不确定时使用备份还原。
7.4 Mongo 文件数据迁移或备份还原
3.0 使用 Mongo 文件存储时,备份所有实际使用的租户文件数据库,包含 GridFS 的文件信息和分块集合,不要只导出文件记录。可使用 MongoDB Database Tools,以下示例每个实际数据库执行一次:
mongodump --host OLD_MONGO_HOST --port 27017 \
--db lcp_00000000 --archive=lcp3-mongo-00000000.archive --gzip
mongorestore --host NEW_MONGO_HOST --port 50007 \
--archive=lcp3-mongo-00000000.archive --gzip
源端口按旧部署实际值填写;新服务从宿主机连接默认使用 50007,容器网络内为 27017。启用认证时补充用户名、认证数据库并交互输入密码。目标使用空的对应数据库,逐一核对工具与源、目标 Mongo 版本兼容性。
恢复后核对集合、文件数量及实际附件下载。也可在正常停止源、目标 Mongo 后,完整迁移数据目录到 deploy/data/mongo/ 和对应 deploy/data/mongo-config/,保留权限;物理迁移必须确认 Mongo 版本兼容。
7.5 MinIO 文件数据迁移或备份还原
3.0 使用 MinIO 时,将 .env 中 LCP_STORAGE_TYPE 设置为 minio。安装 MinIO Client(mc),配置旧、新服务别名后,按原名称创建目标 Bucket,并逐一迁移对象:
# 将地址、账号和密钥替换为实际值,在可信终端执行
mc alias set old http://OLD_MINIO_HOST:9000 OLD_ACCESS_KEY OLD_SECRET_KEY
mc alias set new http://NEW_MINIO_HOST:9000 NEW_ACCESS_KEY NEW_SECRET_KEY
mc mb --ignore-existing new/BUCKET_NAME
mc mirror --preserve old/BUCKET_NAME new/BUCKET_NAME
mc diff old/BUCKET_NAME new/BUCKET_NAME
保留 Bucket 名称和对象路径,所有业务 Bucket 都要迁移。也可从已有的对象备份恢复到新 Bucket。普通对象镜像迁移不等于完整恢复版本历史、删除标记、Bucket 策略、生命周期和用户权限;原环境使用这些功能时需另行迁移配置及历史版本,并核对结果。
不要把正在运行的 MinIO 数据目录直接复制到新服务。物理数据迁移需停写、停止源和目标服务,并确认 MinIO 版本与磁盘布局兼容;通常优先使用对象迁移或备份恢复。
7.6 启动应用并验收
确认 MySQL 和原存储类型的数据已恢复后,核对新服务连接配置。保留读取历史数据所需的原加密密钥;已有租户的存储配置需指向恢复后的 Mongo 或 MinIO,修改 .env 不会自动覆盖主库中已保存的租户配置。
在 lcp4/deploy/ 执行:
./install
./install status
./install log
使用原管理员账号密码登录,检查租户、用户、业务表单和历史数据,并验证历史附件、图片可预览下载及新文件可上传。验收通过后切换访问入口,再停用旧环境;失败时停止新应用、恢复旧入口,在恢复业务写入前确认数据一致性。
8. 可选 MinIO 存储
默认使用 Mongo,无需 MinIO。新安装使用内置 MinIO 时设置:
LCP_STORAGE_TYPE=minio
MINIO_ROOT_USER=lcpminio
MINIO_ROOT_PASSWORD=请替换为独立安全密码
不能保留 change-me-minio。在 deploy/ 执行 ./install,脚本启用 MinIO profile,等待 MinIO 健康后启动应用并注入连接信息。外部 MinIO 使用 LCP_MINIO_ENDPOINT、LCP_MINIO_ACCESS_KEY、LCP_MINIO_SECRET_KEY;当前脚本在 minio 模式仍启用内置 MinIO 服务,需按实际方案调整编排。
已有租户更换存储需通过平台配置并迁移历史文件,修改 .env 不会自动迁移 Mongo 文件或覆盖已有租户存储配置。
9. 常用命令与排障
在 deploy/ 目录执行:
./install status # 查看容器状态
./install log # 跟踪应用日志,Ctrl+C 退出
./install log mysql # 查看 MySQL 日志
./install upgrade # 拉取并重建应用
./install restart # 重启编排服务,包括中间件
./install down # 删除编排容器和网络,保留绑定的数据目录
仅重启应用使用 docker compose restart app。不要删除 data/ 解决启动错误。./install config 输出展开的配置,包含敏感信息,不要公开。
| 现象 | 检查方向 |
|---|---|
| 镜像仓库 HTTPS / HTTP 不匹配 | 检查 insecure-registries 是否包含仓库地址,并确认已重启 Docker |
| 提示缺少 JWT、AES 或 SM3 密钥 | 检查 .env 必填值,升级时恢复原密钥 |
| 登录参数加密失败 | 检查 SM2 私钥是否为正确的单行 PKCS#8 DER Base64 |
| 网站无法访问 | 检查应用日志、WEB_PORT、端口占用、防火墙与安全组 |
/api/api/proxy 或代理异常 | 检查 API 根路径、引擎回环代理地址与统一 Nginx 配置 |
| 数据库连接失败或出现空平台 | 检查密码、原项目名、数据挂载和主库租户连接配置 |
| 创建网络失败 | 检查 172.66.3.0/24 是否冲突,调整时同步全部固定地址 |
本指南依据 LCP4 的 deploy/README.md、.env.example、docker-compose.yml、install 和 scripts/lcp-deploy.sh 更新,交付版本变化时需同步核对。
10. 离线部署
离线部署适用于目标服务器无法访问互联网或镜像仓库的环境。准备工作在联网机器完成,安装和配置在离线 Linux 服务器执行。离线部署同样使用统一应用镜像,不需要在目标服务器编译前后端。
10.1 离线服务器安装 Docker 并导入镜像
先使用离线安装包安装 Docker 和 Compose v2。以下为 Ubuntu 示例,目录须包含全部依赖:
sudo dpkg -i /media/offline/docker-packages/*.deb
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version
CentOS 使用与目标系统版本和架构匹配的 RPM 包,提前准备 Docker Engine、CLI、containerd、Compose 插件及全部依赖,然后在离线服务器执行:
sudo yum --disablerepo='*' localinstall -y /media/offline/docker-packages/*.rpm
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version
软件包路径按实际位置替换。Ubuntu 或 CentOS 提示缺少依赖时,在联网环境补齐对应安装包再安装,不要跳过依赖检查。openEuler 同样准备本地 RPM,但必须使用该系统兼容的软件包。
如果已安装 Docker Engine,只缺 Compose v2,可在联网机器从 Compose 官方发布页 下载指定 v2.x 版本的 Linux 插件。Compose v2 是 2.x 版本,与 Engine 版本不同;x86_64 下载 docker-compose-linux-x86_64,ARM64 下载 docker-compose-linux-aarch64。将文件及官方校验信息传入离线服务器,校验后安装,以下为 x86_64 示例:
sudo mkdir -p /usr/local/lib/docker/cli-plugins
sudo install -m 0755 /media/offline/docker-compose-linux-x86_64 \
/usr/local/lib/docker/cli-plugins/docker-compose
docker compose version
此方式适用于兼容的 CentOS、Ubuntu 等 Linux 环境,仅安装 Compose 插件,不包含 Engine。所选版本须与当前 Engine 兼容,并支持本指南使用的 --wait、--pull never 选项。
导入app及各中间件离线镜像包。
确认导入镜像的名称、标签与 .env 中所有镜像变量完全一致。
10.2 离线配置与首次启动
在离线服务器执行第 3 节的初始化和配置:
cd /data/lcp4
chmod +x deploy/install deploy/scripts/lcp-deploy.sh
./deploy/scripts/lcp-deploy.sh init
chmod 600 deploy/.env
vi deploy/.env
填写密码、持久密钥和部署标识;LCP_IMAGE 及全部中间件镜像变量应指向已导入的准确标签。需要 MinIO 时设置 LCP_STORAGE_TYPE=minio 与独立密码,并确认 MinIO 镜像已导入。
全新安装配置完成后执行:
cd deploy
./install
./install status
./install log
./install 在应用镜像本地存在时可直接从该镜像补齐运行资源;默认 Compose 没有强制始终拉取的策略,本地镜像齐全时可离线启动。出现尝试连接镜像仓库的错误时,检查是否漏导入镜像或镜像名称、标签不一致。
3.0 迁移不要直接启动空库上的应用:先按第 7 节启动新中间件并恢复 MySQL 和 Mongo / MinIO 数据,再执行 ./install。备份恢复使用已交付的本地工具。
按第 4 节通过内网地址访问,验证登录、接口和文件读写。邮件、第三方接口、云模型及在线授权等依赖外部网络的功能,需要单独配置内网可达服务或办理对应离线授权。
10.3 离线升级
在联网机器准备新版本应用镜像归档及匹配的部署文件,校验并传入离线服务器。备份数据、配置与密钥,按交付说明更新部署文件,保留现有 .env、config/ 和 data/,然后执行:
vi .env # 将 LCP_IMAGE 设置为本次导入的新版本标签
docker compose up -d app
./install status
./install log
新版本继续使用 latest 标签时,也需导入新的镜像并使用 --force-recreate 重建应用。此命令只更新应用,不重启中间件;若交付版本要求更新中间件,需额外交付相应镜像并按该版本迁移说明操作。
升级后验证历史数据、附件和新文件上传。不要通过重新生成密钥或清空数据目录处理升级问题。