chore: mount tiktok cookies in production

This commit is contained in:
2026-05-19 09:10:04 +08:00
parent 49c998f66c
commit 2fe3db8f88
5 changed files with 19 additions and 4 deletions

1
.gitignore vendored
View File

@@ -16,6 +16,7 @@ __pycache__/
.pids/
deploy/.env.production
deploy/.htpasswd
secrets/
# api
api/.venv/

View File

@@ -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` 依次尝试,便于区分路径不对和整条语音服务不可用

View File

@@ -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

View File

@@ -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

View File

@@ -572,7 +572,7 @@
<p>当前产品方向已收窄为“信息流广告快速复刻”:主界面左侧是素材输入列,右侧是信息流复刻工作表。顶部固定显示 01-09 流程顺序和每一步的判定依据,编号不再是装饰文本,而是按素材任务、源视频、音频文案、抽帧、主体资产、产品资产、分镜文案、首尾帧和视频候选这些状态解锁。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动音频文案路和视频视觉路。音频文案路提取原音频文案/字幕,分析讲话人、语速节奏、背景音乐/环境声/音效,并为后续新口播和分镜文案提供时间轴;视频视觉路同步抽取参考帧,参考帧只用于人工选择主体并生成相似主体白底视图。产品图上传后独立形成产品资产包:自动识别视角、左右/上下/内外侧、结构点、比例和风险,并补缺角度。最终分镜规划按逐句时间轴把文案、相似主体资产和产品资产汇合;当前暂停直接调视频模型,先逐条生成并审核首帧/尾帧,确认后再决定哪些分镜进入视频候选。</p>
<div class="pipeline">
<div class="step"><div class="num">01</div><h3>素材输入</h3><p>有当前素材任务即通过;输入框只负责创建或切换任务。</p></div>
<div class="step"><div class="num">02</div><h3>源视频下载</h3><p><code>job.video_url</code> 存在即通过;<code>created/downloading</code> 视为运行中。TikTok 受限视频可通过 <code>YTDLP_COOKIES_FILE</code><code>YTDLP_COOKIES_FROM_BROWSER</code> 提供登录态,失败后可对同一素材重新下载。</p></div>
<div class="step"><div class="num">02</div><h3>源视频下载</h3><p><code>job.video_url</code> 存在即通过;<code>created/downloading</code> 视为运行中。TikTok 受限视频可通过 <code>YTDLP_COOKIES_FILE</code><code>YTDLP_COOKIES_FROM_BROWSER</code> 提供登录态;生产云端使用服务器私有 cookies 文件只读挂载,失败后可对同一素材重新下载。</p></div>
<div class="step"><div class="num">03</div><h3>音频文案</h3><p><code>audio_script.source_text</code><code>transcript</code> 逐句时间轴有内容即通过。</p></div>
<div class="step"><div class="num">04</div><h3>抽帧参考</h3><p><code>job.frames.length &gt; 0</code> 即通过;参考帧只做主体重构证据。</p></div>
<div class="step"><div class="num">05</div><h3>相似主体</h3><p>关键帧里存在 <code>subject_assets</code> 即通过;生成类似创新主体,不复刻原人。</p></div>
@@ -952,7 +952,7 @@ ProductRefStateItem {
<tr><td>网页登录</td><td><code>POST /auth/login</code><code>GET /auth/check</code><code>POST /auth/logout</code></td><td><code>web/app/login/page.tsx</code>、Nginx <code>auth_request</code></td><td>登录页提交账号密码到 <code>/api/auth/login</code>,后端设置 HttpOnly 会话 Cookie生产 Nginx 对工作台和 <code>/api/</code><code>/auth/check</code> 做统一校验,未登录页面跳 <code>/login/</code>API 返回 JSON 401。</td></tr>
<tr><td>运行配置 / 模型标注</td><td><code>GET /health</code></td><td><code>getRuntimeHealth</code><code>ModelTrace</code></td><td>返回 <code>models</code>ASR、本机 ASR、ASR fallback、翻译、GPT 改写、GPT 画面理解、产品视角识别 <code>product_view</code>、GPT 图像模型、主体 6 视图 GPT 图像模型、Azure OpenAI TTS、视频别名和 Seedance 服务商。当前 <code>REWRITE_MODEL</code><code>AUDIO_REWRITE_MODEL</code><code>VISION_MODEL</code> 默认使用 <code>gpt-4o</code>;如果旧环境变量仍写 <code>gemini-*</code>,后端会归一化回 <code>GPT_TEXT_MODEL</code> / <code>REWRITE_MODEL</code>。语音只走 Azure OpenAI TTS<code>models.voice_tts_paths</code> 会回传当前尝试的语音路径,方便区分路径错误和语音服务不可用。前端所有当前主路径里会调用模型的按钮旁显示模型名,点击弹出小窗口查看模型链路和输入输出逻辑;不返回 API Key 或敏感凭证。</td></tr>
<tr><td>历史列表</td><td><code>GET /jobs</code></td><td><code>listJobs</code></td><td>所有 job 精简列表id/url/status/thumbnail/mtime…按 state.json mtime 倒序。前端 URL 无 <code>?job=</code> 时拉它回填全部历史;带 <code>limit</code> 可截断。</td></tr>
<tr><td>创建任务</td><td><code>POST /jobs</code></td><td><code>createJob</code></td><td>提交 TK 链接,后台开始下载;前端“开始”队列会在 downloaded 后自动触发音频解析。下载阶段优先使用 <code>YTDLP_COOKIES_FILE</code>,其次使用 <code>YTDLP_COOKIES_FROM_BROWSER</code>TikTok 要求登录态时会提示上传 MP4 或配置后端 cookies。</td></tr>
<tr><td>创建任务</td><td><code>POST /jobs</code></td><td><code>createJob</code></td><td>提交 TK 链接,后台开始下载;前端“开始”队列会在 downloaded 后自动触发音频解析。下载阶段优先使用 <code>YTDLP_COOKIES_FILE</code>,其次使用 <code>YTDLP_COOKIES_FROM_BROWSER</code>;生产云端固定走 <code>/run/secrets/tiktok_cookies.txt</code>,由宿主机 <code>./secrets/tiktok_cookies.txt</code> 只读挂载。TikTok 要求登录态时会提示上传 MP4 或配置后端 cookies。</td></tr>
<tr><td>重试下载</td><td><code>POST /jobs/{id}/download/retry</code></td><td><code>retryJobDownload</code></td><td>用于 TK 链接下载失败且没有 <code>video_url</code> 的素材;清空错误、重新进入下载状态,并在后台再次执行 <code>pipeline_download</code>。上传视频不能重下载,需要重新上传文件。</td></tr>
<tr><td>上传视频</td><td><code>POST /jobs/upload</code></td><td><code>uploadJob</code></td><td>保存 source.mp4然后同样进入下载完成状态当前上传后也加入第一步队列下载完成后自动解析音频。</td></tr>
<tr><td>删除输入视频</td><td><code>DELETE /jobs/{id}</code></td><td><code>deleteJob</code></td><td>从任务队列、URL 和磁盘 <code>jobs/&lt;id&gt;</code> 目录移除整个 job包括源视频、关键帧、元素提取图和生成视频。</td></tr>
@@ -1238,6 +1238,18 @@ ProductRefStateItem {
<p><strong>影响:</strong>只改变工作台视觉模式,不改变素材下载、音频解析、抽帧、主体模板、产品素材池、首尾帧或模型链路;<code>web/app/page.tsx</code> 同步移除旧全局浮动主题按钮,避免右下角出现第二套不相关的主题入口。后续新增图片/视频板块仍应复用同一套媒体悬停放大和删除逻辑。</p>
</div>
</article>
<article class="change">
<header>
<h3>2026-05-19 · 云端 TikTok cookies 文件挂载</h3>
<span class="tag violet">Deploy</span>
<span class="tag cyan">Ops</span>
</header>
<div class="body">
<p><strong>问题:</strong>生产环境没有桌面浏览器,不能依赖 <code>YTDLP_COOKIES_FROM_BROWSER</code> 读取本机 Chrome 登录态;受限 TikTok 链接仍会在云端返回“Log in for access”。</p>
<p><strong>改动:</strong><code>docker-compose.prod.yml</code> 将宿主机 <code>./secrets/tiktok_cookies.txt</code> 只读挂载到 API 容器 <code>/run/secrets/tiktok_cookies.txt</code><code>deploy/.env.production.example</code> 默认设置 <code>YTDLP_COOKIES_FILE=/run/secrets/tiktok_cookies.txt</code><code>.gitignore</code> 忽略 <code>secrets/</code>,避免 cookies 入库。</p>
<p><strong>影响:</strong>云端只需要维护一个服务器私有 cookies 文件配置后可对失败素材执行“重新下载”cookies 过期时更换该文件并重启 API 容器即可。</p>
</div>
</article>
<article class="change">
<header>
<h3>2026-05-18 · TK 受限视频支持 cookies 和失败重试</h3>