构建统一完整镜像,不再构建 tencent-realtime-control 独立镜像:
set -e
REGISTRY="registry.cn-hangzhou.aliyuncs.com/stuuudy"
IMAGE="${REGISTRY}/ad-put-agent"
cd "${WORKSPACE}"
docker build \
-f Dockerfile.auto_put_ad_mini \
-t "${IMAGE}:latest" \
-t "${IMAGE}:${BUILD_TIMESTAMP}" \
.
docker push "${IMAGE}:latest"
docker push "${IMAGE}:${BUILD_TIMESTAMP}"
ssh -i /root/.ssh/piaoquan.pem root@8.222.142.37 \
"sh /home/sh/deploy.sh ${BUILD_TIMESTAMP}"
将仓库中的 docker-compose.yml 放到 /home/server/docker-compose.yml。
当前部署兼容 ECS 已安装的 Docker Compose 2.27.0。
两个服务共用现有的 /home/server/.env:
chmod 600 /home/server/.env
docker compose version
原有数据库、ODPS、腾讯、飞书、OSS 和 AI 环境变量全部保留。
首次部署增加:
RTC_START_HOUR=12
RTC_STOP_HOUR=21
RTC_POLL_SECONDS=600
RTC_HIGH_CPM=250
RTC_LOW_CPM=190
RTC_BID_UP_RATIO=1.05
RTC_MAX_PARTITION_LAG_HOURS=2
RTC_APPLY_ENABLED=0
RTC_COMMAND_ENABLED=1
RTC_COMMAND_CHAT_ID=oc_xxx
RTC_COMMAND_ALLOWED_OPEN_IDS=ou_xxx
RTC_COMMAND_CONFIRM_TTL_MINUTES=10
RTC_COMMAND_NEXT_DELIVERY_HOUR=6
RTC_COMMAND_DRAFT_TTL_MINUTES=5
RTC_NL_COMMAND_ENABLED=0
RTC_COMMAND_LLM_MODEL=google/gemini-3-flash-preview
RTC_COMMAND_LLM_TIMEOUT_SECONDS=20
RTC_COMMAND_LLM_CONFIDENCE_THRESHOLD=0.85
OPEN_ROUTER_API_KEY=sk-or-v1-xxx
DAILY_CREATION_ENABLED=0
DAILY_CREATION_HOUR=10
DAILY_CREATION_MINUTE=30
DAILY_REVIEW_ENABLED=0
DAILY_REVIEW_INTERVAL_HOURS=2
DAILY_RUN_ON_STARTUP=0
DAILY_REVIEW_RUN_ON_STARTUP=0
DAILY_SYNC_DELIVERY_TEMPLATE=0
DAILY_ROI_ENABLED=0
DAILY_ROI_HOUR=9
DAILY_ROI_MINUTE=0
DAILY_ROI_RUN_ON_STARTUP=0
ROI_INTERNAL_TEST_ENABLED=0
ROI_INTERNAL_TEST_HOUR=15
ROI_INTERNAL_TEST_MINUTE=30
ROI_INTERNAL_TEST_DEDUP_ENABLED=1
ROI_FAILURE_FEISHU_CHAT_ID=
ROI_APPLY_ENABLED=0
ROI_SHEET_APPROVAL_ENABLED=0
ROI_SHEET_APPROVAL_POLL_SECONDS=60
ROI_APPROVAL_TTL_MINUTES=120
ROI_SCALE_RATIO=1.10
ROI_SCALE_COOLDOWN_DAYS=3
ROI_MAX_BASE_RATIO=2.00
ROI_FISSION_PARAMETER_VERSION=20260712_A0-A15_v2
ROI_FEISHU_CHAT_ID=oc_xxx
ROI_AGENCY_WEBHOOK_ENABLED=0
ROI_AGENCY_WEBHOOKS_JSON={}
多个操作人使用英文逗号分隔 RTC_COMMAND_ALLOWED_OPEN_IDS。
代码默认 RTC_APPLY_ENABLED=0,日级创建、审核扫描、ROI 和模板同步也默认关闭;
缺少显式生产配置时不会创建广告或修改腾讯。
/home/sh/deploy.sh 使用:
#!/bin/bash
set -e
echo "Qingqu@2019" |
docker login \
--username=stuuudys \
registry.cn-hangzhou.aliyuncs.com \
--password-stdin
VERSION=${1:-latest}
cd /home/server
VERSION=${VERSION} docker compose --env-file /dev/null pull
VERSION=${VERSION} docker compose --env-file /dev/null down --remove-orphans
VERSION=${VERSION} docker compose --env-file /dev/null up -d
VERSION=${VERSION} docker compose --env-file /dev/null ps
继续沿用部署脚本中的 source /home/server/.env,Compose 同时通过标准
env_file 将同一个文件传给两个容器,环境变量文件和加载入口不变。
保持 RTC_APPLY_ENABLED=0 和两个 DAILY_*_ENABLED=0:
cd /home/server
docker compose --env-file /dev/null config --services
docker compose --env-file /dev/null up -d
docker compose --env-file /dev/null ps
docker compose --env-file /dev/null logs --tail=200 ad_control_service
docker compose --env-file /dev/null logs --tail=200 ad_daily_service
控制服务启动时自动执行实时状态表增量迁移。也可以显式验证:
docker compose --env-file /dev/null run --rm \
ad_control_service \
python /app/examples/tencent_realtime_control/init_db.py
执行无腾讯写入的 CPM dry-run:
docker compose --env-file /dev/null run --rm \
ad_control_service \
python /app/examples/tencent_realtime_control/run_once.py \
--at 2026-07-25T12:00:00 \
--cpm-override 220 \
--force-refresh
飞书验证:
查看暂停状态。查询今天自动化账户消耗,确认返回腾讯实时汇总且不要求审批。cmd_xxx。auto_put_ad_mini/server.py 和旧实时容器不再运行。RTC_APPLY_ENABLED=1,保持日级创建和 ROI 服务关闭。docker compose up -d,观察一个完整实时周期。DAILY_REVIEW_ENABLED=1、DAILY_SYNC_DELIVERY_TEMPLATE=1。DAILY_CREATION_ENABLED=1。DAILY_RUN_ON_STARTUP=0,防止部署时额外触发完整创建。日级 ROI 单独分两阶段启用:
当前 north_star_roi_t15_v8 使用版本化传播裂变参数,策略版本为 roi_policy_v12,报表版本为 roi_report_v36。T0 裂变人数取 SUM(t0_fission_uv_root),不再读取旧字段 t0裂变人数。小程序按人群包和转化目标、
公众号按合作方和公众号匹配传播裂变系数;企微暂不进入本版报表、阈值和调控。首层效率收入读取 效率收入,T0 实际裂变收入读取当天的 裂变效率收入,
并以 T0 实际裂变收入乘传播裂变系数预测完整裂变收入。日级任务不会现场重算 cohort 参数。部署前应保持
ROI_FISSION_PARAMETER_VERSION=20260712_A0-A15_v2。参数必须先发布到 MySQL,
启动日志、数据库发布版本和 Excel 摘要中的参数版本、cohort 日期必须一致。
ROI 在线表只上传一次,并发送到 ROI_FEISHU_CHAT_ID 和
FEISHU_OPERATOR_CHAT_ID;两个变量相同时只发送一次。
ROI 表格使用获得链接者可编辑权限。默认隐藏的黄色【审批选择】列取消隐藏后只接受“批准”或“拒绝”,
数据库隐藏幂等键决定真实执行目标,表格中的账户、广告、创意、成本和 ROI 不作为写入参数。
审批表包含小程序创意级、小程序广告级和公众号的三日汇总与每日明细共 6 个主 Sheet,广告级两个 Sheet 默认隐藏。
金额、UV 和人数展示三日总量/3,ROI 和裂变率使用三日汇总后的加权口径。连续三天每天
首层 UV>200、成本>0 且 ROI 有效的小程序创意和公众号实体合并后按实体等权计算整体 P20;
广告级直接从 ODPS 原始数据按广告去重,复用 P20 但不进入样本池;低于关停线且广告 age>3 天时生成广告级关停建议,批准后暂停整个广告。
未进入三日正式样本的小程序创意增加单日补充判断:最新日首层 UV>200 且预测总效率 ROI≤0.20,或最新日首层 UV>500 且预测总效率 ROI≤全部最新日 UV>500 小程序创意的实体等权 P30;命中且广告 age>3 天时建议关停,age≤3 天时观察。动作原因必须明确启用单日规则的前提,并同时展示最新日预测 ROI 与仅供参考的三日预测 ROI,避免把三日值误认为单日判断值。其余最新日首层 UV>200 但未满足三日条件的实体继续作为“观察”放在正式样本之后,不进入三日阈值。
可见尾部列按“当日效率ROI → 预测总效率ROI → 关停线(P20) → 扩量线(P80) → 建议动作 → 建议说明”排列;小程序创意级、广告级可见关停动作分别显示为“关停创意”“关停广告”,底层仍保存统一动作值供执行器消费。创意关停按三日P20、单日硬线、单日P30三类建议说明分组排序,同类内部按 ROI 升序。公众号不参与扩量,扩量线留空。底层无动作的正式中间区间在报表中显示为“观察”并说明当前无需关停或扩量,但不生成可执行动作。
整体三日排名百分位、是否位于后20%、最新日UV、覆盖天数、阈值样本状态和执行结果只保留为隐藏审计字段;底层动作原因通过“建议说明”展示。
每日明细 Sheet 的 dt 位于第一列并按日期倒序。主 Sheet 冻结首行和前 7 列,
关停线列为“关停线(P20)”。所有小程序创意级和广告级关停统一要求广告 age>3 天。汇总表将三日总 T0 裂变人数 / 三日总首层 UV 的加权比例展示为“日均T0裂变率”。合格小程序创意实体等权 P80 为扩量线,处于头部20%且广告 age≥3 时生成扩量建议。汇总顺序为关停、扩量、中间观察、条件不足观察;第一条扩量行和扩量后第一条观察行顶部均使用粗线分隔。“当日效率ROI”和“预测总效率ROI”均使用深红—黄—绿色阶,绿色代表表现好。普通数值显示两位小数,UV、人数、数量和广告年龄显示整数;两个“裂变系数-总裂变UV/…”比率列固定显示两位小数。“传播裂变系数匹配”保留审计数据但默认隐藏。
创意级“当前创意状态”只对关停建议只读腾讯状态并显示正常、已停止或读取失败,其他行留空;“审批选择”默认隐藏。
完整主报表写入成功后,服务额外按“小程序投流”渠道的“代理名称”生成一代理一份 roi_agency_advice_v7 工作簿,文件名为 YYYYMMDD_代理名称_调控建议.xlsx。代理版可见 Sheet 名为“小程序创意调控建议”,并保留默认隐藏的“小程序广告级三日汇总”,不包含每日明细;包名、广告age、日均首层UV、建议说明、收入、预测总效率ROI、阈值、排名、两个裂变系数、日均T0裂变人数/率、审批和执行审计列均物理删除。内部“当日效率ROI”仅以两位小数的“评分”列对外展示,不参与代理动作计算;建议动作仍按预测总效率ROI生成,并明确显示“关停创意”或“关停广告”。代理表生成不改变主报表、数据库快照或主审批链接。
正式任务每天北京时间09:00执行。任务固定以T-1为结束日,并在创建MySQL运行批次、生成报表和发送飞书前校验 loghubods.opengid_base_data 的精确T-1分区;小程序投流或公众号投流相关数据任一为空即失败关闭,禁止静默回退到更早分区。
总表继续由飞书应用按 ROI_FEISHU_CHAT_ID / FEISHU_OPERATOR_CHAT_ID 发布。代理表发布由 ROI_AGENCY_WEBHOOK_ENABLED 独立控制,完整机器人地址仅允许保存在密钥系统或真实 .env 的 ROI_AGENCY_WEBHOOKS_JSON,JSON key 使用代理简称。飞书应用先上传并开放在线表链接,再由对应代理机器人发送可点击卡片;未配置代理记录为跳过,不回退到总群。同一 run_id + 代理 + 代理报表版本 幂等审计,已上传表格在通知重试时复用,避免重复建表。机器人地址只保存哈希指纹,不能写入数据库或日志。
ROI_INTERNAL_TEST_ENABLED=1 时,服务每天北京时间15:30注册独立内部任务。该任务复算后使用空管理账户集合,不生成可审批腾讯动作,只把“自动化投放”分表发送到 ROI_AGENCY_WEBHOOKS_JSON 的“内部”路由,不发送完整主表、正式总群或代理群;缺少该分表时任务失败并告警。它不注册startup任务,服务重启不会主动补发。正式任务始终去重;内部测试由 ROI_INTERNAL_TEST_DEDUP_ENABLED 控制,生产默认1,测试环境显式设为0时每次触发生成独立测试run并重新发送。
09:00正式任务或15:30内部测试的子进程启动失败或非零退出时,调度服务通过飞书应用向 ROI_FAILURE_FEISHU_CHAT_ID 发送红色失败告警;该变量为空时回退 FEISHU_OPERATOR_CHAT_ID。失败告警本身发送失败只记录错误日志,不会吞掉或替换原任务异常。
DAILY_ROI_ENABLED=1、ROI_APPLY_ENABLED=0、ROI_SHEET_APPROVAL_ENABLED=0,观察09:00的T-1来源校验、ODPS计算、数据库快照和可编辑飞书表。ROI_APPLY_ENABLED=1、ROI_SHEET_APPROVAL_ENABLED=1,重建 ad-control-service;批准一条低风险测试行,核对腾讯回读、表格结果和群通知。DAILY_ROI_ENABLED=0、ROI_APPLY_ENABLED=1,也不允许仅开启表格审批而关闭 ROI 写操作;服务启动阶段会拒绝不完整配置。首次启用前可手工运行一个“不发飞书、不写腾讯”的计算批次。该命令会读取 ODPS、 初始化/写入 ROI 数据库快照并在挂载目录生成本地 Excel:
docker compose run --rm ad_daily_service \
python /app/examples/auto_put_ad_mini/run_daily_roi.py \
--end-date 20260725
确认数据库快照和本地报告后,再增加 --send-feishu 验证在线表、黄色审批列和链接编辑权限。
此时必须保持 ROI_APPLY_ENABLED=0、ROI_SHEET_APPROVAL_ENABLED=0,不会轮询或执行表格选择。
如果同一日期窗口的上游历史数据被修订,必须提供稳定的数据修订标识生成新批次,不能覆盖或删除已发布快照:
docker compose run --rm ad_daily_service \
python /app/examples/auto_put_ad_mini/run_daily_roi.py \
--end-date 20260729 \
--source-revision datafix_20260730_1 \
--send-feishu
相同 --source-revision 重复执行会复用同一批次;新的修订必须使用新的标识。日常调度不传此参数。
离线复算新参数必须与日级任务分开执行。以下命令默认只生成 SQL,不访问 ODPS:
docker compose run --rm ad_daily_service \
python /app/examples/auto_put_ad_mini/refresh_roi_fission_multiplier.py \
--cohort-date 20260712 \
--sql-only
去掉 --sql-only 才会固定执行小程序、公众号和企微三条只读 cohort SQL,并生成草稿 CSV/Excel。草稿不会自动
进入生产;必须审计并在 roi_control/fission_multiplier.py 登记版本和文件 SHA256。
小程序和公众号写入联合发布草稿,企微另行生成独立草稿。企微正式版本只需
登记企微 CSV 的 SHA256,数据库参数行只允许合作方精确匹配;不存在企微文件或参数行的旧版本继续使用默认参考系数 2.5。
首次上线或切换版本前,显式发布到 MySQL:
docker compose run --rm ad_daily_service \
python /app/examples/auto_put_ad_mini/refresh_roi_fission_multiplier.py \
--publish-version 20260712_A0-A15_v2 \
--published-by production-deploy
脚本会初始化参数表、写入不可变版本并立即回读校验。相同版本相同内容重复执行会
安全跳过;相同版本内容不同会拒绝覆盖。发布成功后再设置
ROI_FISSION_PARAMETER_VERSION 并启用日级 ROI。
验收:
docker compose --env-file /dev/null ps
docker compose --env-file /dev/null logs --since=30m ad_control_service
docker compose --env-file /dev/null logs --since=30m ad_daily_service
应确认:
回滚时将 VERSION 改为上一个镜像版本并重新部署。数据库新增表和列可以保留,
旧代码不会读取这些字段,不需要执行破坏性回滚。