原结论「零个 upstream 块、零 keepalive」是本轮实测发现的最重大缺陷,也是流量上来时第一个会炸的地方(临时端口与 TIME_WAIT 耗尽)。
2026-07-31 实测依据缺陷已修复。sudo nginx -T | grep -cE '^\s*upstream ' → 12;sudo nginx -T | grep -cE '^\s+keepalive [0-9]+;' → 12(12 个 upstream 各一条 keepalive 32)。修复落在 /etc/nginx/conf.d/00-upstreams.conf,该文件首行自述 added 2026-07-30 (nginx layer, batch 2),即在 433 取数之后的同日批次。proxy_http_version 1.1 由 24 处升至 26 处。新的最近瓶颈改为 im-core-postgres-1 容器 memory.max=268435456(256MiB)而 shared_buffers=128MB 占掉一半,max_connections=100 是假保护。
原结论「零个 conf 使用 map $http_upgrade 标准写法」,据此判定边缘未就绪。
2026-07-31 实测依据实为 1 个,在 /etc/nginx/nginx.conf 第 39–42 行(default upgrade; "" "";),$connection_upgrade 全配置树 29 处引用。同批次的 434 号 §2.1 在同一天就已把它记录在案,两份同日文档自相矛盾;原因是 433 只检索了 conf.d/。取数口径已写死:凡「nginx 有没有 X」必须用 nginx -T 展开全部 include 取数。
原结论compose 里 memswap_limit == mem_limit 即代表该容器禁用 swap,且 docker inspect 可作为取证依据。
2026-07-31 实测依据两条取证准则同时被证伪。14/14 运行中容器 docker inspect -f '{{.HostConfig.MemorySwap}}' 全部等于 Memory(都声明禁 swap),而内核 /sys/fs/cgroup/system.slice/docker-<id>.scope/memory.swap.max 只有 3 个是 0(im-core-110 / im-worker / im-ws-gateway),8 个是 max(完全不限 swap:postgres、redis、info-portal-web、nodebb、grafana、nodebb-mongo、nodebb-redis、gitea),3 个是有限非零值(alloy 512MiB、loki 768MiB、docker-socket-proxy 64MiB)。11/14 不一致,因此「读 inspect 等价于读内核」也不成立。alloy 的真实天花板是 512MiB RSS + 512MiB swap = 1GiB。
原结论告警体系为零:Grafana + Loki + Alloy 在跑,但零条告警规则。
2026-07-31 实测依据实现已落地,闭环判据未全部满足,因此记「部分闭环」而非「已完成」。Grafana 已 provision 12 条规则(/etc/grafana/provisioning/alerting/rules-reits-rc5.yaml);reits-alert-watch.timer(2 分钟)与 reits-alert-probe.timer(5 分钟)均 active;nginx / postgresql / mariadb 的 OnFailure 均已指向 reits-alert-notify@*。未满足:其中 1 条 systemd-unit-failed 规则被该文件首行注释自述为已证伪的死规则、gen_rules.py 与手工修补不同步、站外探活装在一台会休眠的本地工作站上、且「人为制造故障能收到通知」无留证。
原结论「18 个容器逐个内存封顶」仍是待办,容器无内存上限。
2026-07-31 实测依据逐容器封顶已落地:14/14 运行中容器均有非零 HostConfig.Memory。但该项自己写死的完成态是「上限之和 + 两个数据库的 MemoryLow + build.slice 硬上限不超过物理内存」:14 个上限之和 7680MiB + postgres MemoryLow 2048MiB + mariadb MemoryMin 256MiB + build.slice MemoryMax 1500MiB = 11484MiB,而物理内存 7783MiB,超配约 47%。总量约束未满足,不得记为已完成。
状态已过期431 E-3 / 433 E-4431 号原结论环境基线为 17 个 docker 容器;MinIO 是事故当日的幸存者之一。
2026-07-31 实测依据docker ps -q | wc -l → 14。minio 与 nats 两个容器均已不存在,凡以它们存在为前提的记载只在事故当日成立。生效 nginx conf 数同时由 16 升至 18(ls /etc/nginx/conf.d/*.conf | wc -l)。
已被推翻431 E-6 / 433 E-6431 号原结论消息总线是 NATS;MinIO 是切片 origin;把 noop publisher 换成 NATS 发布是路线图条目。
2026-07-31 实测依据im-core 仓 go.mod 无任何 NATS 依赖;internal/config/config.go:32-33 只有 RealtimeBusLocal = "local" 与 RealtimeBusRedis = "redis",:953-955 其余取值一律 unsupported REALTIME_BUS;internal/config/config_test.go:452 把 REALTIME_BUS=nats 列为必须被拒绝的用例。outbox publisher 合法取值只有 disabled / noop / webhook / webhook-push(config.go:19-22),不存在 NATS publisher。
原结论可靠性层已补齐:这台机器已从「被杀就死、无人知晓」变成会自愈、会告警。
2026-07-31 实测依据原文未错,但只覆盖宿主进程存活,不覆盖容器内数据库的启动期正确性。docker logs im-core-postgres-1 | grep -c 'deadlock detected' → 5,全部发生在 2026-07-30(11:18:01 pid21 / 11:18:02 pid20 / 11:19:18 pid20 / 11:19:18 pid21 / 11:19:18.735 pid23),三个进程互等,两次带 at character 2210;而 show log_lock_waits 当前为 off,这类等锁事件默认不留痕。N=3 单机就足以触发,不需要多实例。归属 435 号。
原结论proxy_read_timeout 分布 = 120s×13 / 30s×4 / 300s×3 / 1h×1,共 21 处。
2026-07-31 实测依据按值计数实测为 120s×12 / 30s×4 / 300s×3 / 3600s×2,共 21 处。「四档并存、无统一口径」这一判读仍然成立,具体分布已变。
原结论WebSocket 就绪度判定为「后端就绪、边缘未就绪」。
2026-07-31 实测依据只审了边缘。服务端侧复核:im-core 全仓 WS 层 Ping / SetReadDeadline / ReadDeadline 零命中,internal/httpapi/realtime_handlers.go:63 是空 websocket.AcceptOptions{},心跳纯被动。nginx /websock/ 的 proxy_read_timeout 3600s 与服务端零心跳叠加,半开连接最长挂 1 小时。这是服务端设计缺口,不是边缘配置债。归属 435 号。
原结论(433 未覆盖)新品牌域的边缘可观测性。
2026-07-31 实测依据map $host $reits_edge_service_name 零条 probatlas.com 表项,而 log_format reits_edge_json 用 $reits_edge_service_name 作 service_name 字段。实测已有 12 个 probatlas.com 别名可服务,但其访问日志 service_name 全部落到 default "nginx-edge"。后果:按 service_name 分服务的 Loki 查询与 Grafana 告警对新品牌域全部静默失效。