# ARR 2.0 单机 Compose 部署 本 Compose 模板部署两个 HTTP 服务:`web` 负责应用登录、页面、程序化 XML 处理、验证和入库,`caddy` 负责 HTTPS。没有 Agent 回调服务或 MCP 公网入口。自动月报由另一个无端口的 `monthly_reports.worker` 进程执行,不得放进 Web 请求进程。 ## 前置条件 - DNS:`WEB_PUBLIC_HOST` 指向部署主机; - PostgreSQL 15+:目标必须是隔离数据库 `booking_test`,并已应用 008–016 权威迁移; - OSS:区域匹配、服务端加密、未启用或暂停 versioning、禁止匿名写;bucket ACL 可为 private 或 public-read; - ARR 数据库账号和 OSS RAM/STS 凭据由 Secret 管理器注入,不写入镜像或仓库。 - 月报和公司渠道明细均由 Python/openpyxl 生成;不需要 Node.js、npm 或私有运行时。 - 月报/公司 XLSX 与 `result.json` 上传现有 OSS;只有 `.web-jobs` 队列状态和临时 staging 继续使用 `/app/outputs` 持久卷。 ## 配置 ```bash cp deploy/.env.production.example deploy/.env.production chmod 600 deploy/.env.production ``` 填写应用登录账号/长随机密码、数据库、OSS 和域名。登录凭据必须由 Secret 管理器注入,不能写入镜像或提交到仓库。ARR 2.0 不需要以下配置: - SuperAgent/Open Agent URL 或 API key; - MCP 域名、Bearer 或并发参数; - Agent callback URL/HMAC; - `fetch_oss_file` 或源文件公网 URL。 ## 应用月报 OSS 迁移 在目标数据库确认当前连接为隔离的 `booking_test` 后,先应用 016;脚本会自行拒绝其他数据库。016 只替换月报发布校验函数,不新增表或列,历史 `local` 工件不需要迁移: ```bash psql "$ARR_DATABASE_URL" -Atc "select current_database();" sha256sum database/016_monthly_report_oss_artifacts.sql psql "$ARR_DATABASE_URL" -v ON_ERROR_STOP=1 \ -f database/016_monthly_report_oss_artifacts.sql ``` ## 校验并启动 ```bash docker compose --env-file deploy/.env.production config --quiet docker compose --env-file deploy/.env.production build web docker compose --env-file deploy/.env.production up -d ``` Compose 启动后,应由 systemd、容器编排器或同等进程管理器独立执行月报 worker: ```bash docker compose --env-file deploy/.env.production run --rm web \ python -m monthly_reports.worker \ --output-root /app/outputs/monthly_reports ``` 该命令沿用 Compose 注入的 `ARR_DATABASE_URL`、`ARR_OSS_*` 和 OSS 凭据;如果改由主机上的 systemd 运行, 则在进程环境中提供同一组变量,或显式传入受控的 `--db-config` 文件。`--once` 可用于部署后的单次探针: ```bash docker compose --env-file deploy/.env.production run --rm web \ python -m monthly_reports.worker \ --once \ --output-root /app/outputs/monthly_reports ``` 检查: ```bash curl --fail --silent "https://$WEB_PUBLIC_HOST/healthz" docker compose --env-file deploy/.env.production logs --tail=100 web ``` `/healthz` 仅以 HTTP 200/503 表示数据库与处理入口是否就绪,不暴露组件详情;详细 `/api/health` 必须登录后访问。worker 是独立进程,应另行监控其存活和 outbox 的 `pending/publishing/dead` 数量。失败时优先检查登录环境变量、数据库目标、OSS 区域/加密/versioning、OSS 凭据和固定处理器;无需排查 Agent、MCP 或 Node/npm。 ## 验收 使用无真实住客隐私的受控 XML: 1. 未登录访问首页应进入 ARR 登录页,错误凭据不得创建会话; 2. 使用授权 Finance 账号登录,页面上传一次 XML; 3. 上传响应应直接给出 `succeeded` 或 `failed` 终态以及 `job_id`; 4. 在任务日志中确认“固定处理器已启动 → 程序输出制品已登记 → 独立验收 → Finance 提交”; 5. 成功任务应能下载对应日报,数据库中 source/retained/outcome 数量必须与结构化结果一致; 6. worker 应消费对应 outbox 事件,页面显示真实月报 ID/版本/“更新至”,下载文件哈希应与 OSS 登记值一致;删除 Web 容器或清空其临时 `outputs/monthly_reports` 后,月报与公司报表仍应可下载; 7. 退出登录后,页面、API 和下载均应重新要求登录; 8. 业务失败任务不得激活 Finance 当前版本或触发月报。 ## 回退 ARR 2.0 与 `/Users/chillishark/ARR项目0727` 是两个独立目录。应用级回退可停止本 Compose 并重新启动原工程;不要为了应用回退而删除数据库 009/010 表或 OSS 工件。数据库破坏性回滚需要单独审批、备份和迁移演练。