RUNTIME / 02

生产运行拓扑

这不是目标设计,而是从 EC2、Nginx、systemd、Docker、数据库、日志与健康接口核实出的生产真值。逻辑架构回答应该怎样分层;本页回答现在到底跑在哪里。

4 vCPUcompute
7.6 GiBmemory
256 GiB XFSroot volume
173 GiB · 68%used
17containers
1 week 5 days 15 hoursuptime

READBACK / C03

统一运行态证据入口

把主机、发布、CI、资源、Identity 和可观测性放到同一只读回执中;时间戳区分观察时间与响应时间,任何 HOLD 都不会被页面或接口自动放行。

READBACK_ONLY_HOLDproductionMutations=0 · acceptancePermitted=false/api/runtime-evidence
HOSTOBSERVED11 services · 17 containers
RELEASEBOUNDdeveloper-portal@1dfd35b4f388-a84f2486318f
CIPASSPR #9 · main success
RESOURCEMETA_READBACK_PASSamazon-s3 · EC2 bytes=false
IDENTITYBLOCKED上游 meta=200 · Portal adapter=200 · sessionRegistry 未暴露
METRICSnot_proven5 lanes · all NOT_PROVEN

观察时间: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。箭头表达实际部署路径,不代表推荐的最终边界。

01

EDGE

DNS · TLS · Nginx

公共域名汇聚到同一公网 IP,由 Nginx 按 host/path 分流;media.reits.tech 已有独立 TLS vhost。
reits / wwwbbsapiauthorderopenapiworkergitealogmedia
02

HOST SERVICES

systemd 业务服务

Go/Node 服务直接运行在宿主机;内部端口由 Nginx 反向代理,11 个相关 systemd 单元当前 active。
access-gatewayreits-auth :8095developer-api :8090miniapp-gateway :8081order :3210data-sources :8080reits-media :8096portal
03

CONTAINERS

Docker 产品与平台

IM、官网、BBS、Gitea、日志栈与 Runner 共用一个 Docker daemon 与根卷;本次回读 17 个容器处于 running/healthy。
im-core :18080portal :3003NodeBB :4567Gitea :3002Grafana :3300Loki :3100Alloy
04

STATE

本机数据库与数据卷

数据库、仓库、日志和采集文件仍以本机 EBS/Docker volumes 为主;业务资产已由 reits-media 交给 S3/CloudFront。
MariaDBPostgreSQLRedisMongoDBIM Postgres/Redis/NATS/MinIOS3/CloudFront assetsXFS / Docker volumes

EDGE ROUTING

域名、路径与真实上游

Nginx 是唯一公共入口。8090/8095/8081 虽绑定所有本机地址,但从公网验证均被安全组过滤。

HostPathTargetRuntimeStatus
reits.tech · www/ · /snapshots · /api/operationsreits-info-portal:3003Dockerhealthy
bbs.reits.tech/NodeBB:4567Dockerhealthy
api.reits.tech/healthz · /readyz · /websock/open · defaultim-core:18080Dockerhealthy
api.reits.tech/api/*public-booking-platform:3210systemdhealthy
api.reits.tech/openapi/*miniapp-gateway:8081systemdhealthy
auth.reits.tech/v1/* · /api/*reits-auth:8095systemdhealthy
order.reits.tech/public-booking-platform:3210systemdhealthy
openapi.reits.tech/readyz · /api/* · /openapi/* · /packages/*developer-api runtime fb1a1b4 · gateway · local disk:8090 / 8081systemdrisk
worker.reits.tech/data-sources:8080systemdhealthy
gitea.reits.tech/Gitea:3002Dockerhealthy
log.reits.tech/Grafana:3300Dockerprotected
media.reits.tech/healthz · /readyz · /meta · /v1/*reits-media:8096systemdhealthy

STATE & RESOURCES

状态、资产和备份边界

本次回读确认 reits-media 已运行;业务资产通过 S3/CloudFront 交付,EC2 不持久化业务资产字节。数据库、仓库、日志和备份仍共享本机故障域。

Host MariaDB

Auth Session Registry / OpenAPI
824 MiB + K18 tables

jx_reits_auth.auth_sessions + auth_session_events · jx_im_developer · jx_im_openapi · wukong

Backup · daily dump → local + S3; Auth registry restore drill not proven

Host PostgreSQL

Gitea
4.3 GiB / DB 3.9 GiB

Gitea metadata

Backup · missing from current backup script

Host Redis

Auth / OpenAPI
1 key observed

session/challenge support

Backup · not declared

data-sources data

Content Data
19 GiB + 1.2 GiB backups

crawler state, files and local data

Backup · local backup directory

Gitea Docker volume

Developer Platform
22 GiB

repositories, LFS and Gitea /data

Backup · daily tar → local + S3

BBS volumes

Community
Mongo 524 MiB · uploads 14 MiB

topics/users/uploads + Redis

Backup · not proven in EC2 backup flow

IM volumes

Realtime
Postgres 73 MiB · MinIO 44 KiB

IM state, Redis, NATS, object data

Backup · not proven in EC2 backup flow

Media business assets

reits-media
S3-backed · EC2 persistent bytes=false

business_asset + miniapp_package;CloudFront signed URL delivery;business-asset-safe-v1 policy

Backup · S3/CloudFront boundary;本次未执行对象恢复演练

OBSERVABILITY

日志不是一个框,而是一条可验证链

本次回读确认 Alloy/Loki/Grafana 容器仍在运行;这只能证明本机采集与查询链,不等于异地留存、完整覆盖、指标/追踪和统一告警已完成。

Nginx JSON access→file tail→Grafana Alloy→Loki→Grafana
Docker stdout/stderr→Docker socket→Grafana Alloy→Loki→Grafana
systemd journal→journal source→Grafana 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 active

Gitea 管理 API

HTTP 404当前版本未暴露 admin runners 端点;Gitea healthz/version=200,不能以 404 推断 Runner 不存在

DELIVERY & RECOVERY

发布、定时任务与恢复证据

自动部署频率很高,但各服务版本证据、备份范围和回滚方式尚未统一。

BBS / Data / Portal

~1 minute
  1. SourceGitea main
  2. Executorsystemd timers
  3. TargetDocker / systemd
  4. Evidencecurrent-sha files

Order

~5 minutes
  1. SourceGitea main@83d31a0
  2. Executorreits-order-auto-deploy
  3. Targetsystemd :3210
  4. Evidenceexact release + Auth readiness + K20 witness

OpenAPI

~1 hour
  1. SourceGitea main/witness@fa9283d · runtime@fb1a1b4
  2. Executorreits-openapi-autodeploy
  3. Targettwo systemd services
  4. Evidenceexact runtime build + separate K20 witness source + MySQL/Auth readiness

Auth

manual
  1. SourceGitea main@157b859
  2. Executoroperator config/store preflight + immutable release
  3. Targetsystemd · 127.0.0.1:8095
  4. Evidencesource = production · K21 Phase A safe smoke/meta · MySQL 2/2 ready · env/current rollback set

EC2 backup

daily 03:00 UTC
  1. SourceMariaDB + Gitea /data
  2. Executorec2-backup.timer
  3. Targetlocal + S3
  4. Evidencegzip integrity only

METRICS CONTRACT

下一阶段指标合同:先定义证据,再接入生产

下表是 C03 的可执行目标合同,不是当前运行态。所有条目在采集、存储、告警、回读和恢复证据齐全前均保持 NOT_PROVEN。

机器验收门:/api/observability-contract · 当前 0/5 READY · acceptancePermitted=false · productionMutations=0

host-metricsNOT PROVEN

主机 CPU、内存、根卷、容器资源

Source
node_exporter + cAdvisor
Backend
Prometheus-compatible remote write
Alert
容量/资源阈值触发 watch → operator incident
Evidence
连续 2 个采样窗口可查询,含 host、service、release 标签
STOP未完成采集、远端写入和查询回读前不得标记 PASS
service-metricsNOT PROVEN

systemd 服务、Docker 服务、Nginx 上游

Source
服务 /metrics + Nginx exporter
Backend
Prometheus-compatible time series
Alert
availability、latency、error budget burn
Evidence
11 个 systemd 服务与关键容器清单逐项有 scrape 结果
STOP期望服务与实际序列不一致时自动阻断验收
business-sliNOT PROVEN

Auth、Media、Portal、Gitea 关键用户旅程

Source
合成探针 + 结构化业务计数器
Backend
同一指标查询面,禁止只用日志推导
Alert
关键旅程失败或 SLO burn 超阈值
Evidence
带 request_id、release、probe_id 的成功/失败样本可复查
STOP未完成生产安全的 synthetic journey 前不推进 C03
alert-routeNOT PROVEN

指标规则、值班路由、抑制与恢复

Source
规则仓库 + Alertmanager-compatible router
Backend
异地告警状态与审计回执
Alert
test alert → acknowledgement → resolve receipt
Evidence
告警指纹、owner、时间线和恢复回执完整
STOP只有 timer/watch 没有指标规则与通知回执时保持 NOT_PROVEN
offhost-retentionNOT PROVEN

指标与告警历史

Source
remote_write / managed metrics store
Backend
异地保留与查询恢复环境
Alert
存储不可用时触发降级和恢复演练
Evidence
跨实例查询、retention、RPO/RTO 和清理回执
STOP没有异地副本或恢复演练不得宣称治理完成

INGESTION PLAN

指标接入实施包:五阶段、七份回执、默认不启用

这是下一阶段的变更计划,不代表 EC2 已安装组件。每个阶段必须经过人工 Owner、生产变更审查和回滚窗口;当前 activation=false。

状态 PLAN_ONLY_NOT_APPLIED阶段 5回执 7生产变更 0
M01PLANNED

主机与容器基础指标

node_exporter · cAdvisor

边界
127.0.0.1 only
证据
9090/9100/8080 loopback readiness;连续 2 个采样窗口;host/service/release 标签审计
回滚
停止 exporter、删除 unit/config、回读 Alloy/Loki/Grafana 不受影响
STOP任一公网暴露、secret 明文、日志采集回归或磁盘预算超限立即回滚
M02PLANNED

指标后端与远端保留

Prometheus-compatible remote write

边界
private network / managed endpoint
证据
remote write accepted;跨实例查询;retention/RPO/RTO receipt
回滚
停止 remote_write、保留本地只读快照、恢复到日志-only 状态
STOP无异地保留、无访问控制或无恢复演练不得接入告警
M03PLANNED

业务 SLI 与合成探针

Auth probe · Media probe · Portal probe · Gitea probe

边界
受控探针网络
证据
probe_id/request_id/release 关联;成功与失败样本;无客户原始数据
回滚
停用探针 schedule,不影响业务服务
STOP生产安全边界未审批、探针可能写入业务或含客户数据时禁止启用
M04PLANNED

告警路由与恢复回执

Alertmanager-compatible router · owner routing · silence policy

边界
private control plane
证据
test alert fingerprint;acknowledge receipt;resolve receipt;owner/SLA timeline
回滚
冻结规则发布、停用 route,不删除历史回执
STOP没有去重、抑制、owner 和恢复回执不得称为统一告警
M05PLANNED

小流量验收与 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 可见阻断状态
STOP任一 lane 未 proven、证据时间过期或线上 parity 不一致,C03 保持 ACTIVE

CHANGE PREFLIGHT

生产变更前置检查:当前阻断,不执行安装

前置检查把可观测性安装从页面规划隔离出来。当前只有盘点和日志非干扰检查通过;人工批准、Secret 引用、回滚窗口和 canary 范围仍未完成。

BLOCKED_REQUIRES_HUMAN_AND_PRODUCTION_CHANGE_REVIEWexecute=false · productionMutations=0/api/observability-change-preflight
inventory-baselinePASS

Prometheus、node_exporter、cAdvisor、Alertmanager 和业务指标进程缺失已由 EC2 只读盘点确认

logs-noninterferencePASS

Alloy 当前为 Docker/Nginx/journal logs-only;计划要求旁路采集,不覆盖日志管道

secret-referenceBLOCKED

远端写入凭据和告警凭据尚未建立 secret reference,禁止写入配置或仓库

production-change-approvalBLOCKED

当前只有一名人类 Owner;尚无本次生产监控变更的人工批准回执

rollback-windowBLOCKED

尚未生成 metrics release、配置摘要、回滚目标和观察窗口

canary-scopeBLOCKED

尚未定义仅只读、无客户数据、可撤销的小流量探针范围

operator-commandDENIED

本 Portal 只读展示与验收,不具备安装、启用或修改 EC2 监控组件的执行权限

M01 开始前必须具备人工 Owner 批准回执 · secret reference 与最小权限确认 · metrics release/configuration digest · 回滚目标与观察窗口 · 只读 canary 范围和数据脱敏证明

RUNTIME REVIEW

生产环境优先级

这里只记录盘点结论,不在审计过程中直接修改生产配置。

01P1

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 与其余消费者仍不能直接标为完成。

02P1

首批消费端受控旅程已闭环,全生态与生产 OTP 仍未完成

K20 已用 Open Platform fa9283d 与 Booking 83d31a0 的真实 consumer 代码完成 17/17 allow→revoke→deny 断言,且无正向撤销缓存;OpenSDK 与其他资源服务器仍需逐项进入同一 consumer matrix,经授权的生产 OTP journey 尚未执行。

03P0

资源控制面已运行,但消费者与恢复证据仍未收口

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 消费端票据旅程和对象恢复演练。

04P0

当前备份无法完整恢复 Gitea

备份包含 MariaDB 和 Gitea /data tar,但 Gitea 实际使用的宿主机 PostgreSQL 约 3.9 GiB 未被 dump;BBS 与 IM 数据卷也未进入这条备份链,脚本还包含应迁移到受管密钥存储的硬编码凭据。

05P0

单 EC2 是全生态共同故障域

Edge、Auth、IM、官网、BBS、Order、OpenAPI、数据库、日志和 Gitea 共用一个实例、一块根卷与一个 Docker daemon。

06P1

日志可查询,但没有异地副本

Alloy → Loki → Grafana 容器仍在运行且 Grafana 入口受保护;当前架构仍未证明异地日志副本,实例或根卷故障会同时丢失服务和诊断证据。

07P1

当前是日志链 + 操作守卫,不是完整指标平台

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。

08P1

发布证据格式仍未统一

Auth 已用 immutable release 绑定 source/production exact SHA;Order/OpenAPI 的 build SHA 仍来自健康接口,其他服务的 current-sha、制品摘要、回滚与审批记录格式不一致。

09P1

根卷容量已越过 WARNING,必须持续治理

2026-08-12T02:30:16Z 只读采集为 173/256 GiB、68%、83 GiB 可用,超过 65% WARNING 线但未到 75% HOLD 线;受控发布器仅清理暂存制品,未触碰业务数据。仍需按 release、日志、备份、Docker 镜像分别设置保留策略;禁止把业务资产回迁到 EC2。

10P1

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 数量仍不能从该端点宣称。