Skip to content

一刻工坊|部署手册 V1.0

文档目标:指导运维/开发人员完成从本地到生产环境的部署 最后更新:2025-12-21 依据:Based on /docs/_source_of_truth/tech_facts.md


目录

  1. 基础环境要求
  2. 部署模式详解
  3. 配置说明 (.env)
  4. 第三方 API 接入
  5. 监控与告警
  6. 备份与恢复
  7. 故障排障 (Troubleshooting)
  8. 完整部署实战
  9. 监控告警实战配置

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)

适合开发调试,无需复杂依赖。

  1. 启动 DB/Redis: docker-compose up -d postgres redis
  2. 配置 .env: 复制 .env.example.env,填入本地参数。
  3. 启动 Backend: npm run dev (Nodemon).
  4. 启动 Frontend: npm run dev (Vite).
  5. 启动 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服务端口3001Yes所有模块-
NODE_ENV环境标识productionYes所有模块-
APP_SECRETJWT 签名密钥random_string_xyzYes用户认证高危:务必复杂且定期轮换
JWT_SECRETJWT 密钥(备用)another_secretYes用户认证与 APP_SECRET 可相同
JWT_EXPIRES_INToken 有效期7dNo用户认证默认 7 天
数据库/中间件
DB_HOSTPostgreSQL 地址127.0.0.1Yes所有模块-
DB_PORTPostgreSQL 端口5432No所有模块默认 5432
DB_NAME数据库名kkmusic_prodYes所有模块-
DB_USER数据库用户kkmusicYes所有模块-
DB_PASSWORD数据库密码pass123Yes所有模块勿提交到 Git
REDIS_URLRedis 连接串redis://:pass@host:6379Yes缓存/队列-
REDIS_HOSTRedis 地址127.0.0.1No缓存/队列与 REDIS_URL 二选一
REDIS_PORTRedis 端口6379No缓存/队列-
REDIS_PASSWORDRedis 密码redis_passNo缓存/队列-
AI 服务 - 甄甄 (Doubao)
ZHENZHEN_API_KEY甄甄 API Key...YesLLM 推理核心密钥
ZHENZHEN_BASE_URL甄甄 API 地址https://ark.cn-beijing.volces.com/api/v3YesLLM 推理-
ZHENZHEN_DEFAULT_MODEL默认模型doubao-pro-32kNoLLM 推理默认值
AI 服务 - OpenAI(备用)
OPENAI_API_KEYOpenAI Keysk-...NoLLM 推理(备用)限制额度
OPENAI_BASE_URLOpenAI API 地址https://api.openai.com/v1NoLLM 推理-
LangGraph Runner
LANGGRAPH_API_URLLangGraph 服务地址http://localhost:8000YesAgent 调度-
LANGGRAPH_API_TOKENLangGraph 认证 Tokenjwt_tokenYesAgent 调度使用 Backend JWT
LANGGRAPH_TIMEOUT请求超时时间300000NoAgent 调度默认 5 分钟
ComfyUI
COMFYUI_HOSTComfyUI 服务地址http://localhost:8188No视觉生成本地或云端
COMFYUI_API_KEYComfyUI API Key...No视觉生成仅云端需要
COMFYUI_TIMEOUT生成超时时间120000No视觉生成默认 2 分钟
N8N
N8N_WEBHOOK_URLN8N Webhook 地址http://localhost:5678/webhook/...No自动化中心-
N8N_API_KEYN8N API Key...No自动化中心-
Flowise(可选)
FLOWISE_API_URLFlowise 服务地址http://localhost:3000No知识库问答-
FLOWISE_CHATFLOW_ID知识库 Chatflow IDabc123No知识库问答-
音频/音乐服务
SUNO_COOKIESuno 凭证...No音乐生成需定期更新 Cookie
SUNO_SESSION_IDSuno Session ID...No音乐生成-
FISH_API_TOKENFish Audio Token...NoAI 配音-
FISH_BASE_URLFish Audio API 地址https://api.fish.audio/v1NoAI 配音-
对象存储
OSS_PROVIDER存储提供商aliyun / localYes文件存储-
OSS_LOCAL_PATH本地存储路径./uploadsNo文件存储OSS_PROVIDER=local 时必填
ALI_ACCESS_KEY阿里云 AccessKeyLTAI...No阿里云 OSS仅授予最小权限
ALI_ACCESS_SECRET阿里云 AccessSecret...No阿里云 OSS高危
ALI_OSS_BUCKETOSS Bucket 名称kkmusic-assetsNo阿里云 OSS-
ALI_OSS_REGIONOSS 区域oss-cn-hangzhouNo阿里云 OSS-
支付与登录
ALIPAY_APP_ID支付宝 AppID2021...No支付-
ALIPAY_PRIVATE_KEY支付宝私钥MII...No支付高危
WECHAT_MCH_ID微信商户号1234567890No支付-
WECHAT_API_V3_KEY微信 API V3 密钥...No支付高危
WX_OPEN_APP_ID微信开放平台 AppIDwx...No微信登录-
WX_OPEN_SECRET微信开放平台 Secret...No微信登录高危
剪映集成(仅本地)
JIANYING_DRAFT_PATH剪映草稿目录C:\Users\...\JianyingPro\User Data\Projects\com.lveditor.draftNo剪映草稿导出Windows/Mac 路径
监控与日志
LOG_LEVEL日志级别infoNo所有模块debug/info/warn/error
PROMETHEUS_PORTPrometheus 端口9090No监控-
GRAFANA_PORTGrafana 端口3002No监控-

3.2 配置示例文件

开发环境 .env.development

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

bash
# 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=3002

3.3 配置验证脚本

创建验证脚本backend/scripts/validate-env.js):

javascript
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('✅ 环境变量配置验证通过');

运行验证

bash
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。

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 401Cookie 失效手动更新 .env 中的 SUNO_COOKIE 并重启服务。

7.2 限流与降级

  • 限流: Nginx 层配置 IP 限流;业务层配置 User 限流。
  • 降级: 当 Suno 不可用时,自动切换至备用音乐库或静音模式,并提示用户。

8. 完整部署实战

本章提供从零开始的完整部署指南,涵盖所有服务组件。

8.1 本地开发环境部署

目标:在本地搭建完整的开发环境,用于功能开发和调试。

8.1.1 前置准备

检查环境

bash
# 检查 Node.js 版本
node -v  # 应输出 v18.x 或 v20.x

# 检查 Python 版本
python --version  # 应输出 Python 3.10+

# 检查 Docker
docker -v
docker-compose -v

# 检查 FFmpeg
ffmpeg -version

克隆代码仓库

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

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

bash
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

bash
# 测试健康检查接口
curl http://localhost:3001/health
# 应返回: {"status":"ok","db":"connected","redis":"connected"}

8.1.4 配置 Frontend

bash
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

bash
# 在浏览器中打开
open http://localhost:5173
# 应看到登录页面

8.1.5 测试完整流程

bash
# 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 环境配置

bash
cd langgraph-runner

# 1. 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows: venv\Scripts\activate

# 2. 安装依赖
pip install -r requirements.txt

requirements.txt 内容(参考 langgraph-runner/requirements.txt):

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

8.2.2 配置文件

创建 .env 文件(参考 langgraph-runner/env.example.txt):

bash
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):

bash
# 方法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.txt

8.2.3 启动服务

bash
# 开发模式
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 --reload

8.2.4 Docker 部署(生产环境)

Dockerfile(参考 langgraph-runner/Dockerfile):

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"]

构建并运行

bash
# 构建镜像
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-runner

8.2.5 验证部署

bash
# 测试健康检查
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):

powershell
# 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 n8n

Linux/Mac 启动

bash
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 -d

8.3.2 导入工作流

导入 "计划调度器" 工作流(参考 n8n/workflows/plan_scheduler.json):

  1. 访问 http://localhost:5678
  2. 登录(admin / Admin123456)
  3. 点击 "+ Add workflow"
  4. 点击右上角三点菜单 → Import from File
  5. 选择 n8n/workflows/plan_scheduler.json
  6. 点击 "Save" 保存工作流

配置 Webhook

json
{
  "name": "Webhook",
  "type": "n8n-nodes-base.webhook",
  "parameters": {
    "path": "kkmusic/trigger-plan",
    "httpMethod": "POST",
    "responseMode": "lastNode"
  }
}

Webhook URLhttp://localhost:5678/webhook/kkmusic/trigger-plan

8.3.3 配置 Backend 集成

在 Backend 配置 N8N Webhook

bash
# backend/.env
N8N_WEBHOOK_URL=http://localhost:5678/webhook/kkmusic/trigger-plan

触发工作流backend/src/routes/automation.js):

javascript
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 部署

bash
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 flowise

8.4.2 导入 Chatflow

导入 "知识库聊天" Chatflow(参考 flowise/chatflows/kb_chat.json):

  1. 访问 http://localhost:3000
  2. 点击 "+ Add New"
  3. 点击 "Load Chatflow"
  4. 选择 flowise/chatflows/kb_chat.json
  5. 配置向量数据库连接(Pinecone / Weaviate / 本地 Chroma)

向量数据库配置(参考 flowise/vector-store-setup.md):

javascript
// Pinecone 配置
{
  "apiKey": "your-pinecone-api-key",
  "environment": "us-west1-gcp",
  "indexName": "kkmusic-kb"
}

8.4.3 API 集成

调用 Flowise Chatflowbackend/src/services/FlowiseProxyService.js):

javascript
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 开发工具配置

下载微信开发者工具

导入项目

  1. 打开微信开发者工具
  2. 点击 "导入项目"
  3. 选择 miniprogram 目录
  4. 填写 AppID(测试可使用测试号)

8.5.2 配置 API 地址

编辑 miniprogram/src/services/api.js

javascript
// 开发环境
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 真机调试

步骤

  1. 在微信开发者工具中点击 "预览"
  2. 使用手机微信扫描二维码
  3. 在手机上打开小程序进行测试

真机调试常见问题

问题原因解决方案
API 请求失败服务器域名未配置在小程序后台添加 request 合法域名
WebSocket 连接失败wss 域名未配置添加 socket 合法域名
文件上传失败uploadFile 域名未配置添加 uploadFile 合法域名

配置合法域名(生产环境必须):

  1. 登录微信公众平台:https://mp.weixin.qq.com
  2. 进入 "开发" → "开发管理" → "开发设置"
  3. 找到 "服务器域名"
  4. 添加以下域名:
    • request 合法域名:https://api.yike.com
    • socket 合法域名:wss://api.yike.com
    • uploadFile 合法域名:https://api.yike.com

8.5.4 发布上线

提交审核

  1. 在微信开发者工具中点击 "上传"
  2. 填写版本号和备注
  3. 登录微信公众平台
  4. 在 "版本管理" 中找到刚上传的版本
  5. 点击 "提交审核"
  6. 填写审核信息(功能介绍、测试账号等)
  7. 等待审核(通常 1-3 天)

📋 小程序检查项

  • [ ] 开发者工具导入成功
  • [ ] API 地址配置正确
  • [ ] 真机调试功能正常
  • [ ] 合法域名已配置

8.6 数据库迁移执行

功能:执行所有数据库 schema 变更,创建表结构。

8.6.1 迁移文件列表

所有 Migration 文件(位于 backend/src/database/migrations/):

bash
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.js

8.6.2 执行迁移

配置 package.json 脚本

json
{
  "scripts": {
    "migrate": "sequelize-cli db:migrate",
    "migrate:undo": "sequelize-cli db:migrate:undo",
    "migrate:status": "sequelize-cli db:migrate:status"
  }
}

执行所有迁移

bash
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 回滚迁移

回滚最后一次迁移

bash
npm run migrate:undo

# 回滚到指定迁移
npx sequelize-cli db:migrate:undo:all --to 20251214000000-add-diagnosis-sync-fields.js

8.6.4 初始化数据(Seed)

创建种子数据文件backend/src/database/seeders/):

javascript
// 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

bash
# 执行所有 seed
npx sequelize-cli db:seed:all

# 撤销所有 seed
npx sequelize-cli db:seed:undo:all

8.6.5 生产环境迁移注意事项

最佳实践

  1. 备份数据库

    bash
    pg_dump -U kkmusic -d kkmusic_prod > backup_$(date +%Y%m%d_%H%M%S).sql
  2. 在预发环境测试

    bash
    NODE_ENV=staging npm run migrate
  3. 执行生产迁移

    bash
    NODE_ENV=production npm run migrate
  4. 验证数据完整性

    bash
    # 检查表是否创建成功
    psql -U kkmusic -d kkmusic_prod -c "\dt"
    
    # 检查数据是否正常
    psql -U kkmusic -d kkmusic_prod -c "SELECT COUNT(*) FROM Users;"
  5. 如有问题立即回滚

    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 方式

bash
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 -d

9.1.2 Prometheus 配置文件

monitoring/prometheus/prometheus.yml 内容:

yaml
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 内容:

yaml
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,需立即处理"

验证告警规则

bash
# 检查语法
promtool check rules monitoring/prometheus/alert-rules.yml

# 应输出: Checking alert-rules.yml
#          SUCCESS: 5 rules found

9.2 Grafana Dashboard 配置

9.2.1 安装 Grafana

Docker 方式(添加到 docker-compose.yml):

yaml
  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

bash
docker-compose up -d grafana

# 访问 Grafana
open http://localhost:3002
# 登录:admin / Admin123456

9.2.2 配置数据源

在 Grafana 中添加 Prometheus

  1. 登录 Grafana
  2. 左侧菜单 → Configuration → Data Sources
  3. 点击 "Add data source"
  4. 选择 "Prometheus"
  5. 配置:
    • URL: http://prometheus:9090(Docker 内部)或 http://localhost:9090(本地)
    • Access: Server (default)
  6. 点击 "Save & Test",应显示 "Data source is working"

9.2.3 导入 Dashboard

导入业务指标 Dashboard(参考 monitoring/grafana-dashboards/business-metrics.json):

  1. 左侧菜单 → Dashboards → Import
  2. 点击 "Upload JSON file"
  3. 选择 monitoring/grafana-dashboards/business-metrics.json
  4. 选择数据源:Prometheus
  5. 点击 "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):

  1. Alerting → Notification channels → Add channel
  2. 选择类型:DingDing
  3. 配置 Webhook URL
  4. 测试通知

Alertmanager 配置monitoring/prometheus/alertmanager.yml):

yaml
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: true

9.3 Backend Metrics 暴露

在 Backend 中集成 Prometheus 客户端

bash
cd backend
npm install prom-client

配置 Metrics 中间件backend/src/middleware/metricsCollector.js):

javascript
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):

javascript
const { metricsMiddleware, metricsHandler } = require('./middleware/metricsCollector');

// 所有路由应用 metrics 中间件
app.use(metricsMiddleware);

// Metrics 暴露接口
app.get('/metrics', metricsHandler);

9.4 完整监控架构

mermaid
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 --> SMS

9.5 实战操作步骤

步骤 1:启动监控服务

bash
cd monitoring

# 启动 Prometheus + Grafana
docker-compose up -d prometheus grafana alertmanager

# 验证服务
docker-compose ps
# 应看到 3 个服务状态为 Up

# 查看日志
docker-compose logs -f prometheus

步骤 2:验证指标采集

bash
# 访问 Prometheus
open http://localhost:9090

# 在查询框输入:
http_requests_total
# 应看到图表显示请求量

# 查看告警规则
open http://localhost:9090/alerts
# 应看到配置的所有告警规则

步骤 3:配置 Grafana

bash
# 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:测试告警

触发测试告警

bash
# 模拟队列积压
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. 指标查询示例

promql
# 查询 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_total

3. 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)

🔗 相关章节


End of Deployment Guide

© 2024-2025 趣美丽 QuMeiLi · Powered by 刻流星引擎 KeLiuXing