130 lines
4.8 KiB
Markdown
130 lines
4.8 KiB
Markdown
# 项目部署流程设计文档
|
||
|
||
## 概述
|
||
|
||
本文档描述了项目管理模块与 1Panel 服务器的集成方案,采用**前后端分离架构**:
|
||
|
||
- **前端**:负责 UI 交互,调用后端 API
|
||
- **后端**:存储项目数据到数据库,调用 1Panel API 执行部署
|
||
|
||
## 架构设计
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────────────┐
|
||
│ 架构示意图 │
|
||
├─────────────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
||
│ │ 前端 │──────│ 后端 API │──────│ 1Panel │ │
|
||
│ │ (Vue.js) │ HTTP │ (Spring) │ HTTP │ 服务器 │ │
|
||
│ └─────────────┘ └──────────────┘ └──────────────┘ │
|
||
│ │ │ │
|
||
│ │ ▼ │
|
||
│ │ ┌──────────┐ │
|
||
│ │ │ MySQL │ │
|
||
│ │ │ 数据库 │ │
|
||
│ │ └──────────┘ │
|
||
│ │
|
||
└─────────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 后端实现
|
||
|
||
### 1. 实体类扩展 (`PlatformProject.java`)
|
||
|
||
新增字段:
|
||
|
||
- `shortName` - 项目简称
|
||
- `projectGroup` - 项目分组
|
||
- `logo` - Logo 文字
|
||
- `color` - 主题色
|
||
- `domain` - 绑定域名
|
||
- `enableHttps` - 是否启用 HTTPS
|
||
- `panelWebsiteId` - 1Panel 网站 ID
|
||
- `panelSslId` - 1Panel 证书 ID
|
||
- `lastDeployTime` - 最后部署时间
|
||
- `lastDeployStatus` - 最后部署状态
|
||
- `lastDeployMessage` - 最后部署消息
|
||
|
||
### 2. DTO 类
|
||
|
||
- `DeployRequest.java` - 部署请求参数
|
||
- `DeployResult.java` - 部署结果
|
||
|
||
### 3. 服务类
|
||
|
||
- `OnePanelService.java` - 1Panel 服务接口
|
||
- `OnePanelServiceImpl.java` - 1Panel 服务实现
|
||
|
||
### 4. 控制器 (`PlatformProjectController.java`)
|
||
|
||
新增接口:
|
||
| 接口 | 方法 | 说明 |
|
||
|------|------|------|
|
||
| `/platform/project/deploy` | POST | 部署项目 |
|
||
| `/platform/project/{serverId}/websites` | GET | 获取网站列表 |
|
||
| `/platform/project/{serverId}/certificates` | GET | 获取证书列表 |
|
||
| `/platform/project/{serverId}/acme-accounts` | GET | 获取 Acme 账户 |
|
||
| `/platform/project/{serverId}/dns-accounts` | GET | 获取 DNS 账户 |
|
||
|
||
### 5. 数据库迁移
|
||
|
||
执行 `src/main/resources/db/migration_project_deploy.sql`
|
||
|
||
## 前端实现
|
||
|
||
### 1. API 封装 (`src/api/project.ts`)
|
||
|
||
- `deployProject` - 部署项目
|
||
- `getServerAcmeAccounts` - 获取 Acme 账户
|
||
- `getServerDnsAccounts` - 获取 DNS 账户
|
||
|
||
### 2. 项目管理页面
|
||
|
||
- 部署按钮
|
||
- 部署确认弹窗
|
||
- 部署进度抽屉
|
||
|
||
## 完整部署流程
|
||
|
||
1. 前端:用户点击"部署"按钮
|
||
2. 前端:打开部署确认弹窗,配置 HTTPS 选项
|
||
3. 前端:调用后端 POST /platform/project/deploy
|
||
4. 后端:从数据库获取项目和服务器信息
|
||
5. 后端:检查/创建网站
|
||
6. 后端:如启用 HTTPS,检查/申请证书
|
||
7. 后端:配置网站 HTTPS
|
||
8. 后端:更新项目状态到数据库
|
||
9. 前端:显示部署结果
|
||
|
||
## 1Panel Token 生成算法
|
||
|
||
```java
|
||
// Token = md5('1panel' + API-Key + UnixTimestamp)
|
||
String rawToken = "1panel" + apiKey + timestamp;
|
||
String token = DigestUtils.md5DigestAsHex(rawToken.getBytes());
|
||
```
|
||
|
||
## 配置说明
|
||
|
||
### 服务器配置
|
||
|
||
在 `platform_server` 表中配置:
|
||
|
||
- `panel_port` - 1Panel 端口(默认 42588)
|
||
- `panel_api_key` - 1Panel API 密钥
|
||
|
||
### 项目配置
|
||
|
||
创建项目时配置:
|
||
|
||
- `domain` - 绑定域名
|
||
- `serverId` - 目标服务器
|
||
- `deployPath` - 部署路径
|
||
|
||
## 安全注意事项
|
||
|
||
1. API 密钥存储在后端数据库,不暴露给前端
|
||
2. 每次请求生成新 Token,防止重放攻击
|
||
3. 建议在 1Panel 中配置 API 白名单
|