Skip to content

Repository files navigation

视频分析平台

基于 AI 大模型的视频内容分析平台,支持本地视频上传小红书/抖音链接解析两种方式,通过 GLM 多模态模型自动分析视频内容,生成结构化的分析报告。

技术栈

层级 技术
Monorepo pnpm Workspace + Turborepo
后端 NestJS 11 · TypeScript · Prisma 6
前端 Next.js 16 · React 19 · Tailwind CSS 4 · shadcn/ui
数据库 PostgreSQL 16
队列 Bull + Redis 7
存储 阿里云 OSS (ali-oss SDK)
AI 智谱 GLM 系列多模态模型
实时通信 Socket.io (WebSocket)
认证 JWT 双令牌 (Access + Refresh)
爬虫 Playwright (Chromium headless)

项目结构

xiaohongshuvideo/
├── apps/
│   ├── server/              # NestJS 后端
│   │   └── src/modules/
│   │       ├── auth/        # 认证 & 授权(JWT、角色守卫)
│   │       ├── user/        # 用户管理
│   │       ├── video/       # 视频上传 & 文件夹管理
│   │       ├── link-video/  # 链接视频管理(小红书/抖音)
│   │       ├── storage/     # 阿里云 OSS 配置 & Bucket 管理
│   │       ├── model/       # AI 模型 & Provider 管理
│   │       ├── skill/       # 分析 Prompt 模板(版本管理)
│   │       ├── task/        # 解析任务调度(Bull 队列)
│   │       ├── scraper/     # Playwright 爬虫(平台数据抓取 + 视频 URL 提取)
│   │       ├── llm/         # GLM API 调用
│   │       ├── report/      # 分析报告(版本管理)
│   │       ├── notification/# WebSocket 实时通知
│   │       └── dashboard/   # 仪表盘统计
│   └── web/                 # Next.js 前端
│       └── src/
│           ├── app/         # App Router 页面
│           ├── components/  # UI 组件(shadcn/ui)
│           ├── lib/         # API 客户端、工具函数
│           └── stores/      # Zustand 状态管理
├── packages/
│   └── shared/              # 共享类型 & 常量
├── prisma/                  # Schema、迁移、Seed
├── docker-compose.yml       # PostgreSQL + Redis
└── turbo.json               # Turborepo 配置

快速开始

环境要求

  • Node.js >= 18
  • pnpm >= 9
  • Docker / Podman(用于 PostgreSQL 和 Redis)

1. 克隆并安装依赖

git clone <repo-url>
cd video-analysis
pnpm install

2. 启动基础设施

docker compose up -d

这将启动 PostgreSQL(端口 5432)和 Redis(端口 6379)。

3. 配置环境变量

cp .env.example .env

根据实际情况修改 .env

# 数据库
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/video_analysis?schema=public"

# Redis
REDIS_HOST=localhost
REDIS_PORT=6379

# JWT(生产环境务必更换为随机字符串)
JWT_SECRET=your-jwt-secret-change-in-production
JWT_REFRESH_SECRET=your-refresh-secret-change-in-production
JWT_EXPIRATION=15m
JWT_REFRESH_EXPIRATION=7d

4. 初始化数据库

pnpm db:generate    # 生成 Prisma Client
pnpm db:push        # 同步 Schema 到数据库
pnpm db:seed        # 创建默认管理员账户

Seed 会创建默认管理员:

  • 邮箱:admin@example.com
  • 密码:admin123

5. 启动开发服务

pnpm dev

核心功能

视频管理

  • 支持多视频同时上传,通过后端中转写入阿里云 OSS
  • 文件夹分组管理,支持按客户/品牌分类
  • 选择目标 Bucket,支持中文文件名
  • 视频列表搜索、分页

链接视频解析(v0.2 新增)

  • 粘贴小红书/抖音视频链接,自动识别平台
  • 支持批量链接(逗号分隔),一次创建多个解析任务
  • 通过 Playwright 无头浏览器自动抓取平台互动数据(标题、博主、点赞、收藏、评论、分享)
  • 通过 kukutool 第三方服务提取视频 MP4 直链
  • 使用 curl 下载视频并持久化到阿里云 OSS
  • 平台互动数据与视频内容一起传递给 AI 模型,生成综合分析报告

解析任务

  • 两种任务模式:本地视频任务(选择已上传视频)和链接任务(粘贴 URL)
  • 选择 Skill + AI 模型,创建批量分析任务
  • Bull 队列异步处理,逐视频分析,单个失败不阻塞其他
  • WebSocket 实时推送任务进度
  • 支持手动停止进行中的任务
  • 服务重启时自动清理遗留的孤儿任务
  • 任务状态:PENDING → PROCESSING → COMPLETED / PARTIAL / FAILED
  • 超时保护:Bull job 超时(10/15 分钟)、LLM API 超时(5 分钟)

AI 分析

  • 通过 GLM 多模态模型理解视频内容
  • 链接视频分析时自动附带平台互动数据作为参考
  • Skill 模块管理分析 Prompt 模板,支持版本管理
  • 分析结果生成 Markdown 格式的结构化报告

报告

  • 报告支持版本管理,可查看历史版本对比
  • Markdown 渲染展示,支持表格、引用、分区标题
  • 支持提交修复要求重新分析

存储管理(Admin)

  • 管理阿里云 OSS 配置(AK/SK、Region)
  • 创建 / 关联 / 删除 Bucket,真实操作阿里云
  • 支持查看阿里云远程 Bucket 并一键关联
  • Bucket CORS 自动配置

模型管理(Admin)

  • 管理 AI 模型 Provider(API 地址、密钥)
  • 管理具体模型(名称、启用状态)

用户管理(Admin)

  • 创建用户并分配角色
  • 角色变更、账户启用/禁用、删除

角色权限

功能 ADMIN OPERATOR USER
仪表盘(全部指标) -
仪表盘(基础指标)
视频上传 & 管理
链接视频解析 -
创建解析任务 -
Skills 管理 -
查看报告
修正报告 -
模型管理 - -
存储管理 - -
用户管理 - -

常用脚本

# 开发
pnpm dev                      # 启动前后端开发服务
pnpm build                    # 构建所有应用

# 仅操作单个应用
pnpm --filter server dev      # 仅启动后端
pnpm --filter web dev         # 仅启动前端
pnpm --filter server build    # 仅构建后端
pnpm --filter web build       # 仅构建前端

# 数据库
pnpm db:generate              # 生成 Prisma Client
pnpm db:migrate               # 运行数据库迁移
pnpm db:push                  # 同步 Schema(开发用)
pnpm db:seed                  # 填充初始数据

任务处理流程

本地视频任务

用户选择已上传视频 + Skill + 模型 → 创建任务
    │
    ▼
Bull Queue 入队 ──────────────── 控制器立即返回
    │
    ▼
TaskProcessor 消费
    │
    ├──▶ 视频 1 ──▶ LLM 分析 ──▶ 生成 Report ──▶ WebSocket 通知
    ├──▶ 视频 2 ──▶ LLM 分析 ──▶ 生成 Report ──▶ WebSocket 通知
    └──▶ 视频 N ──▶ ...
    │
    ▼
更新 Task 最终状态(COMPLETED / PARTIAL / FAILED)

链接视频任务

用户粘贴视频链接 + Skill + 模型 → 创建任务
    │
    ▼
Bull Queue 入队 ──────────────── 控制器立即返回
    │
    ▼
LinkTaskProcessor 消费(每条链接依次处理)
    │
    ├──▶ 阶段 1: Playwright 抓取平台互动数据(点赞/收藏/评论/分享)
    │        ↓ 伪装浏览器上下文(隐藏 webdriver、模拟真实 UA)
    │
    ├──▶ 阶段 2: kukutool 提取视频 MP4 直链
    │        ↓ 自动关闭广告弹窗、填入链接、解析
    │
    ├──▶ 阶段 3: curl 下载视频 → 上传 OSS 持久化
    │        ↓ 绕过 CDN TLS 指纹拦截
    │
    ├──▶ 阶段 4: LLM 分析(视频内容 + 平台互动数据)
    │        ↓ GLM 多模态模型
    │
    └──▶ 生成 Report ──▶ WebSocket 通知
    │
    ▼
更新 Task 最终状态(COMPLETED / PARTIAL / FAILED)

数据模型

User ──────────┬──▶ Video ◀── OssBucket ◀── OssConfig
               │      │            │
               │      ├──▶ Report  │
               │      │      ▲     │
               ├──▶ Task     │     │
               │      │      │     │
               │      ├──▶ TaskVideo ──┘
               │      │
               │      ├──▶ TaskLinkVideo
               │      │         │
               │      │         ▼
               ├──▶ LinkVideo ──▶ Report
               │      │
               │      ├──▶ Model ◀── ModelProvider
               │      │
               ├──▶ Skill ──▶ SkillVersion
               │
               └──▶ VideoFolder ──▶ Video

关键模型说明

模型 说明
Video 本地上传的视频文件,存储于 OSS
LinkVideo 通过链接解析的视频,记录原始 URL、平台、互动数据
Task 分析任务,类型为 VIDEO(本地)或 LINK(链接)
TaskVideo 本地视频任务的子项,关联 Video → Report
TaskLinkVideo 链接视频任务的子项,关联 LinkVideo → Report
VideoFolder 视频文件夹,按客户/品牌分组管理

部署指南

方式一:Docker Compose(本地 / 单机)

适用于本地开发验证或单台服务器快速部署。

# 1. 构建所有镜像
docker compose build

# 2. 初始化数据库(仅首次部署需要)
docker compose --profile init run db-migrate

# 3. 启动全部服务
docker compose up -d

启动后访问 http://localhost:3000,使用默认管理员 admin@example.com / admin123 登录。

服务列表:

服务 端口 说明
web 3000 Next.js 前端
server 3001 NestJS 后端 API
postgres 5432 PostgreSQL 数据库
redis 6379 Redis 队列

常用命令:

docker compose logs -f server    # 查看后端日志
docker compose logs -f web       # 查看前端日志
docker compose down              # 停止所有服务
docker compose up -d --build     # 重新构建并启动

方式二:阿里云 ACK (Kubernetes)

1. 前置条件

在阿里云控制台准备以下资源:

资源 说明
ACK 集群 Kubernetes 托管版集群,建议 1.26+,需安装 Nginx Ingress Controller
ACR 镜像仓库 容器镜像服务,创建命名空间(如 video-analysis
RDS PostgreSQL 托管数据库实例,创建数据库 video_analysis
Redis 实例 云数据库 Redis 版(或集群内自建)
域名 已解析到 ACK Ingress SLB 的域名

2. 构建并推送镜像

# 登录阿里云 ACR
docker login registry.cn-shanghai.aliyuncs.com

# 构建后端镜像
docker build -f apps/server/Dockerfile \
  -t registry.cn-shanghai.aliyuncs.com/<your-namespace>/video-analysis-server:v1.0.0 \
  .

# 构建前端镜像(注意:NEXT_PUBLIC_API_URL 必须在构建时注入)
docker build -f apps/web/Dockerfile \
  --build-arg NEXT_PUBLIC_API_URL=https://your-domain.com/api \
  -t registry.cn-shanghai.aliyuncs.com/<your-namespace>/video-analysis-web:v1.0.0 \
  .

# 推送镜像
docker push registry.cn-shanghai.aliyuncs.com/<your-namespace>/video-analysis-server:v1.0.0
docker push registry.cn-shanghai.aliyuncs.com/<your-namespace>/video-analysis-web:v1.0.0

3. 配置 K8s 资源

所有 K8s 清单位于 deploy/k8s/ 目录。部署前需修改以下配置:

secret.yaml — 填入 base64 编码的敏感信息:

# 生成 base64 值
echo -n 'postgresql://user:pass@rm-xxx.pg.rds.aliyuncs.com:5432/video_analysis?schema=public' | base64
echo -n 'your-jwt-secret-random-string' | base64
echo -n 'your-jwt-refresh-secret-random-string' | base64

将输出替换到 secret.yaml 中对应的 REPLACE_WITH_BASE64_ENCODED_VALUE

configmap.yaml — 修改以下字段:

REDIS_HOST: "r-xxx.redis.rds.aliyuncs.com"   # 阿里云 Redis 实例地址
REDIS_PORT: "6379"
CORS_ORIGIN: "https://your-domain.com"        # 你的域名

server-deployment.yaml / web-deployment.yaml — 将 IMAGE_PLACEHOLDER 替换为实际镜像地址:

image: registry.cn-shanghai.aliyuncs.com/<your-namespace>/video-analysis-server:v1.0.0

ingress.yaml — 替换域名:

- host: your-domain.com    # 替换为你的实际域名

如需启用 HTTPS,取消 tls 段的注释并配置证书 Secret。

4. 按序部署

# 创建命名空间
kubectl apply -f deploy/k8s/namespace.yaml

# 创建配置(Secret 必须在 Deployment 之前)
kubectl apply -f deploy/k8s/secret.yaml
kubectl apply -f deploy/k8s/configmap.yaml

# 初始化数据库(首次部署需要,会自动创建表结构和管理员账户)
kubectl apply -f deploy/k8s/db-migrate-job.yaml

# 等待数据库初始化完成
kubectl wait --for=condition=complete job/db-migrate -n video-analysis --timeout=120s

# 部署应用
kubectl apply -f deploy/k8s/server-deployment.yaml
kubectl apply -f deploy/k8s/web-deployment.yaml

# 配置 Ingress 路由
kubectl apply -f deploy/k8s/ingress.yaml

5. 验证部署

# 查看 Pod 状态
kubectl get pods -n video-analysis

# 查看服务状态
kubectl get svc -n video-analysis

# 查看 Ingress
kubectl get ingress -n video-analysis

# 检查后端健康状态
kubectl exec -it deployment/server -n video-analysis -- wget -qO- http://localhost:3001/healthz

# 查看后端日志
kubectl logs -f deployment/server -n video-analysis

# 查看前端日志
kubectl logs -f deployment/web -n video-analysis

6. 后续更新

Schema 变更时重新执行数据库迁移:

# 删除旧 Job(K8s Job 不可重复创建同名)
kubectl delete job db-migrate -n video-analysis --ignore-not-found
kubectl apply -f deploy/k8s/db-migrate-job.yaml

更新应用镜像:

# 方式 1:直接更新镜像 tag
kubectl set image deployment/server server=<new-image>:<tag> -n video-analysis
kubectl set image deployment/web web=<new-image>:<tag> -n video-analysis

# 方式 2:修改 yaml 后重新 apply
kubectl apply -f deploy/k8s/server-deployment.yaml
kubectl apply -f deploy/k8s/web-deployment.yaml

# 查看滚动更新状态
kubectl rollout status deployment/server -n video-analysis
kubectl rollout status deployment/web -n video-analysis

# 回滚到上一版本(如果出问题)
kubectl rollout undo deployment/server -n video-analysis

CI/CD (GitHub Actions)

推送到 main 分支时自动触发流水线:构建镜像 → 推送 ACR → 滚动更新 ACK Deployment。

配置文件:.github/workflows/deploy.yaml

配置 GitHub Secrets

在仓库 Settings → Secrets and variables → Actions 中添加:

Secret 说明 示例
ACR_REGISTRY ACR 仓库地址 registry.cn-shanghai.aliyuncs.com/your-ns
ACR_USERNAME ACR 登录用户名 your-acr-username
ACR_PASSWORD ACR 登录密码 your-acr-password
KUBE_CONFIG ACK kubeconfig(base64 编码) cat ~/.kube/config | base64
NEXT_PUBLIC_API_URL 生产环境 API 地址 https://your-domain.com/api

获取 kubeconfig

# 从阿里云 ACK 控制台下载 kubeconfig,或使用 CLI
aliyun cs GET /k8s/<cluster-id>/user_config | jq -r '.config' > kubeconfig.yaml

# 编码为 base64 后粘贴到 GitHub Secret
cat kubeconfig.yaml | base64

流水线说明

push to main
    │
    ▼
┌─────────────────────────────────┐
│  build-and-push                 │
│  ① docker build server image    │
│  ② docker build web image       │
│  ③ docker push to ACR           │
│     (tag: git commit SHA)       │
└─────────────────────────────────┘
    │
    ▼
┌─────────────────────────────────┐
│  deploy                         │
│  ① kubectl set image server     │
│  ② kubectl set image web        │
│  ③ kubectl rollout status       │
└─────────────────────────────────┘

环境变量参考

变量 必填 默认值 说明
DATABASE_URL - PostgreSQL 连接字符串
REDIS_HOST localhost Redis 地址
REDIS_PORT 6379 Redis 端口
JWT_SECRET - JWT 签名密钥(生产必须替换)
JWT_REFRESH_SECRET - Refresh Token 签名密钥
JWT_EXPIRATION 15m Access Token 有效期
JWT_REFRESH_EXPIRATION 7d Refresh Token 有效期
CORS_ORIGIN http://localhost:3000 允许的 CORS 来源
PORT 3001 后端监听端口
NEXT_PUBLIC_API_URL http://localhost:3001/api 前端 API 地址(构建时注入)

版本历史

版本 说明
v0.2-link-video-analysis 链接视频解析:小红书/抖音链接自动抓取、视频下载、AI 分析;任务停止、超时保护、孤儿任务清理
v0.1 基础功能:本地视频上传、OSS 存储、GLM 分析、报告生成、用户角色权限

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages