KB-721D

GPT — Tổng hợp cấu trúc VPS + Prompt điều tra toàn diện cho Codex (2026-04-07)

17 min read Revision 1
reportgptvpsinvestigationcodexprompt2026-04-07

GPT — Tổng hợp cấu trúc VPS + Prompt điều tra toàn diện cho Codex

Date: 2026-04-07 Agent: GPT Mục tiêu: đọc SSOT/luật liên quan VPS, tổng hợp kiến trúc hiện trạng, và soạn prompt/lệnh điều tra toàn diện VPS cho Codex theo nguyên tắc read-only trước, evidence-first, ưu tiên log gần đây.


1) Cơ sở luật / SSOT đã đọc

A. VPS Operating Rules — SSOT

  • Luật 1: ĐỌC TRƯỚC KHI LÀM
  • Luật 2: KHÔNG SỬA TRỰC TIẾP TRÊN VPS
  • Luật 4: GITOPS LÀ NGUỒN SỰ THẬT
  • Luật 5: VERIFY TRƯỚC KHI BÁO CÁO

B. Luật Hạ tầng VPS — MỌI THỨ TRÊN MỘT SERVER

  • Khoản 1: VPS-FIRST
  • Khoản 2: PostgreSQL là đích đến / không thêm engine mới
  • Khoản 3: local storage tại /opt/incomex
  • Khoản 5: Docker stack mục tiêu

C. VPS Architecture — SSOT

  • VPS là production duy nhất
  • Provider: Contabo Cloud VPS 20, Ubuntu 24.04.4, 6 vCPU, 12 GB RAM, 96 GB NVMe
  • Public ports: 22/80/443
  • Services: postgres, qdrant, directus, agent-data, nuxt, nginx
  • Domains: vps / directus / ops

D. Báo cáo hiện trạng liên quan

  • S166-AUDIT: có drift Git/VPS, có scripts và DOT tools chỉ tồn tại trên VPS, crontab dài ~72 lines chưa vào git đầy đủ
  • S171A: điều tra SSH, loại trừ 6 tầng VPS-side; đã có bằng chứng phương pháp read-only + log-based
  • Tracker rev46: monitoring tạm hoạt động; còn open TD-MYSQL-LEGACY-SCAN, TD-VPS-LOG-FINAL-SCAN, TD-GIT-VPS-GH-SYNC-VERIFY, TD-CRON-SCRIPT-VPS-COMMIT, TD-VPS-UPLOAD, TD-VPS-REVCHECK

2) Ảnh chụp kiến trúc VPS hiện trạng

Hạ tầng

  • 1 VPS duy nhất (VPS-FIRST)
  • OS: Ubuntu 24.04.4 LTS
  • Public exposure chỉ nên có 22/80/443
  • Nginx là reverse proxy chuẩn

Stack đang vận hành

  • postgres — DB quan hệ chính
  • incomex-qdrant — vector DB
  • incomex-directus — CMS/API
  • incomex-agent-data — Knowledge API
  • incomex-nuxt — frontend SSR
  • incomex-nginx — reverse proxy

Cấu trúc file/quy ước quan trọng

  • /opt/incomex/docker/ — compose + nginx + env vận hành
  • /opt/incomex/scripts/ — scripts vận hành/health/check/backup
  • /opt/incomex/dot/bin/ — DOT tools
  • /opt/incomex/logs/ hoặc data/log archive — log ứng dụng
  • crontab production là cấu phần rất quan trọng nhưng có nguy cơ chưa được Git hóa đầy đủ

Rủi ro đã lộ từ SSOT/reports

  1. Drift giữa VPS và Git vẫn là rủi ro thực
  2. Có script/tool chỉ nằm trên VPS
  3. Có TD scan tàn dư MySQL chưa làm
  4. Có các bug/open items cần điều tra tận gốc qua log: upload, revision check, cron workaround, sync, alerting
  5. Cần log scan cuối toàn VPS theo roadmap S173D

3) Mục tiêu điều tra cho Codex

Codex phải trả lời bằng chứng cho 6 câu:

  1. VPS hiện có lỗi gì đang active hoặc tái diễn trong 7 ngày gần đây?
  2. Lỗi nào chỉ là noise, lỗi nào là symptom, lỗi nào là root cause candidate?
  3. Service/container nào có dấu hiệu bất ổn (restart, unhealthy, OOM, crash loop, timeout, 5xx, DB errors)?
  4. Có drift nào giữa runtime VPS và Git/SSOT không?
  5. Có dấu vết legacy trái kiến trúc hiện tại không (đặc biệt MySQL / Firestore / GCS / old container names / old domains)?
  6. Danh sách hành động ưu tiên theo mức độ: P0 khẩn cấp, P1 cao, P2 theo dõi.

4) Prompt/lệnh giao cho Codex

cat <<'CODEX_PROMPT' >/tmp/codex_vps_full_investigation_prompt.txt
Bạn là Codex chạy ĐIỀU TRA TOÀN DIỆN VPS INCOMEX theo chế độ READ-ONLY trước. Tuyệt đối tuân thủ:

A. LUẬT PHẢI TUÂN THỦ
1. Đọc trước khi làm:
   - knowledge/dev/ssot/operating-rules.md
   - knowledge/dev/ssot/vps/vps-architecture.md
   - knowledge/dev/ssot/vps/vps-operating-rules.md
2. KHÔNG sửa trực tiếp VPS.
3. KHÔNG restart/rebuild container, KHÔNG apt install, KHÔNG thay config, KHÔNG chmod/chown, KHÔNG xoá log, KHÔNG rotate log thủ công.
4. GITOPS là nguồn sự thật: mọi drift phải ghi nhận, không tự sửa.
5. VERIFY trước khi báo cáo: mọi kết luận phải có evidence cụ thể.

B. MỤC TIÊU
Điều tra toàn diện VPS để phát hiện vấn đề thực tế đang tồn tại hoặc đã xảy ra trong vài ngày gần đây, đặc biệt phải đọc kỹ log 7 ngày gần nhất, gom nhóm lỗi, khoanh vùng root cause candidate, rồi viết báo cáo có bằng chứng.

C. OUTPUT BẮT BUỘC
1. Một file báo cáo markdown: /tmp/vps_full_investigation_report.md
2. Một file evidence thô: /tmp/vps_full_investigation_evidence.txt
3. Cuối phiên, in ra:
   - TOP 10 lỗi / bất thường quan trọng nhất
   - P0 / P1 / P2
   - các mục KHÔNG CHẮC

D. PHƯƠNG PHÁP LÀM VIỆC
Làm theo thứ tự, không bỏ qua bước, không nhảy cóc.

==================================================
PHASE 0 — CONTEXT SNAPSHOT (READ-ONLY)
==================================================
set -o pipefail
{
  echo '===== BASIC ====='
  date -Is
  hostnamectl || true
  uptime || true
  whoami || true
  uname -a || true
  echo
  echo '===== OS / DISK / RAM ====='
  df -h || true
  free -h || true
  lsblk || true
  echo
  echo '===== NETWORK ====='
  ss -tulpn || true
  ip addr || true
  ip route || true
  ufw status verbose || true
  echo
  echo '===== DOCKER ====='
  docker ps -a --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}' || true
  docker stats --no-stream || true
  docker network ls || true
  docker volume ls || true
  echo
  echo '===== CRON / SYSTEMD ====='
  crontab -l || true
  systemctl list-units --type=service --state=running || true
} | tee /tmp/vps_full_investigation_evidence.txt

==================================================
PHASE 1 — MAP FILESYSTEM / RUNTIME / DRIFT CANDIDATES
==================================================
{
  echo
  echo '===== /opt/incomex tree ====='
  find /opt/incomex -maxdepth 3 -type f | sort || true
  echo
  echo '===== compose/nginx/scripts/dot ====='
  ls -lah /opt/incomex/docker || true
  ls -lah /opt/incomex/docker/nginx/conf.d || true
  ls -lah /opt/incomex/scripts || true
  ls -lah /opt/incomex/dot/bin || true
  echo
  echo '===== recent file changes 7d ====='
  find /opt/incomex -type f -mtime -7 2>/dev/null | sort || true
} | tee -a /tmp/vps_full_investigation_evidence.txt

Nếu có git checkout trên VPS thì chạy read-only:
{
  echo
  echo '===== git status candidates ====='
  find /opt -maxdepth 4 -type d -name .git 2>/dev/null | sed 's#/.git##' | while read repo; do
    echo "--- REPO: $repo ---"
    git -C "$repo" status --short || true
    git -C "$repo" branch -vv || true
    git -C "$repo" log --oneline --decorate -n 15 || true
    git -C "$repo" remote -v || true
  done
} | tee -a /tmp/vps_full_investigation_evidence.txt

==================================================
PHASE 2 — LOG SCAN 7 NGÀY GẦN NHẤT (QUAN TRỌNG NHẤT)
==================================================
Mục tiêu: đọc cả system logs + docker logs + app logs + cron logs. Không chỉ grep error; phải phân loại pattern.

1) System/journal logs:
{
  echo
  echo '===== journalctl priority 0..4 since 7d ====='
  journalctl --since '7 days ago' -p 0..4 --no-pager || true
  echo
  echo '===== journalctl ssh/nginx/docker/containerd/fail2ban/cron since 7d ====='
  journalctl --since '7 days ago' -u ssh -u nginx -u docker -u containerd -u fail2ban -u cron --no-pager || true
  echo
  echo '===== kernel warnings/errors since 7d ====='
  journalctl -k --since '7 days ago' --no-pager || true
} | tee -a /tmp/vps_full_investigation_evidence.txt

2) Traditional logs nếu tồn tại:
{
  echo
  echo '===== /var/log scan ====='
  find /var/log -maxdepth 2 -type f \( -name '*.log' -o -name 'syslog*' -o -name 'auth.log*' -o -name 'kern.log*' \) | sort || true
  echo
  for f in /var/log/syslog /var/log/auth.log /var/log/kern.log /var/log/nginx/error.log /var/log/nginx/access.log; do
    [ -f "$f" ] && { echo "===== FILE: $f ====="; tail -n 400 "$f"; echo; }
  done
} | tee -a /tmp/vps_full_investigation_evidence.txt

3) Docker logs 7 ngày gần nhất cho từng container:
for c in $(docker ps -a --format '{{.Names}}'); do
  {
    echo
    echo "===== DOCKER LOGS: $c (last 7d) ====="
    docker logs --since 168h "$c" 2>&1 || true
  } | tee -a /tmp/vps_full_investigation_evidence.txt
done

4) App logs / custom logs / script logs:
{
  echo
  echo '===== custom log files under /opt/incomex ====='
  find /opt/incomex \( -path '*/logs/*' -o -name '*.log' -o -name '*.out' -o -name '*.err' \) -type f 2>/dev/null | sort || true
}

find /opt/incomex \( -path '*/logs/*' -o -name '*.log' -o -name '*.out' -o -name '*.err' \) -type f 2>/dev/null | sort | while read f; do
  {
    echo
    echo "===== APP LOG FILE: $f ====="
    stat "$f" || true
    tail -n 300 "$f" || true
  } | tee -a /tmp/vps_full_investigation_evidence.txt
 done

5) Grep patterns lỗi trọng yếu (7d nếu log có timestamp; nếu không có thì scan tail gần đây):
{
  echo
  echo '===== GREP CRITICAL PATTERNS ====='
  PAT='error|exception|fatal|panic|oom|out of memory|killed process|segfault|denied|refused|timeout|timed out|5[0-9][0-9]|4[0-9][0-9]|failed|unhealthy|restart|crash|traceback|migration|database|postgres|qdrant|directus|nuxt|nginx|upload|revision|webhook|cron'
  journalctl --since '7 days ago' --no-pager 2>/dev/null | grep -Eai "$PAT" || true
  for f in $(find /var/log /opt/incomex 2>/dev/null -type f \( -name '*.log' -o -name '*.out' -o -name '*.err' -o -name 'syslog*' -o -name 'auth.log*' \)); do
    grep -Eai "$PAT" "$f" || true
  done
} | tee -a /tmp/vps_full_investigation_evidence.txt

==================================================
PHASE 3 — HEALTH / RESTART / RESOURCE / PORT / CERT / HTTP VERIFY
==================================================
{
  echo
  echo '===== docker inspect health/restart ====='
  for c in $(docker ps -a --format '{{.Names}}'); do
    echo "--- $c ---"
    docker inspect "$c" --format 'Name={{.Name}} State={{.State.Status}} Health={{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}} RestartCount={{.RestartCount}} StartedAt={{.State.StartedAt}} FinishedAt={{.State.FinishedAt}}' || true
  done
  echo
  echo '===== top CPU/MEM ====='
  ps aux --sort=-%mem | head -n 30 || true
  echo
  echo '===== open public ports ====='
  ss -ltnp || true
  echo
  echo '===== curl public endpoints ====='
  curl -IksS https://vps.incomexsaigoncorp.vn || true
  curl -IksS https://directus.incomexsaigoncorp.vn/server/health || true
  curl -IksS https://ops.incomexsaigoncorp.vn/items/tasks?limit=1 || true
  echo
  echo '===== certificate info ====='
  echo | openssl s_client -connect vps.incomexsaigoncorp.vn:443 -servername vps.incomexsaigoncorp.vn 2>/dev/null | openssl x509 -noout -dates -issuer -subject || true
  echo | openssl s_client -connect directus.incomexsaigoncorp.vn:443 -servername directus.incomexsaigoncorp.vn 2>/dev/null | openssl x509 -noout -dates -issuer -subject || true
  echo | openssl s_client -connect ops.incomexsaigoncorp.vn:443 -servername ops.incomexsaigoncorp.vn 2>/dev/null | openssl x509 -noout -dates -issuer -subject || true
} | tee -a /tmp/vps_full_investigation_evidence.txt

==================================================
PHASE 4 — DATABASE / LEGACY / ARCHITECTURE VIOLATION SCAN
==================================================
Mục tiêu: tìm bằng chứng trái SSOT, đặc biệt MySQL/Firestore/GCS/old domain/container/name.

{
  echo
  echo '===== legacy process/container scan ====='
  docker ps -a --format '{{.Names}} {{.Image}}' | grep -Eai 'mysql|mariadb|firestore|firebase|gcs|cloudsql|workflow-postgres|uptime|prefect|kestra|ai\.' || true
  ps aux | grep -Eai 'mysql|mariadb|firestore|firebase|gcs|cloudsql|workflow-postgres|uptime-kuma|prefect|kestra' | grep -v grep || true
  echo
  echo '===== legacy file reference scan /opt/incomex ====='
  grep -RInE 'mysql|mariadb|firestore|firebase|gcs|cloudsql|workflow-postgres|ai\.incomexsaigoncorp\.vn|artifact registry|app engine|cloud run' /opt/incomex 2>/dev/null || true
} | tee -a /tmp/vps_full_investigation_evidence.txt

Nếu có psql access local không cần secret lộ ra màn hình thì kiểm read-only:
{
  echo
  echo '===== postgres basic ====='
  docker exec postgres psql -U postgres -d postgres -c '\l' || true
} | tee -a /tmp/vps_full_investigation_evidence.txt

==================================================
PHASE 5 — CRON / BACKUP / SCRIPT RISK SCAN
==================================================
{
  echo
  echo '===== crontab with line numbers ====='
  crontab -l | nl -ba || true
  echo
  echo '===== recent cron-related logs ====='
  journalctl --since '7 days ago' -u cron --no-pager || true
  echo
  echo '===== backup/script logs ====='
  grep -RInE 'backup|cron|heartbeat|disk|alert|push' /opt/incomex/scripts /opt/incomex 2>/dev/null || true
  echo
  echo '===== backup folders ====='
  ls -lah /opt/incomex/backups || true
  find /opt/incomex/backups -maxdepth 3 -type f -mtime -7 2>/dev/null | sort || true
  ls -lah /opt/workflow/postgres/backups 2>/dev/null || true
} | tee -a /tmp/vps_full_investigation_evidence.txt

==================================================
PHASE 6 — PHÂN TÍCH VÀ KHOANH VÙNG
==================================================
Dựa trên evidence, tự tổng hợp thành report markdown với cấu trúc BẮT BUỘC:

# VPS Full Investigation Report

## 1. Executive Summary
- Tình trạng tổng quan
- Top 10 vấn đề đáng chú ý nhất

## 2. Current Architecture Observed
- Ghi cái quan sát được thực tế
- Chỉ ra điểm nào khớp SSOT, điểm nào lệch SSOT

## 3. Error Inventory (7 days)
Lập bảng:
- ID
- timestamp/range
- source log
- service/component
- raw symptom
- frequency
- impact
- root-cause hypothesis
- confidence (high/medium/low)
- evidence reference

## 4. Grouped Findings
Nhóm tối thiểu theo:
- system/kernel/resource
- docker/container health
- nginx/http/ssl
- postgres/directus/agent-data/qdrant/nuxt
- cron/backup/scripts
- security / public exposure
- drift / gitops / SSOT violations
- legacy residue

## 5. Root Cause Candidates
Không chỉ lặp lại symptom. Phải gom và nêu:
- candidate
- tại sao nghĩ vậy
- bằng chứng ủng hộ
- bằng chứng phản bác
- mức chắc chắn

## 6. Priority Actions
- P0: cần xử lý ngay
- P1: cần xử lý sớm
- P2: nên xử lý/giám sát
Mỗi mục phải có: lý do, evidence, rủi ro nếu không làm.

## 7. Unknowns / KHÔNG CHẮC
Liệt kê rõ thứ gì chưa đủ bằng chứng.

## 8. Appendix
- Các lệnh đã chạy
- danh sách file log đã đọc
- danh sách container/services đã kiểm

YÊU CẦU CHẤT LƯỢNG:
- Không được kết luận quá đà.
- Mọi kết luận phải bám evidence cụ thể.
- Nếu có 1 lỗi xuất hiện nhiều lần, phải gom cụm thay vì spam từng dòng.
- Phải phân biệt: noise / symptom / root cause candidate / confirmed issue.
- Phải chỉ ra rõ log nào trong 7 ngày gần đây là quan trọng nhất.

==================================================
PHASE 7 — IN KẾT LUẬN CUỐI PHIÊN
==================================================
Sau khi viết xong report:
cat /tmp/vps_full_investigation_report.md

echo
echo '===== TOP 10 ISSUES ====='
grep -n '^## 1\. Executive Summary\|^## 3\. Error Inventory\|^## 6\. Priority Actions' /tmp/vps_full_investigation_report.md || true

echo
echo 'Report saved at: /tmp/vps_full_investigation_report.md'
echo 'Evidence saved at: /tmp/vps_full_investigation_evidence.txt'

CODEX_PROMPT

printf 'Prompt da luu: /tmp/codex_vps_full_investigation_prompt.txt\n'
printf 'Hay dua NGUYEN van prompt nay cho Codex tren VPS de no thuc hien read-only investigation.\n'

5) Ghi chú chiến lược cho người giao việc

  • Prompt trên cố ý ép Codex làm READ-ONLY trước, đúng VPS Operating Rules.
  • Nó ưu tiên log 7 ngày gần nhất, vì đây là phần user yêu cầu quan trọng nhất.
  • Nó buộc Codex phân biệt noise / symptom / root-cause candidate / confirmed issue, tránh kiểu liệt kê log rác.
  • Nó có thêm lớp scan legacy residue để bắt các dấu vết trái kiến trúc mới: MySQL, Firestore, GCS, old container names, old domains.
  • Nó có scan cron / backup / drift vì các báo cáo hiện trạng cho thấy đây là vùng rủi ro thật.

6) Kết luận của GPT

Từ Agent Data hiện có, bức tranh kiến trúc đúng chuẩn cần hiểu là:

  • Hệ thống production chạy trên 1 VPS duy nhất.
  • Stack chính hiện tại là postgres + qdrant + directus + agent-data + nuxt + nginx.
  • Mối nguy lớn không chỉ là container down, mà là drift giữa VPS và Git, script/cron chỉ tồn tại trên VPS, legacy residue, và lỗi phát sinh lặp lại trong log nhưng chưa được gom thành root cause.
  • Prompt ở trên phù hợp để Codex làm một vòng điều tra toàn diện, có bằng chứng, ưu tiên log gần đây, rồi xuất ra báo cáo hành động.

GPT hiện mới đọc Agent Data và tổng hợp/soạn prompt. GPT CHƯA trực tiếp đọc runtime/log thật trên VPS trong phiên này.