ERP 企业生产管理系统部署手册

基于 Docker 容器化的单机部署方案:MySQL · Redis · Spring Boot · Nginx

|------|---------------------------------------------|
| 文档信息 ||
| 文档类别 | 技术部署手册 |
| 适用系统 | JSH_ERP 开源 ERP(Spring Boot + MySQL + Redis) |
| 部署方式 | Docker 单机四容器(docker run + 自定义网络) |
| 发布日期 | 2026 年 11 月 |

目录

概述

系统简介

部署架构

环境要求

部署前须知

一、环境准备

[1.1 安装基础工具与 Docker](#1.1 安装基础工具与 Docker)

[1.2 验证 Docker 环境](#1.2 验证 Docker 环境)

[1.3 安装 JDK 8 与 Maven(用于源码打包)](#1.3 安装 JDK 8 与 Maven(用于源码打包))

[二、拉取 JSH_ERP 项目源码](#二、拉取 JSH_ERP 项目源码)

[2.1 克隆仓库](#2.1 克隆仓库)

[2.2 确认项目结构](#2.2 确认项目结构)

三、修改配置并打包后端

[3.1 修改数据源与 Redis 配置](#3.1 修改数据源与 Redis 配置)

[3.2 Maven 打包](#3.2 Maven 打包)

[3.3 准备 Dockerfile](#3.3 准备 Dockerfile)

四、创建容器网络

[五、部署 MySQL 数据库](#五、部署 MySQL 数据库)

[5.1 启动 MySQL 容器](#5.1 启动 MySQL 容器)

[5.2 验证 MySQL 就绪](#5.2 验证 MySQL 就绪)

[5.3 导入 ERP 初始化数据](#5.3 导入 ERP 初始化数据)

[六、部署 Redis 缓存](#六、部署 Redis 缓存)

[七、构建并部署 Spring Boot 后端](#七、构建并部署 Spring Boot 后端)

[7.1 构建后端镜像](#7.1 构建后端镜像)

[7.2 启动后端容器](#7.2 启动后端容器)

[7.3 验证后端启动成功](#7.3 验证后端启动成功)

[八、部署 Nginx 反向代理](#八、部署 Nginx 反向代理)

[8.1 准备 Nginx 配置](#8.1 准备 Nginx 配置)

[8.2 启动 Nginx 容器](#8.2 启动 Nginx 容器)

[8.3 验证代理链路](#8.3 验证代理链路)

九、浏览器访问验证

[9.1 访问系统](#9.1 访问系统)

[9.2 登录系统](#9.2 登录系统)

[9.3 部署验收清单](#9.3 部署验收清单)

十、常见问题排查

附录:常用命令速查

概述

系统简介

JSH_ERP(又称"华夏 ERP")是一款开源的企业级进销存/生产管理系统,技术栈为 Spring Boot + MyBatis + MySQL + Redis,功能覆盖采购、销售、库存、生产与财务报表。本手册介绍如何在一台 Linux 服务器上使用 Docker 容器化部署 JSH_ERP,并通过浏览器访问系统。

部署架构

本方案将 MySQL、Redis、Spring Boot 后端、Nginx 四个服务以容器方式集中部署在同一台服务器上,通过自定义 Docker 桥接网络 erp-net 实现容器间通信:

  1. 后端容器通过容器名 mysql:3306、redis:6379 访问数据库与缓存;
  2. Nginx 容器将 80 端口的 HTTP 请求反向代理到后端容器的 9999 端口;
  3. 外部浏览器只需访问 http://服务器IP 即可使用系统。

架构链路:浏览器 → 服务器 80 端口(Nginx 容器)→ jsh-erp 容器 9999 端口(Spring Boot)→ mysql / redis 容器 。

环境要求

|--------|------------------------------------------|
| 项目 | 要求 |
| 操作系统 | Linux(CentOS 7+/Ubuntu 20.04+ 均可) |
| 硬件配置 | 建议 2 核 CPU / 4GB 内存 / 20GB 磁盘以上 |
| 软件依赖 | Git、Docker 20.10+、JDK 8 与 Maven(仅打包阶段使用) |
| 网络要求 | 服务器可访问公网(拉取镜像与源码) |

部署前须知

  1. 手册默认以 root 用户操作;非 root 用户请在命令前加 sudo。
  2. 版本约定:MySQL 使用 5.7(兼容性最好,MySQL 8 的注意事项见"常见问题排查")、Redis 6.2、Nginx 1.25、JDK 8。
  3. 预计部署时长:首次操作约 40~60 分钟(含源码构建)。

一、环境准备

1.1 安装基础工具与 Docker

以 CentOS 7 为例(Ubuntu 将 yum 换为 apt 即可):

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 安装 Git 及基础工具 yum install -y git vim curl # 安装 Docker(使用阿里云镜像源) curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 启动 Docker 并设置开机自启 systemctl start docker systemctl enable docker |

1.2 验证 Docker 环境

|------------------------------|
| docker --version docker info |

预期输出示例:Docker version 24.x.x, build xxxxx,且 docker info 能正常显示 Server 信息。若报错 Cannot connect to the Docker daemon,请确认已执行 systemctl start docker。

1.3 安装 JDK 8 与 Maven(用于源码打包)

|------------------------------------------------------------------------------------------------------|
| # 安装 OpenJDK 8 与 Maven yum install -y java-1.8.0-openjdk-devel maven # 验证 java -version mvn -version |

预期输出:openjdk version "1.8.0_xxx" 与 Apache Maven 3.x.x。

|----------------------------------------------------------|
| ⚠️ 注意:JSH_ERP 后端基于 JDK 8 开发,请勿使用更高版本 JDK 编译,否则可能出现依赖不兼容。 |

二、拉取 JSH_ERP 项目源码

2.1 克隆仓库

|------------------------------------------------------------------------------------------------------------------------------------------|
| # 创建部署工作目录 mkdir -p /opt/jsherp && cd /opt/jsherp # 从 Gitee 拉取项目(国内访问更快) git clone https://gitee.com/jishenghua/JSH_ERP.git cd JSH_ERP |

预期输出:仓库开始下载,完成后 ls 可见后端 Maven 工程(含 pom.xml、src/ 目录)。

|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 💡 说明:主仓库即完整的 Spring Boot 后端源码;Vue 前端位于独立仓库 jshERP-web。本手册采用单体 jar 方式部署,无需单独构建前端。若 Gitee 访问异常,可改用 GitHub 镜像地址 https://github.com/jishenghua/JSH_ERP.git。 |

2.2 确认项目结构

|-------|
| ls -l |

重点关注三项:

  1. pom.xml ------ Maven 构建配置;
  2. src/main/resources/application.properties ------ 数据库与 Redis 连接配置(下一步修改);
  3. 项目根目录下的数据库初始化脚本(jshERP.sql 或同名 .sql 文件,以仓库实际文件为准)。

三、修改配置并打包后端

3.1 修改数据源与 Redis 配置

编辑 src/main/resources/application.properties:

|-----------------------------------------------|
| vim src/main/resources/application.properties |

将数据库与 Redis 的连接地址改为容器名 (容器在同一 Docker 网络内可通过容器名互访):

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # MySQL 数据源:主机名改为容器名 mysql,端口 3306,库名 jsh_erp spring.datasource.url=jdbc:mysql://mysql:3306/jsh_erp?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=jsherp@2024 # Redis:主机名改为容器名 redis,端口 6379 spring.redis.host=redis spring.redis.port=6379 spring.redis.password= |

|--------------------------------------------------------------------------------------------|
| ⚠️ 注意:mysql、redis 即后续第五、六步创建的容器名,必须保持一致;spring.redis.password 为空表示 Redis 未设置密码,与第六步部署方式对应。 |

3.2 Maven 打包

|---------------------------------------------------|
| # 在项目根目录执行,跳过测试加快构建 mvn clean package -DskipTests |

预期输出:末尾出现 BUILD SUCCESS,target/ 目录下生成可执行文件(如 jshERP.war,Spring Boot 可执行包)。

|-------------------------------------------------|
| ls -lh target/*.war target/*.jar 2>/dev/null |

记下实际生成的文件名,下文统一以 jshERP.war 表示。

3.3 准备 Dockerfile

在项目根目录创建 Dockerfile:

|----------------|
| vim Dockerfile |

内容如下:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| # 基础镜像:JRE 8 运行环境 FROM openjdk:8-jre # 将打包产物复制进镜像并重命名 COPY target/jshERP.war /app/jshERP.war # 后端服务端口 EXPOSE 9999 # 启动命令 ENTRYPOINT "java", "-jar", "/app/jshERP.war" |

四、创建容器网络

四个服务共用一个自定义桥接网络,这是容器间用容器名互相访问的前提:

|--------------------------------------------------------------------------------------------------------------------------|
| # 创建名为 erp-net 的桥接网络 docker network create --driver bridge erp-net # 验证 docker network ls docker network inspect erp-net |

预期输出:docker network ls 中出现名为 erp-net、driver 为 bridge 的网络;inspect 显示 Containers 为空(后续容器加入后会列出)。

|---------------------------------------------------------------------------------------------------|
| 💡 原理说明:同一自定义 bridge 网络内的容器,Docker 内置 DNS 会自动将容器名解析为对应容器 IP,因此配置文件中写 mysql、redis 即可,无需知道实际 IP 地址。 |

五、部署 MySQL 数据库

5.1 启动 MySQL 容器

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| docker run -d \ --name mysql \ --network erp-net \ --restart=always \ -e MYSQL_ROOT_PASSWORD=jsherp@2024 \ -e MYSQL_DATABASE=jsh_erp \ -e TZ=Asia/Shanghai \ -v mysql-data:/var/lib/mysql \ -p 3306:3306 \ mysql:5.7 \ --character-set-server=utf8mb4 \ --collation-server=utf8mb4_general_ci |

参数说明:

|------------------------------|---------------------------------------|
| 参数 | 作用 |
| --name mysql | 容器名,与后端配置中的数据源主机名一致 |
| --network erp-net | 加入自定义网络,供后端容器访问 |
| -e MYSQL_ROOT_PASSWORD | root 密码,需与 application.properties 中一致 |
| -e MYSQL_DATABASE=jsh_erp | 启动时自动创建 jsh_erp 库 |
| -v mysql-data:/var/lib/mysql | 数据持久化到命名卷,容器删除数据不丢 |
| -p 3306:3306 | 映射到宿主机,便于外部工具调试(可省略) |
| --character-set-server | 字符集设为 utf8mb4,避免中文乱码 |

5.2 验证 MySQL 就绪

|----------------------|
| docker logs -f mysql |

预期输出:日志末尾出现 ready for connections. Version: '5.7.x',按 Ctrl+C 退出日志。

5.3 导入 ERP 初始化数据

|-------------------------------------------------------------------------------------------------------------------|
| # 在项目根目录执行,将 SQL 脚本导入 jsh_erp 库(按实际脚本文件名调整) docker exec -i mysql mysql -uroot -pjsherp@2024 jsh_erp < jshERP.sql |

验证导入结果:

|---------------------------------------------------------------------------------|
| docker exec -it mysql mysql -uroot -pjsherp@2024 -e "USE jsh_erp; SHOW TABLES;" |

预期输出:列出 jsh_user、jsh_material、jsh_depot 等业务表。

六、部署 Redis 缓存

|----------------------------------------------------------------------------------------------------------------------------|
| docker run -d \ --name redis \ --network erp-net \ --restart=always \ -v redis-data:/data \ -p 6379:6379 \ redis:6.2 |

验证 Redis 就绪:

|--------------------------------------|
| docker exec -it redis redis-cli ping |

预期输出:PONG。

|---------------------------------------------------------------------------------------------------------------------|
| 💡 说明:此处 Redis 未设置密码,与 3.1 节配置 spring.redis.password=(空)对应。若生产环境需要密码,可在启动命令后追加 --requirepass "你的密码",并同步修改后端配置后重新打包。 |

七、构建并部署 Spring Boot 后端

7.1 构建后端镜像

在项目根目录(Dockerfile 所在位置)执行:

|-----------------------------------|
| docker build -t jsherp-boot:1.0 . |

预期输出:分步执行 FROM、COPY、EXPOSE 等指令,末尾出现 Successfully tagged jsherp-boot:1.0。

|------------------------------|
| docker images | grep jsherp |

预期输出:镜像列表中出现 jsherp-boot 1.0。

7.2 启动后端容器

|------------------------------------------------------------------------------------------------------------------------------------|
| docker run -d \ --name jsh-erp \ --network erp-net \ --restart=always \ -e TZ=Asia/Shanghai \ -p 9999:9999 \ jsherp-boot:1.0 |

7.3 验证后端启动成功

|------------------------|
| docker logs -f jsh-erp |

预期输出:Spring Boot 启动日志,出现 Tomcat started on port(s): 9999 且无报错;按 Ctrl+C 退出日志。

再用 curl 直连后端验证:

|-------------------------------|
| curl -I http://localhost:9999 |

预期输出:返回 HTTP/1.1 200 或 302(非 Connection refused 即表示服务已监听)。

八、部署 Nginx 反向代理

8.1 准备 Nginx 配置

在宿主机创建配置文件目录与配置:

|--------------------------------------------------------------------|
| mkdir -p /opt/jsherp/nginx && vim /opt/jsherp/nginx/default.conf |

写入以下内容(核心为 proxy_pass 指向后端容器):

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| server { listen 80; # 对外服务端口 server_name _; location / { proxy_pass http://jsh-erp:9999; # 容器名 jsh-erp,由 erp-net 网络解析 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; proxy_read_timeout 300s; } } |

8.2 启动 Nginx 容器

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| docker run -d \ --name nginx \ --network erp-net \ --restart=always \ -v /opt/jsherp/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro \ -p 80:80 \ nginx:1.25 |

8.3 验证代理链路

|---------------------------------------------------------------------------------------------------------------------------------------|
| # 检查四个容器是否全部运行 docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" # 通过 80 端口访问,验证 Nginx → 后端链路 curl -I http://localhost |

预期输出:docker ps 列出 nginx、jsh-erp、mysql、redis 四个容器且状态均为 Up;curl 返回 HTTP/1.1 200 或 302。

九、浏览器访问验证

9.1 访问系统

在与服务器同网络的客户端浏览器中打开:

|--------------|
| http://服务器IP |

|-----------------------------------------------------------------------------------------------------------------------------------|
| ⚠️ 注意:若云服务器无法访问,请到云控制台安全组 放行 80 端口(TCP 入方向);本地防火墙可用 firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --reload 放行。 |

9.2 登录系统

使用默认管理员账号登录:

|--------|--------------|
| 项目 | 值 |
| 登录地址 | http://服务器IP |
| 默认账号 | admin |
| 默认密码 | 123456 |

9.3 部署验收清单

依次确认以下各项,全部通过即部署成功:

  1. □ 浏览器能打开登录页,页面样式与验证码图片正常显示;
  2. □ 使用 admin/123456 能成功登录进入工作台;
  3. □ 菜单(首页/商品管理/采购管理/销售管理/仓库管理等)可正常打开;
  4. □ 任选一模块执行一次查询,无报错(验证 MySQL 数据读写);
  5. □ 执行 docker ps 四个容器状态均为 Up,重启服务器后各容器自动恢复(--restart=always)。

十、常见问题排查

1. 容器未启动或反复重启

执行 docker ps -a 查看状态,docker logs 容器名 定位原因。常见原因:宿主机端口被占用(netstat -tlnp | grep 80)、配置文件挂载路径错误。

2. 后端启动报数据库连接失败(Communications link failure)

按顺序检查:① 后端容器与 MySQL 是否在同一网络(docker network inspect erp-net);② application.properties 中主机名是否写的是容器名 mysql 而非 localhost;③ MySQL 容器日志是否已 ready for connections;④ 密码是否与 MYSQL_ROOT_PASSWORD 一致。

3. 页面中文乱码或时间差 8 小时

确认 MySQL 启动参数含 --character-set-server=utf8mb4、数据源 URL 含 characterEncoding=utf8 与 serverTimezone=Asia/Shanghai,且容器均带 -e TZ=Asia/Shanghai。若修改了配置,需重新打包并重建后端镜像。

4. MySQL 8 兼容性问题(选用 8.0 时)

JSH_ERP 使用的旧版 MySQL 驱动可能不兼容 MySQL 8 默认的 caching_sha2_password 认证插件,报错认证失败时,建议改用 mysql:5.7 镜像,或在 MySQL 中执行 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'jsherp@2024';。

5. 浏览器无法访问但服务器本地 curl 正常

多为防火墙/安全组未放行 80 端口,见 9.1 节说明。

6. 修改配置或代码后如何更新

重新执行 mvn clean package -DskipTests → docker build -t jsherp-boot:1.0 . → docker rm -f jsh-erp → 重新执行 7.2 的 docker run 命令。MySQL/Redis 数据存放在卷中,重建后端容器不影响数据。

附录:常用命令速查

|-------------|-------------------------------------|
| 用途 | 命令 |
| 查看运行中容器 | docker ps |
| 查看全部容器(含退出) | docker ps -a |
| 查看容器日志 | docker logs -f 容器名 |
| 进入容器终端 | docker exec -it 容器名 bash |
| 重启容器 | docker restart 容器名 |
| 删除容器 | docker rm -f 容器名 |
| 查看网络内容器 | docker network inspect erp-net |
| 查看数据卷 | docker volume ls |
| 查看镜像 | docker images |
| 磁盘清理 | docker system prune -a(慎用,会删除未使用镜像) |

参考资料:JSH_ERP 开源仓库 https://gitee.com/jishenghua/JSH_ERP;Docker 官方文档 https://docs.docker.com。

相关推荐
江屿风38 分钟前
【Git-组件】【Git入门:从文档灾难到版本掌控】流食般投喂
运维·笔记·git·组件·版本控制
我不会起名字3221 小时前
K8s 节点磁盘打满导致 Pod 被驱逐:4 类占用与回收顺序
运维·kubernetes·k8s·diskpressure·evicted
雪落漂泊1 小时前
Linux进程(五):进程地址空间篇
linux·运维·服务器
孔令飞1 小时前
把 Agent 搬进飞书:飞书 Agent 机器人演示
云原生·go·ai编程
瑞克-桑切斯1 小时前
docker mail商城
运维·docker·容器
java_logo2 小时前
Docker 部署 ReMe:轻松搭建 AI Agent 记忆管理平台
人工智能·docker·容器·ai agent·轩辕镜像·reme·agentscope-ai
AR-26710-2 小时前
Linux Day32——网络,ROCE-IB与以太网
linux·运维
不庸.3 小时前
WPScan 实战入门:从 Docker 靶场到弱密码爆破
运维·安全·web安全·docker·容器·安全性测试·wpscan
xbzb4 小时前
Docker 架构与部署:一条 docker run 到底走了三层
docker·容器·架构·镜像·加速·daemon