diff --git a/.memory/worklog.json b/.memory/worklog.json
index 3b3aba8..0d8a2f5 100644
--- a/.memory/worklog.json
+++ b/.memory/worklog.json
@@ -1,23 +1,5 @@
{
"entries": [
- {
- "files_changed": 1,
- "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-20 14:23 (+1, ~1)",
- "ts": "2026-05-20T06:23:58Z",
- "type": "session-heartbeat"
- },
- {
- "files_changed": 1,
- "message": "Claude 会话活跃 · 最近命令:claude · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-20 14:23 (+1, ~1)",
- "ts": "2026-05-20T06:33:39Z",
- "type": "session-heartbeat"
- },
- {
- "files_changed": 1,
- "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-20 14:23 (+1, ~1)",
- "ts": "2026-05-20T06:33:58Z",
- "type": "session-heartbeat"
- },
{
"files_changed": 1,
"message": "Claude 会话结束 · 持续 0 秒 · 最近命令:claude · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-20 14:23 (+1, ~1)",
@@ -3205,6 +3187,25 @@
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-26 08:38 (~6)",
"files_changed": 1
+ },
+ {
+ "ts": "2026-05-26T08:40:41+08:00",
+ "type": "commit",
+ "message": "chore: disable password login in production",
+ "hash": "8aeeee6",
+ "files_changed": 3
+ },
+ {
+ "ts": "2026-05-26T00:49:34Z",
+ "type": "session-heartbeat",
+ "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: disable password login in production",
+ "files_changed": 1
+ },
+ {
+ "ts": "2026-05-26T00:59:34Z",
+ "type": "session-heartbeat",
+ "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: disable password login in production",
+ "files_changed": 1
}
]
}
diff --git a/RULES.md b/RULES.md
index 716cc88..6dc9ecf 100644
--- a/RULES.md
+++ b/RULES.md
@@ -22,6 +22,7 @@
- 生产配置验证(2026-05-25 23:49 CST):已在服务器 `/opt/skg-marketing-studio/deploy/.env.production` 补齐飞书 OAuth 应用配置,并仅重建 `skg-marketing-api` 使环境变量生效;敏感 App Secret 不入库。验证结果:`https://marketing.skg.com/api/auth/config` 返回 `feishu_enabled=true`、`password_enabled=true`、`data_isolation_enabled=true`;`GET https://marketing.skg.com/api/auth/feishu/start?next=/` 返回 302 跳转到飞书授权页;容器内 `/health` 返回 `auth_modes.feishu=True`。
- 最近部署验证(2026-05-26):`c9d8fa7` 对应 Postgres 持久化代码已通过 `./scripts/deploy-prod-safe.sh` 部署到 `/opt/skg-marketing-studio`。生产新增 `skg-marketing-postgres` 容器,数据库持久化在服务器 `./data/postgres`,`DATABASE_URL` / `POSTGRES_PASSWORD` 只写服务器 `deploy/.env.production`。部署前脚本备份生产私有环境、任务数据、资源库和 secrets 到 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260525225145.tgz`;生产 Docker 重建后脚本内验证通过(web/API/Postgres 容器 Up、Postgres healthy、`/` 302、`/login/` 200、缺失 `_next` 资源 404、未登录 `/api/health` 401、容器内 `api:health ok db connected`、`api:ytdlp_cookie_args []`)。文档/元数据同步后又执行 `./scripts/deploy-prod-safe.sh --no-build`,实际走过 Postgres `pg_dump` 备份路径并生成 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260525230444.tgz`,复验同样通过。补验:容器内 `/health` 返回 `database.enabled=true`、`database.connected=true`,`/api/auth/config` 返回 `feishu_enabled=true`、`password_enabled=true`、`data_isolation_enabled=true`;画布项目 API 可创建、读取、软删除记录;数据库索引计数为 users=1、jobs=26、assets=129、canvas_active=0、canvas_deleted=1、audit=2。
- 生产登录收口(2026-05-26):已在服务器 `/opt/skg-marketing-studio/deploy/.env.production` 设置 `PASSWORD_AUTH_ENABLED=false` 并通过 `./scripts/deploy-prod-safe.sh` 重建生产。部署前脚本备份到 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260526003816.tgz`;脚本内首次验证在容器启动 3 秒时遇到根路径临时 500,随后复跑 `./scripts/verify-prod-docker.sh root@76.13.31.179` 通过(web/API/Postgres Up、`/` 302、`/login/` 200、未登录 `/api/health` 401、`api:health ok db connected`)。公网复验:`/api/auth/config` 返回 `password_enabled=false`、`feishu_enabled=true`、`data_isolation_enabled=true`;`GET /api/auth/feishu/start?next=/` 返回 302 到飞书授权页;`POST /api/auth/login` 返回 503 `账号密码登录未配置`。
+- 旧密码账号归属迁移(2026-05-26):已把旧共享密码账号 `password:skg` 下的 22 个 job、3 个画布项目和对应生成资产索引迁到飞书用户 `万康`(`feishu:ou_78276b4fd9dd818d8f70bc00d03ddbdf`)。迁移前已备份数据库和 `data/jobs` 到 `/opt/skg-marketing-studio-backups/skg-marketing-owner-migration-20260526010622.sql.gz` 与 `/opt/skg-marketing-studio-backups/skg-marketing-owner-migration-jobs-20260526010622.tgz`。复验:`job_index` 中该飞书用户 24 个 job,`canvas_projects` 中该飞书用户 3 个未删除私有画布,生成资产索引为 image completed=11、video completed=11、video failed=1;无 owner 的 4 个更早旧 job 保持未迁移,后续再确认归属。
- 最近部署验证(2026-05-25):`cce9779` 已通过 `./scripts/deploy-prod-safe.sh` 部署到 `/opt/skg-marketing-studio`,恢复 `chatfire-AI/huobao-canvas` 上游画布能力但保留 SKG 后端 `/api` 接入。部署前脚本已备份生产私有环境、任务数据、资源库和 secrets 到 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260525102857.tgz`;生产 Docker 重建后脚本内验证通过(web/API 容器 Up、`/` 302、`/login/` 200、缺失 `_next` 资源 404、未登录 `/api/health` 401、容器内 `api:health ok`、`api:ytdlp_cookie_args []`、未发现本地 API/dev URL 泄漏)。补验:外部访问 `https://marketing.skg.com/` 未登录返回 302 到 `/login/?next=/`,`https://marketing.skg.com/canvas/` 返回 308 到 `/`,`https://marketing.skg.com/p/test` 未登录返回 302 到 `/login/?next=/p/test`;容器内静态 bundle 命中 `AI 润色 / 自动执行 / 推荐: / 首帧 / 尾帧 / 多角度分镜 / 儿童绘本 / 工作流模板 / 批量下载素材`,未命中上游注册链接、火宝欢迎文案、GitHub 入口或 `/huobao-canvas`。
- 最近部署验证(2026-05-25):`e767d2b` 已通过 `./scripts/deploy-prod-safe.sh` 部署到 `/opt/skg-marketing-studio`,生产根域名改为直接进入个人生成画布,`/canvas/` 仅作为旧链接 308 跳转到 `/`。部署前脚本已备份生产私有环境、任务数据、资源库和 secrets 到 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260525095839.tgz`;生产 Docker 重建后脚本内验证通过(web/API 容器 Up、`/` 302、`/login/` 200、缺失 `_next` 资源 404、未登录 `/api/health` 401、容器内 `api:health ok`、`api:ytdlp_cookie_args []`、未发现本地 API/dev URL 泄漏)。补验:容器内 `/usr/share/nginx/html/index.html` 为 Vue 画布产物,引用 `/assets/index-CioZwOvT.js` 且 title 为 `SKG`;静态 bundle 命中 `文生图 / 文生视频 / 图生视频`,未命中 `首帧生视频 / 首尾帧生视频 / 上传首帧 / 上传尾帧 / 推荐:`;外部访问 `https://marketing.skg.com/` 未登录返回 302 到 `/login/?next=/`,`https://marketing.skg.com/canvas/` 返回 308 到 `/`,`/p/test` 未登录返回 302 到 `/login/?next=/p/test`。
- 最近部署验证(2026-05-25):`2a1ceee` 已通过 `./scripts/deploy-prod-safe.sh` 部署到 `/opt/skg-marketing-studio`,可见品牌位从文字命名收敛为 logo-only:首页、登录页和画布首页只显示 SKG logo,网页 title 和画布 title 为 `SKG`,首页入口按钮文案为“画布”。部署前脚本已备份生产私有环境、任务数据、资源库和 secrets 到 `/opt/skg-marketing-studio-backups/skg-marketing-preserve-20260525092749.tgz`;生产 Docker 重建后脚本内验证通过(web/API 容器 Up、`/` 302、`/login/` 200、缺失 `_next` 资源 404、未登录 `/api/health` 401、容器内 `api:health ok`、`api:ytdlp_cookie_args []`、未发现本地 API/dev URL 泄漏)。容器内静态产物复验:`index.html` 包含 `
SKG` 和 `/skg-logo-black.svg`,首页入口包含“画布”,登录页只保留 logo;当前 `_next` 与 `/canvas` 产物未再命中 `SKG 生图生视频`、`SKG 生成画布`、`营销内容生产平台` 或 `内容生产画布` 等旧可见文案。
diff --git a/docs/source-analysis.html b/docs/source-analysis.html
index 6bb4f27..945c697 100644
--- a/docs/source-analysis.html
+++ b/docs/source-analysis.html
@@ -1254,6 +1254,18 @@ ProductRefStateItem {
影响:新成员只能通过飞书登录,后续新建任务和画布都会绑定真实飞书 owner。旧 password:skg 数据不会自动归属到任何飞书用户,后续应通过公司可见/认领/管理员迁移处理。
+
+
+ 2026-05-26 · 旧密码账号内容迁到飞书账号
+ Data
+ Ops
+
+
+
问题:密码登录停用后,旧共享账号 password:skg 下的视频和画布不会自动出现在飞书账号里,用户会误以为之前生成的视频丢失。
+
改动:在生产服务器先备份 Postgres 和 data/jobs,再把 password:skg 的 22 个 job、3 个画布项目和对应生成资产索引迁到飞书用户 万康(feishu:ou_78276b4fd9dd818d8f70bc00d03ddbdf)。job 的 state.json 也同步改写 owner 字段,并重启 API 让内存态重新加载。
+
影响:万康飞书登录后应能看到旧密码账号下的历史视频和画布;无 owner 的 4 个更早旧 job 保持不动,避免把来源不明确的内容误归属。
+
+
2026-05-26 · 接入 Postgres 做公司内部沉淀