Logo
Chuyển blog quyenlt.com từ Java Spring Boot sang Astro + Vercel + Cloudflare (không database, không VPS)

Chuyển blog quyenlt.com từ Java Spring Boot sang Astro + Vercel + Cloudflare (không database, không VPS)

tobi
tobi•• … views

Blog quyenlt.com chạy bằng Java Spring Boot + MySQL trên VPS từ ngày đầu. Nó vẫn chạy ổn, nhưng mỗi tháng mình đều phải trả tiền VPS, thỉnh thoảng lại cập nhật hệ điều hành, Java, backup database, xem log lỗi. Trong khi đó, phần lớn thời gian người đọc chỉ mở những bài viết gần như không thay đổi.

Mình tự hỏi: một blog cá nhân có thật sự cần một server chạy 24/7 không? Câu trả lời là không. Vì vậy mình quyết định chuyển toàn bộ quyenlt.com sang một kiến trúc mới: mọi thứ đặt trên cloud, dùng gói miễn phí, không cần VPS, không cần database.

Kiến trúc mới của quyenlt.com

Vì sao mình chuyển

1. Không muốn tốn tiền VPS cho một blog cá nhân

Lý do lớn nhất. Spring Boot là một ứng dụng Java cần chạy liên tục, tức là phải có VPS, và VPS thì tốn tiền hàng tháng dù blog có người đọc hay không. Cộng thêm MySQL cũng chạy trên VPS đó, chiếm RAM và cần backup định kỳ.

Trong khi hiện nay có rất nhiều nền tảng cloud cho dùng miễn phí với giới hạn dư sức cho một blog: Vercel, Cloudflare, GitHub. Không tận dụng thì phí.

2. Không muốn bảo trì server

Có server là có việc: cập nhật bảo mật cho hệ điều hành, nâng phiên bản Java, theo dõi dung lượng ổ đĩa, xử lý khi ứng dụng hết RAM hoặc bị dò quét. Với một blog cá nhân, mình chỉ muốn dành thời gian cho việc viết bài.

3. Blog chủ yếu là nội dung tĩnh

Một bài viết khi đã đăng thì hầu như không đổi. Vậy mà với Spring Boot, mỗi lần có người mở bài, server lại phải truy vấn MySQL rồi dựng lại trang HTML từ đầu. Việc đó hoàn toàn có thể làm một lần lúc đăng bài, rồi phát file HTML có sẵn cho mọi người đọc.

Kiến trúc mới gồm những gì

Phần Bản cũ Bản mới
Giao diện Spring Boot + Thymeleaf Astro build sẵn ra HTML tĩnh
Hosting VPS (trả phí) Vercel (miễn phí)
Bài viết, danh mục, menu MySQL File Markdown + JSON trên GitHub (miễn phí)
Ảnh Ổ đĩa VPS Cloudflare R2 (miễn phí 10GB)
Lượt xem, bình luận MySQL Cloudflare D1 (miễn phí)
Đăng nhập admin, upload ảnh Spring Security Cloudflare Workers (miễn phí 100.000 request/ngày)

Chia ra thì website có hai loại dữ liệu:

  • Dữ liệu tĩnh: bài viết, danh mục, menu, trang giới thiệu. Chỉ thay đổi khi mình viết hoặc sửa bài, nên lưu thành file trên GitHub và build sẵn thành HTML.
  • Dữ liệu động: lượt xem, bình luận, upload ảnh, đăng nhập admin. Phần này cần ghi dữ liệu nên chạy trên Cloudflare Workers và D1, là dạng “serverless”: code chỉ chạy khi có request, không có server nào phải duy trì.

Từng thành phần làm gì

Astro: thay cho Spring Boot + Thymeleaf

Astro là framework sinh ra để làm website nội dung như blog, tài liệu, landing page. Thay vì dựng trang mỗi lần có người truy cập như Spring Boot, Astro build toàn bộ website ra HTML một lần, sau đó chỉ việc phát file có sẵn.

Lợi ích mình thấy rõ nhất:

  • Trang tải nhanh hơn vì không còn bước truy vấn database, HTML được phát thẳng từ CDN gần người đọc nhất.
  • Không cần server chạy liên tục, nên host được ở các nền tảng miễn phí.
  • Bài viết là file Markdown, viết ở đâu cũng được, xem trước ngay trong VS Code hay trên GitHub.

GitHub: thay cho MySQL

Mỗi bài viết là một file .md, phần đầu file chứa thông tin như tiêu đề, ngày đăng, danh mục, ảnh bìa, SEO:

---
title: "Hướng dẫn đổi port SSH"
date: "2023-02-25"
categories: ["linux"]
cover: "https://img.quyenlt.com/uploads/....jpg"
---

Nội dung bài viết...

Git thay thế database một cách tự nhiên: mọi lần sửa bài đều có lịch sử, muốn quay về phiên bản cũ chỉ cần một lệnh, và chỉ cần clone repo là có ngay một bản backup đầy đủ. Không còn phải lo backup MySQL.

Vercel: thay cho VPS

Vercel kết nối với GitHub: mỗi khi có thay đổi mới, Vercel tự build lại website (mất khoảng 1 phút) và phát lên CDN toàn cầu. Gói miễn phí dư sức cho blog cá nhân, có sẵn HTTPS, có hỗ trợ redirect 301 để giữ link cũ.

Cloudflare: ảnh, lượt xem, bình luận

Phần cần ghi dữ liệu mình đặt ở Cloudflare, vì tên miền vốn đã dùng DNS ở đây và gói miễn phí rất rộng rãi:

  • R2 lưu toàn bộ ảnh, phục vụ qua img.quyenlt.com. Điểm hay là R2 không tính phí băng thông tải ra, ảnh có được xem bao nhiêu lần cũng không tốn tiền. Ảnh mình không để trên GitHub vì repo sẽ phình to rất nhanh.
  • Workers là các đoạn code nhỏ chạy trên hạ tầng Cloudflare, mình dùng làm API cho lượt xem, bình luận, upload ảnh và đăng nhập admin.
  • D1 là database SQLite của Cloudflare, lưu lượt xem và bình luận. Lượt xem và bình luận cũ đều được giữ nguyên.

Viết bài thế nào khi không còn server?

Mình vẫn giữ một trang /admin với giao diện giống bản cũ cho quen tay: dashboard, viết bài, quản lý bài viết, danh mục, bình luận, SEO, menu, cài đặt. Khác biệt nằm ở phía sau:

  1. Mình soạn bài trong admin như soạn Word, dán ảnh vào là ảnh tự upload lên R2.
  2. Bấm Lưu, admin tạo một commit lên GitHub chứa file bài viết.
  3. Vercel thấy thay đổi, build lại website, khoảng 1 phút sau bài xuất hiện trên quyenlt.com.

Tính năng crawler + AI viết lại bài của bản cũ cũng được giữ, chuyển sang chạy định kỳ trên GitHub Actions (cũng miễn phí). Bài do AI viết được tạo thành một Pull Request, mình đọc lại và duyệt thì bài mới lên web.

Giữ nguyên SEO khi chuyển

Blog có lượng truy cập từ Google đáng kể, nên mình ưu tiên không làm mất thứ hạng:

  • URL bài viết giữ nguyên như bản cũ.
  • Các dạng link cũ (link theo số id, link có tiền tố /post/, link ảnh cũ) đều được redirect 301 sang địa chỉ mới.
  • Sitemap giữ đúng cấu trúc cũ, Google không thấy khác biệt.
  • Meta title, description, từ khoá của từng bài được chuyển nguyên.

Trước khi trỏ tên miền chính, mình chạy bản mới trên một subdomain để kiểm tra kỹ, so sánh từng trang với bản cũ rồi mới chuyển hẳn.

Kết quả sau khi chuyển

Trước Sau
Chi phí hạ tầng Tiền VPS hàng tháng 0 đồng
Bảo trì Cập nhật OS, Java, backup MySQL Gần như không cần
Tốc độ tải trang Phụ thuộc VPS và database HTML tĩnh từ CDN, nhanh hơn rõ rệt
Khi lượng truy cập tăng đột biến VPS có thể quá tải CDN tự chịu tải
Backup Tự làm định kỳ Có sẵn trong Git

Ngoài tiền, điều mình thích nhất là sự yên tâm: không còn server nào để sập, để hết RAM hay bị dò quét. Nếu phần lượt xem và bình luận có trục trặc thì bài viết vẫn đọc bình thường, vì nó chỉ là HTML tĩnh.

Có điểm gì phải đánh đổi?

Có, và nên biết trước khi áp dụng:

  • Bài mới mất khoảng 1 phút mới lên web, vì phải chờ build lại. Với blog thì không vấn đề, nhưng không hợp với trang tin tức cập nhật từng giây.
  • Phụ thuộc vào gói miễn phí của GitHub, Vercel, Cloudflare. Bù lại dữ liệu đều ở dạng mở (file Markdown, ảnh, SQLite), muốn chuyển đi nơi khác cũng dễ.
  • Phần động phải viết lại theo kiểu serverless, không còn gói gọn trong một ứng dụng Spring Boot như trước.

Có nên chuyển blog của bạn không?

Nếu bạn đang chạy một blog cá nhân, portfolio hay trang giới thiệu bằng một framework backend như Spring Boot, Laravel hay Django trên VPS chỉ để hiển thị nội dung, thì rất đáng thử. Bạn sẽ bớt được tiền VPS, bớt việc bảo trì và có một website nhanh hơn.

Còn nếu website của bạn có nhiều tính năng nghiệp vụ, nhiều người dùng đăng nhập, dữ liệu thay đổi liên tục, thì backend truyền thống vẫn là lựa chọn hợp lý.

Với mình, sau khi chuyển xong, việc duy nhất còn lại là viết bài. Bạn có câu hỏi gì về quá trình chuyển đổi thì để lại bình luận bên dưới nhé, phần bình luận này cũng đang chạy trên chính Cloudflare D1 vừa nhắc tới ở trên.

Chuyên mục:DevOpsJava

Bình luận (0)

+ =
Zalo