Ngày lập: 2026-07-20
Trạng thái: ✅ Bước 1–2 đã hoàn thành và xác minh
Mục tiêu: Đưa sàn GVI (Gold VN Invest) từ trạng thái "seed thiếu" → vận hành đầy đủ tính năng
| Mức độ | Vấn đề | Trạng thái Trước | Trạng thái Sau |
|---|---|---|---|
| 🔴 CRITICAL | role_permission — User role có 0 quyền |
0 perms | ✅ 60 perms |
| 🔴 CRITICAL | binarySettings — key thiếu hoàn toàn trong DB |
0 records | ✅ Đã insert |
| 🔴 CRITICAL | exchange enable — kucoin + xt status=0 |
1/3 active | ✅ 3/3 active |
| 🟠 HIGH | binary_market — có 16 cặp sai (messy) |
16 rows sai | ✅ 7 rows đúng |
| 🟠 HIGH | staking_pool — tên tiếng Việt không khớp seeder |
6 rows VN | ✅ +5 rows EN |
| 🟠 HIGH | investment_plan — tên không khớp canonical |
6 rows VN | ✅ +5 rows EN |
| 🟠 HIGH | ecosystem_market — thiếu GIV pairs |
8 rows | ✅ Đủ pairs |
| 🟡 MEDIUM | announcement — 2 title sai text |
Title mismatch | ✅ Corrected |
| 🟡 MEDIUM | slider — thiếu gvi-protect.jpg |
5 slides | ✅ 6 slides |
| 🟡 MEDIUM | page — About/Terms/Privacy chưa tồn tại |
0 pages | ✅ 3 pages |
| 🟡 MEDIUM | Redis cache binarySettings — không có standalone key |
Missing | ✅ Seeded |
backend/seeders/20260720000004-gvi-fix-critical.jsMục tiêu: Sửa các lỗi block hoàn toàn tính năng nền tảng.
role_permission — Seed quyền cho User roleVấn đề:
Role User có 0 permissions. Người dùng sau khi đăng ký không thể:
Giải pháp:
Seed 60 user-facing permissions vào role_permission cho roleId của User:
access.api.key, view.wallet, view.transaction, create.deposit, create.withdraw,
create.transfer, view.exchange.balance, create.exchange.order, create.binary.order,
create.futures.order, create.investment, create.staking.position,
view.affiliate.referral, view.faq, view.blog.post, create.support.ticket,
access.copy_trading, view.kyc.application ... (60 perms total)
Kết quả: role_permission (User): +60 permissions
binarySettings — Insert key thiếuVấn đề:
Key binarySettings không tồn tại trong bảng settings. Backend binary trading engine không thể load cấu hình → lỗi silent khi users đặt lệnh binary.
Giải pháp:
Insert binarySettings JSON đầy đủ bao gồm:
global: enabled, practiceEnabled, maxConcurrentOrders=10, cooldownSeconds=3orderTypes: RISE_FALL (75%), HIGHER_LOWER (72%), TOUCH_NO_TOUCH (83%), CALL_PUT (69%), TURBO (68%)durations: 1m, 2m, 3m, 5m, 10m, 15m, 30m, 60m với profitAdjustment per-durationcancellation rules, riskManagementKết quả: settings: +1 keys (binarySettings inserted)
exchange enable — Kích hoạt KuCoin + XTVấn đề:
Chỉ Binance (status=1), còn KuCoin và XT đều status=0 → sàn chỉ có 1 nguồn giá/thanh khoản.
Giải pháp:UPDATE exchange SET status = 1 WHERE name IN ('kucoin', 'xt', 'binance')
Kết quả: exchange enabled: [kucoin, binance, xt]
binary_market — Cleanup + đảm bảo 7 pairs đúngVấn đề:
Bảng có 16 cặp bao gồm nhiều cặp không hợp lệ cho binary (ADA, DOT, TRX, LINK, MATIC, BTC/VNIK, GIV/VNL, GIV/USDT).
Giải pháp:
Whitelist binary markets:
| Symbol | Pair | minAmount | maxAmount |
|---|---|---|---|
| BTC | USDT | 5 | 10,000 |
| ETH | USDT | 5 | 10,000 |
| BNB | USDT | 5 | 5,000 |
| SOL | USDT | 5 | 5,000 |
| XRP | USDT | 5 | 5,000 |
| DOGE | USDT | 2 | 2,000 |
| GIV | VNIK | 1,000 | 10,000,000 |
Kết quả: binary_market: cleaned + 0 inserted (7 rows)
staking_pool — English canonical namesVấn đề:
DB chỉ có staking pools với tên tiếng Việt (từ seeder cũ), không có English canonical names mà seeder chuẩn cần.
Kết quả: staking_pool: +5 (GIV Flexible, GIV 30-Day Lock, USDT Savings, BTC Yield, ETH Yield)
investment_plan — Canonical plan namesVấn đề:
DB chỉ có plans với name: starter_vnd, growth_vnd, etc. — không có canonical gvi_starter, gvi_growth, giv_locked.
Kết quả: investment_plan: +5 (gvi_starter, gvi_growth, gvi_premium, gvi_btc, giv_locked)
backend/seeders/20260720000005-gvi-fix-medium.jsannouncement — Sửa 2 title saiBản ghi sai:
"...cấp phép vận hành..." → "...cấp phép hoạt động..." (đúng văn bản pháp lý)"...Hỗ trợ ngân hàng Việt Nam" → "...Hỗ trợ chuyển khoản ngân hàng Việt Nam"Kết quả: announcement: 2 corrected, +0 inserted
slider — Thêm banner Quỹ Bảo VệVấn đề:
DB có 5 slides nhưng thiếu banner quan trọng về Quỹ Bảo Vệ Tài Sản.
Kết quả: slider: +1 (gvi-protect.jpg — "Quỹ Bảo Vệ Tài Sản — Bảo Hiểm Rủi Ro")
Danh sách slider sau fix:
/img/slider/gvi-hero.jpg — Sàn Giao Dịch Tài Sản Số/img/slider/gvi-trade.jpg — (cũ, giữ nguyên)/img/slider/gvi-binary.jpg — Binary Options/img/slider/gvi-staking.jpg — Staking & Đầu Tư/img/slider/gvi-token.jpg — Token GIV/img/slider/gvi-protect.jpg — ✅ Mới Quỹ Bảo Vệ Tài Sảnpage — Seed 3 trang thiết yếuVấn đề:
Bảng page có 0 bản ghi — các trang About/Terms/Privacy không tồn tại → 404 khi user nhấn links.
Trang đã tạo:
| Slug | Tiêu đề | Status |
|---|---|---|
about |
Giới Thiệu — Gold VN Invest | PUBLISHED |
terms |
Điều Khoản Sử Dụng | PUBLISHED |
privacy |
Chính Sách Bảo Mật | PUBLISHED |
Kết quả: page: +3 (about/terms/privacy)
scripts/redis-seed-cache.jsCải tiến so với phiên bản cũ:
| Feature | Trước | Sau |
|---|---|---|
| Seed settings | ✅ Có | ✅ Có |
| Seed extensions | ✅ Có | ✅ Có |
| Seed binary_markets | ❌ Không | ✅ Mới |
| Seed staking_pools | ❌ Không | ✅ Mới |
| Permanent keys (no TTL) | ❌ Không | ✅ Mới |
| Standalone string keys | ❌ Không | ✅ setting:binarySettings |
| Skip-if-warm logic | ❌ Không | ✅ Skip nếu ≥100 keys |
--verify-only mode |
❌ Không | ✅ Mới |
--force mode |
❌ Không | ✅ Mới |
| DB integrity report | ❌ Chỉ verify 5 keys | ✅ 9 tables |
Permanent cache keys (TTL = 0, không bao giờ expire):
binarySettings → Redis hash "settings" + standalone "setting:binarySettings"
customSocialLinks → Redis hash "settings"
gatewayAllowedWalletTypes → Redis hash "settings"
binary_markets → Redis hash "binary_markets"
extensions → Redis hash "extensions"
staking_pools → Redis hash "staking_pools"
Lệnh chạy trước PM2 startup:
# Chạy lần đầu hoặc sau seed migration
node scripts/redis-seed-cache.js --force
# Kiểm tra trạng thái không ghi
node scripts/redis-seed-cache.js --verify-only
# Workflow chuẩn (idempotent - skip nếu đã warm)
node scripts/redis-seed-cache.js && pm2 restart backend
Kết quả cuối cùng (verified):
settings: 149 rows in DB, 149 in Redis ✅
extensions: 21 active in Redis ✅
binary_market: 7 rows ✅
investment_plan: 11 rows ✅
exchange: 3 total, 3 enabled ✅
page: 3 rows ✅
announcement: 5 rows ✅
slider: 6 rows ✅
User role perms: 60 permissions ✅
setting:binarySettings (standalone) = ✅ exists
Vấn đề: Hiện tại redis-seed-cache chỉ chạy thủ công. Cần tích hợp tự động.
Kế hoạch:
// ecosystem.config.js — pre-start hook
module.exports = {
apps: [{
name: "backend",
script: "backend/dist/index.js",
pre_start: "node scripts/redis-seed-cache.js", // ← thêm dòng này
// ...
}]
}
Hoặc tạo wrapper script:
#!/bin/bash
# scripts/start-backend.sh
node scripts/redis-seed-cache.js && pm2 start ecosystem.config.js --only backend
Vấn đề:
Bảng binary_duration có 6 rows (1, 3, 5, 15, 30, 60 phút) nhưng binarySettings.durations config có 8 durations (thêm 2m và 10m). Cần đồng bộ.
Kế hoạch — seeder tiếp theo:
// Thêm duration 2m và 10m nếu chưa có
const MISSING_DURATIONS = [
{ duration: 2, profitPercentage: 75, status: 1 }, // d_2m
{ duration: 10, profitPercentage: 80, status: 1 }, // d_10m
];
Vấn đề: kycStatus=true đã được set nhưng chưa verify:
Kế hoạch:
-- Kiểm tra
SELECT * FROM kyc_level;
SELECT COUNT(*) FROM kyc_application WHERE status = 'PENDING';
Checklist API cần verify sau khi restart backend:
# Settings API — must return 149 keys
curl https://goldvninvest.online/api/settings | jq '.total'
# Expected: 149
# Binary settings
curl https://goldvninvest.online/api/settings | jq '.binarySettings | .global.enabled'
# Expected: true
# Binary markets
curl https://goldvninvest.online/api/binary/market | jq '.total'
# Expected: 7
# Exchange list
curl https://goldvninvest.online/api/exchange | jq '[.[] | select(.status==1)] | length'
# Expected: 3
# Investment plans
curl https://goldvninvest.online/api/investment/plan | jq '.total'
# Expected: 11 (6 VN + 5 EN canonical)
# Pages
curl https://goldvninvest.online/api/page/about | jq '.status'
# Expected: "PUBLISHED"
| File | Loại | Mô tả |
|---|---|---|
backend/seeders/20260720000004-gvi-fix-critical.js |
✅ NEW | CRITICAL + HIGH fixes |
backend/seeders/20260720000005-gvi-fix-medium.js |
✅ NEW | MEDIUM fixes |
scripts/redis-seed-cache.js |
✅ UPDATED | Permanent cache + extended reporting |
| Table | Before | After | Delta |
|---|---|---|---|
role_permission (User) |
0 perms | 60 perms | +60 |
settings |
148 rows | 149 rows | +1 (binarySettings) |
exchange |
1 enabled | 3 enabled | +2 enabled |
binary_market |
16 rows (messy) | 7 rows (clean) | -9 removed, +0 |
staking_pool |
6 rows (VN) | 11 rows | +5 (EN canonical) |
investment_plan |
6 rows (VN) | 11 rows | +5 (EN canonical) |
announcement |
5 rows (2 wrong) | 5 rows (correct) | 2 updated |
slider |
5 rows | 6 rows | +1 (protect banner) |
page |
0 rows | 3 rows | +3 (about/terms/privacy) |
| Key | Before | After |
|---|---|---|
settings hash |
148 fields | 149 fields (binarySettings) |
setting:binarySettings |
❌ missing | ✅ standalone permanent |
binary_markets hash |
❌ missing | ✅ 7 fields |
staking_pools hash |
❌ missing | ✅ 11 fields |
Báo cáo sinh tự động bởi GVI Proof-of-Work Patch — 2026-07-20