Obiz Solutions — chính website này
Đây chính là website bạn đang đọc. Mục tiêu: một nơi để chia sẻ các hệ thống, giải pháp và kiến thức học được, có bản tiếng Anh (mặc định) và tiếng Việt, tải nhanh và gần như không tốn chi phí vận hành.
Kiến trúc
Luồng đi từ lúc viết bài đến lúc người đọc thấy trang:
- Nội dung — bài viết là file Markdown trong
src/content/{blog,projects,docs}, mỗi bài có cặp bản dịchen/vàvi/. git pushlênmainkích hoạt workflow GitHub Actions.- GitHub Actions cài dependency, chạy
astro checkrồiastro build— Astro đọc Content Collections, render toàn bộ trang thành HTML tĩnh vàodist/. - Actions xác thực với AWS qua OIDC (không lưu access key dài hạn),
rồi
aws s3 sync dist/ s3://bucket --deleteđể đồng bộ đúng bản mới nhất, xoá file cũ không còn dùng. - CloudFront đứng trước bucket S3, phục vụ nội dung qua CDN + HTTPS;
Actions gọi
create-invalidationđể xoá cache ngay sau khi deploy. - Trình duyệt người dùng nhận về HTML tĩnh, gần như không có JavaScript nhờ mô hình Islands Architecture của Astro — xem thêm ở bài Astro là gì?.
Mô hình nội dung
Ba collection — blog, projects, docs — dùng chung quy ước: mỗi bài là
một file Markdown nằm trong thư mục en/ hoặc vi/, frontmatter được
validate bằng schema Zod trong src/content/config.ts (xem thêm
TypeScript là gì? để hiểu vì sao việc này hữu ích).
Sai kiểu dữ liệu hay thiếu field sẽ bị chặn ngay lúc astro build, trước
khi kịp deploy.
Đa ngôn ngữ
Astro’s i18n routing đặt tiếng Anh làm mặc định (route gốc /), tiếng Việt
có tiền tố /vi/. Component LanguageSwitcher tính đường dẫn tương ứng ở
ngôn ngữ còn lại dựa trên URL hiện tại, còn Header tự nhận diện menu nào
đang active dựa vào Astro.url.pathname.
Vì sao chọn stack này
- Astro: nội dung là chính, không cần JS runtime nặng cho SPA.
- S3 + CloudFront: hosting tĩnh rẻ, không cần server, tự scale.
- GitHub Actions + OIDC: deploy tự động mỗi lần push, không phải lưu access key AWS ở đâu cả — giảm rủi ro rò rỉ credential.
Điều có thể cải thiện
Hiện chưa có tìm kiếm full-text hay RSS feed cho blog — với vài chục bài viết thì chưa cần, nhưng đây là hai thứ hợp lý để thêm khi nội dung nhiều lên.