Triển khai một LMS Full-Stack trên Shared Hosting và Render

Chúng tôi đã triển khai một ứng dụng Node.js, React và PostgreSQL lên môi trường production mà không cần VPS.

Chúng tôi đã xây dựng một Hệ thống Quản lý Học tập (LMS) hoàn chỉnh cho G3HUB. Stack công nghệ bao gồm: • Frontend: React 18, Vite và TailwindCSS • Backend: Node.js 20 và Express 5 • Database: PostgreSQL 15 thông qua Supabase • ORM: Drizzle ORM

Chúng tôi không có cloud VM hay VPS nào cả. Chúng tôi chỉ có một tài khoản cPanel shared hosting đang chạy sẵn một trang web WordPress. Dưới đây là cách chúng tôi đã thực hiện.

Phân tách Cơ sở hạ tầng Chúng tôi không thể chạy Node.js và PostgreSQL trên cùng một máy chủ. Chúng tôi đã chia ứng dụng ra ba dịch vụ: • Frontend: cPanel shared hosting (Các tệp tĩnh) • API: Render (Gói miễn phí) • Database: Supabase (Gói miễn phí)

Những trở ngại lớn nhất

1. Rào cản Cơ sở dữ liệu Chúng tôi đã thử chạy Node.js API trực tiếp trên cPanel. Nó thất bại ngay lập tức. Các nhà cung cấp shared hosting thường chặn các kết nối outbound trên cổng 5432. Điều này có nghĩa là ứng dụng của bạn không thể kết nối với một cơ sở dữ liệu bên ngoài. Chúng tôi đã chuyển API sang Render để giải quyết vấn đề này.

2. Khó khăn với Monorepo Mã nguồn của chúng tôi sử dụng pnpm workspaces. Khi chúng tôi đẩy code lên Render, quá trình build bị lỗi vì Render không nhận diện được các dependency trong workspace cục bộ của chúng tôi. Cách khắc phục: Chúng tôi đã sử dụng esbuild để đóng gói (bundle) mọi thứ thành một tệp duy nhất nặng 6.4MB. Chúng tôi đã thay thế tệp package.json phức tạp bằng một phiên bản tối giản chỉ chứa các dependency bên ngoài.

3. Cuộc chiến CORS và Proxy Chúng tôi đã thử sử dụng Apache mod_proxy để điều hướng các lệnh gọi API từ domain của mình đến Render. Nó đã bị timeout. Shared hosting thường hạn chế module này. Cách khắc phục: Chúng tôi đã sử dụng một PHP cURL proxy. Vì frontend và script PHP nằm trên cùng một domain, chúng tôi đã tránh được tất cả các vấn đề về CORS. Script PHP sẽ âm thầm chuyển tiếp các yêu cầu đến Render.

Mẹo triển khai • Hãy build trên PowerShell, đừng dùng Git Bash. Windows xử lý các biến môi trường (environment variables) khác nhau trong Git Bash. • Sử dụng mật khẩu cơ sở dữ liệu không có ký tự đặc biệt. Các ký tự như @ hoặc ! yêu cầu phải mã hóa URL (URL encoding) và có thể gây ra lỗi kết nối. • Sử dụng UptimeRobot. Gói miễn phí của Render sẽ "ngủ" sau 15 phút. Hãy thiết lập một lệnh ping đến endpoint health check của bạn để giữ cho nó luôn hoạt động.

Tổng chi phí cơ sở hạ tầng: $0/tháng.

Nếu bạn có ngân sách, hãy sử dụng VPS. Nó sẽ loại bỏ tất cả những rào cản này. Nhưng nếu bạn có ngân sách bằng không, việc điều hướng sáng tạo sẽ giúp việc triển khai các ứng dụng sẵn sàng cho production trở nên khả thi.

Nguồn: https://dev.to/oyohedmond/deploying-a-full-stack-lms-on-shared-hosting-render-free-the-hard-way-4ke0