diff --git a/.gitignore b/.gitignore
index 8a6edb4..c3880a1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -16,6 +16,7 @@ __pycache__/
.pids/
deploy/.env.production
deploy/.htpasswd
+secrets/
# api
api/.venv/
diff --git a/RULES.md b/RULES.md
index 708437d..9f0b12d 100644
--- a/RULES.md
+++ b/RULES.md
@@ -25,6 +25,7 @@
- 生产启动:`docker compose -f docker-compose.prod.yml --env-file deploy/.env.production up -d --build`
- 生产架构:`web` 容器用 Nginx 承载 Next 静态导出;`/login/`、`/_next/`、`/assets/`、`/skg-logo-black.svg`、`/oasis-source/` 等登录页必需静态资源公开访问;未登录访问工作台跳转 `/login/`,`/api/` 通过 Nginx `auth_request` 校验 FastAPI 会话 Cookie 后反代到 `skg-marketing-api:4291`;Traefik 通过 `coolify` 外部网络接入 80/443
- 持久化目录:服务器 `./data/jobs` 挂载到后端 `/data/jobs`;全局资源中心持久化在 `./data/asset_library`、`./data/prompt_library` 和 `./data/_trash`
+- TikTok 下载登录态:云端使用服务器私有 cookies 文件 `./secrets/tiktok_cookies.txt`,只读挂载到 API 容器 `/run/secrets/tiktok_cookies.txt`,生产环境变量 `YTDLP_COOKIES_FILE=/run/secrets/tiktok_cookies.txt`;不要使用云端浏览器读取方案,也不要把 cookies 入库
- 登录凭证:用户名写下方快捷登录;密码明文备份只放服务器 `/root/skg-marketing-studio-login.txt`,生产环境变量 `WEB_AUTH_PASSWORD` / `WEB_AUTH_SESSION_SECRET` 只放服务器 `deploy/.env.production`
## 快捷登录
@@ -65,7 +66,7 @@
- `IMAGE_BASE_URL` / `IMAGE_API_KEY` / `IMAGE_MODEL`:OpenAI 兼容生图网关;当前所有生图入口一律强制使用 `gpt-image-2`,不做其他图片模型 fallback
- `GPT_IMAGE_MODEL` / `SUBJECT_ASSET_IMAGE_MODEL` / `SUBJECT_ASSET_IMAGE_MODELS`:保留兼容旧环境变量名,但服务端会强制主体 6 视图和所有其他生图入口都只使用 `gpt-image-2`
- `AI_HTTP_PROXY` / `IMAGE_HTTP_PROXY`:可选的 AI 网关出站代理;本地 launchd 后台进程不一定继承 shell 的 `http_proxy/https_proxy`,如生图报 DNS / ConnectError,可在本地 `api/.env` 配置后重启后端。`/health` 只回传是否配置代理,不回传代理地址。
-- `YTDLP_COOKIES_FILE` / `YTDLP_COOKIES_FROM_BROWSER`:可选 TikTok 下载登录态;优先使用 cookies 文件,其次读取本机浏览器 cookies。cookies 文件属于敏感登录态,只能放本机或服务器私有路径,不允许入库。
+- `YTDLP_COOKIES_FILE` / `YTDLP_COOKIES_FROM_BROWSER`:可选 TikTok 下载登录态;生产云端固定使用 cookies 文件 `/run/secrets/tiktok_cookies.txt`(宿主机 `./secrets/tiktok_cookies.txt` 只读挂载),本地开发可临时用浏览器 cookies。cookies 文件属于敏感登录态,只能放本机或服务器私有路径,不允许入库。
- `VOICE_PROVIDER`:配音通道,服务端固定使用 `azure_openai`;旧环境若写 `minimax` 会被忽略
- `AZURE_OPENAI_BASE_URL` / `AZURE_OPENAI_API_KEY`:微软 Azure OpenAI 协议配音网关;本地未单独配置 Key 时回退复用 `LLM_API_KEY`
- `AZURE_TTS_MODEL` / `AZURE_TTS_VOICE_ID` / `AZURE_TTS_VOICE_POOL` / `AZURE_TTS_PATH` / `AZURE_TTS_PATHS`:Azure OpenAI TTS 模型、默认音色、音色池和 OpenAI 协议语音路径;后端会按 `AZURE_TTS_PATHS` 依次尝试,便于区分路径不对和整条语音服务不可用
diff --git a/deploy/.env.production.example b/deploy/.env.production.example
index 4454b22..99948ba 100644
--- a/deploy/.env.production.example
+++ b/deploy/.env.production.example
@@ -38,7 +38,7 @@ SUBJECT_ASSET_IMAGE_MODELS=gpt-image-2
AI_HTTP_PROXY=
# Optional TikTok download login state for yt-dlp. Keep cookies files private.
-YTDLP_COOKIES_FILE=
+YTDLP_COOKIES_FILE=/run/secrets/tiktok_cookies.txt
YTDLP_COOKIES_FROM_BROWSER=
# Audio rewrite and Azure OpenAI TTS
diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml
index 67da0a4..b187768 100644
--- a/docker-compose.prod.yml
+++ b/docker-compose.prod.yml
@@ -18,6 +18,7 @@ services:
- ./data/asset_library:/data/asset_library
- ./data/prompt_library:/data/prompt_library
- ./data/_trash:/data/_trash
+ - ./secrets/tiktok_cookies.txt:/run/secrets/tiktok_cookies.txt:ro
restart: unless-stopped
networks:
- skg-marketing-internal
diff --git a/docs/source-analysis.html b/docs/source-analysis.html
index a23a614..9f3523f 100644
--- a/docs/source-analysis.html
+++ b/docs/source-analysis.html
@@ -572,7 +572,7 @@
当前产品方向已收窄为“信息流广告快速复刻”:主界面左侧是素材输入列,右侧是信息流复刻工作表。顶部固定显示 01-09 流程顺序和每一步的判定依据,编号不再是装饰文本,而是按素材任务、源视频、音频文案、抽帧、主体资产、产品资产、分镜文案、首尾帧和视频候选这些状态解锁。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动音频文案路和视频视觉路。音频文案路提取原音频文案/字幕,分析讲话人、语速节奏、背景音乐/环境声/音效,并为后续新口播和分镜文案提供时间轴;视频视觉路同步抽取参考帧,参考帧只用于人工选择主体并生成相似主体白底视图。产品图上传后独立形成产品资产包:自动识别视角、左右/上下/内外侧、结构点、比例和风险,并补缺角度。最终分镜规划按逐句时间轴把文案、相似主体资产和产品资产汇合;当前暂停直接调视频模型,先逐条生成并审核首帧/尾帧,确认后再决定哪些分镜进入视频候选。
01
素材输入
有当前素材任务即通过;输入框只负责创建或切换任务。
-
02
源视频下载
job.video_url 存在即通过;created/downloading 视为运行中。TikTok 受限视频可通过 YTDLP_COOKIES_FILE 或 YTDLP_COOKIES_FROM_BROWSER 提供登录态,失败后可对同一素材重新下载。
+
02
源视频下载
job.video_url 存在即通过;created/downloading 视为运行中。TikTok 受限视频可通过 YTDLP_COOKIES_FILE 或 YTDLP_COOKIES_FROM_BROWSER 提供登录态;生产云端使用服务器私有 cookies 文件只读挂载,失败后可对同一素材重新下载。
03
音频文案
audio_script.source_text 或 transcript 逐句时间轴有内容即通过。
04
抽帧参考
job.frames.length > 0 即通过;参考帧只做主体重构证据。
05
相似主体
关键帧里存在 subject_assets 即通过;生成类似创新主体,不复刻原人。
@@ -952,7 +952,7 @@ ProductRefStateItem {
| 网页登录 | POST /auth/login、GET /auth/check、POST /auth/logout | web/app/login/page.tsx、Nginx auth_request | 登录页提交账号密码到 /api/auth/login,后端设置 HttpOnly 会话 Cookie;生产 Nginx 对工作台和 /api/ 调 /auth/check 做统一校验,未登录页面跳 /login/,API 返回 JSON 401。 |
| 运行配置 / 模型标注 | GET /health | getRuntimeHealth、ModelTrace | 返回 models:ASR、本机 ASR、ASR fallback、翻译、GPT 改写、GPT 画面理解、产品视角识别 product_view、GPT 图像模型、主体 6 视图 GPT 图像模型、Azure OpenAI TTS、视频别名和 Seedance 服务商。当前 REWRITE_MODEL、AUDIO_REWRITE_MODEL 和 VISION_MODEL 默认使用 gpt-4o;如果旧环境变量仍写 gemini-*,后端会归一化回 GPT_TEXT_MODEL / REWRITE_MODEL。语音只走 Azure OpenAI TTS,models.voice_tts_paths 会回传当前尝试的语音路径,方便区分路径错误和语音服务不可用。前端所有当前主路径里会调用模型的按钮旁显示模型名,点击弹出小窗口查看模型链路和输入输出逻辑;不返回 API Key 或敏感凭证。 |
| 历史列表 | GET /jobs | listJobs | 所有 job 精简列表(id/url/status/thumbnail/mtime…),按 state.json mtime 倒序。前端 URL 无 ?job= 时拉它回填全部历史;带 limit 可截断。 |
-
| 创建任务 | POST /jobs | createJob | 提交 TK 链接,后台开始下载;前端“开始”队列会在 downloaded 后自动触发音频解析。下载阶段优先使用 YTDLP_COOKIES_FILE,其次使用 YTDLP_COOKIES_FROM_BROWSER,TikTok 要求登录态时会提示上传 MP4 或配置后端 cookies。 |
+
| 创建任务 | POST /jobs | createJob | 提交 TK 链接,后台开始下载;前端“开始”队列会在 downloaded 后自动触发音频解析。下载阶段优先使用 YTDLP_COOKIES_FILE,其次使用 YTDLP_COOKIES_FROM_BROWSER;生产云端固定走 /run/secrets/tiktok_cookies.txt,由宿主机 ./secrets/tiktok_cookies.txt 只读挂载。TikTok 要求登录态时会提示上传 MP4 或配置后端 cookies。 |
| 重试下载 | POST /jobs/{id}/download/retry | retryJobDownload | 用于 TK 链接下载失败且没有 video_url 的素材;清空错误、重新进入下载状态,并在后台再次执行 pipeline_download。上传视频不能重下载,需要重新上传文件。 |
| 上传视频 | POST /jobs/upload | uploadJob | 保存 source.mp4,然后同样进入下载完成状态;当前上传后也加入第一步队列,下载完成后自动解析音频。 |
| 删除输入视频 | DELETE /jobs/{id} | deleteJob | 从任务队列、URL 和磁盘 jobs/<id> 目录移除整个 job,包括源视频、关键帧、元素提取图和生成视频。 |
@@ -1238,6 +1238,18 @@ ProductRefStateItem {
影响:只改变工作台视觉模式,不改变素材下载、音频解析、抽帧、主体模板、产品素材池、首尾帧或模型链路;web/app/page.tsx 同步移除旧全局浮动主题按钮,避免右下角出现第二套不相关的主题入口。后续新增图片/视频板块仍应复用同一套媒体悬停放大和删除逻辑。
+
+
+ 2026-05-19 · 云端 TikTok cookies 文件挂载
+ Deploy
+ Ops
+
+
+
问题:生产环境没有桌面浏览器,不能依赖 YTDLP_COOKIES_FROM_BROWSER 读取本机 Chrome 登录态;受限 TikTok 链接仍会在云端返回“Log in for access”。
+
改动:docker-compose.prod.yml 将宿主机 ./secrets/tiktok_cookies.txt 只读挂载到 API 容器 /run/secrets/tiktok_cookies.txt;deploy/.env.production.example 默认设置 YTDLP_COOKIES_FILE=/run/secrets/tiktok_cookies.txt;.gitignore 忽略 secrets/,避免 cookies 入库。
+
影响:云端只需要维护一个服务器私有 cookies 文件,配置后可对失败素材执行“重新下载”;cookies 过期时更换该文件并重启 API 容器即可。
+
+