Files
smartClean/deploy/README.md
xqzp2026 8373460096 feat: 添加自动化部署方案(Docker + 远程服务器两套方案)
- 新增 deploy/docker/:Docker 本机模拟部署,含 Dockerfile、docker-compose、deploy.sh 一键脚本
- 新增 deploy/remote/:远程服务器部署,含 SSH 自动上传、重启、回滚脚本
- 新增 deploy/README.md:完整使用手册,含现状分析、落地调整工作清单、命令速查
- 新增 build.sh/start.sh:本地构建和启动脚本(含飞书通知)
- 新增前端 .env.docker 环境配置,API 指向测试服务器
- 前端 package.json 新增 build-docker 命令
- 更新 .gitignore:排除 IDE 配置、SQL 数据、Docker 敏感文件
- 前端 UI 样式优化(多个页面组件)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 18:41:15 +09:30

404 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SmartClean 自动化部署使用手册
## 概述
本项目提供两套独立的自动化部署方案,可同时使用、互不干扰:
| 方案 | 目录 | 适用场景 | 依赖 |
|------|------|---------|------|
| **远程服务器部署** | `deploy/remote/` | 部署到 182 测试/生产服务器 | SSH 免密登录 |
| **Docker 本机模拟** | `deploy/docker/` | 本机模拟完整生产环境 | Docker Desktop |
---
## 现状分析
### 当前部署方式
| 环节 | 现状 | 问题 |
|------|------|------|
| **构建** | 本地执行 `build.sh`,手动触发 | 已自动化,含飞书通知 |
| **上传** | 手动 SCP 或 FTP 上传到 182 服务器 | 无标准化流程,依赖个人操作习惯 |
| **部署** | SSH 登录服务器,手动替换文件、重启服务 | 步骤多、易出错、无操作记录 |
| **回滚** | 无备份机制,出问题需手动找旧版本 | 无法快速回滚,故障恢复时间长 |
| **通知** | 构建结果有飞书通知,部署结果无通知 | 团队无法感知部署状态 |
| **环境一致性** | 服务器环境手动搭建维护 | 本地与服务器环境可能不一致 |
### 现有脚本
| 脚本 | 用途 | 覆盖范围 |
|------|------|---------|
| `build.sh` | 本地构建Maven + npm支持分模块构建含飞书通知 | 仅构建,不含部署 |
| `start.sh` | 本地启动开发环境mvn spring-boot:run + npm run dev | 仅本地开发,非生产部署 |
### 现有流程 vs 新方案对比
```
现有流程5 步手动操作,约 10-15 分钟):
┌──────────┐ 手动 ┌──────────┐ 手动 ┌──────────┐ 手动 ┌──────────┐
│ build.sh │ ───────→ │ SCP 上传 │ ───────→ │ SSH 替换 │ ───────→ │ 手动重启 │
│ 本地构建 │ │ 到服务器 │ │ 文件 │ │ 服务 │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
✅ 已自动化 ❌ 手动 ❌ 手动 ❌ 手动
✅ 有飞书通知 ❌ 无记录 ❌ 无备份 ❌ 无健康检查
方案一 — 远程部署1 条命令,全自动):
┌──────────────────────────────────────────────────────────────────────┐
│ deploy/remote/deploy.sh web │
│ 构建 → 备份 → 上传 → 重启 → 健康检查 → 飞书通知(失败自动回滚) │
└──────────────────────────────────────────────────────────────────────┘
方案二 — Docker 部署1 条命令,全自动):
┌──────────────────────────────────────────────────────────────────────┐
│ deploy/docker/deploy.sh web │
│ 镜像构建 → 容器替换 → 健康检查 → 飞书通知(失败自动回滚) │
└──────────────────────────────────────────────────────────────────────┘
```
### 新方案解决的问题
| 现状痛点 | 方案一(远程部署) | 方案二Docker |
|----------|------------------|-----------------|
| 手动上传、易传错 | SCP 自动传输,路径固定 | 不需要传输,镜像自包含 |
| 无备份,无法回滚 | 每次部署自动备份,一键回滚 | 基于镜像 tag 回滚 |
| 部署步骤多、易遗漏 | 一条命令完成全部步骤 | 一条命令完成全部步骤 |
| 团队不知道谁部署了什么 | 飞书通知含版本/分支/操作人 | 飞书通知含版本/分支 |
| 部署后不确认是否成功 | 自动健康检查,失败自动回滚 | 自动健康检查,失败自动回滚 |
| 新人不知道怎么部署 | 看文档执行一条命令即可 | 一键启动完整环境 |
---
## 落地调整工作清单
### 方案一(远程部署)落地前需要做的事
#### 一次性准备工作
| # | 任务 | 说明 | 负责人 | 耗时预估 |
|---|------|------|--------|---------|
| 1 | **配置 SSH 免密登录** | 本机生成密钥,`ssh-copy-id` 到 182 服务器 | 开发者 | 5 分钟 |
| 2 | **确认服务器目录结构** | 登录 182 确认 Tomcat 实际安装路径、Nginx 配置路径、Task JAR 存放路径 | 开发者 | 10 分钟 |
| 3 | **修改 config.sh** | 将 `TOMCAT_HOME``NGINX_HTML` 等路径改为服务器实际路径 | 开发者 | 5 分钟 |
| 4 | **执行 setup 初始化** | `deploy/remote/deploy.sh setup` 创建标准目录 + 上传重启脚本 | 开发者 | 2 分钟 |
| 5 | **调整重启脚本** | 根据服务器实际情况微调 `restart-web.sh` / `restart-task.sh`(如 Tomcat 启停方式、Task 服务的 JVM 参数) | 开发者 | 15 分钟 |
| 6 | **首次全量部署测试** | 执行 `deploy/remote/deploy.sh` 验证全流程跑通 | 开发者 | 10 分钟 |
#### 需确认的服务器信息
在落地之前,请先 SSH 到 182 服务器确认以下信息,并更新到 `config.sh`
```bash
# 登录服务器后执行以下命令,记录输出
# 1. Tomcat 安装路径
find / -name "catalina.sh" -type f 2>/dev/null
# 将结果的父目录的父目录填入 TOMCAT_HOME
# 2. Nginx 前端文件路径
nginx -T 2>/dev/null | grep "root "
# 将 root 路径填入 NGINX_HTML
# 3. Task 服务当前运行方式
ps -ef | grep "intellectual-task"
# 确认 JAR 名称、启动参数,更新 TASK_JAR_NAME 和 TASK_JVM_OPTS
# 4. 当前 WAR 包位置
find / -name "ROOT.war" -type f 2>/dev/null
# 5. Java 版本
java -version
```
### 方案二Docker 本机模拟)落地前需要做的事
| # | 任务 | 说明 | 负责人 | 耗时预估 |
|---|------|------|--------|---------|
| 1 | **安装 Docker Desktop** | 如未安装,从官网下载安装 | 开发者 | 10 分钟 |
| 2 | **确认端口无冲突** | 确保 8180/18095/18097/3307/6380 未被占用,如有冲突在 `.env` 中调整 | 开发者 | 2 分钟 |
| 3 | **检查 SQL 初始化脚本** | 确认 `sql/` 目录下有完整的建库建表 SQLDocker MySQL 首次启动会自动导入) | 开发者 | 5 分钟 |
| 4 | **首次全量部署测试** | 执行 `deploy/docker/deploy.sh`,首次需下载基础镜像 + 编译,耗时较长 | 开发者 | 20-30 分钟 |
| 5 | **验证前端 API 代理** | 确认 Nginx 的 `/api/` 反代规则与前端实际请求路径匹配(当前前端直接请求后端,无 `/api` 前缀,可能需要调整 `nginx.conf` | 开发者 | 10 分钟 |
#### 可能需要的代码调整
| 调整项 | 原因 | 影响范围 |
|--------|------|---------|
| **前端 .env.docker**(可选) | Docker 环境中前端通过 Nginx 反代访问后端API 地址可能需要调整 | 新增一个 `.env.docker` 文件 |
| **nginx.conf 反代路径** | 当前前端直接调用后端接口(无 `/api` 前缀),需确认 Nginx `location /api/` 的 rewrite 规则与前端请求路径一致 | `deploy/docker/conf/nginx.conf` |
| **application-docker.yml 补全** | 当前只覆盖了数据源和 Redis如果后端有其他外部依赖如 OSS、短信等需补充配置或 mock | `deploy/docker/conf/application-docker.yml` |
---
## 方案一:远程服务器部署(无 Docker
> 本地构建 → SCP 上传 → 远程重启 → 健康检查 → 失败自动回滚 → 飞书通知
### 前置条件
1. 本机已安装 Java 8、Maven、Node.js 16+
2. SSH 免密登录到目标服务器
```bash
# 配置 SSH 免密(一次性)
ssh-keygen -t ed25519
ssh-copy-id root@192.168.1.182
# 验证
ssh root@192.168.1.182 "echo ok"
```
### 首次使用
```bash
# 1. 根据实际环境修改配置
vi deploy/remote/config.sh
# 2. 初始化服务器目录结构 + 上传管理脚本
deploy/remote/deploy.sh setup
```
### 日常使用
```bash
# ===== 部署 =====
# 全量部署(前端 + 后端全部)
deploy/remote/deploy.sh
# 只改了后端 Web 代码
deploy/remote/deploy.sh web
# 只改了 Task 服务代码
deploy/remote/deploy.sh task
# 后端都改了
deploy/remote/deploy.sh backend
# 只改了前端(生产包)
deploy/remote/deploy.sh front
# 前端测试环境包
deploy/remote/deploy.sh front-test
# ===== 回滚 =====
# 回滚到上一版本
deploy/remote/deploy.sh rollback
# 或
deploy/remote/rollback.sh
# ===== 状态查看 =====
# 查看服务器服务状态
deploy/remote/deploy.sh status
```
### 配置说明
编辑 `deploy/remote/config.sh`
```bash
# 服务器地址(根据实际修改)
DEPLOY_HOST="192.168.1.182"
DEPLOY_USER="root"
# Tomcat 路径(根据服务器实际路径修改)
TOMCAT_HOME="/opt/smartclean/web/tomcat"
# 备份保留数量
MAX_BACKUPS=5
# 健康检查重试次数和间隔
HEALTHCHECK_RETRIES=20
HEALTHCHECK_INTERVAL=5
```
### 部署流程
```
1. 本地构建 → 调用 build.sh 生成 ROOT.war / task.jar / dist/
2. 远程备份 → SSH 备份服务器当前版本到 backups/时间戳-hash/
3. 上传产物 → SCP 传输到服务器对应目录
4. 远程重启 → SSH 执行 restart-web.sh / restart-task.sh / restart-front.sh
5. 健康检查 → 轮询接口,最多重试 20 次(每次间隔 5s
6. 结果通知 → 成功/失败/回滚 均推送飞书群
```
### 服务器目录结构
```
/opt/smartclean/
├── web/tomcat/webapps/ROOT.war # Web 服务
├── task/task.jar # Task 服务
├── front/dist/ # 前端静态文件
├── backups/ # 版本备份(自动保留最近 5 个)
│ ├── 20260415-153000-a1b2c3d/
│ └── 20260415-140000-d4e5f6a/
└── scripts/ # 服务管理脚本
├── restart-web.sh
├── restart-task.sh
└── restart-front.sh
```
---
## 方案二Docker 本机模拟
> Docker 镜像构建 → Compose 部署 → 健康检查 → 失败自动回滚 → 飞书通知
### 前置条件
1. 已安装 Docker Desktop 并启动
```bash
# 验证
docker --version
docker compose version
```
### 首次使用
```bash
# 直接一键部署(首次会自动拉取基础镜像 + 构建 + 启动)
deploy/docker/deploy.sh
```
### 日常使用
```bash
# ===== 部署 =====
# 全量部署
deploy/docker/deploy.sh
# 只改了后端 Web 代码
deploy/docker/deploy.sh web
# 只改了 Task 服务代码
deploy/docker/deploy.sh task
# 只改了前端
deploy/docker/deploy.sh front
# ===== 回滚 =====
# 回滚到上一版本(基于镜像 tag
deploy/docker/deploy.sh rollback
# 或
deploy/docker/rollback.sh
# ===== 运维 =====
# 查看容器状态
deploy/docker/deploy.sh status
# 查看所有服务日志
deploy/docker/deploy.sh logs
# 只看 Web 服务日志
deploy/docker/deploy.sh logs web
# 停止所有容器(数据保留)
deploy/docker/deploy.sh stop
# 停止并清理数据卷(慎用,会丢数据库数据)
deploy/docker/deploy.sh clean
```
### 端口映射
| 服务 | 容器内端口 | 宿主机端口 | 访问地址 |
|------|-----------|-----------|---------|
| 前端 (Nginx) | 80 | **8180** | http://localhost:8180 |
| Web 后端 | 8095 | **18095** | http://localhost:18095 |
| Task 后端 | 8097 | **18097** | http://localhost:18097 |
| MySQL | 3306 | **3307** | localhost:3307 |
| Redis | 6379 | **6380** | localhost:6380 |
> 端口可在 `deploy/docker/.env` 中自定义修改。
### 端口隔离说明
Docker 环境与本机开发环境完全独立:
```
本机开发环境 Docker 模拟环境
────────────── ──────────────
前端 localhost:8079 前端 localhost:8180
Web localhost:8095 Web localhost:18095
MySQL localhost:3306 MySQL localhost:3307
Redis localhost:6379 Redis localhost:6380
```
两套可以同时运行,互不干扰。
### 连接 Docker 中的数据库调试
```bash
# 用本机 MySQL 客户端连接 Docker 中的 MySQL
mysql -h127.0.0.1 -P3307 -uroot -pkaixinjiuhao
# 用本机 Redis 客户端连接 Docker 中的 Redis
redis-cli -h 127.0.0.1 -p 6380 -a kaixinjiuhao
```
---
## 两套方案对比
| 维度 | 远程服务器部署 | Docker 本机模拟 |
|------|--------------|----------------|
| **部署目标** | 192.168.1.182 远程服务器 | 本机 Docker 容器 |
| **依赖** | SSH 免密登录 | Docker Desktop |
| **构建方式** | 本机 mvn/npm 构建,上传产物 | Docker 多阶段构建(镜像内编译) |
| **部署速度** | 快(只传几十 MB 产物) | 慢(首次构建镜像,后续有缓存) |
| **环境一致性** | 依赖服务器已有环境 | 镜像自包含,完全一致 |
| **回滚方式** | 文件级(还原备份的 WAR/JAR/dist | 镜像级(切换 Docker 镜像 tag |
| **数据库** | 使用服务器上的 MySQL | 独立 MySQL 容器(数据隔离) |
| **适合场景** | 日常发布到测试/生产 | 本机验证部署流程、新人搭环境 |
## 命令速查表
```bash
# ==================== 远程部署 ====================
deploy/remote/deploy.sh # 全量部署到远程服务器
deploy/remote/deploy.sh web # 只部署 Web
deploy/remote/deploy.sh task # 只部署 Task
deploy/remote/deploy.sh front # 只部署前端
deploy/remote/deploy.sh backend # 部署后端web + task
deploy/remote/deploy.sh rollback # 回滚
deploy/remote/deploy.sh status # 查看服务器状态
deploy/remote/deploy.sh setup # 首次初始化服务器
# ==================== Docker 部署 ====================
deploy/docker/deploy.sh # 全量部署到 Docker
deploy/docker/deploy.sh web # 只部署 Web
deploy/docker/deploy.sh task # 只部署 Task
deploy/docker/deploy.sh front # 只部署前端
deploy/docker/deploy.sh rollback # 回滚
deploy/docker/deploy.sh status # 查看容器状态
deploy/docker/deploy.sh logs [服务] # 查看日志
deploy/docker/deploy.sh stop # 停止容器
deploy/docker/deploy.sh clean # 停止并清理数据
```
## 飞书通知
两套方案都集成了飞书 Webhook 通知,部署结果会自动推送到群里:
-**部署成功**:版本号、分支、提交信息、耗时
-**部署失败**:自动回滚后通知,附失败原因
- ⚠️ **手动回滚**:回滚版本号、操作人
Webhook 地址在各自的配置文件中修改:
- 远程版:`deploy/remote/config.sh``FEISHU_WEBHOOK`
- Docker 版:`deploy/docker/.env``FEISHU_WEBHOOK`
## 注意事项
1. **deploy/docker/.env 不要提交到 git**(含密码),已在 .gitignore 中排除
2. **首次 Docker 构建较慢**(需下载基础镜像 + Maven 依赖),后续有缓存会快很多
3. **远程部署前确认 config.sh 中的路径**与服务器实际一致,特别是 `TOMCAT_HOME`
4. **回滚只保留最近 5 个版本**,超出自动清理(可在配置中调整 `MAX_BACKUPS`
5. **Docker 版 Task 服务**可能因缺少 MQTT/XXL-Job 而启动异常,这是正常的,不影响 Web 和前端