refactor: reorganize project by component
This commit is contained in:
+3
-3
@@ -127,9 +127,9 @@ gateway 的 runtime 清单、Profile 和日志目录不得由 `docker compose do
|
||||
代码检查:
|
||||
|
||||
```bash
|
||||
python3 -m unittest discover -s cmd/browser_gateway -t cmd -p 'test_*.py' -q
|
||||
python3 -m coverage run --source=cmd/browser_gateway --branch -m unittest discover -s cmd/browser_gateway -t cmd -p 'test_*.py' -q
|
||||
python3 -m coverage report --omit='cmd/browser_gateway/test_*.py' --fail-under=65
|
||||
python3 -m unittest discover -s browser_gateway -t . -p 'test_*.py' -q
|
||||
python3 -m coverage run --source=browser_gateway --branch -m unittest discover -s browser_gateway -t . -p 'test_*.py' -q
|
||||
python3 -m coverage report --omit='browser_gateway/test_*.py' --fail-under=65
|
||||
go test ./...
|
||||
go vet ./...
|
||||
go build ./cmd/control-plane
|
||||
|
||||
@@ -14,7 +14,7 @@ grep -Fq 'Compose 不再创建 gateway 服务' docs/deployment.md
|
||||
|
||||
# The install unit must remain a user service and must not run the gateway as root.
|
||||
grep -Fq 'EnvironmentFile=%h/.config/creatorhub/browser-gateway.env' deploy/creatorhub-browser-gateway.service.in
|
||||
grep -Fq 'cmd.browser_gateway.gateway' deploy/creatorhub-browser-gateway.service.in
|
||||
grep -Fq 'browser_gateway.server.http' deploy/creatorhub-browser-gateway.service.in
|
||||
! grep -Fq 'User=root' deploy/creatorhub-browser-gateway.service.in
|
||||
|
||||
echo 'native browser deployment documentation checks passed'
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
|
||||
### 1.2 核对来源与纠偏
|
||||
|
||||
主要来源:`web/src/main.jsx`、`web/src/dataProvider.js`、`web/src/*Page.jsx`、`web/src/Layout.jsx`、`web/src/lib/ui.jsx`;`cmd/control-plane/{main,hub,phasea,creator,creator_events,creator_material}.go`;`internal/creator/{models,accounts,actions,collection,content,metrics,rules,settings,bailian}.go`;`internal/hub/{environment,fingerprint}.go`;`internal/douyin/creator_collector.go`;`cmd/browser_gateway/{gateway,douyin,proxy,runtime}.py`;`compose.yaml`、`compose.dev.yaml`、`Dockerfile`、`deploy/`。
|
||||
主要来源:`web/src/app/main.jsx`、`web/src/shared/api/dataProvider.js`、`web/src/features/**/*.jsx`、`web/src/app/Layout.jsx`、`web/src/shared/ui/ui.jsx`;`internal/controlplane/{app,api,workers}/*.go`;`internal/creator/{models,accounts,actions,collection,content,metrics,rules,settings,bailian}.go`;`internal/environment/{environment,fingerprint}.go`;`internal/platform/douyin/creator_collector.go`;`browser_gateway/{server,http.py,platform,douyin.py,proxy.py,runtime.py}`;`compose.yaml`、`compose.dev.yaml`、`Dockerfile`、`deploy/`。
|
||||
|
||||
其他运行文档只作操作参考:其中“代理仅凭据引用”“仿写自动生成”“抖音仅首批读取”等旧表述不能覆盖当前路由和源码。当前出口表单/API 接收用户名与密码,列表/详情会明文展示;证据必须脱敏。仿写确认只保存要求与确认时间,**没有 AI 生成调用或按钮**。`decodeCreator` 直接读 JSON body,不依据 Content-Type 选择解码,故保存仿写缺 header 不等于已经证实失败。
|
||||
|
||||
|
||||
@@ -29,18 +29,18 @@
|
||||
|
||||
| 现有事实/入口 | 对本次变更的影响 |
|
||||
| --- | --- |
|
||||
| `internal/hub/store.go` 的 `Gateway` 保存名称、Endpoint;`Env` 保存 `Gateway`、`BrowserVersion` | 多机器注册与路由已存在,应复用,不新增第二套节点管理 |
|
||||
| `cmd/control-plane/hub.go` 的 `startBrowserRuntime`、`createGatewayRuntime`、`removeGatewayRuntime` 管理启停与清理 | 必须整体改造生命周期,不能仅替换 Python 中一个 Docker 调用 |
|
||||
| `internal/environment/store.go` 的 `Gateway` 保存名称、Endpoint;`Env` 保存 `Gateway`、`BrowserVersion` | 多机器注册与路由已存在,应复用,不新增第二套节点管理 |
|
||||
| `internal/controlplane/api/environments.go` 的 `startBrowserRuntime`、`createGatewayRuntime`、`removeGatewayRuntime` 管理启停与清理 | 必须整体改造生命周期,不能仅替换 Python 中一个 Docker 调用 |
|
||||
| `gatewayCreatePayload` 下发 `creatorhub-profile-{alias}` 卷名、指纹、代理和绑定版本 | 卷改成 gateway 管理的持久目录;控制面不能下发任意宿主机路径 |
|
||||
| `runtimeCleanupStore` 及启动前清理逻辑已有 cleanup-pending 概念 | 保留“未清理完成不能冒充已停止”的语义,改用本机资源身份,不再依赖容器/网络 ID |
|
||||
| 历史 `cmd/docker_gateway/gateway.py` 曾初始化 `DockerClient` 并读取 `DOCKER_SOCKET`、`BROWSER_NETWORK` | 已由 `cmd/browser_gateway/gateway.py` 的 native runtime 管理替换;当前浏览器入口不依赖 Docker。该行只保留迁移前事实 |
|
||||
| 历史 `cmd/docker_gateway/gateway.py` 曾初始化 `DockerClient` 并读取 `DOCKER_SOCKET`、`BROWSER_NETWORK` | 已由 `browser_gateway/server/http.py` 的 native runtime 管理替换;当前浏览器入口不依赖 Docker。该行只保留迁移前事实 |
|
||||
| 历史 `docker/browser-wrapper/docker-entrypoint.sh` 曾固定容器内 Xvfb/端口/Profile | 浏览器 wrapper 已从生产入口删除;native gateway 为每个 runtime 独立分配 display、端口和 Profile,历史行不构成当前能力证明 |
|
||||
| 历史 wrapper 曾传入 `--no-sandbox` | native gateway 拒绝该参数并以非 root 用户启动;无法满足 sandbox 时直接失败,不回退旧 wrapper |
|
||||
| `cmd/control-plane/creator.go` 的采集读取已有运行账号,没有按任务自动创建 runtime;`creator_events.go` 独立运行监听 | 需要新增任务使用权;现有 source lease 不是浏览器使用权,直接在采集末尾调用 stop 会误停共享会话 |
|
||||
| `creator.go` 的临时下载、`creator_material.go` 的 `audio.wav.tmp` 依赖正常退出删除;素材先写固定路径再提交数据库 token | 控制面本机也需要崩溃清理;旧执行可能覆盖新产物,必须先隔离执行目录与产物发布,不能只增加目录扫描 |
|
||||
| `internal/controlplane/api/creator.go` 的采集读取已有运行账号,没有按任务自动创建 runtime;`internal/controlplane/api/creator_events.go` 独立运行监听 | 需要新增任务使用权;现有 source lease 不是浏览器使用权,直接在采集末尾调用 stop 会误停共享会话 |
|
||||
| `internal/controlplane/api/creator.go` 的临时下载、`internal/controlplane/api/creator_material.go` 的 `audio.wav.tmp` 依赖正常退出删除;素材先写固定路径再提交数据库 token | 控制面本机也需要崩溃清理;旧执行可能覆盖新产物,必须先隔离执行目录与产物发布,不能只增加目录扫描 |
|
||||
| `internal/creator/source_lease.go` / `content.go` 的来源 lease 为固定十分钟;部分失败收尾仍使用已取消的 context | 长任务可能重复领取,取消后仍显示 running;资源使用权必须覆盖真实执行期并有独立收尾上下文 |
|
||||
| `internal/hub/store.go` 的 gateway endpoint 可更新,环境按 gateway 名称重新解析地址 | 不能把名称当稳定机器身份;原 owner 和待清理目标必须保留,禁止把仍有绑定资源的 gateway 改指另一机器 |
|
||||
| `internal/hub/store.go` 的 `Image`、前端镜像页、指纹/版本字段依赖 Docker 镜像语义 | 浏览器版本来源必须替换;只改界面名称会留下无效配置 |
|
||||
| `internal/environment/store.go` 的 gateway endpoint 可更新,环境按 gateway 名称重新解析地址 | 不能把名称当稳定机器身份;原 owner 和待清理目标必须保留,禁止把仍有绑定资源的 gateway 改指另一机器 |
|
||||
| `internal/environment/store.go` 的 `Image`、前端镜像页、指纹/版本字段依赖 Docker 镜像语义 | 浏览器版本来源必须替换;只改界面名称会留下无效配置 |
|
||||
| `scripts/dev-backend.mjs` / `compose*.yaml` 现在只保留 PostgreSQL(Compose)和 host-native gateway 注册 | 联调脚本和部署说明已同步;原生模式不启动 Docker browser gateway |
|
||||
| `requirements-gateway.lock` 当前锁定 `websocket-client` | 优先保留已有 CDP/WebSocket 与平台适配器,不因取消 Docker 就新增 Playwright/Patchright |
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ React → Go control-plane(账号/任务/绑定/业务结果/素材发布)
|
||||
|
||||
先写失败测试,再实现:
|
||||
|
||||
- 提取并保留现有与 Docker 无关的代理、CDP、页面动作;将 gateway 包和测试从 Docker 命名改为浏览器领域命名,建议目标路径 `cmd/browser_gateway/`。
|
||||
- 提取并保留现有与 Docker 无关的代理、CDP、页面动作;将 gateway 包和测试从 Docker 命名改为浏览器领域命名,建议目标路径 `browser_gateway/`。
|
||||
- 原生启动输入校验在创建目录/进程之前完成:节点、环境、代次、浏览器版本、Profile、代理绑定及必要资源容量。
|
||||
- 创建前落盘运行意图;用 runtime 专属 unit/临时目录启动 Xvfb 和浏览器,分配不冲突的 display 与端口。Profile 独占不能只靠控制面内存锁。
|
||||
- 默认不继承 `--no-sandbox`;浏览器与 gateway 以非 root 身份运行。具体 sandbox 模式由目标二进制/发行版证明。
|
||||
@@ -92,7 +92,7 @@ React → Go control-plane(账号/任务/绑定/业务结果/素材发布)
|
||||
先测试控制面与 gateway 的成功、校验、失败、冲突、响应丢失路径,再改:
|
||||
|
||||
- `hub.go` 的创建、启动、停止、状态核对和 cleanup-pending 改用 generation/owner;删除容器和网络代次依赖。
|
||||
- `internal/hub/store.go`、相关查询与 schema 改为原生版本/运行模型;开发数据库受控重建,不回填旧容器字段。
|
||||
- `internal/environment/store.go`、相关查询与 schema 改为原生版本/运行模型;开发数据库受控重建,不回填旧容器字段。
|
||||
- 继续复用既有多 gateway 登记、路由和心跳;核对稳定机器身份。节点 Endpoint 的更换不能改写既存 cleanup 的目的地。
|
||||
- 代理服务不再依赖 Docker IP/网络,仍保留代理绑定代次和失败可见性;从目标 gateway 的实际浏览器路径验证出口。
|
||||
- 登录二维码、账号身份快照、恢复事件订阅全部使用新 runtime 身份;不能随运行代次变化清空业务事件去重、基线和已占用 UID 冷却。先用确定性测试覆盖重启/重连、冷却内新事件、冷却到期旧事件及迟到事件不补发;真实平台按 C02/D04 验收。
|
||||
@@ -136,11 +136,11 @@ React → Go control-plane(账号/任务/绑定/业务结果/素材发布)
|
||||
|
||||
| 范围 | 主要定位 | 必须一起变化的内容 |
|
||||
| --- | --- | --- |
|
||||
| gateway 执行 | `cmd/browser_gateway/gateway.py`、`runtime.py`、`proxy.py`、CDP/平台模块及其测试 | 原生 runner、版本/端口/Profile、unit 生命周期、snapshot、代理恢复 |
|
||||
| 控制面 lifecycle | `cmd/control-plane/hub.go`、`main.go`、hub tests | generation、owner、清理/心跳、多 gateway 错误隔离 |
|
||||
| 采集与监听 | `creator.go`、`creator_events.go`、`internal/creator/source_lease.go`、`content.go` | 使用权、续租、独立收尾、事件边界与身份核对 |
|
||||
| 素材 | `creator_material.go`、`internal/creator/material.go`、素材测试 | 临时目录、不可变发布、token、崩溃清理 |
|
||||
| 数据模型 | `internal/hub/`、`internal/creator/` | 删除 Docker 字段,明确开发重建;业务结果与清理状态分离 |
|
||||
| gateway 执行 | `browser_gateway/server/http.py`、`runtime.py`、`proxy.py`、`browser/`、`platform/` 及其测试 | 原生 runner、版本/端口/Profile、unit 生命周期、snapshot、代理恢复 |
|
||||
| 控制面 lifecycle | `internal/controlplane/api/environments.go`、`internal/controlplane/app/app.go`、environment tests | generation、owner、清理/心跳、多 gateway 错误隔离 |
|
||||
| 采集与监听 | `internal/controlplane/api/creator.go`、`internal/controlplane/api/creator_events.go`、`internal/creator/source_lease.go`、`content.go` | 使用权、续租、独立收尾、事件边界与身份核对 |
|
||||
| 素材 | `internal/controlplane/api/creator_material.go`、`internal/creator/material.go`、素材测试 | 临时目录、不可变发布、token、崩溃清理 |
|
||||
| 数据模型 | `internal/environment/`、`internal/creator/` | 删除 Docker 字段,明确开发重建;业务结果与清理状态分离 |
|
||||
| 前端 | 现有 gateway/环境/镜像/任务相关组件及 data provider | 对应契约、失败/禁用交互;不重做导航和视觉体系 |
|
||||
| 部署/文档 | `scripts/`、`compose*.yaml`、Dockerfile、`deploy/`、README、`docs/` | 原生安装和联调;旧路径移除;手工验收地址 |
|
||||
|
||||
|
||||
@@ -54,10 +54,10 @@ go tool cover -func=/tmp/creatorhub-go.cover
|
||||
```bash
|
||||
python3 -m venv .venv-gateway
|
||||
.venv-gateway/bin/python -m pip install -r requirements-gateway-dev.lock
|
||||
.venv-gateway/bin/python -m unittest discover -s cmd/browser_gateway -t cmd -p 'test_*.py'
|
||||
.venv-gateway/bin/python -m unittest discover -s browser_gateway -t . -p 'test_*.py'
|
||||
.venv-gateway/bin/python -m coverage erase
|
||||
.venv-gateway/bin/python -m coverage run --source=cmd/browser_gateway --branch \
|
||||
-m unittest discover -s cmd/browser_gateway -t cmd -p 'test_*.py'
|
||||
.venv-gateway/bin/python -m coverage run --source=browser_gateway --branch \
|
||||
-m unittest discover -s browser_gateway -t . -p 'test_*.py'
|
||||
.venv-gateway/bin/python -m coverage report --omit='*/test_*.py' --fail-under=65
|
||||
```
|
||||
|
||||
|
||||
+8
-8
@@ -41,14 +41,14 @@
|
||||
|
||||
| 范围 | 已有基础 | 本需求需要补齐或改变 | 代码依据 |
|
||||
| --- | --- | --- | --- |
|
||||
| 页面入口 | 账号、任务、审计、环境、代理、镜像、网关等页面 | 竞品池、作品、素材仿写、评论线索、响应策略、私信会话尚无完整入口 | [页面路由](../web/src/main.jsx) |
|
||||
| 账号 | 平台账号 ID、标签、Cookie、暂停/恢复等 | 实名资料、登录用户名/密码、备注、人工业务状态、人工登录与大小号关系 | [账号页面](../web/src/AccountsPage.jsx)、[账号存储](../internal/phasea/store.go)、[账号接口](../cmd/control-plane/phasea.go) |
|
||||
| 平台范围 | 登记项还包含公众号、快手 | 新业务仅承诺抖音、小红书;其他登记项不是业务能力验收结果,也不因此要求删除无关已有功能 | [账号页面](../web/src/AccountsPage.jsx) |
|
||||
| 作品读取 | 有抖音连接器、指标字段与测试 | 连接器只核验登录者自身、读取首批 20 条,未接成运行中的竞品采集链路;需目标账号解析、分页、保存、查询和定时更新 | [抖音连接器](../internal/douyin/connector.go)、[连接器测试](../internal/douyin/connector_test.go)、[网关读取限制](../cmd/browser_gateway/douyin.py) |
|
||||
| 指纹与环境 | 结构化指纹、独立 Profile、启动/停止/升级及代理接入 | 默认固定 seed 不是自动分配;需首次自动生成、地区匹配及稳定性验证 | [环境页面](../web/src/BrowsersPage.jsx)、[指纹参数](../internal/hub/fingerprint.go)、[环境存储](../internal/hub/environment.go) |
|
||||
| 代理 | 添加、列表、手动检测、停用、实际转发 | 补齐编辑、删除、重新启用及引用约束;不增加自动轮换 | [代理页面](../web/src/NetworkExitsPage.jsx)、[代理转发](../cmd/browser_gateway/proxy.py) |
|
||||
| 任务与发送 | 有草稿确认、任务记录、Mock 执行 | 不能作为真实回复、私信、点赞、关注、转发成功的证据;需接通实际平台执行及结果核验 | [任务页面](../web/src/TasksPage.jsx)、[任务接口](../cmd/control-plane/phasea.go) |
|
||||
| 事件、线索、私信、AI | 未发现完整可运行链路 | 均需新增业务能力,不能把旧文档、类型定义或模拟返回记为已实现 | [页面路由](../web/src/main.jsx)、[抖音连接器](../internal/douyin/connector.go) |
|
||||
| 页面入口 | 账号、任务、审计、环境、代理、镜像、网关等页面 | 竞品池、作品、素材仿写、评论线索、响应策略、私信会话尚无完整入口 | [页面路由](../web/src/app/main.jsx) |
|
||||
| 账号 | 平台账号 ID、标签、Cookie、暂停/恢复等 | 实名资料、登录用户名/密码、备注、人工业务状态、人工登录与大小号关系 | [账号页面](../web/src/features/accounts/AccountsPage.jsx)、[账号存储](../internal/account/store.go)、[账号接口](../internal/controlplane/api/accounts_operations.go) |
|
||||
| 平台范围 | 登记项还包含公众号、快手 | 新业务仅承诺抖音、小红书;其他登记项不是业务能力验收结果,也不因此要求删除无关已有功能 | [账号页面](../web/src/features/accounts/AccountsPage.jsx) |
|
||||
| 作品读取 | 有抖音连接器、指标字段与测试 | 连接器只核验登录者自身、读取首批 20 条,未接成运行中的竞品采集链路;需目标账号解析、分页、保存、查询和定时更新 | [抖音连接器](../internal/platform/douyin/connector.go)、[连接器测试](../internal/platform/douyin/connector_test.go)、[网关读取限制](../browser_gateway/platform/douyin.py) |
|
||||
| 指纹与环境 | 结构化指纹、独立 Profile、启动/停止/升级及代理接入 | 默认固定 seed 不是自动分配;需首次自动生成、地区匹配及稳定性验证 | [环境页面](../web/src/features/environments/BrowsersPage.jsx)、[指纹参数](../internal/environment/fingerprint.go)、[环境存储](../internal/environment/environment.go) |
|
||||
| 代理 | 添加、列表、手动检测、停用、实际转发 | 补齐编辑、删除、重新启用及引用约束;不增加自动轮换 | [代理页面](../web/src/features/environments/NetworkExitsPage.jsx)、[代理转发](../browser_gateway/proxy.py) |
|
||||
| 任务与发送 | 有草稿确认、任务记录、Mock 执行 | 不能作为真实回复、私信、点赞、关注、转发成功的证据;需接通实际平台执行及结果核验 | [任务页面](../web/src/features/operations/TasksPage.jsx)、[任务接口](../internal/controlplane/api/accounts_operations.go) |
|
||||
| 事件、线索、私信、AI | 未发现完整可运行链路 | 均需新增业务能力,不能把旧文档、类型定义或模拟返回记为已实现 | [页面路由](../web/src/app/main.jsx)、[抖音连接器](../internal/platform/douyin/connector.go) |
|
||||
|
||||
### 2.1 已确认的冲突裁决
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Python 网关分支审查与修正清单
|
||||
|
||||
日期:2026-09-13。状态:**历史分支审查已完成;本文保留迁移前 `cmd/docker_gateway`、Docker wrapper 和容器生命周期路径作为问题证据,不是当前生产入口。当前入口与状态以 `cmd/browser_gateway`、部署说明和 native 验证记录为准。**
|
||||
日期:2026-09-13。状态:**历史分支审查已完成;本文保留迁移前 `cmd/docker_gateway`、Docker wrapper 和容器生命周期路径作为问题证据,不是当前生产入口。当前入口与状态以 `browser_gateway`、部署说明和 native 验证记录为准。**
|
||||
|
||||
## 1. 范围、结论与证据边界
|
||||
|
||||
|
||||
@@ -185,7 +185,7 @@ CreatorHub 不应承诺“稳定”“不封号”或“无法识别”,也不
|
||||
|
||||
| 吸收项 | CreatorHub 落点 | 具体要求 |
|
||||
| --- | --- | --- |
|
||||
| 平台适配器与业务逻辑分离 | 新增小红书适配时沿用 `internal/douyin` 的边界,业务层不直接拼平台请求 | 读取、登录、媒体、动作、事件各自有清晰接口;不把上游 Python SDK 直接嵌进控制面 |
|
||||
| 平台适配器与业务逻辑分离 | 新增小红书适配时沿用 `internal/platform/douyin` 的边界,业务层不直接拼平台请求 | 读取、登录、媒体、动作、事件各自有清晰接口;不把上游 Python SDK 直接嵌进控制面 |
|
||||
| 原始响应 + 标准字段 | `internal/creator` 的 Work/Comment/Material 数据 | 保存原始平台 payload、来源链接、采集时间和标准化结果;字段变化先保原文再调整解析 |
|
||||
| `xsec_token`/`xsec_source` 端到端保留 | 作品来源/平台适配输入模型 | 详情链接、搜索结果和后续详情请求不得丢失访问上下文;没有 token 时不得猜测或拼造 |
|
||||
| 评论父子关系 | Comment 入库字段扩展时保留 `parent_comment_id` | 当前业务先采一级评论,平台返回子评论时不丢弃层级;不要把昵称当用户 ID |
|
||||
@@ -230,7 +230,7 @@ CreatorHub 不应承诺“稳定”“不封号”或“无法识别”,也不
|
||||
- `internal/creator/actions.go`:已有事件永久去重、策略顺序、同 UID 冷却,以及 AI 失败/结果不明不补发。
|
||||
- `cmd/control-plane/creator.go`:已有写操作前身份核对、目标映射和结果证据保存。
|
||||
- `cmd/control-plane/creator_material.go`:已有人工选取、原子媒体文件、大小/HTML 校验、ffprobe/ffmpeg 和显式转写失败步骤。
|
||||
- `cmd/control-plane/creator_events.go` 与 `cmd/browser_gateway/douyin.py`:已有监听代际、baseline、gap、断连恢复、delivery ACK/retry 的抖音实现;小红书不能直接沿用为已验证能力。
|
||||
- `cmd/control-plane/creator_events.go` 与 `browser_gateway/platform/douyin.py`:已有监听代际、baseline、gap、断连恢复、delivery ACK/retry 的抖音实现;小红书不能直接沿用为已验证能力。
|
||||
- `docs/plan01.md`:已明确先抖音后小红书、逐平台真实验收,以及读取/写入/事件的成功、失败、不明边界。
|
||||
|
||||
### 5.2 当前小红书缺口
|
||||
|
||||
Reference in New Issue
Block a user