HỆ THỐNG MULTI-SITE

Đề Xuất Kiến Trúc
Monolithic Per-Site

Giải pháp nền tảng cốt lõi (Core Platform) phục vụ chuỗi các website đặt lịch dịch vụ thể thao dưới nước và du lịch biển (Surf, Dive, Kite) trên toàn quốc.

Sử dụng kiến trúc Monorepo để dễ dàng nhân bản, Astro cho Frontend siêu tốc độ, và Go (Gin) cho Backend độc lập, bảo mật.

Ngày tạo 17 Tháng 8, 2026
Tham chiếu Dự án Web-song-bien
Góc nhìn Astro Frontend

Mục Đích Nền Tảng (Platform Purpose)

Xây dựng một hệ thống web cốt lõi giúp doanh nghiệp dễ dàng mở rộng và triển khai hàng loạt các website đặt lịch dịch vụ thể thao biển (Đà Nẵng Surf, Phú Quốc Dive...) với chi phí vận hành tối thiểu. Dù quản lý tập trung, hệ thống vẫn phục vụ nhiều nhóm khách hàng khác nhau với branding, nghiệp vụ, và database hoàn toàn riêng biệt.

01 ISOLATION

Isolation Cao

Mỗi site tách biệt hoàn toàn về dữ liệu, auth, và process. Không có rủi ro lộ dữ liệu chéo giữa các tenant.

  • Database riêng biệt per-site
  • Process độc lập (Systemd / PM2)
  • Auth scope không chồng lấn
02 SCALABILITY

Dễ Mở Rộng & Deploy

Thêm site mới không ảnh hưởng site cũ. Site 1 down không kéo theo hệ thống của Site 2.

  • Clone template → deploy trong <30 phút
  • Fault isolation hoàn toàn
  • Scale từng site độc lập
03 CODE REUSE

Shared Packages

Dù chạy độc lập, các site chia sẻ component, utilities, types qua shared packages của Monorepo.

  • @repo/ui — shared components
  • @repo/types — TypeScript types
  • Turborepo build cache

Monolithic Per-Site

Thay vì 1 backend multi-tenant phức tạp, tạo nhiều mini-application hoàn chỉnh. Tối ưu cho hệ thống ~5-20 sites cần isolation cao.

// multi-site/ (Monorepo) ├── Web-song-bien/ ← Site 1: Surf & Dive Đà Nẵng │ ├── .context/ ← Docs kiến trúc toàn repo │ ├── Site1/ │ │ ├── SITE.md ← Context site cụ thể │ │ ├── backend/ ← Go (Gin) — API riêng │ │ └── admin/ ← React/Vite — TODO │ ├── client/ ← Astro Frontend — ĐANG CHẠY │ ├── packages/ ← Shared code (@repo/ui, @repo/types) │ ├── pnpm-workspace.yaml │ └── turbo.json ├── Site2/ ← (Kế hoạch mở rộng) └── ...

Phù hợp khi nào?

  • Mỗi site có nghiệp vụ, giao diện khác biệt
  • Số site trong phạm vi quản lý được
  • Muốn giao từng site cho team/freelancer độc lập
  • Yêu cầu bảo mật, isolation dữ liệu tuyệt đối

Hạ tầng (Infrastructure)

  • Nginx: Reverse Proxy điều hướng
  • PM2: Quản lý process cho Frontend & Admin
  • Systemd: Quản lý Go backend binary
  • PostgreSQL: 1 server, nhưng cấp nhiều database riêng (site1_db, site2_db...)

Sức Mạnh Của Astro

Lựa chọn tối ưu nhất cho website marketing và landing page với triết lý "Zero-JS by default".

Tốc Độ Tối Đa

Render sẵn HTML tại build-time (SSG). Tải trang tức thì, điểm PageSpeed Insights luôn cao.

SSG Zero-JS
🔍

SEO Tuyệt Đối

Nội dung HTML đầy đủ có sẵn cho crawler, không cần hydration phức tạp, rất tốt cho Indexing.

Meta Tags Sitemap
🧩

Component Islands

Chỉ load JavaScript cho những component thật sự cần tương tác (Booking Form, Slider).

Islands Interactive
ASTRO SỬ DỤNG — SSG
Static Site Generation

HTML được render tại build-time — trước khi user request. Server trả về file HTML tĩnh ngay lập tức, không cần xử lý gì thêm.

  • TTFB cực thấp — HTML sẵn sàng từ CDN/disk
  • LCP < 1.2s — nội dung hiển thị gần như tức thì
  • No hydration — không cần JS parse lại DOM
  • PageSpeed 95–100/100 mặc định
SO SÁNH — SSR
Server-Side Rendering

HTML được render tại request-time — mỗi lần user vào, server phải xử lý, render, rồi mới trả về. Phù hợp cho nội dung động cao.

  • TTFB cao hơn — server cần thời gian render
  • LCP 1.5–3s tùy server load
  • Hydration cost — JS phải "attach" lại vào DOM
  • PageSpeed 60–80/100 thông thường
KHI NÀO DÙNG SSR?
Astro hỗ trợ cả hai

Astro có thể bật output: 'server' để SSR từng route cụ thể. Landing page → SSG. Trang cần auth/dynamic → SSR per-route.

  • Hybrid mode — mix SSG + SSR trong 1 project
  • Adapter — Node.js, Cloudflare, Vercel
  • Use case — dashboard, profile, booking result
  • Landing page vẫn giữ SSG → perf tối đa

Chỉ Số Hiệu Năng Web — Core Web Vitals

Google Ranking Factor · 2024
Chỉ Số Astro (SSG) Next.js (SSR) Mục Tiêu Google
LCP
Largest Contentful Paint
< 1.2s 1.5 – 3.0s < 2.5s ✓
INP
Interaction to Next Paint
< 50ms 100 – 200ms < 200ms ✓
CLS
Cumulative Layout Shift
≈ 0.00 0.05 – 0.15 < 0.1 ✓
TBT
Total Blocking Time
0 – 50ms 200 – 600ms < 200ms ✓
TTFB
Time to First Byte
< 200ms 300 – 800ms < 800ms ✓
PSI Score
PageSpeed Insights
95 – 100 60 – 80 > 90 ✓

Sự Chuyển Đổi Sang Go

Tối ưu hóa tài nguyên server và tăng độ tin cậy với Golang + Gin framework.

Vì sao chọn Go (Gin)?

  • Hiệu năng: Nhanh hơn 2-5 lần so với Node.js.
  • Tài nguyên: Tiêu thụ RAM rất thấp (~5-15MB/site so với 50-100MB của Node).
  • Deploy: Build thành 1 file binary duy nhất, không cần cài đặt runtime phức tạp.
  • An toàn: Type safety tích hợp sẵn, Goroutine xử lý concurrency mạnh mẽ.

Chiến lược Database

PostgreSQL Server (Port 5432) ├── site1_db ← Dự án ABC Data ├── site2_db ← Site 2 Data └── site3_db ← Site 3 Data

Không dùng Multi-tenant chung 1 database. Mỗi site sở hữu 1 database vật lý riêng, đảm bảo 100% không rò rỉ dữ liệu chéo và dễ dàng backup/migrate.