From f99bd336c90a1be0451c3babf3bf094233767aff Mon Sep 17 00:00:00 2001 From: Kevin Wong Date: Mon, 26 Jan 2026 12:18:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/DEPLOY_MANUAL.md | 41 ++++++ Docs/DevLogs/Day10.md | 88 +++++++++++++ Docs/Logs.md | 204 ++++++++++++++++++++++++++++++ Docs/task_complete.md | 17 ++- backend/.env.example | 15 +-- backend/app/api/materials.py | 4 +- backend/app/api/publish.py | 2 +- backend/app/core/paths.py | 2 +- backend/app/core/security.py | 2 +- backend/app/main.py | 1 + frontend/next.config.ts | 8 ++ frontend/src/app/admin/page.tsx | 4 +- frontend/src/app/layout.tsx | 4 +- frontend/src/app/page.tsx | 26 +++- frontend/src/app/publish/page.tsx | 25 +++- frontend/src/lib/auth.ts | 4 +- 16 files changed, 417 insertions(+), 30 deletions(-) create mode 100644 Docs/DevLogs/Day10.md create mode 100644 Docs/Logs.md diff --git a/Docs/DEPLOY_MANUAL.md b/Docs/DEPLOY_MANUAL.md index 356fb1f..a221a1c 100644 --- a/Docs/DEPLOY_MANUAL.md +++ b/Docs/DEPLOY_MANUAL.md @@ -251,6 +251,47 @@ pm2 stop vigent2-latentsync # 停止 LatentSync 服务 pm2 delete all # 删除所有服务 ``` + +--- + +## 步骤 10: 配置 Nginx HTTPS (可选 - 公网访问) + +如果您需要通过公网域名 HTTPS 访问 (如 `https://vigent.hbyrkj.top`),请参考以下 Nginx 配置。 + +**前置条件**: +1. 已申请 SSL 证书 (如 Let's Encrypt)。 +2. 使用 FRP 或其他方式将本地 3002 端口映射到服务器。 + +**配置示例** (`/etc/nginx/conf.d/vigent.conf`): + +```nginx +server { + listen 80; + server_name your.domain.com; + return 301 https://$host$request_uri; +} + +server { + listen 443 ssl http2; + server_name your.domain.com; + + ssl_certificate /path/to/fullchain.pem; + ssl_certificate_key /path/to/privkey.pem; + + location / { + proxy_pass http://127.0.0.1:3002; # 转发给 Next.js 前端 + + # 必须配置 WebSocket 支持,否则热更和即时通信失效 + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + } +} +``` + --- ## 故障排除 diff --git a/Docs/DevLogs/Day10.md b/Docs/DevLogs/Day10.md new file mode 100644 index 0000000..ca62846 --- /dev/null +++ b/Docs/DevLogs/Day10.md @@ -0,0 +1,88 @@ +--- + +## 🔧 隧道访问与视频播放修复 (11:00) + +### 问题描述 +在通过 FRP 隧道 (如 `http://8.148.x.x:3002`) 访问时发现: +1. **视频无法播放**:后端返回 404 (Not Found)。 +2. **发布页账号列表为空**:后端返回 500 (Internal Server Error)。 + +### 解决方案 + +#### 1. 视频播放修复 +- **后端 (`main.py`)**:这是根源问题。后端缺少 `uploads` 目录的挂载,导致静态资源无法访问。 + ```python + app.mount("/uploads", StaticFiles(directory=str(settings.UPLOAD_DIR)), name="uploads") + ``` +- **前端 (`next.config.ts`)**:添加反向代理规则,将 `/outputs` 和 `/uploads` 转发到后端端口 8006。 + ```typescript + { + source: '/uploads/:path*', + destination: 'http://localhost:8006/uploads/:path*', + }, + { + source: '/outputs/:path*', + destination: 'http://localhost:8006/outputs/:path*', + } + ``` + +#### 2. 账号列表 500 错误修复 +- **根源**:`backend/app/core/paths.py` 中的白名单缺少 `weixin` 和 `kuaishou`。 +- **现象**:当 `PublishService` 遍历所有平台时,遇到未在白名单的平台直接抛出 `ValueError`,导致整个接口崩溃。 +- **修复**:更新白名单。 + ```python + VALID_PLATFORMS: Set[str] = {"bilibili", "douyin", "xiaohongshu", "weixin", "kuaishou"} + ``` + +### 结果 +- ✅ 视频预览和历史视频均可正常播放。 +- ✅ 发布页账号列表恢复显示。 + +--- + +## 🚀 Nginx HTTPS 部署 (11:30) + +### 需求 +用户在阿里云服务器上配置了 SSL 证书,需要通过 HTTPS 访问应用。 + +### 解决方案 +提供了 Nginx 配置文件 `nginx_vigent.conf`,配置了: +1. **HTTP -> HTTPS 重定向**。 +2. **SSL 证书路径** (`/etc/letsencrypt/live/vigent.hbyrkj.top/...`)。 +3. **反向代理** 到本地 FRP 端口 (3002)。 +4. **WebSocket 支持** (用于 Next.js 热更和通信)。 + +### 结果 +- ✅ 用户可通过 `https://vigent.hbyrkj.top` 安全访问。 +- ✅ 代码自适应:前端 `API_BASE` 为空字符串,自动适配 HTTPS 协议,无需修改代码。 + +--- + +## 🎨 UI 细节优化 (11:45) + +### 修改 +- 修改 `frontend/src/app/layout.tsx` 中的 Metadata。 +- 标题从 `Create Next App` 改为 `ViGent`。 + +### 结果 +- ✅ 浏览器标签页名称已更新。 + +--- + +## 🚪 用户登录退出功能 (12:00) + +### 需求 +用户反馈没有退出的入口。 + +### 解决方案 +- **UI 修改**:在首页和发布管理页面的顶部导航栏添加红色的“退出”按钮 (位于最右侧)。 +- **逻辑实现**: + ```javascript + onClick={async () => { + if (confirm('确定要退出登录吗?')) { + await fetch(`${API_BASE}/api/auth/logout`, { method: 'POST' }); + window.location.href = '/login'; + } + }} + ``` +- **部署**:已同步代码并重建前端。 diff --git a/Docs/Logs.md b/Docs/Logs.md new file mode 100644 index 0000000..124d7a8 --- /dev/null +++ b/Docs/Logs.md @@ -0,0 +1,204 @@ +rongye@r730-ubuntu:~/ProgramFiles/ViGent2$ pm2 logs vigent2-latentsync +[TAILING] Tailing last 15 lines for [vigent2-latentsync] process (change the value with --lines option) +/home/rongye/.pm2/logs/vigent2-latentsync-out.log last 15 lines: +/home/rongye/.pm2/logs/vigent2-latentsync-error.log last 15 lines: +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | SyntaxError: Non-UTF-8 code starting with '\x80' in file /usr/bin/python on line 2, but no encoding declared; see https://python.org/dev/peps/pep-0263/ for details +15|vigent2 | INFO: Started server process [1437489] +15|vigent2 | INFO: Waiting for application startup. +15|vigent2 | INFO: Application startup complete. +15|vigent2 | INFO: Uvicorn running on http://0.0.0.0:8007 (Press CTRL+C to quit) + + + + + + + +rongye@r730-ubuntu:~/ProgramFiles/ViGent2$ pm2 logs vigent2-frontend +[TAILING] Tailing last 15 lines for [vigent2-frontend] process (change the value with --lines option) +/home/rongye/.pm2/logs/vigent2-frontend-error.log last 15 lines: +11|vigent2 | at ignore-listed frames +11|vigent2 | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2 | at ignore-listed frames +11|vigent2 | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2 | at ignore-listed frames +11|vigent2 | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2 | at ignore-listed frames +11|vigent2 | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2 | at ignore-listed frames +11|vigent2 | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2 | at ignore-listed frames +11|vigent2 | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2 | at ignore-listed frames +11|vigent2 | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2 | at ignore-listed frames + +/home/rongye/.pm2/logs/vigent2-frontend-out.log last 15 lines: +11|vigent2 | +11|vigent2 | ✓ Starting... +11|vigent2 | +11|vigent2 | > frontend@0.1.0 start +11|vigent2 | > next start -p 3002 -p 3002 +11|vigent2 | +11|vigent2 | ▲ Next.js 16.1.1 +11|vigent2 | - Local: http://localhost:3002 +11|vigent2 | - Network: http://192.168.110.200:3002 +11|vigent2 | +11|vigent2 | ✓ Starting... +11|vigent2 | +11|vigent2 | > frontend@0.1.0 start +11|vigent2 | > next start -p 3002 -p 3002 +11|vigent2 | + +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames +11|vigent2-frontend | > frontend@0.1.0 start +11|vigent2-frontend | > next start -p 3002 -p 3002 +11|vigent2-frontend | ▲ Next.js 16.1.1 +11|vigent2-frontend | - Local: http://localhost:3002 +11|vigent2-frontend | - Network: http://192.168.110.200:3002 +11|vigent2-frontend | ✓ Starting... +11|vigent2-frontend | Error: Could not find a production build in the '.next' directory. Try building your app with 'next build' before starting the production server. https://nextjs.org/docs/messages/production-start-no-build-id +11|vigent2-frontend | at ignore-listed frames \ No newline at end of file diff --git a/Docs/task_complete.md b/Docs/task_complete.md index 6bb4a3b..d2b026e 100644 --- a/Docs/task_complete.md +++ b/Docs/task_complete.md @@ -2,8 +2,8 @@ **项目**:ViGent2 数字人口播视频生成系统 **服务器**:Dell R730 (2× RTX 3090 24GB) -**更新时间**:2026-01-23 -**整体进度**:100%(Day 9 部署稳定性优化完成) +**更新时间**:2026-01-26 +**整体进度**:100%(Day 10 HTTPS 部署与细节完善) ## 📖 快速导航 @@ -138,6 +138,13 @@ - [x] 部署服务自愈 (PM2 配置优化) - [x] 部署手册全量更新 (DEPLOY_MANUAL.md) +### 阶段十六:HTTPS 部署与细节完善 (Day 10) +- [x] 隧道访问修复 (StaticFiles 挂载 + Rewrite) +- [x] 平台账号列表 500 错误修复 (paths.py) +- [x] Nginx HTTPS 配置 (反向代理 + SSL) +- [x] 浏览器标题修改 (ViGent) +- [x] 代码自适应 HTTPS 验证 + --- ## 🛤️ 后续规划 @@ -301,5 +308,11 @@ Day 9: 发布模块优化 ✅ 完成 - 前端生产构建流程修复 - LatentSync 严重卡顿修复 (线程数限制) - 部署手册全量更新 + +Day 10: HTTPS 部署与细节完善 ✅ 完成 + - 隧道访问视频修正 (挂载 uploads) + - 账号列表 Bug 修复 (paths.py 白名单) + - 阿里云 Nginx HTTPS 部署 + - UI 细节优化 (Title 更新) ``` diff --git a/backend/.env.example b/backend/.env.example index bbf14ee..2e2c0b4 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -13,9 +13,8 @@ DEFAULT_TTS_VOICE=zh-CN-YunxiNeural # =============== LatentSync 配置 =============== # GPU 选择 (0=第一块GPU, 1=第二块GPU) -LATENTSYNC_GPU_ID=1 +LATENTSYNC_GPU_ID=0 -# 使用本地模式 (true) 或远程 API (false) # 使用本地模式 (true) 或远程 API (false) LATENTSYNC_LOCAL=true @@ -35,7 +34,7 @@ LATENTSYNC_GUIDANCE_SCALE=1.5 LATENTSYNC_ENABLE_DEEPCACHE=true # 随机种子 (设为 -1 则随机) -LATENTSYNC_SEED=1247 +LATENTSYNC_SEED=-1 # =============== 上传配置 =============== # 最大上传文件大小 (MB) @@ -47,16 +46,16 @@ MAX_UPLOAD_SIZE_MB=500 # =============== Supabase 配置 =============== # 从 Supabase 项目设置 > API 获取 -SUPABASE_URL=https://zcmitzlqlyzxlgwagouf.supabase.co -SUPABASE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InpjbWl0emxxbHl6eGxnd2Fnb3VmIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjkxMzkwNzEsImV4cCI6MjA4NDcxNTA3MX0.2NNkkR0cowopcsCs5bP-DTCksiOuqNjmhfyXGmLdTrM +SUPABASE_URL=your_supabase_url_here +SUPABASE_KEY=your_supabase_anon_key_here # =============== JWT 配置 =============== # 用于签名 JWT Token 的密钥 (请更换为随机字符串) -JWT_SECRET_KEY=F4MagRkf7nJsN-ag9AB7Q-30MbZRe7Iu4E9p9xRzyic +JWT_SECRET_KEY=generate_your_secure_random_key_here JWT_ALGORITHM=HS256 JWT_EXPIRE_HOURS=168 # =============== 管理员配置 =============== # 服务启动时自动创建的管理员账号 -ADMIN_EMAIL= -ADMIN_PASSWORD= +ADMIN_EMAIL=admin@example.com +ADMIN_PASSWORD=change_this_password_immediately diff --git a/backend/app/api/materials.py b/backend/app/api/materials.py index 19984b8..81ebb93 100644 --- a/backend/app/api/materials.py +++ b/backend/app/api/materials.py @@ -19,7 +19,7 @@ def sanitize_filename(filename: str) -> str: return safe_name -@router.post("/") +@router.post("") async def upload_material(file: UploadFile = File(...)): if not file.filename.lower().endswith(('.mp4', '.mov', '.avi')): raise HTTPException(400, "Invalid format") @@ -47,7 +47,7 @@ async def upload_material(file: UploadFile = File(...)): "type": "video" } -@router.get("/") +@router.get("") async def list_materials(): materials_dir = settings.UPLOAD_DIR / "materials" files = [] diff --git a/backend/app/api/publish.py b/backend/app/api/publish.py index 50202bd..596df24 100644 --- a/backend/app/api/publish.py +++ b/backend/app/api/publish.py @@ -46,7 +46,7 @@ def _get_user_id(request: Request) -> Optional[str]: return None -@router.post("/", response_model=PublishResponse) +@router.post("", response_model=PublishResponse) async def publish_video(request: PublishRequest, req: Request, background_tasks: BackgroundTasks): """发布视频到指定平台""" # Validate platform diff --git a/backend/app/core/paths.py b/backend/app/core/paths.py index b05105f..b1ca332 100644 --- a/backend/app/core/paths.py +++ b/backend/app/core/paths.py @@ -10,7 +10,7 @@ BASE_DIR = Path(__file__).parent.parent.parent USER_DATA_DIR = BASE_DIR / "user_data" # 有效的平台列表 -VALID_PLATFORMS: Set[str] = {"bilibili", "douyin", "xiaohongshu"} +VALID_PLATFORMS: Set[str] = {"bilibili", "douyin", "xiaohongshu", "weixin", "kuaishou"} # UUID 格式正则 UUID_PATTERN = re.compile(r'^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$', re.IGNORECASE) diff --git a/backend/app/core/security.py b/backend/app/core/security.py index b6905c5..119bfba 100644 --- a/backend/app/core/security.py +++ b/backend/app/core/security.py @@ -101,7 +101,7 @@ def set_auth_cookie(response: Response, token: str) -> None: key="access_token", value=token, httponly=True, - secure=True, # 生产环境使用 HTTPS + secure=not settings.DEBUG, # 开发/测试环境(DEBUG=True)允许非HTTPS samesite="lax", max_age=settings.JWT_EXPIRE_HOURS * 3600 ) diff --git a/backend/app/main.py b/backend/app/main.py index 7c05871..bbb6727 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -24,6 +24,7 @@ settings.OUTPUT_DIR.mkdir(parents=True, exist_ok=True) (settings.UPLOAD_DIR / "materials").mkdir(exist_ok=True) app.mount("/outputs", StaticFiles(directory=str(settings.OUTPUT_DIR)), name="outputs") +app.mount("/uploads", StaticFiles(directory=str(settings.UPLOAD_DIR)), name="uploads") # 注册路由 app.include_router(materials.router, prefix="/api/materials", tags=["Materials"]) diff --git a/frontend/next.config.ts b/frontend/next.config.ts index 40a8570..a572b5d 100644 --- a/frontend/next.config.ts +++ b/frontend/next.config.ts @@ -8,6 +8,14 @@ const nextConfig: NextConfig = { source: '/api/:path*', destination: 'http://localhost:8006/api/:path*', // 服务器本地代理 }, + { + source: '/uploads/:path*', + destination: 'http://localhost:8006/uploads/:path*', // 转发上传的素材 + }, + { + source: '/outputs/:path*', + destination: 'http://localhost:8006/outputs/:path*', // 转发生成的视频 + }, ]; }, }; diff --git a/frontend/src/app/admin/page.tsx b/frontend/src/app/admin/page.tsx index e0ac01e..b0f7e80 100644 --- a/frontend/src/app/admin/page.tsx +++ b/frontend/src/app/admin/page.tsx @@ -4,7 +4,9 @@ import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { getCurrentUser, User } from '@/lib/auth'; -const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8006'; +const API_BASE = typeof window === 'undefined' + ? (process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8006') + : ''; interface UserListItem { id: string; diff --git a/frontend/src/app/layout.tsx b/frontend/src/app/layout.tsx index f7fa87e..3515073 100644 --- a/frontend/src/app/layout.tsx +++ b/frontend/src/app/layout.tsx @@ -13,8 +13,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "ViGent", + description: "ViGent Talking Head Agent", }; export default function RootLayout({ diff --git a/frontend/src/app/page.tsx b/frontend/src/app/page.tsx index 9d3a1ac..1e44f85 100644 --- a/frontend/src/app/page.tsx +++ b/frontend/src/app/page.tsx @@ -4,10 +4,9 @@ import { useState, useEffect } from "react"; import Link from "next/link"; -// 动态获取 API 地址:服务端使用 localhost,客户端使用当前域名 -const API_BASE = typeof window !== 'undefined' - ? `http://${window.location.hostname}:8006` - : 'http://localhost:8006'; +const API_BASE = typeof window === 'undefined' + ? 'http://localhost:8006' + : ''; // 类型定义 interface Material { @@ -73,7 +72,7 @@ export default function Home() { setDebugData("Loading..."); // Add timestamp to prevent caching - const url = `${API_BASE}/api/materials/?t=${new Date().getTime()}`; + const url = `${API_BASE}/api/materials?t=${new Date().getTime()}`; const res = await fetch(url); if (!res.ok) { @@ -197,7 +196,7 @@ export default function Home() { setUploadError('网络错误,上传失败'); }; - xhr.open('POST', `${API_BASE}/api/materials/`); + xhr.open('POST', `${API_BASE}/api/materials`); xhr.send(formData); // 清空 input 以便可以再次选择同一文件 @@ -299,6 +298,21 @@ export default function Home() { > 发布管理 + diff --git a/frontend/src/app/publish/page.tsx b/frontend/src/app/publish/page.tsx index 3092f12..4cfd20d 100644 --- a/frontend/src/app/publish/page.tsx +++ b/frontend/src/app/publish/page.tsx @@ -7,9 +7,9 @@ const fetcher = (url: string) => fetch(url).then((res) => res.json()); import Link from "next/link"; // 动态获取 API 地址:服务端使用 localhost,客户端使用当前域名 -const API_BASE = typeof window !== 'undefined' - ? `http://${window.location.hostname}:8006` - : 'http://localhost:8006'; +const API_BASE = typeof window === 'undefined' + ? 'http://localhost:8006' + : ''; interface Account { platform: string; @@ -95,7 +95,7 @@ export default function PublishPage() { for (const platform of selectedPlatforms) { try { - const res = await fetch(`${API_BASE}/api/publish/`, { + const res = await fetch(`${API_BASE}/api/publish`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ @@ -258,11 +258,26 @@ export default function PublishPage() { href="/" className="px-4 py-2 bg-white/10 hover:bg-white/20 text-white rounded-lg transition-colors" > - 视频生成 + 返回创作 发布管理 + diff --git a/frontend/src/lib/auth.ts b/frontend/src/lib/auth.ts index bb0c601..928a3c9 100644 --- a/frontend/src/lib/auth.ts +++ b/frontend/src/lib/auth.ts @@ -2,7 +2,9 @@ * 认证工具函数 */ -const API_BASE = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8006'; +const API_BASE = typeof window === 'undefined' + ? (process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8006') + : ''; export interface User { id: string;