1. Tổng Quan & Kiến Trúc
Mục Tiêu Phase 03
Triển khai toàn bộ lớp Backup Proxy JeOS và Hardened Repository JeOS trên cả hai site (Chính + DR). Sau khi hoàn thành, hệ thống đạt trạng thái sẵn sàng nhận backup jobs với bảo vệ immutability toàn diện. Đây là nền tảng bắt buộc trước khi cấu hình SOBR ở Phase 04.
Bảng Thành Phần Cần Triển Khai
| Component | Số Lượng | Site | Transport Mode | Mục Đích |
|---|---|---|---|---|
| Proxy JeOS (HotAdd) | 2 | Chính | Hot-Add (datastore access) | High-speed VM backup, không qua mạng |
| Proxy JeOS (Network) | 1 | DR | Network Mode | Backup tại site DR, linh hoạt cross-cluster |
| Hardened Repo JeOS | 1 | Chính | N/A | Immutable XFS storage, chống ransomware |
| Hardened Repo JeOS | 1 | DR | N/A | Immutable XFS tại DR, đáp ứng 3-2-1-1-0 |
Sơ Đồ Kiến Trúc
vCenter (Site Chính)
├── ESXi Host 1 ←── Proxy-01 (HotAdd, cùng datastore với VMs)
├── ESXi Host 2 ←── Proxy-02 (HotAdd, cùng datastore với VMs)
└── VMs (Production)
│ backup data (direct datastore read, không qua network)
↓
Repo-01 (XFS + reflink=1 + Immutable 30 days)
│ SOBR capacity tier (Phase 04)
↓
S3 Object Lock (Compliance Mode)
vCenter (Site DR)
└── ESXi Host DR ←── Proxy-DR-01 (Network Mode, 1Gbps WAN)
│ backup data (qua network)
↓
Repo-DR-01 (XFS + reflink=1 + Immutable 14 days)
│ offsite copy → đáp ứng 3-2-1-1-0 rule
↓
S3 Object Lock DR (Compliance Mode)
Lưu ý: HotAdd Proxy và VM cần cùng ESXi host hoặc cùng shared datastore. Nếu proxy ở host khác nhưng datastore không shared, Veeam sẽ tự động fallback sang Network Mode và ghi log cảnh báo.
2. Breaking Changes v13 — JeOS Specific
PHẢI ĐỌC trước khi triển khai — những thay đổi này KHÁC HOÀN TOÀN so với v12
- THAY ĐỔITất cả roles triển khai qua VIA ISO — không còn Windows installer cho Proxy/Repo. Rocky Linux được cài tự động qua VIA (Veeam Infrastructure Appliance) ISO.
- CRITICALJeOS chỉ chạy UEFI — BIOS firmware bị block ở level security policy. Nếu tạo VM với BIOS, VIA ISO sẽ khởi động nhưng từ chối cài đặt. Phải recreate VM với UEFI.
- THAY ĐỔICertificate-based pairing thay thế credential-based — v12 dùng SSH username/password để thêm Linux repo. v13 dùng TLS certificate exchange qua port 10443. Không cần mở SSH.
- SECURITYSSH disabled by default — Management chỉ qua HTTPS port 10443. SSH có thể enable tạm thời qua Host Management UI, tự động disable sau timeout (mặc định 1 giờ).
- IMPORTANTBlock generation trên XFS yêu cầu reflink=1 tại thời điểm format. Không thể enable reflink sau khi đã format. Phải reformat disk nếu quên tham số này.
- MỚISecurity Officer account bắt buộc trong wizard. Tài khoản này có quyền approve thay đổi infrastructure sau khi Backup Infrastructure Lock được bật (Section 7).
3. Phần 1: Deploy Proxy JeOS — Site Chính (×2)
Lặp lại toàn bộ các bước dưới đây cho cả proxy-01 và proxy-02. Chỉ thay đổi hostname và IP. Hai proxy chạy song song, VBR tự động load-balance jobs giữa chúng.
Bước 1 Tạo VM trong vSphere Client
| Thông Số | Giá Trị | Lý Do |
|---|---|---|
| Firmware | UEFI (BẮT BUỘC) | BIOS bị block, JeOS từ chối cài |
| vCPU | 8 vCPU | Max concurrent tasks = vCPU count |
| RAM | 10 GB | Veeam khuyến nghị 2 GB + 200 MB/task |
| Disk 1 (System) | 120 GB | Rocky Linux OS + Veeam agent |
| Disk 2 (Data/Log) | 120 GB | Veeam logs, cache temporary |
| SCSI Controller | VMware Paravirtual (PVSCSI) | Hiệu năng cao hơn LSI Logic |
| Network | Cùng segment với ESXi hosts | BẮT BUỘC cho HotAdd — proxy cần truy cập datastores qua vmkernel |
Quan trọng: Đặt tên VM theo FQDN ngay từ đầu: veeam-proxy-01 và veeam-proxy-02. Không đổi tên sau khi đã pair với VBR — certificate sẽ không còn valid.
Bước 2 Boot VIA ISO — Cài Đặt Tự Động
Mount VIA ISO vào VM (download từ Veeam ISO Repository). Boot VM và chờ GRUB menu xuất hiện:
┌─────────────────────────────────────────────────────┐
│ VEEAM INFRASTRUCTURE APPLIANCE v13 │
│ │
│ [1] Veeam Infrastructure Appliance ← CHỌN CÁI NÀY
│ [2] Veeam Hardened Repository ← Dùng cho Repo
│ [3] Boot from local disk │
│ │
│ (*) Tự động cài trong 5-7 phút, không cần internet │
│ (*) Rocky Linux 9, UEFI required │
│ (*) Disk 1 sẽ được partition/format tự động │
└─────────────────────────────────────────────────────┘
Sau khi chọn [1]:
→ Kernel loading...
→ Anaconda installer chạy tự động (không cần tương tác)
→ Rocky Linux 9 được cài trên /dev/sda
→ Veeam agent, certificates tự động provisioned
→ System reboot sau ~6 phút
→ Console hiện: "Veeam Infrastructure Appliance ready"
Kết quả mong đợi: VM boot vào màn hình text hiển thị IP (DHCP), port 10443 status: LISTENING. Chưa có static IP ở bước này — sẽ cấu hình qua wizard.
Bước 3 Initial Configuration Wizard (qua HTTPS:10443)
Truy cập https://<dhcp-ip>:10443 từ máy quản trị, chấp nhận self-signed certificate, hoàn thành wizard:
veeam-proxy-01.domain.local
Phải nhập FQDN, KHÔNG được nhập IP. Certificate được ký theo FQDN — nếu dùng IP, VBR sẽ từ chối kết nối khi validate certificate.
Ví dụ: 192.168.10.51/24, gateway 192.168.10.1. Sau khi save, web interface sẽ redirect sang IP mới.
Nhập DNS nội bộ để FQDN resolution hoạt động đúng: 192.168.10.1, 8.8.8.8. Kiểm tra: nslookup veeam-proxy-01.domain.local phải resolve về đúng IP.
Sync NTP trước mọi backup operation. Nếu lệch thời gian >5 phút, certificate handshake sẽ fail. Dùng NTP server nội bộ hoặc pool.ntp.org.
Password mạnh, tối thiểu 12 ký tự, có chữ hoa/thường/số/ký tự đặc biệt. Lưu ngay vào vault (CyberArk / KeePass) — không thể reset qua console nếu quên.
Tạo tài khoản riêng biệt (ví dụ: secoff-proxy01). Tài khoản này sẽ được yêu cầu approve khi Backup Infrastructure Lock bật. Giao cho người quản lý bảo mật, không phải IT ops thông thường.
Kết quả mong đợi: Sau khi wizard hoàn thành, truy cập được https://veeam-proxy-01.domain.local:10443 với certificate hợp lệ. Dashboard hiển thị status: Online.
Bước 4 Thêm vào VBR — Certificate-Based Authentication (v13 Mới)
# Quy trình trong VBR Console:
VBR Console
→ Backup Infrastructure
→ Managed Servers
→ Add Server
→ Linux Server
# Điền thông tin:
DNS Name: veeam-proxy-01.domain.local ← FQDN (không dùng IP)
Port: 10443
# Authentication: ← PHẦN THAY ĐỔI TRONG v13
[×] SSH credentials (v12 cũ)
[✓] Certificate-based authentication ← CHỌN CÁI NÀY
# Veeam sẽ fetch certificate từ appliance và hiển thị fingerprint:
Certificate Details:
Subject: CN=veeam-proxy-01.domain.local
Thumbprint: AA:BB:CC:DD:EE:FF:...
Valid until: 2026-05-03 (auto-renews)
# XÁC NHẬN fingerprint khớp với hiển thị trên Host Management UI:
→ Trên proxy: https://veeam-proxy-01.domain.local:10443
→ About → Certificate Fingerprint: AA:BB:CC:DD:EE:FF
# Nếu fingerprint khớp → Click "Connect"
# Connection established automatically ← không cần nhập password
Lỗi phổ biến nhất: Nhập IP thay vì FQDN
Certificate được ký theo FQDN. Nếu bạn kết nối qua IP, validation sẽ fail với lỗi: "Certificate CN mismatch: expected veeam-proxy-01.domain.local, got 192.168.10.51". Đảm bảo DNS A record tồn tại và resolve đúng trước khi thực hiện bước này.
Bước 5 Gán Backup Proxy Role & Cấu Hình Transport Mode
VBR Console
→ Backup Infrastructure
→ Backup Proxies
→ Add VMware Backup Proxy
# Wizard settings:
Server: veeam-proxy-01.domain.local (đã add ở Bước 4)
Transport mode: Virtual appliance (HotAdd)
← Proxy đọc data trực tiếp từ datastore, bypass network
← Yêu cầu proxy và VM cùng cluster hoặc shared datastore
Max concurrent tasks: 8
← Bằng số vCPU (1 task = 1 vCPU optimally utilized)
← Tăng lên 12-16 nếu vCPU = 16, nhưng monitor CPU/RAM trước
[✓] Failover to network mode if HotAdd unavailable
← Safety net: nếu HotAdd fail (VM không trên cùng datastore),
proxy tự động dùng network mode thay vì fail backup job
← Log warning khi failover xảy ra → kiểm tra placement issue
Connected datastores:
← VBR tự động scan và list datastores proxy có thể access
← Verify: tất cả production datastores phải xuất hiện ở đây
So Sánh Transport Modes:
| Mode | Tốc Độ | Yêu Cầu | Use Case |
|---|---|---|---|
| HotAdd (Virtual Appliance) | Rất nhanh (trực tiếp datastore) | Proxy cùng ESXi cluster, shared datastore | Site chính, production backup |
| Network Mode (NBD) | Chậm hơn (bị giới hạn 1Gbps) | Chỉ cần network access tới ESXi host | DR site, cross-cluster, linh hoạt |
| Direct SAN Access | Nhanh nhất (FC/iSCSI trực tiếp) | Physical backup server, FC HBA hoặc iSCSI | Enterprise SAN environment |
4. Phần 2: Deploy Proxy JeOS — Site DR (×1)
Thực hiện đúng 5 bước như Phần 1, chỉ thay đổi các thông số sau:
| Thông Số | Site Chính | Site DR (Thay Đổi) |
|---|---|---|
| Hostname | veeam-proxy-01/02.domain.local | veeam-proxy-dr-01.domain.local |
| Static IP | 192.168.10.51/52 | 192.168.20.51 (DR subnet) |
| Transport Mode | Virtual Appliance (HotAdd) | Network Mode (NBD) |
| Max Tasks | 8 (8 vCPU) | 4 (DR có ít VM hơn) |
| vCPU | 8 vCPU | 4 vCPU (tiết kiệm tài nguyên DR) |
DR proxy dùng Network Mode vì số lượng VMs ít hơn và WAN bandwidth là bottleneck, không phải CPU. Network Mode phù hợp vì không yêu cầu shared datastore giữa DR proxy và DR VMs.
5. Phần 3: Deploy Hardened Repository — Site Chính
Bước 1 Tạo VM trong vSphere Client
| Thông Số | Giá Trị | Lý Do |
|---|---|---|
| Firmware | UEFI (BẮT BUỘC) | Như proxy, BIOS bị block |
| vCPU | 8 vCPU | Xử lý deduplication, encryption, integrity check |
| RAM | 16 GB | Block generation cần nhiều RAM hơn proxy |
| Disk 1 (System) | 120 GB | Rocky Linux OS |
| Disk 2+ (Data) | Theo công thức bên dưới | Thêm nhiều disk nếu cần, XFS stripe tự động |
| SCSI Controller | PVSCSI | Hiệu năng I/O tối ưu cho storage |
| Network | Management network | Repo không cần cùng segment với ESXi hosts |
Công Thức Tính Dung Lượng Storage Data Disk
Công thức tổng quát:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Data Disk Size = (daily_change_GB × retention_days × 1.2)
+ full_backup_GB
+ 20% overhead cho block generation
Ví dụ thực tế (môi trường 200 VMs):
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Full backup tổng cộng : 5,000 GB (5 TB)
Daily change rate : 500 GB (10% của 5TB — typical cho production)
Retention period : 30 ngày
= (500 × 30 × 1.2) + 5,000
= 18,000 + 5,000
= 23,000 GB
+ 20% block generation overhead:
= 23,000 × 1.20 = 27,600 GB ≈ 27.6 TB
Kết luận: Provision ≥ 28 TB data disk cho scenario này.
Điều chỉnh theo môi trường:
- Change rate cao (>15%): nhân thêm hệ số 1.3 thay vì 1.2
- Dùng dedup: nhân với 0.7 (dedup ratio ~1.5:1 cho VMDKs)
- Retention 14 ngày: (500×14×1.2)+5,000 = 13,400 GB ≈ 14 TB
Bước 2 Boot VIA ISO → Chọn "Veeam Hardened Repository"
# Tại GRUB menu, chọn option [2] — KHÁC với proxy:
┌─────────────────────────────────────────────────────┐
│ VEEAM INFRASTRUCTURE APPLIANCE v13 │
│ │
│ [1] Veeam Infrastructure Appliance │
│ [2] Veeam Hardened Repository ← CHỌN CÁI NÀY
│ [3] Boot from local disk │
└─────────────────────────────────────────────────────┘
# Option [2] sẽ:
→ Cài Rocky Linux với hardened kernel parameters
→ Disable unnecessary services (NetworkManager, firewalld modified)
→ Enable XFS tools và Veeam Immutability module
→ Tạo veeamadmin user với sudo restricted
→ Expose management port 10443 ONLY
# QUAN TRỌNG: Data disk KHÔNG được format trong quá trình cài.
# Bạn sẽ format thủ công ở Bước 3 để đảm bảo reflink=1 được bật.
Bước 3 — CRITICAL Format Data Disk as XFS với Reflink (Bắt Buộc)
Bước này KHÔNG thể undo. Nếu format sai, phải xóa và recreate disk. KHÔNG thể enable reflink sau khi đã format.
# Bước 3.1 — Xác định data disk (KHÔNG phải system disk)
# SSH tạm thời hoặc qua Host Management → Terminal
lsblk
# Output mong đợi:
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# sda 8:0 0 120G 0 disk ← System disk (OS)
# sda1 8:1 0 100G 0 part /
# sda2 8:2 0 20G 0 part /var
# sdb 8:16 0 28T 0 disk ← DATA DISK ← DÙNG CÁI NÀY
# ← CHƯA có partition, chưa có mountpoint → đây là disk cần format
# Bước 3.2 — Tạo GPT partition table và partition
parted /dev/sdb mklabel gpt
parted /dev/sdb mkpart primary xfs 0% 100%
# Confirm với 'y' khi được hỏi
# Bước 3.3 — Format XFS với reflink ENABLED (CRITICAL)
mkfs.xfs -m reflink=1 -b size=4096 /dev/sdb1
# Tham số giải thích:
# -m reflink=1 → Enable reflink copy-on-write (BẮT BUỘC cho block generation)
# -b size=4096 → 4KB block size (recommended cho Veeam workloads)
# Output mong đợi khi format thành công:
# meta-data=/dev/sdb1 isize=512 agcount=8, ...
# data = bsize=4096 blocks=..., imaxpct=25
# naming =version 2 bsize=4096 ascii-ci=0, ftype=1
# log =internal log bsize=4096
# realtime =none extsz=4096
# Bước 3.4 — Xác minh reflink đã được bật (QUAN TRỌNG)
xfs_info /dev/sdb1 | grep reflink
# KẾT QUẢ MONG ĐỢI (phải có reflink=1):
# ftype=1,reflink=1,rmapbt=1,bigtime=1,inobtcount=1,nrext64=0
# Nếu output hiển thị reflink=0 hoặc reflink không có → DỪNG LẠI
# Format lại: mkfs.xfs -f -m reflink=1 -b size=4096 /dev/sdb1
# Bước 3.5 — Mount vĩnh viễn
mkdir -p /backups
echo "/dev/sdb1 /backups xfs defaults 0 0" >> /etc/fstab
mount -a
# Bước 3.6 — Xác minh mount
df -h /backups
# Output: /dev/sdb1 28T 200M 28T 1% /backups
Hậu quả nếu quên reflink=1: Immutability vẫn hoạt động bình thường. Nhưng fast-clone optimization (block generation cho SOBR) sẽ không hoạt động → Veeam phải copy dữ liệu đầy đủ thay vì reflink copy → tốn thêm ~20% storage và thời gian backup tăng đáng kể.
Bước 4 Thêm vào VBR as Hardened Repository
VBR Console
→ Backup Infrastructure
→ Backup Repositories
→ Add Backup Repository
# Step 1 — Chọn loại repository:
[×] Direct attached storage ← Không chọn
[×] Network attached storage ← Không chọn
[✓] Hardened Repository ← CHỌN CÁI NÀY (không phải "Linux")
# QUAN TRỌNG: Phải chọn "Hardened Repository", không phải "Linux Server"
# Nếu chọn "Linux Server", Veeam sẽ không kích hoạt
# immutability features và xattr locking.
# Step 2 — Server details:
Server: veeam-repo-01.domain.local ← FQDN
Port: 10443
# Step 3 — Authentication:
[✓] Certificate-based (tự động detect vì đây là JeOS appliance)
# Step 4 — Repository settings:
Path: /backups ← Mountpoint từ Bước 3
Max concurrent tasks: 8 ← Tùy thuộc vào backup jobs
# Step 5 — Immutability settings:
[✓] Make recent backups immutable for: 30 days
← Minimum recommended. Tăng lên
theo chính sách bảo mật (60/90 ngày)
[✓] Protect recent backups from deletion by data locking service
# Finish wizard → VBR kết nối và verify XFS capabilities
# VBR sẽ log: "Repository supports immutability (XFS with reflink)"
Bước 5 Xác Minh Immutability Hoạt Động
# Sau khi backup job đầu tiên chạy xong: # Phương pháp 1: Thử xóa backup file (via Host Management Terminal) # Enable SSH tạm thời: Host Management → Security → SSH → Enable (30 phút) ssh [email protected] # Kiểm tra FS flags trên backup file: lsattr /backups/Jobs/Job-01/2026-05-03T0300/Job-01D2026-05-03T0300.vbk # Output mong đợi: ----i--------e-- /backups/...vbk # ^ "i" = immutable flag set # Thử xóa (phải FAIL): rm /backups/Jobs/Job-01/2026-05-03T0300/Job-01D2026-05-03T0300.vbk # Kết quả mong đợi: # rm: cannot remove '...vbk': Operation not permitted ✅ # Thử thay đổi content (phải FAIL): echo "test" >> /backups/Jobs/Job-01/2026-05-03T0300/Job-01D2026-05-03T0300.vbk # Kết quả mong đợi: # bash: .../Job-01D2026-05-03T0300.vbk: Operation not permitted ✅ # Phương pháp 2: VBR Console VBR Console → Backups → Disk → [right-click job] → Properties # Tab "Storage": hiển thị "Immutability: Active (expires: 2026-06-02)"
Nếu cả hai thử nghiệm trên đều fail (Operation not permitted), immutability hoạt động đúng. Lưu screenshot kết quả vào tài liệu compliance.
6. Phần 4: Deploy Hardened Repository — Site DR
Thực hiện đúng 5 bước như Phần 3, với các thay đổi sau:
| Thông Số | Site Chính | Site DR |
|---|---|---|
| Hostname | veeam-repo-01.domain.local | veeam-repo-dr-01.domain.local |
| Immutability Period | 30 ngày | 14 ngày tối thiểu (DR budget thấp hơn) |
| Data Disk Size | ~28 TB (30-day retention) | ~14 TB (14-day retention) |
| Mount Point | /backups | /backups (giống nhau) |
DR repo với immutability 14 ngày vẫn đáp ứng yêu cầu "1 immutable copy" trong quy tắc 3-2-1-1-0. Nếu ngân sách cho phép, tăng lên 30 ngày để đồng nhất với site chính.
7. Cấu Hình Sau Triển Khai
Proxy Load Balancing — Tự Động
VBR tự động chọn proxy tốt nhất cho mỗi backup job. Không cần cấu hình thủ công. Thuật toán selection:
Khi backup job được trigger:
1. VBR scan danh sách proxies available (không đang chạy full load)
2. Ưu tiên proxy cùng ESXi host với VM (HotAdd direct)
3. Nếu không có: proxy cùng cluster (HotAdd qua shared datastore)
4. Nếu không có: proxy với least current tasks (load balancing)
5. Nếu tất cả proxies full: job queue và chờ
Monitoring load balancing:
VBR Console → Home → Last 24 Hours → Jobs
→ Click job → Statistics → Proxy column
→ Xem proxy nào được assign cho từng VM
Repository Task Limits — Công Thức
Max Tasks = min(vCPU_count, (RAM_GB - 2) / 0.5, storage_throughput_MB / 200)
Ví dụ: 8 vCPU, 16GB RAM, disk throughput 2000 MB/s
= min(8, (16-2)/0.5, 2000/200) = min(8, 28, 10) = 8 tasks
Backup Infrastructure Lock — Enable Sau Khi Xong Phase 03
Chỉ bật sau khi tất cả infrastructure đã được deploy xong. Sau khi bật, thêm hoặc xóa bất kỳ component nào (proxy, repo, managed server) đều yêu cầu Security Officer approve. Không thể undo nhanh trong trường hợp khẩn cấp.
VBR Console
→ Menu → Configuration
→ Security
→ Backup Infrastructure Protection
→ [✓] Enable Backup Infrastructure Protection
→ Require Security Officer approval for:
[✓] Adding backup repositories
[✓] Adding backup proxies
[✓] Removing managed servers
[✓] Modifying credentials
→ Save
# Sau khi bật, mọi thay đổi sẽ hiện notification:
# "Requires Security Officer approval (veeamadmin@secoff-repo01)"
8. JeOS Management Reference
| Task | Cách Thực Hiện | Lưu Ý |
|---|---|---|
| Kiểm tra system status | https://<fqdn>:10443 → Dashboard | Hiển thị CPU, RAM, disk, service status |
| Enable SSH tạm thời | Host Management → Security → SSH → Enable | Auto-disable sau timeout (default 1h). Log tất cả SSH sessions |
| Verify XFS reflink | xfs_info /backups | grep reflink | Phải thấy reflink=1 |
| Kiểm tra immutability status | VBR Console → Repo → right-click → Properties | Tab Storage, mục Immutability |
| Tạo mới pairing token | Host Management → Applications → Generate Token | Dùng khi cần re-add vào VBR sau certificate renewal |
| Xem immutable files | lsattr /backups/Jobs/ | grep "\-i" | Files có flag "i" = immutable |
| Update JeOS firmware | Host Management → Updates → Check for updates | Updates áp dụng qua Veeam Update Server, không cần internet |
9. Verification Checklist & Risk Assessment
Checklist Phase 03 Hoàn Thành
Risk Assessment & Mitigation
| Rủi Ro | Mức Độ | Biện Pháp Giảm Thiểu |
|---|---|---|
| HotAdd fails vì VM không trên cùng datastore | TRUNG BÌNH | Enable failover to network mode. Monitor logs sau backup jobs đầu tiên |
| XFS format không có reflink=1 | CAO | Verify với xfs_info | grep reflink TRƯỚC khi add vào VBR |
| Certificate mismatch (IP vs FQDN) | CAO | Tạo DNS A record trước, test nslookup trước khi add vào VBR |
| BIOS firmware → JeOS từ chối cài | CRITICAL | Kiểm tra firmware type trước khi boot. Phải recreate VM nếu sai |
| Backup Infrastructure Lock bật quá sớm | TRUNG BÌNH | Chỉ bật sau khi tất cả Phase 03 và Phase 04 hoàn thành và test xong |