it0/docs/deployment-guide.md

626 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.

# IT0 系统编译与部署指南
IT0 是一个 AI 驱动的服务器集群运维平台,采用 DDD + Clean Architecture + 微服务架构。本文档涵盖系统的编译、部署和运维全流程。
---
## 目录
- [架构概览](#架构概览)
- [前置依赖](#前置依赖)
- [项目结构](#项目结构)
- [安装依赖](#安装依赖)
- [本地开发](#本地开发)
- [编译构建](#编译构建)
- [Docker 部署](#docker-部署)
- [生产部署](#生产部署)
- [语音服务GPU](#语音服务gpu)
- [数据库迁移](#数据库迁移)
- [环境变量说明](#环境变量说明)
- [服务端口](#服务端口)
- [运维命令](#运维命令)
- [关键文件索引](#关键文件索引)
- [快速上手清单](#快速上手清单)
---
## 架构概览
```
客户端 (Web/App/语音)
Nginx (SSL/TLS 反向代理)
Kong API Gateway (:8000)
├── auth-service (:3001) JWT 认证与 RBAC
├── agent-service (:3002) AI 代理编排Claude CLI/API
├── ops-service (:3003) 运维任务管理
├── inventory-service (:3004) 服务器资产管理
├── monitor-service (:3005) 健康监控与告警
├── comm-service (:3006) 多渠道消息通知
├── audit-service (:3007) 审计日志
└── voice-service (:3008) 语音交互STT/TTS
基础设施:
PostgreSQL 16 ── 主数据库Schema-per-Tenant 多租户隔离)
Redis 7 ── 事件总线Redis Streams+ 缓存 + 限流
```
**技术栈:**
| 组件 | 技术 |
|------|------|
| 后端微服务 | NestJS (TypeScript) |
| API 网关 | Kong 3.7 (DB-less 模式) |
| Web 管理端 | Next.js (React/TypeScript) |
| 移动端 | Flutter (Dart) |
| 语音引擎 | FastAPI + Pipecat + Whisper + Kokoro |
| 构建工具 | Turbo + pnpm Workspaces |
| 容器化 | Docker + Docker Compose |
---
## 前置依赖
| 软件 | 版本要求 | 用途 |
|------|----------|------|
| Node.js | v18+ | 后端 NestJS 服务运行时 |
| pnpm | 最新稳定版 | 包管理器Workspaces 支持) |
| Docker | 最新稳定版 | 容器化运行环境 |
| Docker Compose | v2.x+ | 服务编排 |
| Python | 3.11 | 语音服务 |
| Flutter | 最新稳定版 | 移动端 App 构建 |
---
## 项目结构
```
IT0/
├── packages/
│ ├── services/ # 微服务
│ │ ├── auth-service/ # 认证服务
│ │ ├── agent-service/ # AI 代理服务
│ │ ├── ops-service/ # 运维服务
│ │ ├── inventory-service/ # 资产服务
│ │ ├── monitor-service/ # 监控服务
│ │ ├── comm-service/ # 通信服务
│ │ ├── audit-service/ # 审计服务
│ │ └── voice-service/ # 语音服务 (Python)
│ ├── shared/ # 共享库
│ │ ├── common/ # @it0/common 通用工具
│ │ ├── database/ # @it0/database 数据层
│ │ ├── events/ # @it0/events 事件总线
│ │ ├── proto/ # @it0/proto gRPC 定义
│ │ └── testing/ # @it0/testing 测试工具
│ └── gateway/ # Kong API 网关配置
├── it0-web-admin/ # Next.js Web 管理端
├── it0_app/ # Flutter 移动端
├── deploy/
│ ├── docker/ # Docker 部署配置
│ │ ├── docker-compose.yml # 主编排文件
│ │ ├── docker-compose.voice.yml # GPU 语音覆盖
│ │ ├── docker-compose.ssl.yml # SSL 代理覆盖
│ │ ├── deploy.sh # 部署脚本
│ │ ├── .env.example # 环境变量模板
│ │ └── nginx/ # Nginx 配置
│ └── k8s/ # Kubernetes 配置
├── package.json # Monorepo 根配置
├── turbo.json # Turbo 构建管道
└── pnpm-lock.yaml # 依赖锁定文件
```
---
## 安装依赖
```bash
# 在项目根目录执行,安装所有工作区依赖
pnpm install
```
此命令会自动安装以下工作区的依赖:
- `packages/services/*` — 7 个 NestJS 微服务
- `packages/shared/*` — 5 个共享库
- `packages/gateway` — Kong API 网关
- `it0-web-admin` — Next.js 前端
语音服务Python需单独安装
```bash
cd packages/services/voice-service
pip install -r requirements.txt
```
Flutter 移动端:
```bash
cd it0_app
flutter pub get
```
---
## 本地开发
### 方式 ADocker Compose推荐
最简单的方式,一键启动所有服务和基础设施:
```bash
cd deploy/docker
# 1. 首次安装(自动生成 .env 及安全密钥)
./deploy.sh install
# 2. 编辑 .env填入必要配置
vi .env
# 至少需要设置 ANTHROPIC_API_KEY
# 3. 构建所有 Docker 镜像
./deploy.sh build
# 4. 启动所有服务
./deploy.sh up
# 5. 运行数据库迁移
./deploy.sh migrate
```
启动完成后:
- Web 管理端:`http://localhost:3000`
- API 网关:`http://localhost:8000`
### 方式 B原生开发热重载
适合需要频繁修改代码的开发场景:
```bash
# 终端 1启动基础设施PostgreSQL + Redis
cd deploy/docker
docker-compose up postgres redis -d
# 终端 2启动所有后端服务Watch 模式,自动重载)
# 回到项目根目录
pnpm dev
# 终端 3启动 Web 前端可选pnpm dev 已包含)
cd it0-web-admin
npm run dev
```
本地开发需要在根目录创建 `.env` 文件(参考 `.env.example`
```env
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=it0
DB_PASSWORD=it0_dev
DB_DATABASE=it0
REDIS_URL=redis://localhost:6379
JWT_SECRET=your-jwt-secret-change-in-production
JWT_REFRESH_SECRET=your-refresh-secret-change-in-production
AGENT_ENGINE_TYPE=claude_code_cli
ANTHROPIC_API_KEY=sk-ant-xxx
```
---
## 编译构建
### 后端服务NestJS
```bash
# Turbo 并行构建所有服务(自动处理依赖关系)
pnpm build
# 构建单个服务
pnpm --filter @it0/auth-service build
pnpm --filter @it0/agent-service build
pnpm --filter @it0/ops-service build
# 构建输出目录
# packages/services/{service-name}/dist/
```
每个 NestJS 服务使用 `nest build` 编译 TypeScript 到 JavaScript输出到各自的 `dist/` 目录。
### Web 管理端Next.js
```bash
cd it0-web-admin
# 开发模式
npm run dev
# 生产构建
npm run build
# 输出:.next/ 目录
# 启动生产服务
npm run start # 默认端口 3000
```
### Flutter 移动端
```bash
cd it0_app
# 获取依赖
flutter pub get
# 代码生成(如有使用 build_runner
flutter pub run build_runner build --delete-conflicting-outputs
# 构建 Android APK
flutter build apk
# 构建 iOS
flutter build ios
```
### 语音服务Python
Python 服务无需编译,直接运行:
```bash
cd packages/services/voice-service
# 开发模式(自动重载)
uvicorn src.api.main:app --reload --port 3008
# 生产模式
uvicorn src.api.main:app --host 0.0.0.0 --port 3008 --workers 4
```
---
## Docker 部署
### Docker Compose 文件说明
| 文件 | 用途 |
|------|------|
| `docker-compose.yml` | 主编排文件,包含所有服务和基础设施 |
| `docker-compose.voice.yml` | GPU 覆盖层,为语音服务启用 NVIDIA GPU |
| `docker-compose.ssl.yml` | SSL 覆盖层,添加 Nginx 反向代理 + Certbot |
### 构建镜像
```bash
cd deploy/docker
# 并行构建所有镜像
./deploy.sh build
# 无缓存构建(完全重建)
./deploy.sh build-no-cache
```
### Docker 网络与卷
**网络:**
- `it0-network` — 所有服务共享的 bridge 网络
**数据卷:**
| 卷名 | 用途 |
|------|------|
| `postgres_data` | PostgreSQL 数据持久化 |
| `certbot_webroot` | ACME 证书验证目录 |
| `certbot_certs` | SSL 证书存储 |
| `models` | 语音模型缓存(可选) |
---
## 生产部署
### 完整流程
```bash
cd deploy/docker
# 1. 首次安装(生成安全密钥和配置)
./deploy.sh install
# 自动生成:
# - JWT_SECRET32 位随机字符)
# - JWT_REFRESH_SECRET32 位随机字符)
# - VAULT_MASTER_KEY64 位十六进制)
# - POSTGRES_PASSWORD32 位随机字符)
# 2. 编辑 .env 配置生产环境变量
vi .env
# 必须手动设置:
# - ANTHROPIC_API_KEY
# - API_DOMAIN如 it0api.szaiai.com
# - WEB_DOMAIN如 it0.szaiai.com
# - CERT_EMAIL如 admin@szaiai.com
# 3. 构建所有 Docker 镜像
./deploy.sh build
# 4. 获取 SSL 证书Let's Encrypt
./deploy.sh ssl-init
# 5. 带 SSL 启动所有服务
./deploy.sh ssl-up
# 6. 运行数据库迁移
./deploy.sh migrate
# 7. 验证部署
./deploy.sh health
```
### SSL/TLS 配置
Nginx 作为 SSL 反向代理,配置位于 `deploy/docker/nginx/`
| 文件 | 用途 |
|------|------|
| `nginx.conf` | 主配置(反向代理 + 限流 + 压缩) |
| `nginx-init.conf` | 初始配置(仅 HTTP用于 ACME 验证) |
| `ssl-params.conf` | SSL 参数Mozilla Intermediate 配置) |
**SSL 特性:**
- TLS 1.2 + 1.3 支持
- ECDHE 密钥交换
- HSTS 预加载头
- OCSP Stapling
- API 限流30 请求/秒
- Web 限流50 请求/秒
- Gzip 压缩
**生产域名映射:**
- `https://it0api.szaiai.com` → Kong Gateway (:8000)
- `https://it0.szaiai.com` → Web Admin (:3000)
### 证书管理
```bash
# 获取证书(首次)
./deploy.sh ssl-init
# 手动续期
./deploy.sh ssl-renew
# 查看证书状态
./deploy.sh ssl-status
```
Certbot 容器会自动处理证书续期。
---
## 语音服务GPU
语音服务使用以下模型:
- **STT语音转文字** faster-whisper (large-v3)
- **TTS文字转语音** Kokoro-82M
- **VAD语音活动检测** Silero VAD
- **编排框架:** Pipecat
### 启用 GPU 支持
```bash
# 使用 GPU 覆盖层启动
./deploy.sh voice-up
# 重建语音服务
./deploy.sh voice-rebuild
```
GPU 模式通过 `docker-compose.voice.yml` 添加:
- NVIDIA GPU 设备访问
- `DEVICE=cuda` 环境变量
- 模型缓存卷挂载
### CPU 模式
默认使用 CPU 运行,在 `.env` 中设置:
```env
VOICE_DEVICE=cpu
WHISPER_MODEL=large-v3
KOKORO_MODEL=kokoro-82m
```
---
## 数据库迁移
IT0 使用 TypeORM 管理数据库迁移,采用 Schema-per-Tenant 多租户架构:
```sql
-- 自动创建的 Schema
shared -- 跨租户共享数据
tenant_default -- 默认租户
tenant_{id} -- 各租户独立 Schema
```
### 迁移命令
```bash
# 运行所有服务的迁移
./deploy.sh migrate
# 生成新迁移
./deploy.sh migrate-generate auth-service AddUserTable
# 回滚上一次迁移
./deploy.sh migrate-revert auth-service
# 强制同步 Schema仅开发环境
./deploy.sh schema-sync auth-service
```
---
## 环境变量说明
### 必填变量
| 变量 | 说明 | 示例 |
|------|------|------|
| `POSTGRES_USER` | 数据库用户名 | `it0` |
| `POSTGRES_PASSWORD` | 数据库密码 | *自动生成* |
| `POSTGRES_DB` | 数据库名 | `it0` |
| `JWT_SECRET` | JWT 签名密钥 | *自动生成* |
| `JWT_REFRESH_SECRET` | Refresh Token 密钥 | *自动生成* |
| `VAULT_MASTER_KEY` | 凭证加密主密钥 | *自动生成* |
| `ANTHROPIC_API_KEY` | Claude AI API 密钥 | `sk-ant-xxx` |
### 可选变量
| 变量 | 说明 | 默认值 |
|------|------|--------|
| `REDIS_PASSWORD` | Redis 密码 | 空(无认证) |
| `API_DOMAIN` | API 域名 | `it0api.szaiai.com` |
| `WEB_DOMAIN` | Web 域名 | `it0.szaiai.com` |
| `CERT_EMAIL` | Let's Encrypt 邮箱 | `admin@szaiai.com` |
| `TWILIO_ACCOUNT_SID` | Twilio 账号 SID | 空 |
| `TWILIO_AUTH_TOKEN` | Twilio 认证令牌 | 空 |
| `TWILIO_PHONE_NUMBER` | Twilio 电话号码 | 空 |
| `WHISPER_MODEL` | Whisper 模型版本 | `large-v3` |
| `KOKORO_MODEL` | Kokoro TTS 模型 | `kokoro-82m` |
| `VOICE_DEVICE` | 语音计算设备 | `cpu` |
---
## 服务端口
### 内部端口Docker 网络内)
| 服务 | 端口 | 健康检查 |
|------|------|----------|
| Kong API Gateway | 8000 (代理) / 8001 (管理) | `GET /status` |
| Web Admin | 3000 | — |
| Auth Service | 3001 | `GET /api/health` |
| Agent Service | 3002 | `GET /api/health` |
| Ops Service | 3003 | `GET /api/health` |
| Inventory Service | 3004 | `GET /api/health` |
| Monitor Service | 3005 | `GET /api/health` |
| Comm Service | 3006 | `GET /api/health` |
| Audit Service | 3007 | `GET /api/health` |
| Voice Service | 3008 | `GET /health` |
| PostgreSQL | 5432 | — |
| Redis | 6379 | — |
### Kong 网关路由
```
/api/v1/auth → http://auth-service:3001
/api/v1/agent → http://agent-service:3002
/api/v1/ops → http://ops-service:3003
/api/v1/inventory → http://inventory-service:3004
/api/v1/monitor → http://monitor-service:3005
/api/v1/comm → http://comm-service:3006
/api/v1/audit → http://audit-service:3007
# WebSocket 路由
/ws/agent → ws://agent-service:3002
/ws/voice → ws://voice-service:3008
```
---
## 运维命令
所有命令通过 `deploy/docker/deploy.sh` 执行:
### 服务管理
```bash
./deploy.sh up # 启动所有服务
./deploy.sh down # 停止所有服务
./deploy.sh restart # 重启所有服务
./deploy.sh start-svc <name> # 启动指定服务
./deploy.sh rebuild-svc <name> # 重建并重启指定服务
```
### 监控与日志
```bash
./deploy.sh status # 查看容器运行状态
./deploy.sh health # 健康检查所有服务
./deploy.sh logs # 查看所有日志
./deploy.sh logs <service> # 查看指定服务日志
```
### 基础设施
```bash
./deploy.sh infra-up # 仅启动 PostgreSQL + Redis
./deploy.sh infra-reset # 重置基础设施(会删除数据!)
```
### SSL 证书
```bash
./deploy.sh ssl-init # 首次获取证书
./deploy.sh ssl-up # 带 SSL 启动
./deploy.sh ssl-renew # 手动续期证书
./deploy.sh ssl-status # 查看证书状态
```
### 数据库
```bash
./deploy.sh migrate # 运行迁移
./deploy.sh migrate-generate <svc> <name> # 生成迁移
./deploy.sh migrate-revert <svc> # 回滚迁移
./deploy.sh schema-sync <svc> # 同步 Schema仅开发
```
---
## 关键文件索引
| 路径 | 说明 |
|------|------|
| `package.json` | Monorepo 根配置pnpm workspaces + Turbo 脚本) |
| `turbo.json` | Turbo 构建管道与缓存配置 |
| `deploy/docker/deploy.sh` | 生产部署脚本(核心) |
| `deploy/docker/docker-compose.yml` | 主 Docker Compose 编排文件 |
| `deploy/docker/docker-compose.voice.yml` | GPU 语音服务覆盖层 |
| `deploy/docker/docker-compose.ssl.yml` | SSL Nginx 代理覆盖层 |
| `deploy/docker/.env.example` | 环境变量模板 |
| `deploy/docker/nginx/nginx.conf` | Nginx SSL 反向代理配置 |
| `deploy/k8s/base/` | Kubernetes 部署配置 |
| `packages/gateway/config/kong.yml` | Kong 网关声明式配置 |
| `packages/gateway/Dockerfile` | Kong 网关 Dockerfile |
| `packages/services/voice-service/Dockerfile` | 语音服务 Dockerfile |
---
## 快速上手清单
### 本地开发Docker
- [ ] 安装 Docker、pnpm、Node.js v18+
- [ ] `pnpm install` — 安装依赖
- [ ] `cd deploy/docker && ./deploy.sh install` — 初始化配置
- [ ] 编辑 `.env`,设置 `ANTHROPIC_API_KEY`
- [ ] `./deploy.sh build` — 构建镜像
- [ ] `./deploy.sh up` — 启动服务
- [ ] `./deploy.sh migrate` — 数据库迁移
- [ ] 访问 `http://localhost:3000`Web`http://localhost:8000`API
### 生产部署
- [ ] 准备服务器Linux已安装 Docker + Docker Compose
- [ ] 克隆代码仓库
- [ ] `cd deploy/docker && ./deploy.sh install` — 初始化配置
- [ ] 编辑 `.env`设置所有必要变量API Key、域名、邮箱
- [ ] `./deploy.sh build` — 构建镜像
- [ ] `./deploy.sh ssl-init` — 获取 SSL 证书
- [ ] `./deploy.sh ssl-up` — 带 SSL 启动
- [ ] `./deploy.sh migrate` — 数据库迁移
- [ ] `./deploy.sh health` — 验证所有服务健康