# 部署自动化

<cite>
**本文档引用的文件**   
- [install.sh](file://manifest/docker/install.sh)
- [install-test.sh](file://manifest/docker/install-test.sh)
- [install-one.sh](file://manifest/docker/install-one.sh)
- [docker-compose.yml](file://manifest/docker/docker-compose.yml)
- [docker-compose-local.yaml](file://manifest/docker/docker-compose-local.yaml)
- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh)
</cite>

## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概述](#架构概述)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)

## 简介
本文档深入分析了Kami项目中的部署自动化脚本，包括install.sh、install-test.sh和install-one.sh。这些脚本为Kami后端系统提供了一套完整的Docker Compose部署解决方案，支持完整部署、测试环境部署和单节点部署等多种场景。文档详细解释了脚本的功能、执行流程、参数说明、错误处理机制和日志输出格式，并提供了扩展这些脚本以支持自定义部署需求的方法。

**Section sources**
- [install.sh](file://manifest/docker/install.sh#L1-L144)
- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118)
- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134)

## 项目结构
Kami后端项目的部署脚本位于manifest/docker目录下，与Docker相关配置文件共同构成了完整的部署体系。该目录包含多个安装脚本和Docker Compose配置文件，形成了分层的部署架构。

```mermaid
graph TD
A[manifest/docker] --> B[install.sh]
A --> C[install-test.sh]
A --> D[install-one.sh]
A --> E[install-simple.sh]
A --> F[docker-compose.yml]
A --> G[docker-compose-test.yml]
A --> H[docker-compose-local.yaml]
A --> I[wait-for-it.sh]
A --> J[Dockerfile]
B --> K[完整部署]
C --> L[测试部署]
D --> M[单节点部署]
E --> N[简化部署]
F --> O[生产环境配置]
G --> P[测试环境配置]
H --> Q[本地开发配置]
```

**Diagram sources **
- [manifest/docker](file://manifest/docker)

**Section sources**
- [manifest/docker](file://manifest/docker)

## 核心组件
部署自动化系统由三个主要脚本构成：install.sh用于完整部署，install-test.sh用于测试环境部署，install-one.sh用于单节点部署。这些脚本通过统一的逻辑框架实现了不同的部署策略，包括前置条件检查、环境准备、服务启动和状态验证等关键功能。

**Section sources**
- [install.sh](file://manifest/docker/install.sh#L1-L144)
- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118)
- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134)

## 架构概述
部署自动化脚本采用模块化设计，通过参数化配置支持多种部署场景。脚本首先进行用户交互式选择或命令行参数解析，然后执行一系列标准化的部署步骤，包括代码拉取、容器管理、服务构建和启动、状态验证等。

```mermaid
graph TD
A[开始] --> B[选择应用]
B --> C{应用选择验证}
C --> |有效| D[克隆代码库]
C --> |无效| E[退出]
D --> F[进入代码目录]
F --> G[切换到master分支]
G --> H[拉取最新代码]
H --> I[停止并删除现有容器]
I --> J[停止所有其他容器]
J --> K[构建并启动Docker容器]
K --> L[启动所有容器]
L --> M[等待10秒]
M --> N[重启kami_前缀容器]
N --> O[删除本地代码]
O --> P[删除悬空镜像]
P --> Q[自我删除]
Q --> R[结束]
```

**Diagram sources **
- [install.sh](file://manifest/docker/install.sh#L1-L144)

## 详细组件分析

### 完整部署脚本分析
install.sh脚本提供了完整的部署流程，适用于生产环境的全面部署。该脚本通过交互式菜单让用户选择要部署的应用，然后执行完整的部署周期。

```mermaid
flowchart TD
Start([开始]) --> SelectApp["选择应用 (1-7)"]
SelectApp --> ValidateChoice{"选择有效?"}
ValidateChoice --> |否| ExitError["显示错误并退出"]
ValidateChoice --> |是| CheckRepo["检查本地仓库"]
CheckRepo --> |不存在| CloneRepo["克隆代码库"]
CheckRepo --> |存在| CdRepo["进入目录"]
CloneRepo --> CdRepo
CdRepo --> CheckoutMaster["切换到master分支"]
CheckoutMaster --> PullLatest["拉取最新代码"]
PullLatest --> StopContainer["停止并删除现有容器"]
StopContainer --> StopAll["停止所有其他容器"]
StopAll --> BuildStart["构建并启动容器"]
BuildStart --> StartAll["启动所有容器"]
StartAll --> Wait10s["等待10秒"]
Wait10s --> RestartKami["重启kami_前缀容器"]
RestartKami --> RemoveLocal["删除本地代码"]
RemoveLocal --> RemoveDangling["删除悬空镜像"]
RemoveDangling --> SelfDelete["自我删除"]
SelfDelete --> End([结束])
```

**Diagram sources **
- [install.sh](file://manifest/docker/install.sh#L1-L144)

**Section sources**
- [install.sh](file://manifest/docker/install.sh#L1-L144)

### 测试部署脚本分析
install-test.sh脚本专为测试环境设计，其流程与完整部署类似，但在某些步骤上有所简化，主要区别在于使用测试专用的Docker Compose配置文件。

```mermaid
flowchart TD
Start([开始]) --> SelectApp["选择应用 (1-7)"]
SelectApp --> ValidateChoice{"选择有效?"}
ValidateChoice --> |否| ExitError["显示错误并退出"]
ValidateChoice --> |是| CheckRepo["检查本地仓库"]
CheckRepo --> |不存在| CloneRepo["克隆代码库"]
CheckRepo --> |存在| CdRepo["进入目录"]
CloneRepo --> CdRepo
CdRepo --> CheckoutMaster["切换到master分支"]
CheckoutMaster --> PullLatest["拉取最新代码"]
PullLatest --> StopContainer["停止并删除现有容器"]
StopContainer --> BuildStart["构建并启动容器"]
BuildStart --> |非前端/后端| StopAll["停止所有容器"]
BuildStart --> |前端/后端| UseTestConfig["使用测试配置文件"]
UseTestConfig --> StartAll["启动所有容器"]
StartAll --> Wait10s["等待10秒"]
Wait10s --> RestartKami["重启kami_前缀容器"]
RestartKami --> End([结束])
```

**Diagram sources **
- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118)

**Section sources**
- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118)

### 单节点部署脚本分析
install-one.sh脚本支持通过命令行参数进行非交互式部署，适用于自动化部署场景。该脚本使用getopts解析命令行参数，实现了更灵活的部署方式。

```mermaid
flowchart TD
Start([开始]) --> ParseArgs["解析命令行参数 (-c)"]
ParseArgs --> ValidateArg{"参数有效?"}
ValidateArg --> |否| ShowHelp["显示帮助并退出"]
ValidateArg --> |是| MatchRepo["匹配仓库名称"]
MatchRepo --> CheckRepo["检查本地仓库"]
CheckRepo --> |不存在| CloneRepo["克隆代码库"]
CheckRepo --> |存在| CdRepo["进入目录"]
CloneRepo --> CdRepo
CdRepo --> CheckoutMaster["切换到master分支"]
CheckoutMaster --> PullLatest["拉取最新代码"]
PullLatest --> StopContainer["停止并删除现有容器"]
StopContainer --> StopAll["停止所有其他容器"]
StopAll --> BuildStart["构建并启动容器"]
BuildStart --> StartAll["启动所有容器"]
StartAll --> Wait10s["等待10秒"]
Wait10s --> RestartKami["重启kami_前缀容器"]
RestartKami --> RemoveLocal["删除本地代码"]
RemoveLocal --> RemoveDangling["删除悬空镜像"]
RemoveDangling --> SelfDelete["自我删除"]
SelfDelete --> End([结束])
```

**Diagram sources **
- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134)

**Section sources**
- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134)

## 依赖分析
部署脚本依赖于多个外部组件和配置文件，形成了复杂的依赖关系网络。这些依赖确保了部署过程的可靠性和一致性。

```mermaid
graph TD
A[install.sh] --> B[git]
A --> C[docker]
A --> D[docker-compose]
A --> E[kami_frontend]
A --> F[kami_backend]
A --> G[kami_boss]
A --> H[kami_merchant]
A --> I[kami_shop]
A --> J[kami_gateway]
A --> K[kami_agent]
A --> L[./manifest/docker/docker-compose.yml]
A --> M[./deploy/docker-compose.yml]
N[install-test.sh] --> B
N --> C
N --> D
N --> E
N --> F
N --> G
N --> H
N --> I
N --> J
N --> K
N --> O[./manifest/docker/docker-compose-test.yml]
N --> P[./deploy/docker-compose-test.yml]
Q[install-one.sh] --> B
Q --> C
Q --> D
Q --> E
Q --> F
Q --> G
Q --> H
Q --> I
Q --> J
Q --> K
Q --> L
Q --> M
R[wait-for-it.sh] --> S[nc (netcat)]
```

**Diagram sources **
- [install.sh](file://manifest/docker/install.sh#L1-L144)
- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118)
- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134)
- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L20)

**Section sources**
- [install.sh](file://manifest/docker/install.sh#L1-L144)
- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118)
- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134)
- [wait-for-it.sh](file://manifest/docker/wait-for-it.sh#L1-L20)

## 性能考虑
部署脚本在设计时考虑了性能优化，通过一系列机制确保部署过程的高效性。脚本通过停止所有其他容器来释放系统资源，确保新部署的服务能够获得足够的计算资源。同时，脚本在部署完成后删除本地代码和悬空镜像，有效管理磁盘空间。

部署过程中的等待机制（10秒暂停）为服务启动和初始化提供了充足的时间，避免了因服务未完全启动而导致的后续操作失败。此外，脚本通过重启kami_前缀的所有容器来确保服务状态的一致性，提高了部署的可靠性。

## 故障排除指南
当部署脚本执行失败时，可以根据以下常见问题进行排查：

1. **Git克隆失败**：检查网络连接和Git仓库地址的正确性，确保有权限访问指定的代码库。
2. **Docker权限问题**：确保执行脚本的用户具有Docker操作权限，或者以root用户身份运行脚本。
3. **端口冲突**：检查Docker Compose配置中定义的端口是否已被其他进程占用。
4. **磁盘空间不足**：部署过程需要足够的磁盘空间来存储镜像和容器，确保系统有足够的可用空间。
5. **依赖缺失**：确保系统已安装git、docker和docker-compose等必要工具。

**Section sources**
- [install.sh](file://manifest/docker/install.sh#L1-L144)
- [install-test.sh](file://manifest/docker/install-test.sh#L1-L118)
- [install-one.sh](file://manifest/docker/install-one.sh#L1-L134)

## 结论
Kami项目的部署自动化脚本提供了一套完整、灵活且可靠的部署解决方案。通过install.sh、install-test.sh和install-one.sh三个脚本，项目支持了从完整部署到测试部署再到单节点部署的多种场景，满足了不同环境下的部署需求。脚本设计考虑了用户体验、错误处理和资源管理，通过标准化的流程确保了部署的一致性和可靠性。未来可以通过添加更多的配置选项和环境支持来进一步扩展这些脚本的功能。