📋 Giới thiệu

Trong Bài 2, chúng ta đã thiết lập backend (Google Apps Script + Google Sheets). Bây giờ, đến phần frontend: build và deploy webapp React lên internet để ai cũng có thể truy cập.

Điều tuyệt vời là:

  • Miễn phí 100% - Các gói free đủ dùng
  • Không cần server - Deploy static files
  • SSL tự động - HTTPS miễn phí
  • Custom domain - Có thể dùng tên miền riêng
  • Auto deploy - Tự động update khi push code

Các nền tảng được hướng dẫn:

  1. Vercel (Khuyên dùng - Tối ưu cho React/Vite)
  2. Netlify (Dễ dùng - Drag & drop)
  3. GitHub Pages (Đơn giản - Cho project open-source)

🎯 Yêu cầu chuẩn bị

Yêu cầuMô tảThời gian
Tài khoản GitHubĐể lưu code0 phút
Tài khoản Vercel/NetlifyĐể deploy2 phút
Backend đã deployTừ Bài 2-
Code frontendĐã clone về máy-

🚀 Bước 1: Build Project

1.1 Cài đặt dependencies

Mở terminal trong thư mục dự án:

npm install

1.2 Cấu hình API URL

Tạo file .env.production (hoặc sửa .env):

VITE_GAS_API_URL=https://script.google.com/macros/s/YOUR_DEPLOYMENT_ID/exec

Thay YOUR_DEPLOYMENT_ID bằng ID từ Bài 2.

Lưu ý quan trọng:

  • ✅ Dùng biến môi trường để dễ chuyển đổi giữa dev/production
  • ✅ Không commit .env lên GitHub (đã có trong .gitignore)

1.3 Build project

npm run build

Kết quả:

  • Thư mục dist/ sẽ được tạo ra
  • Chứa tất cả files HTML, CSS, JS đã optimize
  • Sẵn sàng để deploy

Kiểm tra build:

ls -lh dist/

Bạn sẽ thấy:

index.html
assets/
  - index.xxx.js
  - index.xxx.css

🌐 Bước 2: Deploy lên Vercel (Khuyên dùng)

Vercel là nền tảng tốt nhất cho React/Vite với:

  • Auto deploy từ GitHub
  • Edge network (nhanh toàn cầu)
  • Analytics miễn phí
  • Custom domain miễn phí

2.1 Lấy code từ repository

Clone repository của TNTT Management:

git clone https://github.com/dongthinhlong/TNTT-MANAGEMENT.git
cd TNTT-MANAGEMENT

Hoặc tải về:

2.2 Cài đặt dependencies

npm install

2.3 Push code lên GitHub (nếu muốn auto deploy)

Tạo repository mới trên GitHub của bạn, sau đó:

git init
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/YOUR_USERNAME/TNTT-MANAGEMENT.git
git push -u origin main

2.2 Tạo project trên Vercel

  1. Truy cập Vercel.com
  2. Sign up với GitHub
  3. Nhấn Add NewProject
  4. Tìm repository TNTT-MANAGEMENTImport

Vercel Import

2.3 Cấu hình project

TrườngGiá trịGhi chú
Framework PresetViteTự động detect
Root Directory.Thư mục gốc
Build Commandnpm run buildMặc định
Output DirectorydistMặc định

Environment Variables: Click Environment Variables → Thêm:

VITE_GAS_API_URL = https://script.google.com/macros/s/YOUR_DEPLOYMENT_ID/exec

2.4 Deploy!

Nhấn Deploy và chờ ~2 phút.

Kết quả:

🎉 Your project has been deployed!
https://tntt-management.vercel.app

📌 Ghi lại URL này! Đây là webapp production của bạn.

2.5 Auto deploy khi push code

Mỗi khi bạn push code lên GitHub, Vercel sẽ:

  1. Tự động detect thay đổi
  2. Build lại project
  3. Deploy version mới
  4. Update URL production

Không cần làm gì thêm!


🌐 Bước 3: Deploy lên Netlify (Alternative)

Netlify nổi tiếng với drag & drop cực đơn giản.

3.1 Cách 1: Deploy từ GitHub (Khuyên dùng)

  1. Truy cập Netlify.com
  2. Sign up với GitHub
  3. Nhấn Add new siteImport an existing project
  4. Chọn GitHub → Chọn repository
  5. Cấu hình:
TrườngGiá trị
Base directory.
Build commandnpm run build
Publish directorydist

Environment Variables: Click AdvancedEnvironment variables:

VITE_GAS_API_URL = https://script.google.com/macros/s/YOUR_DEPLOYMENT_ID/exec
  1. Nhấn Deploy site

3.2 Cách 2: Drag & Drop (Không cần GitHub)

  1. Build project: npm run build
  2. Truy cập Netlify Drop
  3. Kéo thư mục dist/ vào ô trống
  4. Đợi upload xong
  5. Done! Site online ngay lập tức

Nhược điểm: Mỗi lần sửa code phải build & drag lại.

3.3 Cấu hình Netlify (Tùy chọn)

Tạo file netlify.toml trong thư mục gốc:

[build]
  command = "npm run build"
  publish = "dist"

[[redirects]]
  from = "/*"
  to = "/index.html"
  status = 200

Redirects giúp SPA routing hoạt động đúng (không bị 404 khi refresh).


🌐 Bước 4: Deploy lên GitHub Pages (Đơn giản nhất)

GitHub Pages hoàn toàn miễn phí và tích hợp sẵn với GitHub.

4.1 Cài đặt package

npm install -D gh-pages

4.2 Thêm scripts vào package.json

{
  "scripts": {
    "predeploy": "npm run build",
    "deploy": "gh-pages -d dist"
  },
  "homepage": "https://YOUR_USERNAME.github.io/TNTT-MANAGEMENT"
}

Lưu ý:

  • Thay YOUR_USERNAME bằng username GitHub của bạn
  • homepage phải đúng format như trên

4.3 Cấu hình base path trong vite.config.ts

export default defineConfig({
  plugins: [react()],
  base: '/TNTT-MANAGEMENT/', // Tên repository
  build: {
    outDir: 'dist',
    // ...
  }
});

4.4 Deploy

npm run deploy

Kết quả:

https://YOUR_USERNAME.github.io/TNTT-MANAGEMENT/

🎨 Bước 5: Custom Domain (Tùy chọn)

5.1 Mua tên miền

Mua tên miền từ:

  • Namecheap (~$10/năm)
  • Google Domains (~$12/năm)
  • GoDaddy (~$15/năm)

Ví dụ: tntt-management.com

5.2 Cấu hình trên Vercel

  1. Vào project Vercel → SettingsDomains
  2. Thêm domain: tntt-management.com
  3. Vercel cung cấp DNS records:
    Type: A
    Name: @
    Value: 76.76.21.21
    
    Type: CNAME
    Name: www
    Value: cname.vercel-dns.com
    
  4. Cấu hình DNS tại nơi mua tên miền
  5. Chờ 1-24 giờ để DNS propagate

5.3 Cấu hình trên Netlify

  1. Vào site Netlify → Domain settings
  2. Add custom domain
  3. Netlify cung cấp DNS:
    Type: CNAME
    Name: @
    Value: tntt-management.netlify.app
    
  4. Cấu hình DNS tại nơi mua tên miền

🔒 Bước 6: Bảo mật & Tối ưu

6.1 Bảo vệ API URL

Vấn đề: API URL có thể bị public

Giải pháp:

  • ✅ Không commit .env lên GitHub (đã có trong .gitignore)
  • ✅ Dùng environment variables trên Vercel/Netlify
  • ✅ Giới hạn CORS trong backend (nếu cần)

6.2 HTTPS bắt buộc

Tất cả nền tảng đều cung cấp HTTPS miễn phí:

  • ✅ SSL tự động từ Let’s Encrypt
  • ✅ Không cần cấu hình thêm
  • ✅ Tự động renew

6.3 Performance optimization

Lazy loading

Vite đã optimize tự động, nhưng bạn có thể:

// Dynamic import
const Dashboard = lazy(() => import('./components/Dashboard'));

Image optimization

  • Dùng WebP format
  • Lazy load images
  • Dùng CDN cho assets lớn

Caching

Vercel/Netlify tự động cache static files:

  • CSS/JS: 1 năm
  • HTML: No-cache
  • Images: 1 năm

6.4 Analytics

Vercel Analytics (Miễn phí)

  1. Vào project → Analytics
  2. Enable → Done!

Xem:

  • Page views
  • Unique visitors
  • Bounce rate
  • Geography

Google Analytics (Tùy chọn)

Thêm vào index.html:

<script async src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'GA_MEASUREMENT_ID');
</script>

🐛 Xử lý sự cố

Lỗi “Build failed”

Nguyên nhân: Lỗi TypeScript hoặc thiếu dependencies

Giải pháp:

# Kiểm tra build local
npm run build

# Sửa lỗi nếu có
# Sau đó push lại
git add .
git commit -m "Fix build error"
git push

Lỗi “404 Not Found” khi refresh

Nguyên nhân: SPA routing không được cấu hình

Giải pháp:

Vercel: Tạo file vercel.json:

{
  "rewrites": [{ "source": "/(.*)", "destination": "/" }]
}

Netlify: Tạo file public/_redirects:

/*    /index.html   200

GitHub Pages: Đã cấu hình trong vite.config.ts

Lỗi “API URL không đúng”

Nguyên nhân: Biến môi trường không được set

Giải pháp:

  1. Kiểm tra Vercel/Netlify → Settings → Environment Variables
  2. Đảm bảo VITE_GAS_API_URL đã được set
  3. Redeploy project

Lỗi “CORS Error”

Nguyên nhân: Backend không cho phép truy cập từ domain

Giải pháp:

  1. Kiểm tra backend đã deploy đúng chưa
  2. Đảm bảo “Who has access” = “Anyone”
  3. Xóa cache trình duyệt

Site tải chậm

Nguyên nhân: File quá lớn hoặc network chậm

Giải pháp:

  1. Kiểm tra bundle size:
    npm run build -- --report
    
  2. Optimize dependencies
  3. Dùng CDN cho libraries lớn

📊 So sánh các nền tảng

Tính năngVercelNetlifyGitHub Pages
GiáFreeFreeFree
Build time100 giờ/tháng300 giờ/thángKhông giới hạn
Bandwidth100GB/tháng100GB/thángKhông giới hạn
Custom domain✅ Miễn phí✅ Miễn phí✅ Miễn phí
SSL✅ Tự động✅ Tự động✅ Tự động
Auto deploy✅ Từ GitHub✅ Từ GitHub✅ Từ GitHub
Serverless functions✅ Có✅ Có❌ Không
Analytics✅ Miễn phí✅ Có hạn❌ Không
Ease of use⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
Performance⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

Khuyến nghị:

  • Vercel: Tốt nhất cho production (nhanh, dễ dùng)
  • Netlify: Tốt cho drag & drop, forms
  • GitHub Pages: Tốt cho demo, open-source

🎯 Kiểm tra deployment

6.1 Kiểm tra các tính năng

Tính năngCách testKết quả mong đợi
Truy cập siteMở URL productionLoad trang chủ
Đăng nhậpClick “Đăng nhập với Google”Thành công
Xem học viênVào tab “Học viên”Hiện danh sách
Điểm danh QRQuét mã QRGhi nhận thành công
Xuất ExcelClick “Xuất Excel”Tải file xuống

6.2 Kiểm tra trên mobile

  1. Mở URL trên điện thoại
  2. Test các tính năng
  3. Đảm bảo responsive đúng

6.3 Kiểm tra performance

Sử dụng Lighthouse (Chrome DevTools):

  1. F12 → Lighthouse
  2. Run audit
  3. Xem điểm: Performance, Accessibility, SEO

Mục tiêu:

  • Performance: >90
  • Accessibility: >90
  • SEO: >90

🔄 Update code sau khi deploy

Quy trình update

# 1. Sửa code
# 2. Test local
npm run dev

# 3. Commit & push
git add .
git commit -m "Update feature X"
git push

# 4. Vercel/Netlify auto deploy
# Chờ ~2 phút

Rollback (nếu có lỗi)

Vercel:

  1. Vào Deployments
  2. Click deployment cũ
  3. Promote to Production

Netlify:

  1. Vào Deploys
  2. Click Deploy history
  3. Click deployment cũ
  4. Deploy latest commit

🎨 Tổng kết

Những gì bạn đã làm được:

Build project React thành static files
Deploy lên Vercel/Netlify/GitHub Pages
Cấu hình custom domain (tùy chọn)
Thiết lập auto deploy từ GitHub
Bảo mật & tối ưu performance

URL của bạn:

  • Production: https://tntt-management.vercel.app
  • Preview: Mỗi PR có URL preview riêng
  • Admin: Không cần phân biệt - cùng 1 URL

Bước tiếp theo:

📝 Bài 4: Hướng dẫn sử dụng chi tiết các tính năng


Chúc bạn thành công! 🎉

Webapp của bạn giờ đã online và ai cũng có thể truy cập!


Bài viết bởi @dongthinhlong - Người phát triển TNTT Management
Năm cập nhật: 2026