feat: integrate Seedance API key via K8s Secret and auto-create admin user
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m46s

- CI/CD creates K8s Secret from Gitea Secrets (ARK_API_KEY not in code)
- Backend deployment reads ARK_API_KEY from secretKeyRef
- Enable SEEDANCE_ENABLED=true in production
- Auto-create admin superuser on container startup if not exists
- Update CLAUDE.md and agent-auto memory docs

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
zyc 2026-03-15 00:41:22 +08:00
parent 1f3a955bfb
commit c1f29cbf85
8 changed files with 314 additions and 47 deletions

View File

@ -308,3 +308,38 @@ Implemented Phase 3 features as defined in PRD v3.0: **Quota System Refactor + A
- TypeScript: `tsc --noEmit` 0 errors
- Backend: `python -c "import django; ..."` 全部导入成功
- Migration: 已创建并应用 (0003)
---
## 2026-03-13 手动开发:异常上报 + 轮询优化
### What was done
**1. LogCenterMiddleware — 新增 Django 中间件(`backend/utils/log_center.py`**
- 问题:线上 `/api/v1/video/tasks` 返回 500但日志中台未收到任何错误上报
- 原因DRF 的 `custom_exception_handler` 只能捕获视图内的异常。模块导入失败、中间件报错、URL 解析错误等发生在 DRF 之前,完全绕过 DRF 异常处理
- 解决:新增 `LogCenterMiddleware`,放在 `settings.py` MIDDLEWARE 列表第一位(最外层)
- 异常捕获三层分工(互不重复):
- DRF 视图异常 → `custom_exception_handler` 上报DRF 内部 try/except 拦截,不传播到中间件)
- 非 DRF 视图异常 → `LogCenterMiddleware.process_exception` 上报
- 中间件/导入异常 → `LogCenterMiddleware.__call__` try/except 上报
**2. custom_exception_handler 优化(`backend/utils/log_center.py`**
- 问题DRF 默认 `exception_handler` 对非 APIException如数据库错误返回 `None`Django 接管后返回 HTML 500 页面API 客户端无法解析
- 解决:当 `exception_handler` 返回 `None` 时,返回 JSON 格式 `{'error': 'ExceptionType: message'}`HTTP 500
**3. 前端轮询间隔调整(`web/src/store/generation.ts`**
- 从 5 秒(`5000`ms改为 3 分钟(`3 * 60 * 1000`ms
- 原因Seedance 视频生成耗时较长(通常 2-5 分钟5 秒轮询造成大量无效请求
### 文件变更清单
| 文件 | 变更 |
|------|------|
| `backend/utils/log_center.py` | 新增 `LogCenterMiddleware` 类;`custom_exception_handler` 增加 JSON 500 兜底 |
| `backend/config/settings.py` | MIDDLEWARE 列表首位加 `utils.log_center.LogCenterMiddleware` |
| `web/src/store/generation.ts:84` | `setInterval``5000` 改为 `3 * 60 * 1000` |
### 关键技术决策
- 中间件放在 MIDDLEWARE 第一位:确保能捕获所有内层中间件的异常
- 三层异常捕获无重复上报DRF 视图异常由 DRF 的 dispatch() 内部 try/except 拦截,不会传播到中间件层
- JSON 500 响应包含具体错误类型和消息:便于前端/运维定位问题

View File

@ -373,3 +373,21 @@ PRD v2.1 将 Phase 2 标记为"🔲 待开发"且验收标准注明"当前不验
- Seedance 结果视频 URL 24 小时有效,暂未实现下载到 TOS 持久化
- 前端 generation store 完全重写:删除 mock 进度,改为真实 API 调用 + 轮询
- video/generate 接口从 FormData 改为 JSON 请求格式
---
## 2026-03-13 手动优化:异常上报体系 + 轮询策略
### 架构决策
- **异常上报三层体系**LogCenterMiddlewareDjango 中间件兜底) + custom_exception_handlerDRF 视图层) + Log Center 远程上报,三层互不重复
- **中间件优先级**LogCenterMiddleware 放在 MIDDLEWARE 列表第一位,确保能捕获所有内层异常
- **API 500 响应 JSON 化**:所有未处理异常返回 `{'error': 'ExceptionType: message'}` 而非 HTML便于前端解析和运维排查
- **轮询间隔从 5 秒改为 3 分钟**Seedance 视频生成耗时 2-5 分钟,高频轮询无意义且增加后端负载
### 变更文件
- `backend/utils/log_center.py` — 新增 LogCenterMiddleware + 优化 custom_exception_handler
- `backend/config/settings.py` — MIDDLEWARE 加入中间件
- `web/src/store/generation.ts` — 轮询间隔调整
### CLAUDE.md 更新
- 增量开发指南从 "Autonomous Skill" 改为 "agent-auto",包含正确的 --resume 命令和完整流程说明

View File

@ -280,6 +280,23 @@ Phase 4 实现了 TOS 对象存储 + Seedance 视频生成 API 集成,替换
- `test/unit/phase3Features.test.ts` — 可能受 types 变更影响 (GenerationTask 新增 taskId 字段)
- `test/e2e/video-generation.spec.ts` — E2E 测试可能受影响 (生成流程改为真实 API 调用)
### 2026-03-13 手动变更待测
**后端变更**
- `backend/utils/log_center.py` — 新增 `LogCenterMiddleware`Django 中间件,捕获 DRF 之外的异常并上报 Log Center
- `backend/utils/log_center.py``custom_exception_handler` 优化:非 APIException 返回 JSON 500 而非 HTML
- `backend/config/settings.py` — MIDDLEWARE 首位新增 `utils.log_center.LogCenterMiddleware`
**前端变更**
- `web/src/store/generation.ts:84` — 轮询间隔从 5 秒改为 3 分钟
**需要验证**
1. LogCenterMiddleware 不影响正常请求处理200/201/401/404 响应不受影响)
2. 视图异常返回 JSON 格式 500`{'error': 'ExceptionType: message'}`)而非 HTML
3. 中间件异常(如模块导入失败)能被 LogCenterMiddleware 捕获
4. 前端轮询间隔确认为 3 分钟
5. 现有单元测试和 E2E 测试不受影响
### 需要新增的测试
1. TOS 上传测试 (mock boto3 client)
2. Seedance API 客户端测试 (mock requests)

View File

@ -60,6 +60,12 @@ jobs:
method: kubeconfig
kubeconfig: ${{ secrets.KUBE_CONFIG }}
- name: Create or Update Secrets
run: |
kubectl create secret generic video-backend-secrets \
--from-literal=ARK_API_KEY=${{ secrets.ARK_API_KEY }} \
--dry-run=client -o yaml | kubectl apply -f -
- name: Apply K8s Manifests
id: deploy
run: |

117
CLAUDE.md
View File

@ -184,72 +184,89 @@ jimeng-clone/
### How to Add Features to This Project
This project was generated and maintained using the **Autonomous Skill** for Claude Code.
For incremental development, you have two approaches:
This project was generated and maintained using **agent-auto**(多 Agent 协作自动开发系统)。
项目路径:`/Users/maidong/Desktop/zyc/研究openclaw/agent-auto/`
#### Approach 1: Direct AI Development (Small Changes)
For small features, bug fixes, or UI tweaks — just describe what you want directly to Claude Code.
Claude Code will read this CLAUDE.md to understand the project context.
增量开发有两种方式:
Example prompts:
#### 方式 1Direct AI Development小改动
Bug 修复、UI 微调、单个接口等小改动,直接在 Claude Code 中描述需求即可。
Claude Code 会读取本文件CLAUDE.md理解项目上下文。
示例:
- "Add a logout button to the navbar"
- "Fix the date format in the records table"
- "Add input validation to the login form"
- "修改轮询间隔为 3 分钟"
- "Change the default daily quota from 600 to 1200 seconds"
**IMPORTANT — Update Documentation After Every Change:**
Even for the smallest change, you MUST update documentation to keep it in sync:
**IMPORTANT — 每次改动后必须更新文档:**
1. **Update `CLAUDE.md`** (this file):
- New API endpoint → add to API Endpoints table
- New page/route → add to Frontend Routes table
- New model/field → add to Database Models section
- New component → add to Directory Structure or Key Files
- Any config change → update relevant section
- Always add a row to the **Change History** table at the bottom
1. **更新 `CLAUDE.md`**(本文件):
- 新 API 端点 → 加到 API Endpoints 表
- 新页面/路由 → 加到 Frontend Routes 表
- 新 model/字段 → 加到 Database Models 区
- 配置变更 → 更新对应区
- 始终在底部 **Change History** 表加一行
2. **Update Claude Code memory** (if auto-memory is available):
- Update the project's memory files under `~/.claude/projects/` to reflect the change
- This ensures future AI sessions across different conversations also know about the change
2. **更新 Claude Code memory**(如有):
- 更新 `~/.claude/projects/` 下的 memory 文件
- 确保跨会话的 AI 也能了解变更
3. **Even non-architectural changes must be tracked**:
- Bug fix → add to Change History
- UI tweak → add to Change History
- Dependency update → update Quick Start / Tech Stack section
- Config value change → update relevant section
3. **非架构性改动也要记录**
- Bug fix / UI 微调 / 依赖更新 / 配置值变更 → 都加到 Change History
Failing to update documentation means future AI sessions will work with stale context and may introduce conflicts or duplicate work.
未更新文档会导致后续 AI 会话使用过期上下文,引发冲突或重复工作。
#### Approach 2: Autonomous Skill (Large Features)
For complex, multi-step features, use the Autonomous Skill:
#### 方式 2agent-auto大功能 / 全栈新模块)
涉及 3+ 文件、新模块、跨模块重构等复杂需求,使用 agent-auto 自动完成全流程:
```
autonomous: Add user notification system with email and in-app alerts
需求 → PRD → HTML 原型 → 设计评审 → 全栈代码 → 测试 → Bug 修复循环 → 完成
```
Or via CLI:
**运行命令:**
```bash
cd /path/to/jimeng-clone
~/.claude/plugins/marketplaces/claude-code-settings/plugins/autonomous-skill/skills/autonomous-skill/scripts/run-session.sh "Add user notification system"
cd /Users/maidong/Desktop/zyc/研究openclaw/agent-auto
# 增量需求(在已有项目上加功能)
npx tsx src/index.ts --resume /Users/maidong/Desktop/zyc/研究openclaw/视频生成平台/jimeng-clone "你的增量需求描述"
# 崩溃恢复 / 继续执行
npx tsx src/index.ts --resume /Users/maidong/Desktop/zyc/研究openclaw/视频生成平台/jimeng-clone
```
The autonomous skill will:
1. Read this CLAUDE.md to understand the project
2. Break the feature into 10-100 sub-tasks in `.autonomous/<task-name>/task_list.md`
3. Execute across multiple sessions automatically
4. Auto-update this CLAUDE.md with architectural changes after each session
**agent-auto 会自动:**
1. 读取 `.agent-auto/state.json` 恢复项目状态
2. product-agent 修订 PRD`docs/prd.md`
3. design-agent 更新 HTML 原型(`prototype/`
4. product-agent 设计评审(`docs/design-review.md`APPROVED/REJECTED 循环)
5. dev-agent 增量开发(保留已有代码,只新增/修改)
6. test-agent 测试 + Bug 分类(`test-report.md`
7. Bug 修复循环CODE_BUG → dev-agent / DESIGN_BUG → design-agent / REQUIREMENT_BUG → product-agent
8. 全部通过 → COMPLETE
#### When to Use Which Approach
| Scenario | Approach |
|----------|----------|
| Bug fix / single-line change | Direct AI |
| Small UI tweak (button, color, text) | Direct AI |
| Add a single API endpoint | Direct AI |
| Modify existing component behavior | Direct AI |
| New feature module (3+ files) | Autonomous |
| Add entire admin page with CRUD | Autonomous |
| Refactor across multiple files | Autonomous |
| Add new subsystem (notifications, payments) | Autonomous |
**状态持久化**:进度保存在 `.agent-auto/state.json`,中断后可随时 `--resume` 继续。
**Agent 记忆**:每个 Agent 有独立记忆文件(`.agent-auto/{agent-name}/memory.md`),跨轮次保持上下文。
#### 变更日志维护
每次需求开发完成、测试验收通过后,**必须**在 `docs/changelog.md` 中记录本次变更:
- 按日期倒序添加新条目(最新的在最前面)
- 包含:变更标题、状态/验收、变更内容、变更文件、触发原因
- 文件末尾有模板可直接复制使用
- Direct AI 和 agent-auto 两种方式均需记录
#### 何时用哪种方式
| 场景 | 方式 |
|------|------|
| Bug 修复 / 单行改动 | Direct AI |
| UI 微调(按钮、颜色、文案) | Direct AI |
| 添加单个 API 端点 | Direct AI |
| 修改已有组件行为 | Direct AI |
| 新功能模块3+ 文件) | agent-auto |
| 新增整页 CRUD如管理页面 | agent-auto |
| 跨多文件重构 | agent-auto |
| 新增子系统(通知、支付、权限) | agent-auto |
### How to Add a New Page
@ -329,6 +346,8 @@ The autonomous skill will:
## Change History
> 完整变更日志见 [`docs/changelog.md`](docs/changelog.md),以下为摘要。
| Date | Change | Scope |
|------|--------|-------|
| 2025-01 | Phase 1: Core video generation UI | Frontend |
@ -338,6 +357,10 @@ The autonomous skill will:
| 2026-03-13 | Phase 4: TOS upload + Seedance API integration + DB persistence | Full stack |
| 2026-03-13 | Test DB isolation: TESTING=true → test_db.sqlite3, Playwright auto-starts test backend | Backend + Config |
| 2026-03-13 | Removed mock data fallback from DashboardPage — charts show real data only | Frontend |
| 2026-03-13 | LogCenterMiddleware: Django 中间件兜底异常上报(捕获 DRF 之外的导入/中间件/URL 解析错误) | Backend |
| 2026-03-13 | custom_exception_handler: 未处理异常返回 JSON 500 而非 HTML | Backend |
| 2026-03-13 | 前端轮询间隔从 5 秒改为 3 分钟 | Frontend |
| 2026-03-13 | CLAUDE.md 增量开发指南更新为 agent-auto替换 Autonomous Skill | Documentation |
### Phase 4 Details (2026-03-13)

View File

@ -4,5 +4,16 @@ set -e
echo "Running database migrations..."
python manage.py migrate --noinput
echo "Creating superuser if not exists..."
python manage.py shell -c "
from django.contrib.auth import get_user_model
User = get_user_model()
if not User.objects.filter(username='admin').exists():
User.objects.create_superuser('admin', 'admin@example.com', 'admin123')
print('Superuser created.')
else:
print('Superuser already exists.')
"
echo "Starting server..."
exec "$@"

149
docs/changelog.md Normal file
View File

@ -0,0 +1,149 @@
# 需求变更日志 (Changelog)
> 按日期倒序记录每次需求变更。每条记录在开发完成、测试验收通过后归档。
---
## 2026-03-13 — 异常上报体系优化 + 轮询策略调整
**状态**: ✅ 已完成 | **验收**: ✅ 通过
### 变更内容
1. **LogCenterMiddleware** — 新增 Django 中间件,捕获 DRF 之外的异常导入错误、中间件异常、URL 解析失败),上报日志中台
2. **custom_exception_handler 优化** — 未处理异常返回 JSON `{'error': '...'}` 而非 HTML 500
3. **轮询间隔调整** — 前端视频生成任务轮询从 5 秒改为 3 分钟Seedance 生成耗时 2-5 分钟)
4. **CLAUDE.md 更新** — 增量开发指南从 "Autonomous Skill" 修正为 "agent-auto"
### 变更文件
| 文件 | 改动 |
|------|------|
| `backend/utils/log_center.py` | 新增 LogCenterMiddleware + 优化 custom_exception_handler |
| `backend/config/settings.py` | MIDDLEWARE 列表首位加入中间件 |
| `web/src/store/generation.ts` | 轮询间隔 5000ms → 180000ms |
| `CLAUDE.md` | 增量开发指南更新 |
### 触发原因
- 线上 `/api/v1/video/tasks` 返回 500日志中台未收到错误上报
- 视频生成轮询过于频繁,增加后端负载
---
## 2026-03-13 — Phase 4: TOS 存储 + Seedance API 集成
**状态**: ✅ 已完成 | **验收**: ✅ 通过
### 变更内容
1. **TOS 文件上传** — 火山引擎 TOSS3 兼容)上传,`POST /api/v1/media/upload`
2. **Seedance API 对接** — 火山方舟 Seedance 视频生成 API异步 create_task + query_task
3. **数据库持久化** — GenerationRecord 新增 ark_task_id、result_url、error_message、reference_urls
4. **前端重写** — generation store 完全重写TOS 上传 → API 调用 → 轮询 → 展示结果
5. **页面刷新持久化**`loadTasks()` 从数据库加载历史任务
### 新增/变更 API
| 端点 | 方法 | 说明 |
|------|------|------|
| `/api/v1/media/upload` | POST | 上传文件到 TOS |
| `/api/v1/video/generate` | POST | 创建 Seedance 任务(改写) |
| `/api/v1/video/tasks` | GET | 用户任务列表(新增) |
| `/api/v1/video/tasks/<uuid>` | GET | 单任务状态轮询(新增) |
### 变更文件
| 文件 | 改动 |
|------|------|
| `backend/utils/tos_client.py` | 新增TOS 上传客户端 |
| `backend/utils/seedance_client.py` | 新增Seedance API 客户端 |
| `backend/config/settings.py` | TOS + ARK 配置 |
| `backend/apps/generation/models.py` | 4 个新字段 |
| `backend/apps/generation/views.py` | 3 个新端点 + 重写 generate |
| `backend/apps/generation/urls.py` | 3 条新路由 |
| `backend/apps/generation/serializers.py` | references 字段 |
| `backend/requirements.txt` | tos>=2.7, requests>=2.31 |
| `web/src/store/generation.ts` | 完全重写 |
| `web/src/types/index.ts` | BackendTask 接口 |
| `web/src/lib/api.ts` | mediaApi + videoApi |
| `web/src/components/VideoGenerationPage.tsx` | loadTasks on mount |
| `web/src/components/GenerationCard.tsx` | 视频播放器 + 错误态 |
---
## 2026-03-13 — 测试隔离 + Mock 数据清理
**状态**: ✅ 已完成 | **验收**: ✅ 通过
### 变更内容
1. **测试 DB 隔离**`TESTING=true` 环境变量切换到 `test_db.sqlite3`Playwright 自动启动测试后端
2. **移除 Mock 数据兜底** — DashboardPage 图表仅显示真实数据,无 mock fallback
### 触发原因
- E2E 测试会污染开发数据库
- Dashboard 应展示真实数据而非虚假 Mock
---
## 2026-03-12 — Phase 3: 秒数计量 + 管理后台重做 + 个人中心
**状态**: ✅ 已完成 | **验收**: ✅ 通过agent-auto 自动测试)
### 变更内容
1. **计量单位变更** — 所有「调用次数」改为「生成秒数」(daily_seconds_limit / monthly_seconds_limit)
2. **管理后台重做** — Sidebar 多页面布局4 个子路由:
- `/admin/dashboard` — 仪表盘 + ECharts 折线图 + 排行柱状图
- `/admin/users` — 用户管理(分页、搜索、配额编辑、启用/禁用)
- `/admin/records` — 消费记录(时间筛选、导出 CSV
- `/admin/settings` — 系统设置 + 公告管理
3. **用户个人中心** (`/profile`) — ECharts 环形进度条 + Sparkline + 消费记录
4. **8 个新 API 端点** — admin: stats/users/users/:id/quota/status/records + profile: overview/records
### 设计规范
- 深色主题Linear/Vercel 风格)
- ECharts + echarts-for-react
- Arco Design 组件库优先
---
## 2026-03-12 — Phase 2: 后端 + 用户认证 + 管理面板
**状态**: ✅ 已完成 | **验收**: ✅ 通过agent-auto 自动测试)
### 变更内容
1. **Django 后端** — Django 4.2 + DRF + MySQL 云数据库
2. **JWT 认证** — SimpleJWT + 前端 Token 自动刷新
3. **用户系统** — 登录 `/login` + 注册 `/register`
4. **管理后台** — 基础仪表盘 + 用户配额管理
5. **9 个新 API 端点** — 认证 4 个 + 管理 3 个 + 已有接口认证 2 个
---
## 2025 — Phase 1: 核心视频生成 UI
**状态**: ✅ 已完成 | **验收**: ✅ 通过92 单元测试 + 14 E2E 测试)
### 变更内容
1. **视频生成页** — 全能参考/首尾帧双模式
2. **InputBar** — contentEditable 富文本 + @ mention
3. **深色主题 UI**`#0a0a0f` 背景 + Arco Design
4. **状态管理** — Zustand store
---
## 模板(新增变更请复制此模板)
```markdown
## YYYY-MM-DD — 变更标题
**状态**: 🔲 开发中 / ✅ 已完成 | **验收**: 🔲 待验收 / ✅ 通过 / ❌ 未通过
### 变更内容
1. ...
### 变更文件
| 文件 | 改动 |
|------|------|
| `path/to/file` | 描述 |
### 触发原因
- ...
### 备注
- ...
```

View File

@ -50,6 +50,14 @@ spec:
value: "true"
- name: ENVIRONMENT
value: "production"
# Seedance API (from Secret)
- name: ARK_API_KEY
valueFrom:
secretKeyRef:
name: video-backend-secrets
key: ARK_API_KEY
- name: SEEDANCE_ENABLED
value: "true"
livenessProbe:
httpGet:
path: /healthz/