Docker 部署 推荐
适用于任何操作系统的服务器,最简单的部署方式。自带 MySQL/Redis/应用三容器编排与数据卷持久化,开箱即用。
⬇ 下载 Docker 版(compose / 脚本)
1. 环境要求
| 组件 | 版本 | 说明 |
| Docker | 20.10+ | 含 Docker Compose v2 插件 |
| 内存 | 2G+ | 三容器(MySQL/Redis/应用) |
ⓘ
应用内嵌前端页面与 Tomcat,只需暴露 8080 端口即可访问。
2. 目录结构
crm-system-<版本>-docker/
├── crm-system.jar # 后端可执行包(内嵌前端页面、默认配置与建表 SQL)
├── application.yml # 可编辑配置(compose 已挂载到容器, 修改后 restart app 生效)
├── init.sql # 建库建表 SQL(自动建表已内置, 供手动初始化/审计)
├── demo-data.sql # 可选: 测试/演示业务数据(建表完成后按需导入)
├── Dockerfile # 应用镜像
├── docker-compose.yml # 一键编排(MySQL+Redis+应用)
├── .env.example # 授权主密钥等变量模板
└── VERSION
3. 部署步骤
3.1 解压即用
本包已内置演示主密钥(Crm2026@MasterKey!X8zQwL9p,与代码内置密文配套),数据库/Redis 连接与授权密钥均已预置,无需创建 .env,解压后直接启动即可。
3.2 一键启动
docker compose up -d --build
首次启动会自动:拉取 MySQL/Redis 镜像、构建应用镜像,应用首次启动自动建库建表(无需手动导入 SQL)。等待约 1~2 分钟即可访问:
http://<服务器IP>:8080
3.3 常用命令
docker compose ps # 查看状态
docker compose logs -f app # 查看应用日志
docker compose restart app # 重启应用(修改配置后)
docker compose down # 停止并删除容器(数据卷保留)
docker compose down -v # 停止并删除容器+数据卷(慎用, 会清空数据)
4. 修改配置
默认内置:MySQL 账号 root / 密码 rootroot,Redis 无密码。
宿主端口映射(为避开本机常驻 MySQL/Redis 占用的 3306/6379,默认使用高位端口;容器内应用通信仍走默认端口,不受影响):
| 服务 | 宿主端口 | 容器内端口 |
| Web | 8080 | 8080 |
| MySQL | 13306 | 3306 |
| Redis | 16379 | 6379 |
若 Web 8080 也被占用,可将 app 服务段的 - "8080:8080" 改为 - "8081:8080"。
修改配置有两种方式(优先级:环境变量 > application.yml):
方式一:编辑包根 application.yml(已挂载到容器 /app/application.yml)
修改后生效:
docker compose restart app
方式二:修改 docker-compose.yml 环境变量
如修改 MySQL 密码:改 mysql 服务的 MYSQL_ROOT_PASSWORD 并同步改 app 服务的 DB_PASSWORD,重建生效:
docker compose up -d --build
ⓘ
init.sql 为完整建表脚本,应用首次启动会自动建库建表,无需手动导入;此文件供手工初始化其他环境或审计表结构使用。
ⓘ
可选测试数据:新部署默认不含业务数据。如需预置演示客户/线索/合同等测试数据,首次启动建表完成后执行(建议空库/演示环境):
docker compose exec -T mysql mysql -uroot -prootroot crm_db --default-character-set=utf8mb4 < demo-data.sql
脚本内置幂等防重,可重复执行不会翻倍;若历史库演示数据已膨胀,用 fix-dup-data.sql 清理。
⚠
关于授权主密钥:本 docker 包使用演示主密钥加密(开箱即用)。请勿随意修改 CRM_LICENSE_MASTER_KEY——如需自定义密钥,请使用 Linux/Windows 原生包的 ./start.sh configure 基于新主密钥重新生成配套密文,再连同密文一并填写;否则应用会因密文不匹配而启动失败(报错:授权主密钥与配套密文不匹配 / Tag mismatch)。
5. 授权激活
- 首次登录后按弹窗提示"免费试用"(14 天)或上传正式 License Key
- 授权记录管理:
admin 登录 → 系统管理 → 授权管理(查看/生成 License)
- 机器码基于部署机器的硬件序列号 + MAC 地址生成,请确保部署机器硬件稳定,更换机器需重新申请授权
6. 登录账号
| 账号 | 密码 | 角色 |
admin | 123456 | 超级管理员 |
sales01 | 123456 | 销售经理 |
sales02 | 123456 | 销售员 |
market01 | 123456 | 市场管理员 |
云帆智能客户管理系统 - Windows 部署说明
适用于 Windows Server / 桌面版,解压后双击脚本即可启动。
⬇ 下载部署包(Windows)
1. 环境要求
| 组件 | 版本 | 说明 |
| JDK | 17+ | 需配置 PATH 环境变量(java -version 可执行) |
| MySQL | 8.0+ | 本地安装,建议 root/rootroot(首次启动自动建库建表,无需手动导入 SQL) |
| Redis | 6.0+ | 本地安装(Windows 版) |
ⓘ
应用内嵌前端页面与 Tomcat,只需暴露 8080 端口即可访问。
2. 目录结构
crm-system-<版本>-windows/
├── crm-system.jar # 后端可执行包(内嵌前端页面、默认配置与建表 SQL)
├── application.yml # 部署配置(数据库连接等在此修改,修改后重启生效)
├── init.sql # 建库建表 SQL(自动建表已内置,供手动初始化/审计)
├── demo-data.sql # 可选:测试/演示业务数据(建表完成后按需导入)
├── start.bat # 启动(首次自动生成配置)
├── stop.bat # 停止
├── restart.bat # 重启
├── configure.ps1 # 自动生成 .env(随机授权主密钥)
├── .env.example # 环境变量模板(授权主密钥/JWT/Redis 等;数据库连接见 application.yml)
└── VERSION
3. 部署步骤
3.1 解压并启动
将部署包解压到任意目录(如 D:\crm),双击 start.bat 或命令行执行:
cd D:\crm
start.bat
首次启动会自动生成 .env(随机授权主密钥 + 配套敏感配置密文),随后自动建库建表并后台启动应用。就绪后访问:
http://127.0.0.1:8080
ⓘ
配置优先级(高 → 低):
1. 包根 application.yml(Spring Boot 自动加载,修改后重启生效,推荐常规参数)
2. jar 内置默认值
未设置项使用内置默认值(数据库 localhost:3306/crm_db root/rootroot,Redis localhost:6379 无密码)。
修改数据库连接:统一编辑包根 application.yml 的 spring.datasource 段——password 为数据库密码,url 为地址/端口/库名,username 为账号,保存后 restart.bat 生效。注意与 MySQL 实际账号密码保持一致。
数据库初始化:应用首次启动自动建库建表,无需手动导入。包根 init.sql 为完整建表脚本,供手工初始化其他环境或审计表结构使用:mysql -uroot -prootroot < init.sql
可选测试数据:新部署默认不含业务数据。如需预置演示客户/线索/合同等测试数据,首次启动建表完成后执行(建议空库/演示环境):
mysql -uroot -prootroot crm_db --default-character-set=utf8mb4 < demo-data.sql
脚本内置幂等防重,可重复执行不会翻倍;若历史库演示数据已膨胀,用 fix-dup-data.sql 清理。
3.2 停止 / 重启
stop.bat
restart.bat
3.3 修复主密钥不匹配(升级场景)
旧版本部署后 .env 已存在但主密钥与代码内置密文不匹配时,应用会启动失败。此时执行:
start.bat configure
即为 .env 中的主密钥重新生成配套密文,无需更换主密钥即可正常启动。
3.4 注册为 Windows 服务(可选)
使用 NSSM 将 java -jar D:\crm\crm-system.jar 注册为开机自启服务。
4. 修改数据库 / Redis 账号密码
数据库(MySQL):编辑包根 application.yml 的 spring.datasource 段:
password — MySQL 账号密码(默认 rootroot)
url — MySQL 地址 / 端口 / 库名(默认 jdbc:mysql://localhost:3306/crm_db?...)
username — MySQL 账号(默认 root)
保存后运行 restart.bat 生效。
Redis:如启用了 Redis 密码,编辑 .env 中的 REDIS_PASSWORD 后运行 restart.bat 生效。
5. 授权激活
- 首次登录后按弹窗提示"免费试用"(14 天)或上传正式 License Key
- 授权记录管理:
admin 登录 → 系统管理 → 授权管理(查看/生成 License)
- 机器码基于部署机器的硬件序列号 + MAC 地址生成,请确保部署机器硬件稳定,更换机器需重新申请授权
6. 登录账号
| 账号 | 密码 | 角色 |
admin | 123456 | 超级管理员 |
sales01 | 123456 | 销售经理 |
sales02 | 123456 | 销售员 |
market01 | 123456 | 市场管理员 |
7. 常见问题排查
7.1 启动即退出 / 日志报 Unable to connect to Redis(Connection refused localhost:6379)
⚠
现象:start.bat 启动后应用很快退出,日志末尾出现 Caused by: java.net.ConnectException: Connection refused: localhost/127.0.0.1:6379(或 io.lettuce.core.RedisConnectionException: Unable to connect to localhost/<unresolved>:6379)。
原因:Redis 未安装或未启动。Redis 是本系统的硬依赖(登录态、会话、缓存均依赖它),启动阶段 WebMvcConfig 会读取系统配置,redis 连不上就会中断 Spring 容器初始化。
解决:安装并启动 Redis:
- 推荐(Windows 原生服务):安装 Memurai(Redis 6 兼容的 Windows 版,免费开发授权),安装完成后自动作为 Windows 服务运行,开机自启;验证
redis-cli ping 返回 PONG。
- 使用 WSL:
wsl -e sudo apt install redis-server -y && wsl -e sudo service redis-server start(Win10 2004+/Win11 默认把 localhost:6379 转发给 Windows 上的 jar)。
- Redis 在其它机器或改了端口/密码:编辑
.env 的 REDIS_HOST / REDIS_PORT / REDIS_PASSWORD 后运行 restart.bat。
7.2 双击 start.bat 报"不是内部或外部命令" / 中文乱码(如 鋸扔敘…)
⚠
现象:黑窗口一闪而过,报 'M' 不是内部或外部命令、'ver' 不是...、'""'、'{'、PIDOLDlPID" >nul && ( 等,或大量 GBK 乱码。
原因:.bat / .ps1 脚本以 UTF-8 无 BOM + LF 换行保存,cmd.exe 解析错位——把整段当一行乱读、中文被当乱码、续行符 ^ 与括号配对全部失效,于是被切成"独立命令"执行。
解决:使用发行包内已修复(UTF-8 BOM + CRLF)的脚本即可。若自行用编辑器修改过脚本,请保存为 UTF-8 BOM 且换行用 CRLF(Windows 格式);用 VS Code 右下角可切换。
云帆智能客户管理系统 - Linux 部署说明
适用于 CentOS / Ubuntu / Debian 等主流发行版。
⬇ 下载部署包(Linux / macOS)
1. 环境要求
| 组件 | 版本 | 说明 |
| JDK | 17+ | 运行后端 jar(内嵌前端静态资源与 Tomcat) |
| MySQL | 8.0+ | 业务数据库 crm_db(首次启动自动建库建表,无需手动导入 SQL) |
| Redis | 6.0+ | 验证码 / 会话缓存 |
| Nginx | 可选 | 80 端口反代 / HTTPS(不装也可直接用 8080 端口访问) |
2. 目录结构
crm-system-<版本>/
├── crm-system.jar # 后端可执行包(内嵌前端页面、默认配置与建表 SQL)
├── application.yml # 部署配置(数据库连接等在此修改, 修改后重启生效)
├── init.sql # 建库建表 SQL(自动建表已内置, 供手动初始化/审计)
├── demo-data.sql # 可选: 测试/演示业务数据(建表完成后按需导入)
├── VERSION
├── start.sh # 启动/停止/重启/状态/配置
├── stop.sh
├── restart.sh
├── crm.service # systemd 服务单元(生产推荐)
├── .env.example # 环境变量模板(授权主密钥/JWT/Redis 等; 数据库连接见 application.yml)
├── nginx/crm-nginx.conf # Nginx 反向代理配置示例
└── README.md # 本说明
3. 部署步骤
3.1 放置部署包
mkdir -p /opt/crm && cp -r crm-system-<版本>/* /opt/crm/
ⓘ
start.sh 首次启动会自动生成 .env(含随机授权主密钥与配套密文),无需手动编辑。
3.2 启动
cd /opt/crm
bash start.sh start # 首次启动自动建库建表、生成配置并启动(日志: logs/app.log, PID: crm.pid)
bash start.sh status # 查看状态
bash start.sh restart # 重启
bash start.sh configure # 仅生成/查看 .env 配置, 不启动
启动完成后访问:http://<服务器IP>:8080
ⓘ
配置优先级(高 → 低):
1. 包根 application.yml(Spring Boot 自动加载,修改后重启生效,推荐常规参数)
2. jar 内置默认值
未设置项使用内置默认值(Redis localhost:6379 无密码)。
修改数据库连接:统一编辑包根 application.yml 的 spring.datasource 段——password 为数据库密码,url 为地址/端口/库名,username 为账号(默认 localhost:3306/crm_db、root/rootroot),保存后 bash start.sh restart 生效。注意与 MySQL 实际账号密码保持一致。
数据库初始化:应用首次启动自动建库建表,无需手动导入。包根 init.sql 为完整建表脚本,供手工初始化其他环境或审计表结构使用:mysql -uroot -p < init.sql
可选测试数据:新部署默认不含业务数据。如需预置演示客户/线索/合同等测试数据,待建表完成后执行(建议空库/演示环境):
mysql -uroot -p crm_db --default-character-set=utf8mb4 < demo-data.sql
脚本内置幂等防重,可重复执行不会翻倍;若历史库演示数据已膨胀,用 fix-dup-data.sql 清理。
3.3 使用 systemd 守护进程(生产推荐)
# 先运行一次, 自动生成 /opt/crm/.env(随机授权主密钥)
bash /opt/crm/start.sh start
useradd -r -s /sbin/nologin crm
mkdir -p /var/log/crm && chown -R crm:crm /opt/crm /var/log/crm
cp /opt/crm/crm.service /etc/systemd/system/crm.service
systemctl daemon-reload
systemctl enable --now crm
systemctl status crm
ⓘ
若将 jar 放在其他路径,请同步修改 crm.service 中的 WorkingDirectory、ExecStart、EnvironmentFile 路径。
4. Nginx 反代(可选,用于 80 端口 / HTTPS)
cp /opt/crm/nginx/crm-nginx.conf /etc/nginx/conf.d/crm.conf
# 按需修改 server_name、/uploads 目录
nginx -t && nginx -s reload
5. 登录账号
| 账号 | 密码 | 角色 |
admin | 123456 | 超级管理员 |
sales01 | 123456 | 销售经理 |
sales02 | 123456 | 销售员 |
market01 | 123456 | 市场管理员 |
6. 授权激活
系统为 License 授权模式:
- 首次登录后按弹窗提示"免费试用"(14 天)或上传正式 License Key
- 授权记录管理:
admin 登录 → 系统管理 → 授权管理(查看/生成 License)
- 机器码基于部署机器的硬件序列号 + MAC 地址生成,请确保部署机器硬件稳定,更换机器需重新申请授权
7. 常见问题
| 问题 | 处理 |
| 启动即退出,日志提示缺少主密钥 | 检查 .env 中 CRM_LICENSE_MASTER_KEY 是否已设置 |
| 连接数据库失败 | 检查包根 application.yml 的 spring.datasource(url/username/password)与 MySQL 授权 |
| Redis 连接失败 | 检查 .env 中 REDIS_HOST/REDIS_PORT/REDIS_PASSWORD |
| 端口被占用 | 修改 .env 中 SERVER_PORT |
| 忘记日志位置 | 手动启动日志 logs/app.log;systemd 日志 /var/log/crm/app.log |
7.1 Redis 连接失败 / 应用启动即退
⚠
现象:bash start.sh start 后应用很快退出,logs/app.log 末尾出现 Caused by: java.net.ConnectException: Connection refused: localhost/127.0.0.1:6379(或 io.lettuce.core.RedisConnectionException: Unable to connect to localhost/...:6379)。
原因:Redis 未安装或未启动。Redis 是本系统硬依赖(登录态、会话、缓存均依赖它),启动阶段 WebMvcConfig 读取系统配置时连不上 Redis 会中断 Spring 容器初始化。
解决:安装并启动 Redis:
sudo apt install redis-server -y && sudo systemctl enable --now redis-server(验证 redis-cli ping → PONG)
- 容器 / 编译安装:启动
redis-server 并确保监听 6379。
- Redis 在其它机器或改了端口/密码:编辑
.env 的 REDIS_HOST/REDIS_PORT/REDIS_PASSWORD 后 bash start.sh restart(或 systemctl restart crm)。
说明(2.6.1+):自 2.6.1 起 RedisService 已对 Redis 不可用做降级——get 失败返回 null 走数据库兜底、set/delete 等降级为 no-op,因此应用可正常启动且能扛住运行期 Redis 抖动;但登录、会话、缓存仍需要 Redis 真正在运行,否则登录写入被忽略、isTokenValid 校验失败,登录仍通不过。日志里若出现 Redis 不可用, 已降级处理... 即表示已触发降级(功能会受限),请先确保 Redis 已启动。
7.2 启动失败:需要 JDK 17 及以上
⚠
现象:执行 ./start.sh 后直接退出并提示 启动失败:需要 JDK 17 及以上(jar 由 Java 17 编译,Spring Boot 3.2 要求 17+);或启动后立刻报 UnsupportedClassVersionError: class file version 61.0。
原因:本机默认 java 是 8 / 11。程序包由 JDK 17 编译(class 版本号 61.0),低于 17 的 JVM 无法加载。
解决:
- CentOS / RHEL / Rocky / 腾讯OS:
sudo yum install -y java-17-openjdk-devel(或 dnf install)
- Ubuntu / Debian / 麒麟 / UOS:
sudo apt install -y openjdk-17-jdk
- 安装后用
java -version 确认是 17+,再执行 ./start.sh
- 机器上已装 17 但默认 java 仍指向旧版:
ls /usr/lib/jvm 查看路径,然后 JAVA_HOME=/usr/lib/jvm/java-17-openjdk ./start.sh;也可用 sudo alternatives --config java 切换默认版本
说明(2.6.5+):启动脚本会自动扫描 /usr/lib/jvm、/usr/java、/opt/jdk、/Library/Java/JavaVirtualMachines 等常见目录,只要机器里装了 JDK 17+(哪怕不是默认 java)就会自动选中,无需手写 JAVA_HOME;仅当扫描不到任何 17+ 时才报错,报错时会列出已扫描到的所有 java 及版本。
7.3 执行 node prerender.js 报 node: command not found
⚠
现象:bash: node: command not found。
原因:服务器没装 Node.js。这个命令不是必须执行的——prerender.js 只是把新闻/案例动态页生成一份静态 HTML 给搜索引擎收录,部署包里已经自带预生成好的 web/news/*.html、web/case/*.html 和 sitemap.xml。
可以不跑的情况:直接用包内预渲染文件即可,页面照常访问,不会 404。只有当你在后台新增/修改了新闻或案例、希望静态页与最新内容一致时,才需要重跑。
需要跑就先装 Node 18+:
- CentOS / RHEL / 腾讯OS:
sudo dnf module install -y nodejs:20(CentOS 7 用 sudo yum install -y nodejs)
- Ubuntu / Debian:
sudo apt install -y nodejs npm
- 离线/指定版本:从 nodejs.org 下载 Linux 二进制包解压,把
bin 目录加入 PATH
- 确认:
node -v 显示 v18+ 即可
然后安装预渲染依赖并生成:
npm i playwright && npx playwright install chromium(首次约需下载 100~200MB,且需要后端已在 8099 端口运行,脚本会访问本地接口取数据)
OUT_DIR=web node prerender.js(默认输出到 web/)
注意:若站点由 Nginx 托管,则完全不需要 Node;只有选择用 node serve.js 作为静态服务时才必须装。