# 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
```

---

## 本地开发

### 方式 A：Docker 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_SECRET（32 位随机字符）
#   - JWT_REFRESH_SECRET（32 位随机字符）
#   - VAULT_MASTER_KEY（64 位十六进制）
#   - POSTGRES_PASSWORD（32 位随机字符）

# 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` — 验证所有服务健康
