本文档说明如何将 auto_put_ad_mini 部署到海外服务器的 Docker/Kubernetes 环境,实现生产级自动化运行。
✅ Docker 容器化
✅ 账户白名单机制
✅ 海外环境适配
✅ 定时调度
✅ 监控和日志
/health✅ 安全配置
auto_put_ad_mini/
├── Dockerfile # Docker 镜像定义
├── .dockerignore # Docker 构建排除文件
├── docker-compose.yml # 本地开发环境
├── requirements.txt # Python 依赖
├── server.py # FastAPI + APScheduler 服务器(推荐)
├── execute_once.py # 单次执行入口
├── schedule.sh # Cron 脚本(备用)
├── whitelist.json # 白名单账户配置
├── metrics.py # Prometheus 指标导出
├── utils/
│ └── log_capture.py # 并发日志捕获
├── k8s/ # Kubernetes 部署清单
│ ├── README.md # K8s 部署详细说明
│ ├── namespace.yaml # 命名空间
│ ├── deployment.yaml # Deployment + Service
│ ├── cronjob.yaml # CronJob(备用)
│ ├── configmap.yaml # 公开配置
│ ├── secret.yaml # 敏感信息
│ ├── pvc.yaml # 持久化存储
│ └── network-policy.yaml # 网络策略
└── DEPLOYMENT.md # 本文档
# 1. 进入项目目录
cd /Users/liulidong/project/agent/Agent/examples/auto_put_ad_mini
# 2. 创建 .env 文件(从 .env.example 复制并填入真实值)
cp .env.example .env
vim .env # 填入实际的 API 密钥和配置
# 3. 构建镜像
docker build -t auto-put-ad-mini:test .
# 4. 启动服务(APScheduler 模式)
docker-compose up -d
# 5. 查看日志
docker-compose logs -f
# 6. 测试健康检查
curl http://localhost:8080/health | jq .
# 7. 手动触发任务
curl -X POST http://localhost:8080/trigger | jq .
# 8. 停止服务
docker-compose down
# 测试单次执行(不启动调度服务)
docker run --rm \
--env-file .env \
-e EXECUTION_ENABLED=false \
-e WHITELIST_ENABLED=true \
-e WHITELIST_ACCOUNTS=80769799 \
-v $(pwd)/outputs:/app/outputs \
auto-put-ad-mini:test \
python execute_once.py
# 验证输出
ls -lh outputs/reports/
cat outputs/reports/llm_decisions_*.csv | head
# 1. 登录镜像仓库
docker login your-registry.com
# 2. 打标签
docker tag auto-put-ad-mini:test your-registry.com/auto-put-ad-mini:v1.0.0
docker tag auto-put-ad-mini:test your-registry.com/auto-put-ad-mini:latest
# 3. 推送
docker push your-registry.com/auto-put-ad-mini:v1.0.0
docker push your-registry.com/auto-put-ad-mini:latest
详细步骤见 k8s/README.md
推荐部署方式:Deployment + APScheduler
# 1. 创建命名空间
kubectl apply -f k8s/namespace.yaml
# 2. 修改 k8s/secret.yaml,填入真实密钥
vim k8s/secret.yaml
# 3. 部署所有资源
kubectl apply -f k8s/pvc.yaml
kubectl apply -f k8s/configmap.yaml
kubectl apply -f k8s/secret.yaml
kubectl apply -f k8s/deployment.yaml
# 4. 验证部署
kubectl get all -n ad-automation
kubectl logs -f -n ad-automation deployment/auto-put-ad-mini
# 5. 端口转发测试
kubectl port-forward -n ad-automation svc/auto-put-ad-mini 8080:8080
# 6. 测试健康检查
curl http://localhost:8080/health | jq .
# 7. 手动触发任务
curl -X POST http://localhost:8080/trigger | jq .
| 变量名 | 说明 | 默认值 | 必需 |
|---|---|---|---|
WHITELIST_ENABLED |
启用账户白名单 | true | 否 |
WHITELIST_ACCOUNTS |
白名单账户ID(逗号分隔) | - | 是(启用白名单时) |
EXECUTION_ENABLED |
启用实际执行 | false | 否 |
HTTP_PROXY |
HTTP 代理地址 | - | 否 |
HTTPS_PROXY |
HTTPS 代理地址 | - | 否 |
TZ |
时区 | UTC | 否 |
CRON_SCHEDULE |
定时表达式 | 0 2 * * * | 否 |
RUN_ON_STARTUP |
启动时立即执行 | false | 否 |
PORT |
FastAPI 端口 | 8080 | 否 |
FEISHU_APP_ID |
飞书应用ID | - | 是 |
FEISHU_APP_SECRET |
飞书应用密钥 | - | 是 |
TENCENT_AD_ACCOUNT_ID |
腾讯广告账户ID | - | 是 |
ODPS_ACCESS_ID |
ODPS 访问ID | - | 是 |
ODPS_ACCESS_SECRET |
ODPS 访问密钥 | - | 是 |
OPEN_ROUTER_API_KEY |
OpenRouter API Key | - | 是 |
方式 1:环境变量(推荐)
# .env 或 k8s/secret.yaml
WHITELIST_ENABLED=true
WHITELIST_ACCOUNTS=80769799,71305011,12345678
方式 2:配置文件
编辑 whitelist.json:
{
"accounts": [80769799, 71305011],
"description": "生产环境白名单账户列表",
"last_updated": "2026-04-22"
}
Cron 表达式格式:分 时 日 月 周
示例:
0 2 * * * - 每天凌晨 2 点(UTC)30 1 * * * - 每天凌晨 1:30(UTC)0 */6 * * * - 每 6 小时执行一次0 9 * * 1-5 - 工作日上午 9 点修改定时:
# Kubernetes ConfigMap
kubectl patch configmap ad-config -n ad-automation \
--patch '{"data":{"CRON_SCHEDULE":"0 3 * * *"}}'
kubectl rollout restart deployment/auto-put-ad-mini -n ad-automation
# 本地
curl http://localhost:8080/health
# Kubernetes
kubectl exec -n ad-automation <pod-name> -- curl -f http://localhost:8080/health
返回示例:
{
"status": "healthy",
"timestamp": "2026-04-22T10:00:00Z",
"scheduler_running": true,
"latest_report": "llm_decisions_20260422.csv",
"jobs": [
{
"id": "decision_pipeline",
"name": "广告决策流程",
"next_run": "2026-04-23T02:00:00Z"
}
]
}
Docker:
docker logs -f auto-put-ad-mini
Kubernetes:
# 实时日志
kubectl logs -f -n ad-automation deployment/auto-put-ad-mini
# 最近 100 行
kubectl logs -n ad-automation deployment/auto-put-ad-mini --tail=100
# 查看多个 Pod 日志
kubectl logs -n ad-automation -l app=auto-put-ad-mini --all-containers=true
Docker:
docker exec -it auto-put-ad-mini ls -lh /app/outputs/reports/
docker exec -it auto-put-ad-mini cat /app/outputs/reports/llm_decisions_*.csv
Kubernetes:
POD_NAME=$(kubectl get pods -n ad-automation -l app=auto-put-ad-mini -o jsonpath='{.items[0].metadata.name}')
kubectl exec -n ad-automation $POD_NAME -- ls -lh /app/outputs/reports/
kubectl exec -n ad-automation $POD_NAME -- cat /app/outputs/reports/llm_decisions_*.csv
如果启用了 Prometheus metrics:
# 查看 metrics 文件
kubectl exec -n ad-automation $POD_NAME -- cat /app/outputs/metrics.prom
配置 Prometheus 抓取:
scrape_configs:
- job_name: 'auto-put-ad-mini'
file_sd_configs:
- files:
- /app/outputs/metrics.prom
# 查看 Pod 状态
kubectl describe pod <pod-name> -n ad-automation
# 查看事件
kubectl get events -n ad-automation --sort-by='.lastTimestamp'
# 查看日志
kubectl logs <pod-name> -n ad-automation --previous
常见原因:
# 检查调度器状态
curl http://localhost:8080/health | jq .scheduler_running
# 查看下次执行时间
curl http://localhost:8080/health | jq .jobs
# 手动触发测试
curl -X POST http://localhost:8080/trigger
# 查看日志,搜索白名单相关信息
kubectl logs -n ad-automation deployment/auto-put-ad-mini | grep "白名单"
# 检查配置
kubectl get secret ad-secrets -n ad-automation -o jsonpath='{.data.WHITELIST_ACCOUNTS}' | base64 -d
# 检查代理配置
kubectl get configmap ad-config -n ad-automation -o yaml | grep PROXY
# 测试代理连接
kubectl exec -n ad-automation $POD_NAME -- curl -x $HTTP_PROXY https://api.e.qq.com
# Deployment 模式
kubectl rollout undo deployment/auto-put-ad-mini -n ad-automation
# CronJob 模式
kubectl set image cronjob/auto-put-ad-mini \
decision-engine=your-registry/auto-put-ad-mini:v0.9.0 \
-n ad-automation
# Deployment 模式
kubectl scale deployment auto-put-ad-mini --replicas=0 -n ad-automation
# CronJob 模式
kubectl patch cronjob auto-put-ad-mini -n ad-automation -p '{"spec":{"suspend":true}}'
# Deployment 模式
kubectl scale deployment auto-put-ad-mini --replicas=1 -n ad-automation
# CronJob 模式
kubectl patch cronjob auto-put-ad-mini -n ad-automation -p '{"spec":{"suspend":false}}'
ad-automation)| 环境 | CPU Request | CPU Limit | Memory Request | Memory Limit |
|---|---|---|---|---|
| 测试 | 250m | 500m | 512Mi | 1Gi |
| 生产 | 500m | 1 | 1Gi | 2Gi |
| 高负载 | 1 | 2 | 2Gi | 4Gi |
max_instances=1 防止任务并发concurrencyPolicy: Forbid# 输出目录定期清理
find /app/outputs -name "cron_*.log" -mtime +30 -delete
# 更新镜像
kubectl set image deployment/auto-put-ad-mini \
decision-engine=your-registry/auto-put-ad-mini:v1.1.0 \
-n ad-automation
# 查看更新状态
kubectl rollout status deployment/auto-put-ad-mini -n ad-automation
# 创建 Canary Deployment
kubectl apply -f k8s/deployment-canary.yaml
# 验证 Canary 版本
kubectl logs -n ad-automation deployment/auto-put-ad-mini-canary
# 全量发布
kubectl set image deployment/auto-put-ad-mini \
decision-engine=your-registry/auto-put-ad-mini:v1.1.0 \
-n ad-automation
# 删除 Canary
kubectl delete deployment auto-put-ad-mini-canary -n ad-automation
| 特性 | Deployment + APScheduler | CronJob |
|---|---|---|
| 资源占用 | 常驻 Pod(低) | 每次启动新 Pod |
| 启动速度 | 快(任务触发即执行) | 慢(需启动容器) |
| 健康检查 | ✅ HTTP 端点 | ❌ 需额外脚本 |
| 手动触发 | ✅ HTTP API | ⚠️ 需创建 Job |
| 日志查看 | ✅ 持续输出 | ⚠️ 分散在多个 Job |
| 监控集成 | ✅ Prometheus metrics | ⚠️ 需额外配置 |
| 适用场景 | 生产环境、频繁调度 | 简单定时任务 |
推荐:生产环境使用 Deployment + APScheduler 模式。
# 快速重启
kubectl rollout restart deployment/auto-put-ad-mini -n ad-automation
# 查看最近事件
kubectl get events -n ad-automation --sort-by='.lastTimestamp' | tail -20
# 进入 Pod Shell
kubectl exec -it -n ad-automation <pod-name> -- bash
# 复制文件到本地
kubectl cp ad-automation/<pod-name>:/app/outputs/reports/llm_decisions_*.csv ./local-reports/
# 查看资源使用
kubectl top pod -n ad-automation
k8s/README.md 和本文档CLAUDE.md 和源码注释.env.example 和 k8s/configmap.yaml文档版本:v1.0.0 最后更新:2026-04-22 维护者:auto_put_ad_mini team