commit 0192c313f48b95089be78d843aa4fa69a33c7455 Author: William Date: Mon Jun 29 17:46:36 2026 +0600 docs: 初始化项目文档(PRD、AGENTS、MEMORY、README) diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..13554bb --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +node_modules/ +dist/ +data/ +.env +.env.* +.git/ +.github/ +.vscode/ +.idea/ +*.md +*.log +.DS_Store +coverage/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..43ed9f4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# Dependencies +node_modules/ +.pnp +.pnp.js + +# Build outputs +dist/ +build/ +*.tsbuildinfo + +# Environment variables +.env +.env.local +.env.*.local + +# Database +data/ +*.db +*.sqlite +*.sqlite3 + +# Logs +logs/ +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Test coverage +coverage/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..6a387ff --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,111 @@ +# AGENTS.md + +> 本项目(阿里云 VOD 媒体库管理器)的代理开发指南。 + +## 项目背景 + +一个轻量、开源、可自托管的阿里云视频点播(VOD)媒体资源管理后台。核心目标是解决阿里云官方 VOD 控制台在查看、批量下载、批量删除大量视频时操作繁琐的问题。 + +- 许可证:MIT +- 用户群体:开发者、内容运营人员 +- 部署方式:Docker / 源码运行 + +## 技术栈 + +- **前端**:React 18 + TypeScript + Vite + Ant Design 5 + Zustand +- **后端**:Node.js 20 + Express + TypeScript + SQLite +- **阿里云 SDK**:`@alicloud/pop-core` +- **容器化**:Docker + Docker Compose + +## 目录结构 + +``` +. +├── apps/ +│ ├── web/ # React 前端 +│ └── server/ # Express 后端 +├── docker/ +│ ├── Dockerfile +│ ├── docker-compose.yml +│ └── .env.example +├── docs/ # 部署与使用文档 +├── PRD.md # 产品需求文档 +├── README.md +└── AGENTS.md # 本文件 +``` + +## 开发规范 + +### 代码风格 + +- 使用 TypeScript,严格模式开启。 +- 后端统一使用 `asyncHandler` 包装异步路由处理器,避免未捕获异常导致进程崩溃。 +- 后端数据库查询结果使用 camelCase 别名与 TypeScript 接口保持一致。 +- 前端使用函数组件 + Hooks,状态管理使用 Zustand。 +- API 响应统一格式:`{ code: number, data: T, message?: string }`。 + +### 安全要求 + +- AccessKey Secret 必须加密存储(`APP_ENCRYPTION_KEY`),生产环境必须设置。 +- JWT 密钥生产环境必须修改,默认密钥不允许用于生产。 +- 阿里云 API 调用仅在后端进行,禁止前端直接持有密钥。 +- 建议用户创建最小权限 RAM 子用户。 + +### 环境变量 + +后端关键配置见 `apps/server/.env.example`: + +- `PORT`:服务端端口 +- `JWT_SECRET`:JWT 签名密钥 +- `APP_ENCRYPTION_KEY`:AccessKey Secret 加密密钥 +- `DEFAULT_ADMIN_USERNAME/PASSWORD`:默认管理员账号 +- `DB_PATH`:SQLite 数据库路径 + +## 常用命令 + +```bash +# 安装依赖 +npm install + +# 开发启动(同时启动前后端) +npm run dev + +# 单独启动后端 +npm run dev -w apps/server + +# 单独启动前端 +npm run dev -w apps/web + +# 代码检查 +npm run lint + +# 测试 +npm run test + +# 生产构建 +npm run build + +# 生产运行 +npm run start -w apps/server +``` + +## 后端路由约定 + +- `/api/auth`:登录与当前用户 +- `/api/accounts`:阿里云账号配置(需管理员权限修改) +- `/api/videos`:视频列表、详情、批量下载/删除/更新 +- `/api/categories`:VOD 分类树 +- `/api/logs`:操作日志 + +## 数据库表 + +- `users`:用户表(id, username, password_hash, role, created_at) +- `accounts`:阿里云账号表(access_key_id, access_key_secret, region, endpoint, is_active, ...) +- `operation_logs`:操作日志表(action, target_type, target_ids, details, ...) + +## 贡献注意事项 + +1. 修改前后端代码后,必须跑通 `npm run lint` 和 `npm run test`。 +2. 后端新增接口建议同步写入 `docs/api.md`(如存在)。 +3. 涉及数据库 schema 变更时,需考虑现有部署的兼容性。 +4. 提交信息使用中文,描述清晰。 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a635cb6 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Aliyun VOD Media Library Manager Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MEMORY.md b/MEMORY.md new file mode 100644 index 0000000..44f5ea4 --- /dev/null +++ b/MEMORY.md @@ -0,0 +1,71 @@ +# MEMORY.md + +> 项目状态与关键决策记录,供跨会话参考。 + +## 当前状态 + +- **版本**:v0.1.0(MVP) +- **阶段**:基础功能已完成,前后端均可构建并运行 +- **最后更新**:2026-06-29 + +## 已完成的里程碑 + +### MVP(v0.1.0) + +- [x] 前后端项目初始化 +- [x] SQLite 数据库与默认管理员账号 +- [x] JWT 登录认证与管理员/只读角色 +- [x] 阿里云 VOD 账号配置(多账号、切换、Secret 加密) +- [x] 视频列表、搜索、筛选 +- [x] 视频详情查看 +- [x] 批量获取下载地址(支持指定清晰度) +- [x] 批量删除视频 +- [x] 批量更新视频元信息 +- [x] VOD 分类树读取 +- [x] 操作日志记录 +- [x] Docker + Docker Compose 部署配置 +- [x] README 与部署文档 +- [x] GitHub Actions CI 配置 + +## 架构决策 + +1. **前后端分离**:React 前端 + Express 后端,生产环境由后端 serve 前端静态资源。 +2. **数据库选型**:使用 SQLite,零部署成本,适合个人/小团队自托管。 +3. **密钥安全**:AccessKey Secret 使用 AES-256-GCM 加密,密钥通过 `APP_ENCRYPTION_KEY` 环境变量注入。 +4. **API 调用代理**:所有阿里云 VOD API 调用均通过后端代理,前端不接触密钥。 +5. **权限模型**:简单双角色(admin / readonly),admin 可修改账号与执行删除/更新,readonly 仅可查看与下载。 + +## 已知问题 / 待优化 + +1. 下载地址获取是同步串行循环,后续应改为异步队列并增加进度条。 +2. 前端构建产物单文件较大(>1MB),可考虑按路由懒加载。 +3. 尚未接入真实阿里云 VOD 环境进行端到端验证,字段映射可能需要根据实际 API 响应微调。 +4. 单元测试覆盖较少,目前仅覆盖 crypto 工具函数。 +5. 分类树目前只读取一层子分类,未做递归展开。 + +## 后续规划 + +### v0.2.0 + +- [ ] 真实 VOD 环境联调与字段校准 +- [ ] 批量任务异步队列与进度展示 +- [ ] 标签管理 +- [ ] 更完善的错误提示 + +### v0.3.0 + +- [ ] 支持 STS 临时凭证 +- [ ] 下载任务导出 CSV +- [ ] 前端路由懒加载优化 + +### v1.0.0 + +- [ ] 中英文国际化 +- [ ] 完善测试覆盖 +- [ ] 发布正式 Release + +## 部署注意 + +- 生产环境必须设置 `JWT_SECRET` 和 `APP_ENCRYPTION_KEY`。 +- 默认管理员账号 `admin/admin` 仅用于首次登录,务必修改。 +- SQLite 数据库文件位于 `apps/server/data/vod-manager.db`,Docker 部署时通过 volume 持久化。 diff --git a/PRD.md b/PRD.md new file mode 100644 index 0000000..4c9f959 --- /dev/null +++ b/PRD.md @@ -0,0 +1,341 @@ +# 阿里云 VOD 媒体资源管理器 - 产品需求文档 (PRD) + +> 版本:v1.0 +> 状态:草稿 / 待评审 +> 目标:构建一个轻量、开源、可自托管的阿里云视频点播(VOD)媒体资源管理后台,解决官方控制台操作繁琐、批量处理能力弱的问题。 + +--- + +## 1. 项目概述 + +### 1.1 背景 + +阿里云视频点播(VOD)官方管理控制台功能全面,但在以下场景中存在明显痛点: + +- **查看视频麻烦**:控制台层级深、加载慢、筛选和搜索体验一般。 +- **批量下载困难**:无法一次性选中多个视频并批量获取下载地址。 +- **删除操作繁琐**:批量删除步骤多,确认链路过长。 +- **权限过重**:需要将阿里云账号或复杂 RAM 权限交给所有操作人员。 +- **成本不透明**:难以快速统计某个分类/标签下的视频数量、存储时长、转码状态等。 + +### 1.2 产品定位 + +一个**面向开发者和内容运营人员的轻量 VOD 管理后台**,支持: + +- 快速查看、搜索、筛选媒体库。 +- 批量获取播放/下载地址。 +- 批量删除、批量修改分类/标签/标题。 +- 多账号配置切换(支持多个阿里云 VOD 账号/Region)。 +- 简单自托管部署(Docker / 二进制 / 源码)。 + +### 1.3 目标用户 + +- 使用阿里云 VOD 存储大量视频的内容团队。 +- 需要将 VOD 管理能力集成到内部工作流的开发者。 +- 希望拥有可定制、可私有部署的媒体管理工具的开源社区用户。 + +### 1.4 开源声明 + +本项目以 **MIT License** 开源,代码托管于 GitHub,欢迎 Issue / PR / Fork。设计上避免引入商业依赖,保证社区可长期免费使用与二次开发。 + +--- + +## 2. 功能需求 + +### 2.1 核心功能 + +| 功能模块 | 功能说明 | 优先级 | +| --- | --- | --- | +| 视频列表 | 分页展示 VOD 媒体库,支持按标题、ID、分类、标签、状态、时间筛选 | P0 | +| 视频详情 | 查看单个视频的元信息(ID、标题、描述、时长、大小、创建时间、转码状态、封面、播放 URL 等) | P0 | +| 批量下载 | 勾选多个视频,批量获取原片或指定清晰度播放地址,导出为 CSV / 直接触发浏览器下载 | P0 | +| 批量删除 | 勾选多个视频,二次确认后批量删除(支持逻辑删除/物理删除配置) | P0 | +| 批量编辑 | 批量修改标题前缀、分类、标签 | P1 | +| 账号管理 | 配置多个阿里云 AccessKey / Region / 存储区域,支持切换 | P0 | +| 权限控制 | 内置简单登录与只读/读写角色(可选) | P1 | +| 操作日志 | 记录谁在什么时间做了下载/删除/编辑操作 | P1 | + +### 2.2 视频列表字段 + +默认展示字段: + +- 视频 ID(VideoId) +- 标题(Title) +- 分类(CateId / CateName) +- 标签(Tags) +- 时长(Duration) +- 文件大小(Size) +- 创建时间(CreationTime) +- 状态(Status:上传中 / 转码中 / 正常 / 审核中 / 屏蔽) +- 转码状态(TranscodeStatus) +- 缩略图(CoverURL) + +### 2.3 筛选与搜索 + +- 关键词搜索:标题、VideoId。 +- 分类筛选:下拉选择 VOD 分类树。 +- 标签筛选:输入标签,支持多选。 +- 时间范围:创建时间、更新时间。 +- 状态筛选:上传状态、转码状态。 +- 文件大小、时长范围筛选(P2)。 + +### 2.4 批量下载 + +- 支持选择:原片 / 指定清晰度(如 LD/SD/HD/FHD/4K)。 +- 输出方式: + - 生成临时下载地址列表,导出 CSV(含 VideoId、标题、URL、过期时间)。 + - 对浏览器可直接访问的资源,触发浏览器多文件下载(受浏览器策略限制)。 +- 支持设置 URL 过期时间(默认 2 小时,最大 24 小时)。 +- 下载任务队列,避免一次性请求过多导致限流。 + +### 2.5 批量删除 + +- 选中视频后弹出确认框,列出待删除的视频标题与 ID。 +- 支持“仅删除媒资信息(逻辑删除)”或“彻底删除(包括存储文件)”。 +- 删除前二次确认,防止误操作。 + +### 2.6 账号与 Region 管理 + +- 添加账号:AccessKey ID、AccessKey Secret、Region(如 cn-shanghai)、存储区域。 +- 支持同时保存多个账号,通过下拉切换。 +- 敏感信息(AccessKey Secret)在本地配置中加密存储或仅保留在服务端环境变量中。 + +--- + +## 3. 非功能需求 + +### 3.1 性能 + +- 视频列表首屏加载 < 2s(1000 条以内)。 +- 批量操作(下载/删除/编辑)单次最多支持 100 条,超过时分批处理并展示进度。 +- 支持阿里云 VOD API 分页与限流自动重试。 + +### 3.2 安全 + +- AccessKey 不暴露给前端,所有阿里云 API 调用由后端代理完成。 +- 支持通过环境变量注入 AccessKey,避免写入代码或前端配置。 +- 内置登录态(JWT),可配置只读账号与管理员账号。 +- 支持 HTTPS 部署(通过反向代理)。 + +### 3.3 易用性 + +- 单 Docker 镜像即可运行,5 分钟内完成部署。 +- 提供开箱即用的 Docker Compose 配置。 +- 前端响应式,支持桌面端与平板。 +- 中文/英文界面(i18n,P1)。 + +### 3.4 可维护性 + +- 前后端分离,代码结构清晰。 +- 统一 REST API 规范。 +- 完善的类型定义(TypeScript)。 +- 单元测试覆盖核心 API 调用与工具函数。 + +--- + +## 4. 技术栈 + +采用**前后端分离**架构,整体追求轻量、现代、易部署。 + +### 4.1 前端 + +| 技术 | 版本/选型 | 说明 | +| --- | --- | --- | +| 框架 | **React 18** | 组件化、生态成熟、社区广泛 | +| 语言 | **TypeScript 5** | 类型安全,降低维护成本 | +| 构建工具 | **Vite 5** | 极速冷启动与 HMR | +| UI 组件库 | **Ant Design 5** | 完善的中后台组件,支持国际化 | +| 状态管理 | **Zustand** | 轻量,适合中小型应用 | +| 路由 | **React Router v6** | 声明式路由 | +| HTTP 客户端 | **Axios** | 统一拦截、错误处理 | +| 表格/虚拟滚动 | **Ant Design Table** + 按需分页 | 处理大量视频列表 | +| 代码规范 | **ESLint + Prettier** | 统一代码风格 | + +### 4.2 后端 + +| 技术 | 版本/选型 | 说明 | +| --- | --- | --- | +| 运行时 | **Node.js 20 LTS** | 长期支持,性能稳定 | +| 框架 | **Express 4** | 轻量、成熟、文档丰富 | +| 语言 | **TypeScript 5** | 类型安全 | +| 阿里云 SDK | **@alicloud/pop-core** 或官方 **@alicloud/vod-sdk** | 调用 VOD OpenAPI | +| 配置管理 | **cosmiconfig / dotenv** | 支持环境变量与配置文件 | +| 身份认证 | **jsonwebtoken** + bcryptjs | JWT + 密码哈希 | +| 持久化 | **SQLite**(可选) | 存储账号配置、操作日志,零部署成本 | +| 日志 | **pino** | 高性能结构化日志 | +| 任务队列 | **bullmq** 或内存队列 | 批量任务异步处理 | +| 代码规范 | **ESLint + Prettier** | 统一代码风格 | + +### 4.3 部署与运维 + +| 技术 | 说明 | +| --- | --- | +| **Docker** | 前后端统一镜像或多镜像编排 | +| **Docker Compose** | 一键启动完整服务 | +| **Nginx / Caddy** | 反向代理、SSL 终止(可选,由用户自行配置) | +| **GitHub Actions** | CI: lint / test / build / Docker 镜像发布 | + +### 4.4 整体架构 + +``` +┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ +│ Web Browser │──────▶ React Frontend │──────▶ Node.js Backend │ +│ (Ant Design) │ │ (Vite + TS) │ │ (Express + TS) │ +└─────────────────┘ └──────────────────┘ └────────┬────────┘ + │ + ▼ + ┌─────────────────┐ + │ 阿里云 VOD API │ + │ (pop-core SDK) │ + └─────────────────┘ + │ + ▼ + ┌─────────────────┐ + │ SQLite (可选) │ + │ 配置 / 操作日志 │ + └─────────────────┘ +``` + +### 4.5 目录结构(建议) + +``` +Aliyun-VOD-Media-Library-Manager/ +├── apps/ +│ ├── web/ # 前端 (React + Vite) +│ │ ├── src/ +│ │ ├── package.json +│ │ └── vite.config.ts +│ └── server/ # 后端 (Node.js + Express) +│ ├── src/ +│ ├── package.json +│ └── tsconfig.json +├── docker/ +│ ├── Dockerfile.web +│ ├── Dockerfile.server +│ └── docker-compose.yml +├── docs/ # 使用文档、部署文档 +├── .github/ +│ └── workflows/ci.yml +├── LICENSE (MIT) +├── README.md +└── PRD.md +``` + +--- + +## 5. API 设计(核心) + +### 5.1 账号配置 + +- `GET /api/config` - 获取当前账号配置(脱敏) +- `POST /api/config` - 新增/更新账号配置 +- `DELETE /api/config/:id` - 删除账号配置 +- `POST /api/config/:id/switch` - 切换当前使用账号 + +### 5.2 媒体库 + +- `GET /api/videos` - 视频列表(分页、筛选) +- `GET /api/videos/:id` - 视频详情 +- `POST /api/videos/:id/play-info` - 获取播放信息 +- `POST /api/videos/batch-delete` - 批量删除 +- `POST /api/videos/batch-download` - 批量获取下载地址 +- `POST /api/videos/batch-update` - 批量更新元信息(P1) + +### 5.3 分类 + +- `GET /api/categories` - 获取 VOD 分类树 + +### 5.4 系统 + +- `POST /api/auth/login` - 登录 +- `GET /api/auth/me` - 当前用户 +- `GET /api/logs` - 操作日志(P1) + +--- + +## 6. 界面原型要点 + +### 6.1 布局 + +- 左侧导航:视频库、批量任务、账号配置、系统设置、操作日志。 +- 顶部:当前账号/Region 切换、用户头像/退出。 +- 主内容区:面包屑 + 筛选栏 + 数据表格。 + +### 6.2 视频库页面 + +- 筛选栏:关键词输入、分类下拉、标签输入、时间选择、状态选择、刷新按钮。 +- 操作栏:批量下载、批量删除、批量编辑。 +- 表格:支持多选、排序、列自定义。 +- 点击行展开/抽屉查看详情与预览。 + +### 6.3 批量任务页面 + +- 展示当前批量下载/删除任务进度。 +- 完成后可导出结果 CSV。 + +--- + +## 7. 里程碑规划 + +| 阶段 | 目标 | 周期(建议) | +| --- | --- | --- | +| **MVP** | 视频列表、详情、单/批量下载、单/批量删除、单账号配置 | 2 - 3 周 | +| **v0.2** | 多账号切换、分类树、操作日志、只读/管理员权限 | 2 周 | +| **v0.3** | 批量编辑、标签管理、下载任务队列、Docker 一键部署 | 2 周 | +| **v1.0** | i18n、测试覆盖、文档完善、发布 Release | 2 周 | + +--- + +## 8. 风险与规避 + +| 风险 | 影响 | 规避方案 | +| --- | --- | --- | +| 阿里云 API 限流 | 批量操作失败 | 分页、队列、指数退避重试 | +| AccessKey 泄露 | 账号安全 | 仅后端持有,环境变量注入,最小权限 RAM 用户 | +| 大文件下载超时 | 体验差 | 仅获取临时 URL,由用户自行使用下载工具 | +| 官方 API 变更 | 功能异常 | 封装 SDK 调用层,抽象统一接口 | + +--- + +## 9. 附录 + +### 9.1 参考文档 + +- [阿里云 VOD 开发指南](https://help.aliyun.com/document_detail/60574.html) +- [阿里云 OpenAPI 门户 - VOD](https://next.api.aliyun.com/api/Vod) +- [RAM 最小权限策略最佳实践](https://help.aliyun.com/document_detail/58932.html) + +### 9.2 建议的 RAM 最小权限 + +为了让本工具安全运行,建议为阿里云子账号/用户组授予最小权限策略: + +```json +{ + "Version": "1", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "vod:Get*", + "vod:List*", + "vod:SearchMedia", + "vod:DeleteVideo", + "vod:UpdateVideoInfo", + "vod:GetPlayInfo" + ], + "Resource": "*" + } + ] +} +``` + +> 注:如果仅需要只读功能,应移除 `DeleteVideo` 与 `UpdateVideoInfo`。 + +--- + +## 10. 待决策事项 + +1. 是否引入数据库:MVP 阶段建议仅用内存/JSON 配置,v0.2 引入 SQLite。 +2. 批量下载 URL 过期策略:默认 2 小时,是否允许用户自定义。 +3. 是否支持阿里云 STS 临时凭证:建议 v0.3 支持,进一步提升安全性。 +4. 是否支持多云扩展(如腾讯云、AWS):明确 v1.0 前不支持,保持聚焦。 diff --git a/README.md b/README.md new file mode 100644 index 0000000..7494081 --- /dev/null +++ b/README.md @@ -0,0 +1,112 @@ +# 阿里云 VOD 媒体库管理器 + +一个**轻量、开源、可自托管**的阿里云视频点播(VOD)媒体资源管理后台,解决官方控制台操作繁琐、批量处理能力弱的问题。 + +## 功能特性 + +- 视频库快速查看、搜索、筛选(标题、分类、标签、状态、时间) +- 批量获取视频播放/下载地址,支持选择清晰度 +- 批量删除视频 +- 多账号/多 Region 切换管理 +- 内置登录与角色控制(管理员 / 只读) +- 操作日志审计 +- 单 Docker 镜像一键部署 + +## 技术栈 + +- **前端**:React 18 + TypeScript + Vite + Ant Design 5 + Zustand +- **后端**:Node.js 20 + Express + TypeScript + SQLite +- **阿里云 SDK**:`@alicloud/pop-core` +- **部署**:Docker + Docker Compose + +## 快速开始 + +### 方式一:Docker Compose(推荐) + +```bash +git clone https://github.com/your-org/Aliyun-VOD-Media-Library-Manager.git +cd Aliyun-VOD-Media-Library-Manager/docker +cp .env.example .env +# 编辑 .env,设置 JWT_SECRET 等 +sudo docker-compose up -d +``` + +访问 http://localhost:3001,默认账号密码 `admin` / `admin`。 + +### 方式二:源码运行 + +```bash +# 安装依赖 +npm install + +# 启动后端(端口 3001) +npm run dev -w apps/server + +# 新终端启动前端(端口 5173) +npm run dev -w apps/web +``` + +## 配置说明 + +关键环境变量: + +| 变量 | 说明 | 默认值 | +| --- | --- | --- | +| `JWT_SECRET` | JWT 签名密钥,生产环境必须修改 | `vod-manager-dev-secret-change-me` | +| `APP_ENCRYPTION_KEY` | AccessKey Secret 加密密钥 | 空(明文存储,会告警) | +| `DEFAULT_ADMIN_USERNAME` | 默认管理员账号 | `admin` | +| `DEFAULT_ADMIN_PASSWORD` | 默认管理员密码 | `admin` | +| `DB_PATH` | SQLite 数据库路径 | `./data/vod-manager.db` | + +## 阿里云 RAM 最小权限 + +建议为本工具单独创建 RAM 子用户,并授予最小权限: + +```json +{ + "Version": "1", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "vod:Get*", + "vod:List*", + "vod:SearchMedia", + "vod:GetPlayInfo", + "vod:DeleteVideo", + "vod:UpdateVideoInfo" + ], + "Resource": "*" + } + ] +} +``` + +如果只需要只读能力,请移除 `DeleteVideo` 和 `UpdateVideoInfo`。 + +## 项目结构 + +``` +. +├── apps/ +│ ├── web/ # React 前端 +│ └── server/ # Express 后端 + SQLite +├── docker/ +│ ├── Dockerfile +│ └── docker-compose.yml +├── docs/ # 部署与使用文档 +├── PRD.md # 产品需求文档 +└── README.md +``` + +## 贡献指南 + +欢迎 Issue 和 Pull Request。请确保: + +1. 代码通过 `npm run lint` +2. 核心逻辑补充测试 +3. 提交信息清晰说明改动 + +## License + +[MIT](./LICENSE)