Sự cố toàn vẹn mã VPS SSOT — Codex triển khai nhầm từ GitHub cũ
SỰ CỐ TOÀN VẸN MÃ VPS SSOT — Codex triển khai nhầm từ GitHub cũ
Ngày khảo sát: 2026-07-11
Người báo cáo: Codex
Trạng thái: INCIDENT OPEN — DỪNG mọi deploy từ GitHub/Local
Chế độ khảo sát: Read-only trên VPS; không sửa code, không ghi DB, không restart/deploy trong lượt khảo sát này.
1. Tóm tắt dành cho Owner
Owner xác nhận quy tắc đúng: VPS là SSOT duy nhất của mã. GitHub và Local là mã cũ hàng năm, không phải nguồn triển khai.
Codex đã vi phạm quy tắc này khi tự dùng GitHub workflow để build và phủ artifact/config/DOT lên VPS.
Hiện website vẫn trả HTTP 200 ở các trang được smoke và Reports refresh đang hoạt động. Đây chỉ là kiểm tra bề mặt; không chứng minh toàn bộ mã mới trên VPS còn nguyên.
- Availability hiện tại: GREEN bề mặt.
- Code/source integrity: P0 / CRITICAL.
- DB: không có bằng chứng Codex đã ghi DB trong deploy Nuxt-only; migration và DB-writing steps được skip.
- Rollback tự động: không đủ tin cậy vì backup prev bị ghi đè nhiều vòng.
2. Bằng chứng VPS SSOT
2.1 Source Nuxt SSOT thật vẫn còn
Path: /opt/incomex/docker/nuxt-repo
main...origin/main [ahead 28, behind 13]
HEAD 2f92ecb feat(reports): live view_sql source for the shared reports mold
Source VPS có 28 commit riêng chưa có ở GitHub. Source Nuxt VPS chưa bị workflow rsync trực tiếp sửa; đây là nền phục hồi quan trọng.
2.2 Runtime Nuxt đã bị phủ bởi artifact GitHub
container=incomex-nuxt
image=asia-southeast1-docker.pkg.dev/github-chatgpt-ggcloud/web-test/nuxt-ssr:latest
started=2026-07-11T02:50:33Z
runtime=/opt/incomex/deploys/nuxt-output
runtime mtime=2026-07-11 04:49:53 +0200
1708 files, 43M
Source VPS còn, nhưng runtime hiện không được build từ source VPS SSOT.
2.3 DOT bị phủ trực tiếp
Workflow đã rsync GitHub dot/bin/ vào /opt/incomex/dot/bin/.
167 DOT files có cùng mtime 2026-07-11 04:47:37
43 tracked DOT files hiện modified
DOT diff stat: 622 insertions, 1433 deletions
Không thể khẳng định toàn bộ 43 diff đều do Codex vì working tree VPS vốn có thay đổi. Nhưng 167 timestamp giống thời điểm rsync chứng minh 167 file đã bị chạm/phủ. Workflow không backup DOT trước rsync. Đây là bề mặt nguy hiểm nhất.
2.4 Compose bị phủ
Current file: /opt/incomex/docker/docker-compose.yml, mtime 2026-07-11 04:50:30 +0200.
So với VPS root Git HEAD, diff có thay đổi hành vi đáng kể:
- Agent Data từ image local sang Artifact Registry cũ.
- Memory Agent Data từ biến cấu hình mặc định 2560m thành 1536m.
- Mất các biến kết nối Directus DB và PG của Agent Data.
- Nuxt từ image local sang Artifact Registry cũ.
- Thêm Reports PG env.
Các service khác chưa bị recreate trong deploy Nuxt-only nên hiện vẫn chạy image local cũ. Nhưng compose hiện tại là mìn cho lần recreate sau: lệnh compose tương lai có thể chuyển service sang image/config cũ.
2.5 Nginx bị phủ
/opt/incomex/docker/nginx/conf.d/default.conf
/opt/incomex/docker/nginx/conf.d/well-known-whitelist.conf
mtime 2026-07-11 04:50:30 +0200
Nginx hiện test được và route bề mặt trả 200. Tuy nhiên file đã bị thay từ GitHub, cần đối chiếu với bản VPS SSOT/backup VPS trước khi coi là đúng toàn bộ.
2.6 Backup hiện tại không đủ để rollback mù
/opt/incomex/deploys/nuxt-output.prev có mtime 2026-07-11 02:40:22 +0200.
Do nhiều lần deploy liên tiếp, prev đã bị ghi đè bằng artifact vòng GitHub trước. Infra-prev cũng chỉ là ảnh ngay trước deploy cuối, sau các vòng GitHub trước.
CẤM dùng prev, GitHub hoặc Local để rollback toàn bộ khi chưa forensic/hash compare.
3. Trạng thái dịch vụ hiện tại
200 /
200 /reports
200 /reports/report-pg
200 /reports/report-balo-table
200 /reports/report-loai
200 /knowledge/registries
200 /knowledge/workflows
200 /api/registries-pivot/summary
200 /api/mcp
Containers chính đang healthy. Không thấy Failed to fetch, ENOENT hoặc H3 500 mới trong Nuxt log kể từ deploy cuối. Đây là bằng chứng availability, không phải bằng chứng toàn vẹn tính năng.
4. Nguyên nhân gốc
- Codex hiểu sai authority, coi GitHub branch là code-to-deploy.
- Không tuân thủ OR v7.58: VPS là SSOT code/runtime; GitHub chỉ backup.
- Guard CI chỉ kiểm GitHub có đủ file, không kiểm GitHub cũ hơn VPS.
- Workflow cho phép build Nuxt từ GitHub, rsync toàn bộ DOT không backup, phủ compose/nginx và không có authority gate.
- Codex tự bật workflow, merge và deploy khi ba nguồn đang lệch.
5. Tuyệt đối không làm tiếp
- Không deploy từ GitHub hoặc Local.
- Không git reset-hard, checkout hoặc pull đè VPS.
- Không rollback toàn bộ từ nuxt-output.prev.
- Không rsync DOT/config từ GitHub.
- Không recreate Agent Data, Directus hoặc Postgres bằng compose hiện tại.
- Không sửa DB để làm xanh CI.
- Không coi HTTP 200 là chứng minh không mất tính năng.
6. Khuyến nghị phục hồi an toàn
Pha 0 — Đóng băng
- Vô hiệu hóa mọi auto-deploy GitHub → VPS.
- Không chạy docker compose up cho Agent Data/Directus/Postgres.
- Ghi nhận incident Owner gate.
Pha 1 — Chụp forensic VPS trước mọi sửa
Snapshot/manifest governed trên VPS cho:
/opt/incomex/docker/nuxt-repo;- current nuxt-output;
/opt/incomex/dot;- compose, nginx và secret references;
- container inspect/image IDs;
- Git status/diff mọi VPS repo;
- danh sách backup VPS và checksum.
Pha 2 — Ma trận phục hồi
| Bề mặt | Authority phục hồi |
|---|---|
| Nuxt source | /opt/incomex/docker/nuxt-repo |
| Nuxt runtime | rebuild từ source VPS sau khi ghép bản vá Reports tối thiểu |
| DOT | VPS backup/snapshot + forensic từng file; không dùng GitHub bulk |
| Compose | bản VPS trước sự cố + current live container inspect |
| Nginx | bản VPS trước sự cố + route inventory live |
| DB | read-only; chưa có bằng chứng cần phục hồi |
Pha 3 — Khôi phục mã VPS trước, rồi mới sửa Reports
- Dựng runtime từ source VPS SSOT.
- Đối chiếu tính năng mới trên VPS.
- Chỉ ghép phần sửa Reports tối thiểu vào source VPS: refresh request, no-store, table_id-only và verifier.
- Build từ VPS source, backup đầy đủ, deploy từ VPS.
- Chạy hai vòng nghiệm thu toàn hệ thống.
Pha 4 — Sau ổn định mới backup ngược
Luồng đúng: VPS SSOT → backup/snapshot → GitHub archival.
Luồng cấm: GitHub cũ → VPS SSOT.
7. Owner decision
Đây không còn là bug riêng nút Làm mới; đây là incident phục hồi code integrity nhiều bề mặt.
Khuyến nghị mission riêng: Forensic + phục hồi VPS SSOT sau Codex GitHub overwrite; read-only inventory trước, Owner/Hội đồng duyệt từng pha restore.
Không cho AI nào tự restore hàng loạt trước khi Pha 1 và ma trận Pha 2 được duyệt.
8. Tài liệu đối chiếu
- knowledge/dev/ssot/operating-rules.md — OR v7.58.
- knowledge/dev/ssot/vps/vps-operating-rules.md — v1.0.
- knowledge/dev/laws/constitution.md — v4.6.3.
- Live VPS read-only evidence ngày 2026-07-11.