RUNTIME / 02
生产运行拓扑
这不是目标设计,而是从 EC2、Nginx、systemd、Docker、数据库、日志与健康接口核实出的生产真值。逻辑架构回答应该怎样分层;本页回答现在到底跑在哪里。
READBACK / C03
统一运行态证据入口
把主机、发布、CI、资源、Identity 和可观测性放到同一只读回执中;时间戳区分观察时间与响应时间,任何 HOLD 都不会被页面或接口自动放行。
观察时间:2026-08-12T02:30:16Z · 资源回执:2026-08-12T02:41:36Z · 响应生成:2026-09-28T11:01:56.144Z · 阻断项:identity_portal_adapter_contract_mismatch、observability_metrics_not_proven、storage_configuration_and_database_sample_pending
REQUEST TO STATE
从域名到状态盘的四层运行链
所有层目前位于同一台 EC2。箭头表达实际部署路径,不代表推荐的最终边界。
EDGE
DNS · TLS · Nginx
公共域名汇聚到同一公网 IP,由 Nginx 按 host/path 分流;media.reits.tech 已有独立 TLS vhost。reits / wwwbbsapiauthorderopenapiworkergitealogmediaHOST SERVICES
systemd 业务服务
Go/Node 服务直接运行在宿主机;内部端口由 Nginx 反向代理,11 个相关 systemd 单元当前 active。access-gatewayreits-auth :8095developer-api :8090miniapp-gateway :8081order :3210data-sources :8080reits-media :8096portalCONTAINERS
Docker 产品与平台
IM、官网、BBS、Gitea、日志栈与 Runner 共用一个 Docker daemon 与根卷;本次回读 17 个容器处于 running/healthy。im-core :18080portal :3003NodeBB :4567Gitea :3002Grafana :3300Loki :3100AlloySTATE
本机数据库与数据卷
数据库、仓库、日志和采集文件仍以本机 EBS/Docker volumes 为主;业务资产已由 reits-media 交给 S3/CloudFront。MariaDBPostgreSQLRedisMongoDBIM Postgres/Redis/NATS/MinIOS3/CloudFront assetsXFS / Docker volumesEDGE ROUTING
域名、路径与真实上游
Nginx 是唯一公共入口。8090/8095/8081 虽绑定所有本机地址,但从公网验证均被安全组过滤。
/ · /snapshots · /api/operationsreits-info-portal:3003Dockerhealthy/NodeBB:4567Dockerhealthy/healthz · /readyz · /websock/open · defaultim-core:18080Dockerhealthy/api/*public-booking-platform:3210systemdhealthy/openapi/*miniapp-gateway:8081systemdhealthy/v1/* · /api/*reits-auth:8095systemdhealthy/public-booking-platform:3210systemdhealthy/readyz · /api/* · /openapi/* · /packages/*developer-api runtime fb1a1b4 · gateway · local disk:8090 / 8081systemdrisk/data-sources:8080systemdhealthy/Gitea:3002Dockerhealthy/Grafana:3300Dockerprotected/healthz · /readyz · /meta · /v1/*reits-media:8096systemdhealthySTATE & RESOURCES
状态、资产和备份边界
本次回读确认 reits-media 已运行;业务资产通过 S3/CloudFront 交付,EC2 不持久化业务资产字节。数据库、仓库、日志和备份仍共享本机故障域。
Host MariaDB
Auth Session Registry / OpenAPIjx_reits_auth.auth_sessions + auth_session_events · jx_im_developer · jx_im_openapi · wukong
Backup · daily dump → local + S3; Auth registry restore drill not provenHost PostgreSQL
GiteaGitea metadata
Backup · missing from current backup scriptHost Redis
Auth / OpenAPIsession/challenge support
Backup · not declareddata-sources data
Content Datacrawler state, files and local data
Backup · local backup directoryGitea Docker volume
Developer Platformrepositories, LFS and Gitea /data
Backup · daily tar → local + S3BBS volumes
Communitytopics/users/uploads + Redis
Backup · not proven in EC2 backup flowIM volumes
RealtimeIM state, Redis, NATS, object data
Backup · not proven in EC2 backup flowMedia business assets
reits-mediabusiness_asset + miniapp_package;CloudFront signed URL delivery;business-asset-safe-v1 policy
Backup · S3/CloudFront boundary;本次未执行对象恢复演练OBSERVABILITY
日志不是一个框,而是一条可验证链
本次回读确认 Alloy/Loki/Grafana 容器仍在运行;这只能证明本机采集与查询链,不等于异地留存、完整覆盖、指标/追踪和统一告警已完成。
根卷容量
173 / 256 GiB · 68%2026-08-12T02:30:16Z 只读采集;83 GiB 可用,已越过 WARNING 阈值。发布器只清理受控制品暂存,不触碰业务数据宿主机服务
11 active包含 access gateway、Auth、data-sources、portal、media、Runner 与基础入口Runner
systemd activegitea-runner.service;另有 matrixxchat-ios-prod-ci-1 与 reits-sdk-release-runner 容器资源控制面
S3 + CloudFrontmedia /meta=200;business_asset-safe-v1;EC2 persistent asset bytes=false日志栈
Alloy · Loki · GrafanaAlloy 日志管道、Loki ready/metrics=200、Grafana health=200;仍未把本机链路误报为异地恢复能力告警守卫
2m watch · 5m probereits-alert-watch.timer 与 reits-alert-probe.timer 均 active;oneshot 运行单元按定时器触发指标链
0 / 5 proven2026-08-12 EC2 只读盘点:Prometheus、node_exporter、cAdvisor、Alertmanager 均 absent;业务 /metrics 为 401/404,Loki/Grafana 仅服务级健康CI / Runner
PR #9 successdata-sources PR #9 run 77303 completed/success;main run 77453 completed/success;主机 Runner activeGitea 管理 API
HTTP 404当前版本未暴露 admin runners 端点;Gitea healthz/version=200,不能以 404 推断 Runner 不存在DELIVERY & RECOVERY
发布、定时任务与恢复证据
自动部署频率很高,但各服务版本证据、备份范围和回滚方式尚未统一。
BBS / Data / Portal
~1 minute- SourceGitea main
- Executorsystemd timers
- TargetDocker / systemd
- Evidencecurrent-sha files
Order
~5 minutes- SourceGitea main@83d31a0
- Executorreits-order-auto-deploy
- Targetsystemd :3210
- Evidenceexact release + Auth readiness + K20 witness
OpenAPI
~1 hour- SourceGitea main/witness@fa9283d · runtime@fb1a1b4
- Executorreits-openapi-autodeploy
- Targettwo systemd services
- Evidenceexact runtime build + separate K20 witness source + MySQL/Auth readiness
Auth
manual- SourceGitea main@157b859
- Executoroperator config/store preflight + immutable release
- Targetsystemd · 127.0.0.1:8095
- Evidencesource = production · K21 Phase A safe smoke/meta · MySQL 2/2 ready · env/current rollback set
EC2 backup
daily 03:00 UTC- SourceMariaDB + Gitea /data
- Executorec2-backup.timer
- Targetlocal + S3
- Evidencegzip integrity only
METRICS CONTRACT
下一阶段指标合同:先定义证据,再接入生产
下表是 C03 的可执行目标合同,不是当前运行态。所有条目在采集、存储、告警、回读和恢复证据齐全前均保持 NOT_PROVEN。
主机 CPU、内存、根卷、容器资源
- Source
- node_exporter + cAdvisor
- Backend
- Prometheus-compatible remote write
- Alert
- 容量/资源阈值触发 watch → operator incident
- Evidence
- 连续 2 个采样窗口可查询,含 host、service、release 标签
systemd 服务、Docker 服务、Nginx 上游
- Source
- 服务 /metrics + Nginx exporter
- Backend
- Prometheus-compatible time series
- Alert
- availability、latency、error budget burn
- Evidence
- 11 个 systemd 服务与关键容器清单逐项有 scrape 结果
Auth、Media、Portal、Gitea 关键用户旅程
- Source
- 合成探针 + 结构化业务计数器
- Backend
- 同一指标查询面,禁止只用日志推导
- Alert
- 关键旅程失败或 SLO burn 超阈值
- Evidence
- 带 request_id、release、probe_id 的成功/失败样本可复查
指标规则、值班路由、抑制与恢复
- Source
- 规则仓库 + Alertmanager-compatible router
- Backend
- 异地告警状态与审计回执
- Alert
- test alert → acknowledgement → resolve receipt
- Evidence
- 告警指纹、owner、时间线和恢复回执完整
指标与告警历史
- Source
- remote_write / managed metrics store
- Backend
- 异地保留与查询恢复环境
- Alert
- 存储不可用时触发降级和恢复演练
- Evidence
- 跨实例查询、retention、RPO/RTO 和清理回执
INGESTION PLAN
指标接入实施包:五阶段、七份回执、默认不启用
这是下一阶段的变更计划,不代表 EC2 已安装组件。每个阶段必须经过人工 Owner、生产变更审查和回滚窗口;当前 activation=false。
主机与容器基础指标
node_exporter · cAdvisor
- 边界
- 127.0.0.1 only
- 证据
- 9090/9100/8080 loopback readiness;连续 2 个采样窗口;host/service/release 标签审计
- 回滚
- 停止 exporter、删除 unit/config、回读 Alloy/Loki/Grafana 不受影响
指标后端与远端保留
Prometheus-compatible remote write
- 边界
- private network / managed endpoint
- 证据
- remote write accepted;跨实例查询;retention/RPO/RTO receipt
- 回滚
- 停止 remote_write、保留本地只读快照、恢复到日志-only 状态
业务 SLI 与合成探针
Auth probe · Media probe · Portal probe · Gitea probe
- 边界
- 受控探针网络
- 证据
- probe_id/request_id/release 关联;成功与失败样本;无客户原始数据
- 回滚
- 停用探针 schedule,不影响业务服务
告警路由与恢复回执
Alertmanager-compatible router · owner routing · silence policy
- 边界
- private control plane
- 证据
- test alert fingerprint;acknowledge receipt;resolve receipt;owner/SLA timeline
- 回滚
- 冻结规则发布、停用 route,不删除历史回执
小流量验收与 C03 重审
read-only canary · evidence bundle · rollback rehearsal
- 边界
- operator-only
- 证据
- 5/5 lanes proven;0 production mutations during proof;线上 API/page parity;rollback readback
- 回滚
- 回滚 metrics release 与规则版本,保持 Portal 可见阻断状态
CHANGE PREFLIGHT
生产变更前置检查:当前阻断,不执行安装
前置检查把可观测性安装从页面规划隔离出来。当前只有盘点和日志非干扰检查通过;人工批准、Secret 引用、回滚窗口和 canary 范围仍未完成。
/api/observability-change-preflightPrometheus、node_exporter、cAdvisor、Alertmanager 和业务指标进程缺失已由 EC2 只读盘点确认
Alloy 当前为 Docker/Nginx/journal logs-only;计划要求旁路采集,不覆盖日志管道
远端写入凭据和告警凭据尚未建立 secret reference,禁止写入配置或仓库
当前只有一名人类 Owner;尚无本次生产监控变更的人工批准回执
尚未生成 metrics release、配置摘要、回滚目标和观察窗口
尚未定义仅只读、无客户数据、可撤销的小流量探针范围
本 Portal 只读展示与验收,不具备安装、启用或修改 EC2 监控组件的执行权限
RUNTIME REVIEW
生产环境优先级
这里只记录盘点结论,不在审计过程中直接修改生产配置。
Auth 当前 productionSafe + OIDC ready,但 knife 仍为 6/7
2026-08-11 Auth /v1/meta=200,productionSafe=true、OIDC ready=true、13 个 client、11 个 machine client;密钥轮换、生产 OTP synthetic、设备/MFA 与其余消费者仍不能直接标为完成。
首批消费端受控旅程已闭环,全生态与生产 OTP 仍未完成
K20 已用 Open Platform fa9283d 与 Booking 83d31a0 的真实 consumer 代码完成 17/17 allow→revoke→deny 断言,且无正向撤销缓存;OpenSDK 与其他资源服务器仍需逐项进入同一 consumer matrix,经授权的生产 OTP journey 尚未执行。
资源控制面已运行,但消费者与恢复证据仍未收口
reits-media.service active,healthz/readyz/meta 均为 200;/meta 明确 storage=amazon-s3、delivery=cloudfront-signed-url、business-asset-safe-v1、ec2_persistent_asset_bytes=false。仍需逐一完成 OpenAPI/Gateway/iOS 消费端票据旅程和对象恢复演练。
当前备份无法完整恢复 Gitea
备份包含 MariaDB 和 Gitea /data tar,但 Gitea 实际使用的宿主机 PostgreSQL 约 3.9 GiB 未被 dump;BBS 与 IM 数据卷也未进入这条备份链,脚本还包含应迁移到受管密钥存储的硬编码凭据。
单 EC2 是全生态共同故障域
Edge、Auth、IM、官网、BBS、Order、OpenAPI、数据库、日志和 Gitea 共用一个实例、一块根卷与一个 Docker daemon。
日志可查询,但没有异地副本
Alloy → Loki → Grafana 容器仍在运行且 Grafana 入口受保护;当前架构仍未证明异地日志副本,实例或根卷故障会同时丢失服务和诊断证据。
当前是日志链 + 操作守卫,不是完整指标平台
2026-08-12T02:30:16Z 的 EC2 只读盘点确认没有 Prometheus、node_exporter、cAdvisor、Alertmanager 或业务指标进程;data-sources /metrics=401,developer-api/Auth/Media /metrics=404,Loki /metrics 与 Grafana /api/health 仅服务级证据。C03 因此继续保持 ACTIVE。
发布证据格式仍未统一
Auth 已用 immutable release 绑定 source/production exact SHA;Order/OpenAPI 的 build SHA 仍来自健康接口,其他服务的 current-sha、制品摘要、回滚与审批记录格式不一致。
根卷容量已越过 WARNING,必须持续治理
2026-08-12T02:30:16Z 只读采集为 173/256 GiB、68%、83 GiB 可用,超过 65% WARNING 线但未到 75% HOLD 线;受控发布器仅清理暂存制品,未触碰业务数据。仍需按 release、日志、备份、Docker 镜像分别设置保留策略;禁止把业务资产回迁到 EC2。
Runner 已有 workflow 成功证据,但 Gitea 管理端点不暴露计数
gitea-runner.service active,Runner 相关容器在运行;data-sources PR #9 的 run 77303 completed/success,main run 77453 completed/success。Gitea 1.27.0 的 admin runners 端点返回 HTTP 404,因此组织级 Runner 数量仍不能从该端点宣称。