# Universe 机制层上云 P0：只读镜像 + 手动同步 上线记录

> **状态**：✅ 已上线（P0 完成）
> **日期**：2026-08-14（21:38 R 批准《Universe_机制层上云提案_v1》P0 → 21:50 上线完成）
> **执行**：福斯（fus / agent-l8g0）
> **批准**：R（R1-R6 批准，含 P0 启动 R6）
> **依据**：`Blueprint/Universe_机制层上云提案_v1_20260814.md` §8 P0（只读镜像 + 手动同步，验收①④）
> **落位**：Changes/（正文层变更留痕，照 Changes README 惯例）

---

## 0. 结论速览

| 验收/红线 | 结果 |
|-----------|------|
| 验收① 远端读通（模拟 Ark/Falcon 从公网读镜像） | ✅ HTTP 200 + 内容与本地一致（sha256 逐文件校验） |
| 验收④ 冲突行为已定义 | ✅ 沿用提案 §6.3（本 P0 无写入口，冲突面不涉及；P1 暂存区起适用） |
| 红线 本地真相源零改动 | ✅ 148 个本地文件同步前后哈希完全一致（比对见 §6） |
| 红线 同机逻辑隔离 | ✅ 独立账号 universe-sync + 独立目录 /srv/universe-mirror + 独立端口 8890；与 Nexus(/opt/nexus) 互不可写 |
| 红线 只读安全 | ✅ nginx limit_except GET/HEAD；PUT/POST/DELETE 实测 403 |
| 红线 域名/证书不卡 DNS | ✅ 临时入口用 IP 路径 `http://47.243.179.2/universe/`；universe.nexus.pro DNS+证书 记入遗留 |

---

## 1. 部署形态（R 拍板「选 a」：同机逻辑隔离）

| 项 | 落地 |
|----|------|
| 独立账号 | `universe-sync`（uid=1002，system user，nologin，组 universe-sync；非 root 共享） |
| 独立目录 | `/srv/universe-mirror`（只读镜像根，属主 universe-sync，目录 755 / 文件 644） |
| 备份区 | `/srv/universe-backups/`（同步前旧镜像快照，保留最近 7 份；不在 nginx 服务根内） |
| 独立端口 | `8890`（nginx conf.d/universe-mirror.conf；云安全组未放行，本机可达，P1 开通） |
| 只读入口 | `http://47.243.179.2/universe/`（默认服务器 /universe/ 路径，限 GET/HEAD） |
| 与 Nexus | 权限互斥：universe-sync 对 /opt/nexus 写测试 = Permission denied；镜像目录属主非 Nexus 任何进程 |
| 物理约束 | **物理共享 + 逻辑隔离**（书面声明）：当前与 Nexus 共享物理机，容器/目录/账号/端口/权限互斥；物理隔离为中期演进项（提案 §5） |

## 2. 镜像内容（单向投影，非真相）

| 路径（镜像内） | 本地真相源（canonical，只读引用） | 说明 |
|----------------|-----------------------------------|------|
| `universe/99_System/` | `~/Nutstore Files/Universe/99_System/` | Blueprint / Governance / Registry / Changes / Skills 全集 |
| `nebula/agents/` | `~/Nutstore Files/Nebula/99_System/agents/` | 关键档案全集（排除 `.backup/`、`*.backup*`、`*.bak*`） |
| `INDEX.md` / `SYNC.json` / `SHA256SUMS` | —（镜像自生成三件套） | 目录索引 / 同步元数据（版本+时间戳）/ 全量校验清单 |

- **同步方向**：仅本地 → 服务器；脚本对本地零写入（只读源），镜像永不反向。
- **版本/时间戳**：每次同步生成 `SYNC.json`（synced_at / mirror_version / file_count）+ `SHA256SUMS`（排除三件套，保持稳定可比对）。

## 3. 同步脚本（P0 手动；自动排 P1）

- **路径**：`~/.openclaw-autoclaw/agents/fus/workspace/scripts/sync-universe-mirror.sh`（v p0-0.1.0）
- **用法**：`./sync-universe-mirror.sh`（手动同步，P0 标准方式）；`--dry-run` 预览；`--no-verify` 跳过验证；`--cron` 安静模式（P1 自动同步/排空器启用时用）
- **特性**：rsync `--checksum` 幂等（重复运行零变更）；变更检测（itemize）→ 变更前自动快照备份（保留 7 份）；远端收尾 chown universe-sync + 权限 755/644；三件套自动生成；内置验证（本地↔远端 sha256 + HTTP 可达 + 写拒绝）
- **互斥锁**：mkdir 原子锁 + 陈旧锁（>2h）自动打破
- **cron 说明**：P0 按提案只做手动同步，cron 未启用（P1 随暂存区/排空器一起规划自动链路）

## 4. 服务器侧改动清单（47.243.179.2）

| # | 改动 | 位置 |
|---|------|------|
| 1 | 新建账号 universe-sync（uid 1002，nologin） | `/etc/passwd` |
| 2 | 新建镜像区 + 备份区 | `/srv/universe-mirror` `/srv/universe-backups` |
| 3 | 独立只读 server（端口 8890） | `/etc/nginx/conf.d/universe-mirror.conf` |
| 4 | 默认服务器加 `/universe/` 只读 location（限 GET/HEAD → 其余 403） | `/etc/nginx/sites-enabled/nexus`（改动前备份 `nexus.bak-20260814-universe-mirror`） |
| 5 | ufw 放行 8890/tcp（云安全组未放行，P1 处理） | ufw |

> 未触碰：/opt/nexus 任何数据与配置、/opt/visio、/opt/kidsclub、/srv/boa*、其余 nginx server 块。

## 5. 验证结果（2026-08-14 21:47-21:50）

### 5.1 验收① 远端读通（本机 Mac 模拟远程 agent，公网路径）

| 检查 | 结果 |
|------|------|
| `GET http://47.243.179.2/universe/INDEX.md` | 200 ✅ |
| `GET .../universe/99_System/Blueprint/Universe_机制层上云提案_v1_20260814.md` | 200 ✅ |
| `GET .../universe/99_System/Registry/Universe_Agent身份盘点_20260814.md`（盘点表） | 200 ✅ |
| `GET .../universe/99_System/Registry/Agent_Identity_Mapping.md` | 200 ✅ |
| `GET .../universe/99_System/Governance/Universe_Mechanism_Layer_Map_v0.2.md` | 200 ✅ |
| `GET .../universe/nebula/agents/AGENT_REPORT.json` | 200 ✅ 且本地=远端 sha256（e0d4a191…） |
| 远端全量校验 `sha256sum -c SHA256SUMS` | 全部 OK（149 文件）✅ |

### 5.2 只读安全（写测试全部被拒）

| 方法 | 结果 |
|------|------|
| PUT / POST / DELETE（对镜像内文件） | 均 403 Forbidden ✅ |

### 5.3 同机逻辑隔离

- `runuser -u universe-sync -- touch /opt/nexus/.write-test` → **Permission denied** ✅（universe-sync 不可写 Nexus）
- 镜像区全部文件属主 universe-sync、文件 644 / 目录 755 ✅

### 5.4 本地真相源零改动

- 同步前后对本地 148 个文件（Universe/99_System 全集 + agents 精选集）做 sha256 全量比对：**diff=0，哈希完全一致** ✅
- 本记录（Changes/）为本步骤授权的唯一本地新增，属变更留痕（提案 §8 P0 文档要求）

### 5.5 幂等

- 连续第二次运行：变更检测 = 无内容变更，不再打备份，SHA256SUMS 稳定 ✅

## 6. 遗留事项（后续跟进）

| # | 事项 | 归属 | 说明 |
|---|------|------|------|
| 1 | **DNS**：universe.nexus.pro A 记录 → 47.243.179.2 | Max ⚡（照 file.nexus.pro 先例：DNS 发包 Gitea issue + certbot 签证书） | 完成后启用独立域名入口 |
| 2 | **独立端口 8890**：云安全组放行 | R/云控制台 | 放行后 nginx 8890 server 即成第二入口（conf 已就绪） |
| 3 | **Registry Runtime 登记**：「物理共享 + 逻辑隔离」约束正式写入环境说明 | 小宝（维护）/ 珍珍（审定） | 本记录 §1 已书面声明；按 Components_Registry 规则补登（提案 §5 要求） |
| 4 | **P1 暂存区 + 排空器 + 自动同步** | 福斯 | 提案 §8 P1：暂存区上线、排空器拉取回写、提交幂等；cron 随此期启用 |
| 5 | **镜像内容扩展**（如需）：Nebula Onboarding 回执/索引层等增量纳入 | 福斯 | 现为精选集，可随时在脚本 EXCLUDES/SOURCES 调整后重跑 |

---

*福斯（fus）· 2026-08-14 · P0 上线记录 v1 · R 批准（R1-R6）后执行*
*依据：Universe_机制层上云提案_v1_20260814.md §8 P0；验收①④；四红线全过*
