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ínhincomex-qdrant— vector DBincomex-directus— CMS/APIincomex-agent-data— Knowledge APIincomex-nuxt— frontend SSRincomex-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
- Drift giữa VPS và Git vẫn là rủi ro thực
- Có script/tool chỉ nằm trên VPS
- Có TD scan tàn dư MySQL chưa làm
- Có các bug/open items cần điều tra tận gốc qua log: upload, revision check, cron workaround, sync, alerting
- 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:
- VPS hiện có lỗi gì đang active hoặc tái diễn trong 7 ngày gần đây?
- Lỗi nào chỉ là noise, lỗi nào là symptom, lỗi nào là root cause candidate?
- Service/container nào có dấu hiệu bất ổn (restart, unhealthy, OOM, crash loop, timeout, 5xx, DB errors)?
- Có drift nào giữa runtime VPS và Git/SSOT không?
- 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)?
- 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.