一刻工坊|部署手册 V1.0
文档目标:指导运维/开发人员完成从本地到生产环境的部署 最后更新:2025-12-21 依据:Based on
/docs/_source_of_truth/tech_facts.md
目录
1. 基础环境要求
1.1 硬件/云资源
- [ ] 域名: 一个备案完成的一级/二级域名 (e.g.,
api.yike.com). - [ ] HTTPS 证书: 泛域名证书或单域名证书 (Let's Encrypt / 阿里云).
- [ ] 对象存储 (OSS): MinIO (私有化) 或 AWS S3 / 阿里云 OSS.
- [ ] 数据库: PostgreSQL 14+.
- [ ] 缓存/队列: Redis 6+ (用于 BullMQ 队列和 Session).
- [ ] 计算资源:
- Backend Node: 2核 4G RAM (最低).
- Python Agent: 2核 8G RAM (建议).
- GPU (可选): 仅当部署 本地 ComfyUI 或 本地 LLM 时需要。
- 推荐: NVIDIA RTX 3060 (12GB VRAM) 及以上.
- 注:若使用 API 模式调用 Suno/Midjourney,则不需要本地 GPU。
1.2 软件依赖
- [ ] Node.js: v18 LTS 或 v20 LTS.
- [ ] Python: 3.10+ (用于 LangGraph).
- [ ] PM2: 进程守护 (生产环境).
- [ ] Docker & Compose: 容器化部署建议.
- [ ] FFmpeg: 必须安装,用于音视频处理.
2. 部署模式详解
2.1 🏠 本地开发模式 (Local Dev)
适合开发调试,无需复杂依赖。
- 启动 DB/Redis:
docker-compose up -d postgres redis - 配置 .env: 复制
.env.example为.env,填入本地参数。 - 启动 Backend:
npm run dev(Nodemon). - 启动 Frontend:
npm run dev(Vite). - 启动 Agent:
python main.py(Debug mode).
2.2 🧪 测试/预发模式 (Staging)
模拟生产环境,主要用于 CI/CD 验证。
- [ ] 数据库使用独立的 Staging 库。
- [ ] 第三方 API 使用 Sandbox/Mock Key (如有)。
- [ ] 部署方式:Docker Compose 单机编排。
2.3 🚀 生产模式 (Production)
高可用,高性能。
- [ ] 数据库: 云托管 PostgreSQL (RDS) + 主从高可用。
- [ ] 缓存: 云托管 Redis Cluster。
- [ ] Backend: PM2 Cluster 模式 (
pm2 start ecosystem.config.js) 或 K8s Deployment。 - [ ] Frontend: Nginx 托管静态资源 + CDN 加速。
- [ ] Agent: 独立容器集群,配合 HPA 自动扩缩容。
3. 配置说明 (.env)
以下配置项需在 Backend 根目录 .env 文件中设置。
3.1 完整环境变量表
| 字段名 | 含义 | 示例 | 必填 | 对应功能模块 | 安全建议 |
|---|---|---|---|---|---|
| 基础配置 | |||||
PORT | 服务端口 | 3001 | Yes | 所有模块 | - |
NODE_ENV | 环境标识 | production | Yes | 所有模块 | - |
APP_SECRET | JWT 签名密钥 | random_string_xyz | Yes | 用户认证 | 高危:务必复杂且定期轮换 |
JWT_SECRET | JWT 密钥(备用) | another_secret | Yes | 用户认证 | 与 APP_SECRET 可相同 |
JWT_EXPIRES_IN | Token 有效期 | 7d | No | 用户认证 | 默认 7 天 |
| 数据库/中间件 | |||||
DB_HOST | PostgreSQL 地址 | 127.0.0.1 | Yes | 所有模块 | - |
DB_PORT | PostgreSQL 端口 | 5432 | No | 所有模块 | 默认 5432 |
DB_NAME | 数据库名 | kkmusic_prod | Yes | 所有模块 | - |
DB_USER | 数据库用户 | kkmusic | Yes | 所有模块 | - |
DB_PASSWORD | 数据库密码 | pass123 | Yes | 所有模块 | 勿提交到 Git |
REDIS_URL | Redis 连接串 | redis://:pass@host:6379 | Yes | 缓存/队列 | - |
REDIS_HOST | Redis 地址 | 127.0.0.1 | No | 缓存/队列 | 与 REDIS_URL 二选一 |
REDIS_PORT | Redis 端口 | 6379 | No | 缓存/队列 | - |
REDIS_PASSWORD | Redis 密码 | redis_pass | No | 缓存/队列 | - |
| AI 服务 - 甄甄 (Doubao) | |||||
ZHENZHEN_API_KEY | 甄甄 API Key | ... | Yes | LLM 推理 | 核心密钥 |
ZHENZHEN_BASE_URL | 甄甄 API 地址 | https://ark.cn-beijing.volces.com/api/v3 | Yes | LLM 推理 | - |
ZHENZHEN_DEFAULT_MODEL | 默认模型 | doubao-pro-32k | No | LLM 推理 | 默认值 |
| AI 服务 - OpenAI(备用) | |||||
OPENAI_API_KEY | OpenAI Key | sk-... | No | LLM 推理(备用) | 限制额度 |
OPENAI_BASE_URL | OpenAI API 地址 | https://api.openai.com/v1 | No | LLM 推理 | - |
| LangGraph Runner | |||||
LANGGRAPH_API_URL | LangGraph 服务地址 | http://localhost:8000 | Yes | Agent 调度 | - |
LANGGRAPH_API_TOKEN | LangGraph 认证 Token | jwt_token | Yes | Agent 调度 | 使用 Backend JWT |
LANGGRAPH_TIMEOUT | 请求超时时间 | 300000 | No | Agent 调度 | 默认 5 分钟 |
| ComfyUI | |||||
COMFYUI_HOST | ComfyUI 服务地址 | http://localhost:8188 | No | 视觉生成 | 本地或云端 |
COMFYUI_API_KEY | ComfyUI API Key | ... | No | 视觉生成 | 仅云端需要 |
COMFYUI_TIMEOUT | 生成超时时间 | 120000 | No | 视觉生成 | 默认 2 分钟 |
| N8N | |||||
N8N_WEBHOOK_URL | N8N Webhook 地址 | http://localhost:5678/webhook/... | No | 自动化中心 | - |
N8N_API_KEY | N8N API Key | ... | No | 自动化中心 | - |
| Flowise(可选) | |||||
FLOWISE_API_URL | Flowise 服务地址 | http://localhost:3000 | No | 知识库问答 | - |
FLOWISE_CHATFLOW_ID | 知识库 Chatflow ID | abc123 | No | 知识库问答 | - |
| 音频/音乐服务 | |||||
SUNO_COOKIE | Suno 凭证 | ... | No | 音乐生成 | 需定期更新 Cookie |
SUNO_SESSION_ID | Suno Session ID | ... | No | 音乐生成 | - |
FISH_API_TOKEN | Fish Audio Token | ... | No | AI 配音 | - |
FISH_BASE_URL | Fish Audio API 地址 | https://api.fish.audio/v1 | No | AI 配音 | - |
| 对象存储 | |||||
OSS_PROVIDER | 存储提供商 | aliyun / local | Yes | 文件存储 | - |
OSS_LOCAL_PATH | 本地存储路径 | ./uploads | No | 文件存储 | OSS_PROVIDER=local 时必填 |
ALI_ACCESS_KEY | 阿里云 AccessKey | LTAI... | No | 阿里云 OSS | 仅授予最小权限 |
ALI_ACCESS_SECRET | 阿里云 AccessSecret | ... | No | 阿里云 OSS | 高危 |
ALI_OSS_BUCKET | OSS Bucket 名称 | kkmusic-assets | No | 阿里云 OSS | - |
ALI_OSS_REGION | OSS 区域 | oss-cn-hangzhou | No | 阿里云 OSS | - |
| 支付与登录 | |||||
ALIPAY_APP_ID | 支付宝 AppID | 2021... | No | 支付 | - |
ALIPAY_PRIVATE_KEY | 支付宝私钥 | MII... | No | 支付 | 高危 |
WECHAT_MCH_ID | 微信商户号 | 1234567890 | No | 支付 | - |
WECHAT_API_V3_KEY | 微信 API V3 密钥 | ... | No | 支付 | 高危 |
WX_OPEN_APP_ID | 微信开放平台 AppID | wx... | No | 微信登录 | - |
WX_OPEN_SECRET | 微信开放平台 Secret | ... | No | 微信登录 | 高危 |
| 剪映集成(仅本地) | |||||
JIANYING_DRAFT_PATH | 剪映草稿目录 | C:\Users\...\JianyingPro\User Data\Projects\com.lveditor.draft | No | 剪映草稿导出 | Windows/Mac 路径 |
| 监控与日志 | |||||
LOG_LEVEL | 日志级别 | info | No | 所有模块 | debug/info/warn/error |
PROMETHEUS_PORT | Prometheus 端口 | 9090 | No | 监控 | - |
GRAFANA_PORT | Grafana 端口 | 3002 | No | 监控 | - |
3.2 配置示例文件
开发环境 .env.development:
# Backend 基础配置
PORT=3001
NODE_ENV=development
APP_SECRET=dev-secret-key-change-in-prod
JWT_SECRET=dev-secret-key-change-in-prod
JWT_EXPIRES_IN=7d
# 数据库(Docker本地)
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=kkmusic_dev
DB_USER=kkmusic
DB_PASSWORD=dev_password_123
# Redis(Docker本地)
REDIS_URL=redis://127.0.0.1:6379
# 甄甄 AI(必填)
ZHENZHEN_API_KEY=your-zhenzhen-api-key-here
ZHENZHEN_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
ZHENZHEN_DEFAULT_MODEL=doubao-pro-32k
# LangGraph Runner(本地)
LANGGRAPH_API_URL=http://localhost:8000
LANGGRAPH_API_TOKEN=your-jwt-token-here
LANGGRAPH_TIMEOUT=300000
# ComfyUI(可选,不启动也能开发)
COMFYUI_HOST=http://localhost:8188
COMFYUI_TIMEOUT=120000
# Fish Audio(可选)
FISH_API_TOKEN=your-fish-token-here
FISH_BASE_URL=https://api.fish.audio/v1
# 对象存储(开发环境用本地)
OSS_PROVIDER=local
OSS_LOCAL_PATH=./uploads
# 日志
LOG_LEVEL=debug生产环境 .env.production:
# Backend 基础配置
PORT=3001
NODE_ENV=production
APP_SECRET=prod-super-complex-secret-key-change-regularly
JWT_SECRET=prod-jwt-secret-different-from-app-secret
JWT_EXPIRES_IN=7d
# 数据库(云RDS)
DB_HOST=rm-xxx.mysql.rds.aliyuncs.com
DB_PORT=5432
DB_NAME=kkmusic_prod
DB_USER=kkmusic_prod
DB_PASSWORD=prod_complex_password_123
# Redis(云Redis)
REDIS_URL=redis://:prod_redis_pass@r-xxx.redis.rds.aliyuncs.com:6379
# 甄甄 AI(生产Key)
ZHENZHEN_API_KEY=prod-zhenzhen-api-key
ZHENZHEN_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
ZHENZHEN_DEFAULT_MODEL=doubao-pro-32k
# LangGraph Runner(云端部署)
LANGGRAPH_API_URL=https://langgraph.yike.com
LANGGRAPH_API_TOKEN=prod-jwt-token
LANGGRAPH_TIMEOUT=300000
# ComfyUI(云端GPU服务)
COMFYUI_HOST=https://comfyui.yike.com
COMFYUI_API_KEY=prod-comfyui-key
COMFYUI_TIMEOUT=120000
# N8N(云端部署)
N8N_WEBHOOK_URL=https://n8n.yike.com/webhook/kkmusic/trigger
N8N_API_KEY=prod-n8n-api-key
# Fish Audio(生产Token)
FISH_API_TOKEN=prod-fish-token
FISH_BASE_URL=https://api.fish.audio/v1
# 对象存储(阿里云OSS)
OSS_PROVIDER=aliyun
ALI_ACCESS_KEY=LTAI5txxxxx
ALI_ACCESS_SECRET=prod_ali_secret
ALI_OSS_BUCKET=kkmusic-prod-assets
ALI_OSS_REGION=oss-cn-hangzhou
# 支付(生产配置)
ALIPAY_APP_ID=2021xxxxx
ALIPAY_PRIVATE_KEY=MIIEvQIBADANBg...
WECHAT_MCH_ID=1234567890
WECHAT_API_V3_KEY=prod_wechat_key
# 微信登录
WX_OPEN_APP_ID=wxabcdef123456
WX_OPEN_SECRET=prod_wx_secret
# 日志与监控
LOG_LEVEL=info
PROMETHEUS_PORT=9090
GRAFANA_PORT=30023.3 配置验证脚本
创建验证脚本(backend/scripts/validate-env.js):
const requiredVars = [
'PORT',
'NODE_ENV',
'APP_SECRET',
'DB_HOST',
'DB_NAME',
'DB_USER',
'DB_PASSWORD',
'REDIS_URL',
'ZHENZHEN_API_KEY',
'LANGGRAPH_API_URL'
];
const missing = requiredVars.filter(key => !process.env[key]);
if (missing.length > 0) {
console.error('❌ 缺少必填环境变量:', missing.join(', '));
process.exit(1);
}
console.log('✅ 环境变量配置验证通过');运行验证:
node scripts/validate-env.js📋 配置检查项
- [ ] 所有必填字段已配置
- [ ] 密钥未硬编码到代码中
- [ ] 生产环境密钥已定期轮换
- [ ] .env 文件已加入 .gitignore
如何使用这些配置? 查看 产品书 - 核心功能
4. 第三方 API 接入
4.1 核心生成服务
- [ ] Suno (音乐): 在
.env配置SUNO_COOKIE。需设置定时任务脚本每 7 天刷新 Cookie 保活。 - [ ] Fish Audio (配音): 配置
FISH_API_TOKEN。检查余额充足。 - [ ] Stable Diffusion / ComfyUI:
- 模式 A (本地): 配置
COMFYUI_HOST=http://localhost:8188。 - 模式 B (云端): 配置 API Gateway 地址及 Token。
- 模式 A (本地): 配置
4.2 客户端工具集成
- [ ] 剪映 (Jianying):
- 仅支持 Windows/Mac 本地环境。
- 需配置
JIANYING_DRAFT_PATH指向剪映草稿目录。 - 注意:生产服务器环境通常无法运行剪映。
4.3 支付与登录
- [ ] 支付:
- 支付宝:配置
ALIPAY_APP_ID,ALIPAY_PRIVATE_KEY。 - 微信支付:配置
WECHAT_MCH_ID,WECHAT_API_V3_KEY。
- 支付宝:配置
- [ ] 登录:
- 微信扫码:配置
WX_OPEN_APP_ID,WX_OPEN_SECRET。
- 微信扫码:配置
5. 监控与告警
5.1 健康检查 (Health Check)
- [ ] 接口:
GET /health - [ ] 检查项: DB 连接、Redis 连接、磁盘空间。
- [ ] 频率: 每 30s 一次。
5.2 关键指标 (Metrics)
建议集成 Prometheus + Grafana。
- [ ]
http_requests_total: API 请求量 (按 status code 分组)。 - [ ]
task_queue_size: 待处理任务数 (堆积预警)。 - [ ]
gpu_utilization: GPU 利用率 (如有本地节点)。
5.3 日志采集
- [ ] 生产环境建议将日志输出到
stdout,由 Docker Driver 收集至 ELK 或 Loki。 - [ ] 错误日志 (
level=error) 需触发即时告警 (钉钉/飞书/邮件)。
6. 备份与恢复
- [ ] 数据库:
- 策略: 每日全量备份 + WAL 归档。
- 验证: 每月进行一次恢复演练。
- [ ] 对象存储:
- 策略: 开启版本控制 (Versioning),防止误删。
- 跨区域复制 (CRR): 建议开启异地容灾。
- [ ] 配置文件:
- 策略: 使用 GitOps 管理配置模板,Secrets 使用 Vault 或云厂商 KMS 管理。
7. 故障排障 (Troubleshooting)
7.1 常见问题清单
| 现象 | 可能原因 | 排查命令/方案 |
|---|---|---|
| 队列堆积 | Agent 消费慢 / 挂死 | pm2 log agent 查看报错;重启 Agent;增加 Consumer 数量。 |
| API 超时 (504) | 数据库慢查询 / 同步调用了耗时操作 | 检查 Slow Query Log;将同步逻辑改为异步 Task。 |
| 生成失败 | 第三方 API 欠费 / Token 过期 | 检查 .env 配置;测试第三方连通性。 |
| Suno 401 | Cookie 失效 | 手动更新 .env 中的 SUNO_COOKIE 并重启服务。 |
7.2 限流与降级
- 限流: Nginx 层配置 IP 限流;业务层配置 User 限流。
- 降级: 当 Suno 不可用时,自动切换至备用音乐库或静音模式,并提示用户。
8. 完整部署实战
本章提供从零开始的完整部署指南,涵盖所有服务组件。
8.1 本地开发环境部署
目标:在本地搭建完整的开发环境,用于功能开发和调试。
8.1.1 前置准备
检查环境:
# 检查 Node.js 版本
node -v # 应输出 v18.x 或 v20.x
# 检查 Python 版本
python --version # 应输出 Python 3.10+
# 检查 Docker
docker -v
docker-compose -v
# 检查 FFmpeg
ffmpeg -version克隆代码仓库:
# 1. 克隆代码
git clone https://github.com/user/KKmusic.git
cd KKmusic
# 2. 查看项目结构
ls -la
# 应看到: backend/ frontend/ langgraph-runner/ miniprogram/ docs/ n8n/ flowise/8.1.2 启动基础设施
使用 Docker Compose 启动数据库和 Redis:
# 1. 创建 docker-compose.yml(如果不存在)
cat > docker-compose.yml <<EOF
version: '3.8'
services:
postgres:
image: postgres:14-alpine
environment:
POSTGRES_DB: kkmusic_dev
POSTGRES_USER: kkmusic
POSTGRES_PASSWORD: dev_password_123
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:6-alpine
ports:
- "6379:6379"
volumes:
- redis_data:/data
volumes:
postgres_data:
redis_data:
EOF
# 2. 启动服务
docker-compose up -d postgres redis
# 3. 验证服务
docker-compose ps
# 应看到 postgres 和 redis 状态为 Up
# 4. 测试数据库连接
docker exec -it $(docker ps -qf "name=postgres") psql -U kkmusic -d kkmusic_dev -c "SELECT version();"8.1.3 配置 Backend
cd backend
# 1. 安装依赖
npm install
# 2. 复制环境变量配置
cp .env.example .env
# 3. 编辑 .env 文件
cat > .env <<EOF
# 基础配置
PORT=3001
NODE_ENV=development
APP_SECRET=dev-secret-key-change-in-prod
# 数据库
DB_HOST=127.0.0.1
DB_PORT=5432
DB_NAME=kkmusic_dev
DB_USER=kkmusic
DB_PASSWORD=dev_password_123
# Redis
REDIS_URL=redis://127.0.0.1:6379
# 甄甄 (Doubao) - 主要 LLM
ZHENZHEN_API_KEY=your-zhenzhen-api-key
ZHENZHEN_BASE_URL=https://ark.cn-beijing.volces.com/api/v3
# LangGraph Runner
LANGGRAPH_API_URL=http://localhost:8000
# Fish Audio(可选)
FISH_API_TOKEN=your-fish-audio-token
# ComfyUI(可选,本地开发可不启动)
COMFYUI_HOST=http://localhost:8188
# 对象存储(开发环境可使用本地存储)
OSS_PROVIDER=local
OSS_LOCAL_PATH=./uploads
EOF
# 4. 运行数据库迁移
npm run migrate
# 5. 启动开发服务器
npm run dev
# 应输出: 🚀 Server running on http://localhost:3001验证 Backend:
# 测试健康检查接口
curl http://localhost:3001/health
# 应返回: {"status":"ok","db":"connected","redis":"connected"}8.1.4 配置 Frontend
cd ../frontend
# 1. 安装依赖
npm install
# 2. 创建 .env.development
cat > .env.development <<EOF
VITE_API_URL=http://localhost:3001
VITE_WS_URL=ws://localhost:3001
EOF
# 3. 启动开发服务器
npm run dev
# 应输出: ➜ Local: http://localhost:5173/验证 Frontend:
# 在浏览器中打开
open http://localhost:5173
# 应看到登录页面8.1.5 测试完整流程
# 1. 注册测试账号
curl -X POST http://localhost:3001/api/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"test@test.com","password":"Test123456","nickname":"测试用户"}'
# 2. 登录获取 Token
TOKEN=$(curl -X POST http://localhost:3001/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"test@test.com","password":"Test123456"}' \
| jq -r '.token')
# 3. 创建项目
curl -X POST http://localhost:3001/api/project \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"我的第一个项目","platform":"douyin"}'📋 本地开发检查项
- [ ] 数据库连接成功
- [ ] Redis 连接成功
- [ ] Backend 启动无报错
- [ ] Frontend 可访问
- [ ] 可完成注册登录流程
8.2 LangGraph Runner 部署
功能:Python Agent 服务,负责复杂 AI 逻辑(账号诊断、蓝图生成等)。
8.2.1 环境配置
cd langgraph-runner
# 1. 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 2. 安装依赖
pip install -r requirements.txtrequirements.txt 内容(参考 langgraph-runner/requirements.txt):
# LangGraph Runner Dependencies
# Core framework
langgraph>=0.2.0
langchain>=0.1.0
langchain-openai>=0.0.5
langchain-core>=0.1.0
# API framework
fastapi>=0.109.0
uvicorn[standard]>=0.27.0
pydantic>=2.5.0
pydantic-settings>=2.1.0
# HTTP client
httpx>=0.26.0
aiohttp>=3.9.0
# Data validation
python-dotenv>=1.0.0
# Observability (optional)
langsmith>=0.0.87
# Utilities
python-json-logger>=2.0.78.2.2 配置文件
创建 .env 文件(参考 langgraph-runner/env.example.txt):
cat > .env <<EOF
# OpenAI API (或使用甄甄)
OPENAI_API_KEY=sk-your-openai-api-key-here
OPENAI_MODEL=gpt-4o-mini
# Node.js Backend
NODE_API_URL=http://localhost:3001
NODE_API_TOKEN=your-jwt-token-here
# LangSmith (Optional - for tracing)
LANGSMITH_API_KEY=
LANGSMITH_PROJECT=kkmusic-langgraph
LANGSMITH_TRACING=false
# Server
HOST=0.0.0.0
PORT=8000
LOG_LEVEL=INFO
EOF获取 JWT Token(用于 LangGraph 调用 Backend API):
# 方法1:从 Backend 日志中复制测试用户的 Token
# 方法2:手动生成 Token
cd ../backend
node -e "
const jwt = require('jsonwebtoken');
const token = jwt.sign(
{ id: 1, email: 'test@test.com', role: 'admin' },
process.env.APP_SECRET || 'dev-secret-key-change-in-prod',
{ expiresIn: '7d' }
);
console.log(token);
" > ../langgraph-runner/temp_token.txt8.2.3 启动服务
# 开发模式
python app/main.py
# 应输出: INFO: Uvicorn running on http://0.0.0.0:8000
# 或使用 uvicorn 直接启动
uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload8.2.4 Docker 部署(生产环境)
Dockerfile(参考 langgraph-runner/Dockerfile):
FROM python:3.11-slim
WORKDIR /app
# Install dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy application
COPY app/ ./app/
# Expose port
EXPOSE 8000
# Run server
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]构建并运行:
# 构建镜像
docker build -t kkmusic-langgraph:latest .
# 运行容器
docker run -d \
--name langgraph-runner \
-p 8000:8000 \
--env-file .env \
kkmusic-langgraph:latest
# 查看日志
docker logs -f langgraph-runner8.2.5 验证部署
# 测试健康检查
curl http://localhost:8000/health
# 应返回: {"status":"healthy","service":"langgraph-runner"}
# 测试诊断接口
curl -X POST http://localhost:8000/api/v1/diagnosis \
-H "Content-Type: application/json" \
-d '{
"answers": ["抖音", "美妆", "8万", "每天2条", "希望日更5条"],
"project_id": "test-project-123"
}'📋 LangGraph Runner 检查项
- [ ] Python 环境配置正确
- [ ] 依赖安装完成
- [ ] 与 Backend 通信正常
- [ ] 可成功调用 LLM API
8.3 N8N 工作流引擎部署
功能:自动化中心,执行定时任务、批量采集等工作流。
8.3.1 快速启动
使用 PowerShell 脚本(参考 n8n/start-n8n.ps1):
# Windows PowerShell
cd n8n
# 启动 N8N(使用 Docker)
docker run -d `
--name n8n `
-p 5678:5678 `
-v ${PWD}/data:/home/node/.n8n `
-e N8N_BASIC_AUTH_ACTIVE=true `
-e N8N_BASIC_AUTH_USER=admin `
-e N8N_BASIC_AUTH_PASSWORD=Admin123456 `
-e WEBHOOK_URL=http://localhost:5678/ `
n8nio/n8n:latest
# 查看日志
docker logs -f n8nLinux/Mac 启动:
cd n8n
# 使用 docker-compose
cat > docker-compose.yml <<EOF
version: '3.8'
services:
n8n:
image: n8nio/n8n:latest
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=admin
- N8N_BASIC_AUTH_PASSWORD=Admin123456
- WEBHOOK_URL=http://localhost:5678/
volumes:
- ./data:/home/node/.n8n
EOF
docker-compose up -d8.3.2 导入工作流
导入 "计划调度器" 工作流(参考 n8n/workflows/plan_scheduler.json):
- 访问 http://localhost:5678
- 登录(admin / Admin123456)
- 点击 "+ Add workflow"
- 点击右上角三点菜单 → Import from File
- 选择
n8n/workflows/plan_scheduler.json - 点击 "Save" 保存工作流
配置 Webhook:
{
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "kkmusic/trigger-plan",
"httpMethod": "POST",
"responseMode": "lastNode"
}
}Webhook URL:http://localhost:5678/webhook/kkmusic/trigger-plan
8.3.3 配置 Backend 集成
在 Backend 配置 N8N Webhook:
# backend/.env
N8N_WEBHOOK_URL=http://localhost:5678/webhook/kkmusic/trigger-plan触发工作流(backend/src/routes/automation.js):
const axios = require('axios');
async function triggerN8NWorkflow(workflowData) {
const response = await axios.post(
process.env.N8N_WEBHOOK_URL,
workflowData
);
console.log('✅ N8N 工作流已触发:', response.data);
return response.data;
}8.3.4 其他可用工作流
知识库自动摄取(n8n/workflows/kb_auto_ingest.json):
- 功能:每日自动抓取行业资讯并导入知识库
- Cron:每天 06:00 执行
每周知识分析(n8n/workflows/kb_weekly_analysis.json):
- 功能:每周汇总知识库使用情况并生成报告
- Cron:每周一 09:00 执行
📋 N8N 检查项
- [ ] N8N 服务启动成功
- [ ] 可访问 Web UI
- [ ] 工作流导入成功
- [ ] Webhook 触发正常
8.4 Flowise 部署(可选)
功能:AI Chatflow 可视化编排,用于知识库问答、灵感分析等。
8.4.1 Docker 部署
cd flowise
# 使用 docker-compose
cat > docker-compose.yml <<EOF
version: '3.8'
services:
flowise:
image: flowiseai/flowise:latest
ports:
- "3000:3000"
environment:
- PORT=3000
- DATABASE_PATH=/root/.flowise
- APIKEY_PATH=/root/.flowise
- SECRETKEY_PATH=/root/.flowise
- LOG_LEVEL=info
volumes:
- ./data:/root/.flowise
EOF
docker-compose up -d
# 查看日志
docker-compose logs -f flowise8.4.2 导入 Chatflow
导入 "知识库聊天" Chatflow(参考 flowise/chatflows/kb_chat.json):
- 访问 http://localhost:3000
- 点击 "+ Add New"
- 点击 "Load Chatflow"
- 选择
flowise/chatflows/kb_chat.json - 配置向量数据库连接(Pinecone / Weaviate / 本地 Chroma)
向量数据库配置(参考 flowise/vector-store-setup.md):
// Pinecone 配置
{
"apiKey": "your-pinecone-api-key",
"environment": "us-west1-gcp",
"indexName": "kkmusic-kb"
}8.4.3 API 集成
调用 Flowise Chatflow(backend/src/services/FlowiseProxyService.js):
class FlowiseProxyService {
async query(chatflowId, question) {
const response = await axios.post(
`http://localhost:3000/api/v1/prediction/${chatflowId}`,
{
question,
overrideConfig: {
returnSourceDocuments: true
}
}
);
return {
answer: response.data.text,
sources: response.data.sourceDocuments
};
}
}📋 Flowise 检查项
- [ ] Flowise 服务启动成功
- [ ] Chatflow 导入成功
- [ ] 向量数据库连接正常
- [ ] API 调用成功返回
8.5 小程序部署
功能:移动端拍摄助手,支持 AR 构图、智能提词器、离线队列。
8.5.1 开发工具配置
下载微信开发者工具:
导入项目:
- 打开微信开发者工具
- 点击 "导入项目"
- 选择
miniprogram目录 - 填写 AppID(测试可使用测试号)
8.5.2 配置 API 地址
编辑 miniprogram/src/services/api.js:
// 开发环境
const DEV_API_URL = 'http://localhost:3001';
// 生产环境
const PROD_API_URL = 'https://api.yike.com';
// 根据环境自动切换
const API_URL = process.env.NODE_ENV === 'production' ? PROD_API_URL : DEV_API_URL;
export default {
baseURL: API_URL,
timeout: 30000
};8.5.3 真机调试
步骤:
- 在微信开发者工具中点击 "预览"
- 使用手机微信扫描二维码
- 在手机上打开小程序进行测试
真机调试常见问题:
| 问题 | 原因 | 解决方案 |
|---|---|---|
| API 请求失败 | 服务器域名未配置 | 在小程序后台添加 request 合法域名 |
| WebSocket 连接失败 | wss 域名未配置 | 添加 socket 合法域名 |
| 文件上传失败 | uploadFile 域名未配置 | 添加 uploadFile 合法域名 |
配置合法域名(生产环境必须):
- 登录微信公众平台:https://mp.weixin.qq.com
- 进入 "开发" → "开发管理" → "开发设置"
- 找到 "服务器域名"
- 添加以下域名:
- request 合法域名:
https://api.yike.com - socket 合法域名:
wss://api.yike.com - uploadFile 合法域名:
https://api.yike.com
- request 合法域名:
8.5.4 发布上线
提交审核:
- 在微信开发者工具中点击 "上传"
- 填写版本号和备注
- 登录微信公众平台
- 在 "版本管理" 中找到刚上传的版本
- 点击 "提交审核"
- 填写审核信息(功能介绍、测试账号等)
- 等待审核(通常 1-3 天)
📋 小程序检查项
- [ ] 开发者工具导入成功
- [ ] API 地址配置正确
- [ ] 真机调试功能正常
- [ ] 合法域名已配置
8.6 数据库迁移执行
功能:执行所有数据库 schema 变更,创建表结构。
8.6.1 迁移文件列表
所有 Migration 文件(位于 backend/src/database/migrations/):
ls backend/src/database/migrations/
# 应看到以下文件:
20251208000000-create-admin-tables.js
20251212000000-create-strategy-logs-table.js
20251214000000-add-diagnosis-sync-fields.js
20251214020000-create-knowledge-base.js
20251215000000-create-facts-tables.js
20251215030000-create-audit-logs.js
20251215040000-create-content-templates.js
20251215050000-create-content-versions.js
20251215060000-create-template-performance.js
20251215070000-create-workflow-presets.js
20251216000000-create-governance-tables.js
20251217000000-add-format-taxonomy-fields.js8.6.2 执行迁移
配置 package.json 脚本:
{
"scripts": {
"migrate": "sequelize-cli db:migrate",
"migrate:undo": "sequelize-cli db:migrate:undo",
"migrate:status": "sequelize-cli db:migrate:status"
}
}执行所有迁移:
cd backend
# 1. 查看迁移状态
npm run migrate:status
# 输出示例:
# Status Migration
# ──────────────────────────────────────
# up 20251208000000-create-admin-tables.js
# up 20251212000000-create-strategy-logs-table.js
# down 20251214000000-add-diagnosis-sync-fields.js
# down 20251214020000-create-knowledge-base.js
# 2. 执行所有未执行的迁移
npm run migrate
# 应输出:
# ✅ 20251214000000-add-diagnosis-sync-fields.js migrated
# ✅ 20251214020000-create-knowledge-base.js migrated
# ✅ ... (所有未执行的迁移)
# 3. 验证迁移结果
npm run migrate:status
# 所有状态应为 "up"8.6.3 回滚迁移
回滚最后一次迁移:
npm run migrate:undo
# 回滚到指定迁移
npx sequelize-cli db:migrate:undo:all --to 20251214000000-add-diagnosis-sync-fields.js8.6.4 初始化数据(Seed)
创建种子数据文件(backend/src/database/seeders/):
// 20251220-demo-user.js
module.exports = {
up: async (queryInterface, Sequelize) => {
await queryInterface.bulkInsert('Users', [
{
id: '00000000-0000-0000-0000-000000000001',
email: 'demo@yike.com',
password: '$2b$10$hashed_password',
nickname: '演示账号',
role: 'paid',
created_at: new Date(),
updated_at: new Date()
}
]);
},
down: async (queryInterface, Sequelize) => {
await queryInterface.bulkDelete('Users', {
email: 'demo@yike.com'
});
}
};执行 Seed:
# 执行所有 seed
npx sequelize-cli db:seed:all
# 撤销所有 seed
npx sequelize-cli db:seed:undo:all8.6.5 生产环境迁移注意事项
最佳实践:
备份数据库:
bashpg_dump -U kkmusic -d kkmusic_prod > backup_$(date +%Y%m%d_%H%M%S).sql在预发环境测试:
bashNODE_ENV=staging npm run migrate执行生产迁移:
bashNODE_ENV=production npm run migrate验证数据完整性:
bash# 检查表是否创建成功 psql -U kkmusic -d kkmusic_prod -c "\dt" # 检查数据是否正常 psql -U kkmusic -d kkmusic_prod -c "SELECT COUNT(*) FROM Users;"如有问题立即回滚:
bash# 恢复备份 psql -U kkmusic -d kkmusic_prod < backup_20251221_143000.sql
📋 数据库迁移检查项
- [ ] 所有迁移文件完整
- [ ] 迁移执行无报错
- [ ] 数据库表结构正确
- [ ] 种子数据导入成功
- [ ] 生产迁移已备份
📚 本章小结
第 8 章提供了完整的部署实战指南,涵盖:
- 本地开发环境:Backend + Frontend + 数据库 + Redis 完整配置
- LangGraph Runner:Python Agent 服务部署与 Docker 化
- N8N 工作流引擎:自动化任务调度器配置与工作流导入
- Flowise(可选):AI Chatflow 可视化编排部署
- 小程序:微信开发者工具配置与真机调试
- 数据库迁移:Schema 变更管理与种子数据初始化
🔗 相关章节
- 了解系统架构? 查看 技术白皮书 - 架构总览
- 各配置项对应哪些功能? 查看 产品书 - 核心功能
9. 监控告警实战配置
本章提供 Prometheus + Grafana 完整配置指南,实现生产级监控。
9.1 Prometheus 配置
9.1.1 安装 Prometheus
Docker 方式:
cd monitoring
# 创建 docker-compose.yml
cat > docker-compose.yml <<EOF
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/alert-rules.yml:/etc/prometheus/alert-rules.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
alertmanager:
image: prom/alertmanager:latest
ports:
- "9093:9093"
volumes:
- ./prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.yml
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
volumes:
prometheus_data:
EOF
docker-compose up -d9.1.2 Prometheus 配置文件
monitoring/prometheus/prometheus.yml 内容:
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: 'kkmusic-production'
environment: 'production'
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- 'localhost:9093'
# Load rules once and periodically evaluate them
rule_files:
- "alert-rules.yml"
# Scrape configurations
scrape_configs:
# KKMusic Backend API
- job_name: 'kkmusic-backend'
static_configs:
- targets: ['localhost:3001']
metrics_path: '/metrics'
scrape_interval: 30s
# Node.js process metrics
- job_name: 'node-exporter'
static_configs:
- targets: ['localhost:9100']
# PostgreSQL metrics
- job_name: 'postgresql'
static_configs:
- targets: ['localhost:9187']
# Redis metrics
- job_name: 'redis'
static_configs:
- targets: ['localhost:9121']9.1.3 告警规则配置
monitoring/prometheus/alert-rules.yml 内容:
groups:
- name: kkmusic_alerts
interval: 30s
rules:
# AI生成成功率告警
- alert: LowAIGenerationSuccessRate
expr: ai_generation_success_rate < 80
for: 5m
labels:
severity: warning
component: ai_engine
annotations:
summary: "AI生成成功率过低"
description: "AI生成成功率为 {{ $value }}%,低于80%阈值"
- alert: CriticalAIGenerationSuccessRate
expr: ai_generation_success_rate < 60
for: 5m
labels:
severity: critical
component: ai_engine
annotations:
summary: "AI生成成功率严重过低"
description: "AI生成成功率为 {{ $value }}%,低于60%阈值,需立即处理"
# API响应时间告警
- alert: HighAPIResponseTime
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 5
for: 10m
labels:
severity: warning
component: api_server
annotations:
summary: "API响应时间过长"
description: "95分位响应时间超过5秒"
# 队列积压告警
- alert: HighQueueBacklog
expr: queue_backlog_total > 100
for: 10m
labels:
severity: warning
component: task_queue
annotations:
summary: "任务队列积压严重"
description: "队列积压任务数为 {{ $value }},超过100"
- alert: CriticalQueueBacklog
expr: queue_backlog_total > 500
for: 5m
labels:
severity: critical
component: task_queue
annotations:
summary: "任务队列积压极度严重"
description: "队列积压任务数为 {{ $value }},超过500,需立即处理"验证告警规则:
# 检查语法
promtool check rules monitoring/prometheus/alert-rules.yml
# 应输出: Checking alert-rules.yml
# SUCCESS: 5 rules found9.2 Grafana Dashboard 配置
9.2.1 安装 Grafana
Docker 方式(添加到 docker-compose.yml):
grafana:
image: grafana/grafana:latest
ports:
- "3002:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=Admin123456
- GF_INSTALL_PLUGINS=grafana-piechart-panel
volumes:
- grafana_data:/var/lib/grafana
- ./grafana-dashboards:/etc/grafana/provisioning/dashboards
depends_on:
- prometheus
volumes:
grafana_data:启动 Grafana:
docker-compose up -d grafana
# 访问 Grafana
open http://localhost:3002
# 登录:admin / Admin1234569.2.2 配置数据源
在 Grafana 中添加 Prometheus:
- 登录 Grafana
- 左侧菜单 → Configuration → Data Sources
- 点击 "Add data source"
- 选择 "Prometheus"
- 配置:
- URL:
http://prometheus:9090(Docker 内部)或http://localhost:9090(本地) - Access: Server (default)
- URL:
- 点击 "Save & Test",应显示 "Data source is working"
9.2.3 导入 Dashboard
导入业务指标 Dashboard(参考 monitoring/grafana-dashboards/business-metrics.json):
- 左侧菜单 → Dashboards → Import
- 点击 "Upload JSON file"
- 选择
monitoring/grafana-dashboards/business-metrics.json - 选择数据源:Prometheus
- 点击 "Import"
Dashboard 包含的面板:
业务概览:
- 今日视频生成数(Counter)
- 今日活跃用户数(Gauge)
- 实时任务队列深度(Gauge)
- 各平台采集成功率(Pie Chart)
性能监控:
- API 请求 QPS(Graph,按接口分组)
- 响应时间分布(Heatmap,P50/P95/P99)
- 错误率趋势(Graph,按错误码分组)
资源监控:
- CPU 使用率(Graph)
- 内存使用率(Graph)
- 数据库连接数(Gauge)
- Redis 命中率(Gauge)
9.2.4 配置告警通知
创建通知渠道(钉钉 Webhook):
- Alerting → Notification channels → Add channel
- 选择类型:DingDing
- 配置 Webhook URL
- 测试通知
Alertmanager 配置(monitoring/prometheus/alertmanager.yml):
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'dingtalk'
receivers:
- name: 'dingtalk'
webhook_configs:
- url: 'https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN'
send_resolved: true9.3 Backend Metrics 暴露
在 Backend 中集成 Prometheus 客户端:
cd backend
npm install prom-client配置 Metrics 中间件(backend/src/middleware/metricsCollector.js):
const promClient = require('prom-client');
// 创建 Registry
const register = new promClient.Registry();
// 启用默认指标(CPU/内存/事件循环延迟)
promClient.collectDefaultMetrics({ register });
// 自定义指标
const httpRequestDuration = new promClient.Histogram({
name: 'http_request_duration_seconds',
help: 'Duration of HTTP requests in seconds',
labelNames: ['method', 'route', 'status_code'],
buckets: [0.1, 0.5, 1, 2, 5, 10]
});
const taskQueueDepth = new promClient.Gauge({
name: 'task_queue_depth',
help: 'Number of tasks in queue'
});
const aiGenerationSuccessRate = new promClient.Gauge({
name: 'ai_generation_success_rate',
help: 'AI generation success rate percentage'
});
register.registerMetric(httpRequestDuration);
register.registerMetric(taskQueueDepth);
register.registerMetric(aiGenerationSuccessRate);
// Metrics 收集中间件
function metricsMiddleware(req, res, next) {
const start = Date.now();
res.on('finish', () => {
const duration = (Date.now() - start) / 1000;
httpRequestDuration.observe({
method: req.method,
route: req.route?.path || req.path,
status_code: res.statusCode
}, duration);
});
next();
}
// Metrics 暴露接口
function metricsHandler(req, res) {
res.set('Content-Type', register.contentType);
res.end(register.metrics());
}
module.exports = { metricsMiddleware, metricsHandler, taskQueueDepth, aiGenerationSuccessRate };在 Express 中使用(backend/src/index.js):
const { metricsMiddleware, metricsHandler } = require('./middleware/metricsCollector');
// 所有路由应用 metrics 中间件
app.use(metricsMiddleware);
// Metrics 暴露接口
app.get('/metrics', metricsHandler);9.4 完整监控架构
graph LR
subgraph Application [应用层]
Backend[Backend API]
LangGraph[LangGraph Runner]
N8N[N8N]
end
subgraph Metrics [指标采集]
PromClient[Prom Client]
NodeExporter[Node Exporter]
PGExporter[PG Exporter]
RedisExporter[Redis Exporter]
end
subgraph Monitoring [监控层]
Prometheus[Prometheus]
Alertmanager[Alertmanager]
Grafana[Grafana]
end
subgraph Notification [通知层]
DingTalk[钉钉]
Email[邮件]
SMS[短信]
end
Backend --> PromClient
PromClient --> Prometheus
NodeExporter --> Prometheus
PGExporter --> Prometheus
RedisExporter --> Prometheus
Prometheus --> Alertmanager
Prometheus --> Grafana
Alertmanager --> DingTalk
Alertmanager --> Email
Alertmanager --> SMS9.5 实战操作步骤
步骤 1:启动监控服务
cd monitoring
# 启动 Prometheus + Grafana
docker-compose up -d prometheus grafana alertmanager
# 验证服务
docker-compose ps
# 应看到 3 个服务状态为 Up
# 查看日志
docker-compose logs -f prometheus步骤 2:验证指标采集
# 访问 Prometheus
open http://localhost:9090
# 在查询框输入:
http_requests_total
# 应看到图表显示请求量
# 查看告警规则
open http://localhost:9090/alerts
# 应看到配置的所有告警规则步骤 3:配置 Grafana
# 1. 访问 Grafana
open http://localhost:3002
# 2. 登录(admin / Admin123456)
# 3. 添加数据源
# Configuration → Data Sources → Add → Prometheus
# URL: http://prometheus:9090
# 4. 导入 Dashboard
# Dashboards → Import → Upload JSON
# 选择: monitoring/grafana-dashboards/business-metrics.json
# 5. 查看监控面板
# 应看到实时更新的业务指标图表步骤 4:测试告警
触发测试告警:
# 模拟队列积压
curl -X POST http://localhost:3001/api/test/simulate-queue-backlog?count=150
# 等待 10 分钟后,查看告警
open http://localhost:9090/alerts
# 应看到 HighQueueBacklog 触发验证通知:
- 检查钉钉群是否收到告警消息
- 检查邮箱是否收到告警邮件
9.6 监控最佳实践
1. 告警分级:
| 级别 | 响应时间 | 通知渠道 | 处理流程 |
|---|---|---|---|
| Critical (P0) | 立即 | 钉钉 + 短信 + 电话 | 值班工程师立即处理 |
| Warning (P1) | 30 分钟内 | 钉钉 + 邮件 | 工作时间内处理 |
| Info (P2) | 24 小时内 | 邮件 | 定期复盘优化 |
2. 指标查询示例:
# 查询 API 成功率
sum(rate(http_requests_total{status_code=~"2.."}[5m]))
/
sum(rate(http_requests_total[5m])) * 100
# 查询 P95 响应时间
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
# 查询 GPU 利用率
gpu_utilization_percent
# 查询队列积压
queue_backlog_total3. Dashboard 优化建议:
- 使用变量(Variables)支持按项目/用户筛选
- 设置自动刷新(每 30s)
- 配置时间范围快捷选择(Last 1h / Last 24h / Last 7d)
- 使用 Panel Links 关联到相关日志
9.7 生产环境监控清单
上线前检查:
- [ ] Prometheus 采集所有服务指标
- [ ] Grafana Dashboard 导入成功
- [ ] 告警规则配置完成
- [ ] 通知渠道测试通过
- [ ] 日志采集器配置(Filebeat/Fluentd)
- [ ] 链路追踪配置(Jaeger/Zipkin,可选)
- [ ] 值班人员已培训
日常巡检:
- [ ] 每日查看 Grafana Dashboard
- [ ] 每周复盘告警记录
- [ ] 每月优化告警阈值
- [ ] 每季度进行故障演练
📋 监控配置检查项
- [ ] Prometheus 是否正常采集指标?
- [ ] Grafana Dashboard 是否实时更新?
- [ ] 告警规则是否触发正常?
- [ ] 通知渠道是否畅通?
📚 部署手册小结
本手册涵盖了一刻工坊从本地开发到生产部署的完整流程:
- 第 1 章:硬件/软件基础环境要求
- 第 2 章:本地开发/测试/生产三种部署模式
- 第 3 章:完整环境变量配置表(40+ 配置项)
- 第 4 章:第三方 API 接入指南
- 第 5 章:监控与告警设计
- 第 6 章:备份与恢复策略
- 第 7 章:常见故障排查
- 第 8 章:完整部署实战(Backend + Frontend + LangGraph + N8N + 小程序)
- 第 9 章:监控告警实战配置(Prometheus + Grafana)
🔗 相关章节
- 了解技术架构? 查看 技术白皮书 - 架构总览
- 了解核心功能? 查看 产品书 - 核心功能
- 快速上手操作? 查看 使用手册 - 10分钟快速开始
End of Deployment Guide