Hướng dẫn thiết lập GitHub Actions để kiểm tra mã nguồn và tự động cập nhật ứng dụng trên VPS mỗi khi có thay đổi trên nhánh chính. Có ví dụ workflow, cách cấu hình SSH và lưu ý bảo mật.
#GitHub Actions
#deploy VPS
#CI/CD
VVibeVPS
Sẵn sàng triển khai?
Đưa website của bạn lên Cloud VPS ngay hôm nay
Khởi tạo tự động ngay sau khi thanh toán, chuyển khoản bằng mã QR, bật tắt và cài lại máy chủ trong trang quản lý.
Đưa ứng dụng Node.js lên VPS giúp bạn chủ động hơn trong việc quản lý môi trường, cấu hình và tài nguyên máy chủ. Tuy nhiên, để ứng dụng chạy ổn định và truy cập được bằng tên miền, bạn cần thực hiện nhiều bước ngoài việc cài Node.js. Bài viết này hướng dẫn quy trình triển khai Node.js trên VPS Ubuntu từ khâu chuẩn bị, cấu hình dịch vụ đến kiểm tra và cập nhật ứng dụng.
Các ví dụ bên dưới áp dụng cho ứng dụng Node.js thông thường trên Ubuntu. Tên miền, thư mục dự án, cổng ứng dụng và tên tệp có thể cần điều chỉnh theo dự án thực tế.
1. Chuẩn bị VPS và thông tin cần thiết
Lập trình viên chuẩn bị VPS Ubuntu để triển khai ứng dụng Node.js
Trước khi bắt đầu, bạn cần có một VPS cài Ubuntu, quyền truy cập SSH và mã nguồn ứng dụng Node.js. Nếu muốn người dùng truy cập bằng tên miền, hãy chuẩn bị tên miền và quyền quản lý DNS. Với dự án cần cơ sở dữ liệu, bạn cũng cần thông tin kết nối tương ứng.
Đăng nhập vào VPS bằng SSH:
ssh root@DIA_CHI_IP_VPS
Thay DIA_CHI_IP_VPS bằng địa chỉ IP máy chủ. Sau khi đăng nhập, cập nhật các gói hệ thống:
apt update && apt upgrade -y
Bạn có thể tạo một tài khoản riêng để quản lý ứng dụng thay vì chạy tiến trình bằng root:
adduser deploy
usermod -aG sudo deploy
Đăng nhập bằng tài khoản này ở các bước tiếp theo. Nếu bật tường lửa UFW, hãy cho phép SSH trước khi kích hoạt để tránh tự khóa quyền truy cập:
Không cần mở cổng ứng dụng Node.js ra Internet nếu Nginx sẽ tiếp nhận kết nối bên ngoài và chuyển tiếp đến ứng dụng qua localhost.
2. Cài Node.js trên Ubuntu VPS
Cài đặt Node.js và npm trên máy chủ Ubuntu
Ubuntu có thể cung cấp phiên bản Node.js khác với phiên bản dự án yêu cầu. Trước khi cài, hãy kiểm tra trường engines trong package.json hoặc tài liệu của ứng dụng, sau đó chọn phiên bản LTS tương thích.
Ví dụ dưới đây cài Node.js 22 từ kho NodeSource. Hãy xác nhận phiên bản này phù hợp với ứng dụng trước khi chạy lệnh:
Nếu dự án dùng Yarn hoặc pnpm, hãy cài và sử dụng đúng trình quản lý gói được chỉ định trong dự án. Khi triển khai, ưu tiên dùng tệp khóa như package-lock.json, yarn.lock hoặc pnpm-lock.yaml để các lần cài phụ thuộc nhất quán hơn.
3. Đưa mã nguồn ứng dụng lên VPS
Tạo thư mục dành cho ứng dụng và cấp quyền cho tài khoản triển khai:
Thay DIA_CHI_REPOSITORY bằng địa chỉ repository của bạn. Nếu repository riêng tư, hãy cấu hình xác thực an toàn; tránh đặt mật khẩu hoặc token trực tiếp trong lịch sử lệnh. Bạn cũng có thể tải tệp lên bằng SFTP.
Kiểm tra cấu trúc dự án và đọc hướng dẫn triển khai của ứng dụng. Thông thường, tệp package.json chứa các lệnh trong mục scripts, chẳng hạn start hoặc build. Cài các gói phụ thuộc từ thư mục dự án:
cd /var/www/myapp
npm ci
Nếu dự án có bước biên dịch, chạy lệnh build được khai báo trong package.json, ví dụ:
npm run build
Không phải ứng dụng nào cũng cần build. Với ứng dụng cần biên dịch, hãy hoàn tất bước này trước khi chuyển sang chế độ cài phụ thuộc production. Nếu build cần các gói phát triển, không nên xóa chúng trước khi build xong.
4. Cấu hình biến môi trường và chạy thử
Thông tin nhạy cảm như khóa API, mật khẩu cơ sở dữ liệu và cấu hình môi trường nên được lưu bên ngoài mã nguồn. Tạo tệp môi trường có quyền truy cập giới hạn:
Định dạng biến môi trường tùy theo ứng dụng. Không đưa tệp .env lên repository công khai; hãy kiểm tra .gitignore và chỉ cấp quyền đọc cần thiết:
chmod 600 /var/www/myapp/.env
Ứng dụng cần đọc biến PORT và lắng nghe trên 127.0.0.1 để Nginx có thể chuyển tiếp yêu cầu nội bộ. Cách triển khai cụ thể phụ thuộc framework; hãy xác nhận ứng dụng không chỉ chạy trên môi trường phát triển. Khởi chạy thử theo script của dự án, sau đó kiểm tra phản hồi tại máy chủ:
curl http://127.0.0.1:3000
Nếu lệnh trả về nội dung phù hợp, ứng dụng đang nhận yêu cầu trên cổng nội bộ. Dừng tiến trình chạy thử trước khi cấu hình dịch vụ nền.
5. Tạo dịch vụ systemd để ứng dụng tự chạy
Chạy ứng dụng trong phiên SSH không phù hợp cho vận hành lâu dài: tiến trình có thể dừng khi phiên kết thúc. Tạo dịch vụ systemd để khởi động ứng dụng cùng hệ thống và thuận tiện xem trạng thái.
Mở tệp cấu hình:
sudo nano /etc/systemd/system/myapp.service
Thêm nội dung sau, điều chỉnh đường dẫn và lệnh chạy theo dự án:
Ví dụ trên giả định ứng dụng khởi động từ server.js. Nếu dự án cần chạy bằng một script khác, hãy dùng lệnh khởi chạy phù hợp và kiểm tra đường dẫn Node.js bằng which node. Tải lại cấu hình rồi bật dịch vụ:
Trỏ bản ghi DNS của tên miền về IP VPS, sau đó thử truy cập bằng trình duyệt. Nếu ứng dụng dùng WebSocket, bạn có thể cần bổ sung các header nâng cấp kết nối theo hướng dẫn của framework.
7. Bật HTTPS và kiểm tra toàn bộ hệ thống
Mô hình Nginx chuyển tiếp yêu cầu đến ứng dụng Node.js trên VPS
Sau khi DNS đã trỏ về VPS và tên miền truy cập được qua HTTP, bạn có thể cài Certbot để xin chứng chỉ TLS từ Let's Encrypt:
Làm theo hướng dẫn trên màn hình để hoàn tất. Kiểm tra ứng dụng qua HTTPS và bảo đảm cả trang chính lẫn các chức năng cần thiết hoạt động bình thường.
8. Cập nhật ứng dụng và xử lý lỗi thường gặp
Khi phát hành phiên bản mới, quy trình cơ bản là lấy mã nguồn, cài lại phụ thuộc, build nếu cần và khởi động lại dịch vụ:
cd /var/www/myapp
git pull
npm ci
npm run build
sudo systemctl restart myapp
sudo systemctl status myapp
Bỏ qua npm run build nếu dự án không có bước này. Nếu dự án yêu cầu chỉ cài các gói production, hãy thực hiện đúng hướng dẫn triển khai sau khi hoàn tất build.
Một số lỗi thường gặp gồm:
Ứng dụng không khởi động: xem journalctl, kiểm tra đường dẫn ExecStart, quyền thư mục và biến môi trường.
Tên miền không truy cập được: kiểm tra DNS, trạng thái Nginx và tường lửa; dùng sudo nginx -t để tìm lỗi cú pháp.
Lỗi kết nối cổng: xác nhận ứng dụng lắng nghe đúng cổng mà Nginx chuyển tiếp, chẳng hạn 3000.
Chạy được trong SSH nhưng không chạy bằng systemd: kiểm tra người dùng dịch vụ, thư mục làm việc và các biến môi trường; dịch vụ không tự nhận cấu hình của phiên shell.
Kết luận
Để triển khai Node.js trên VPS thành công, bạn cần cài đúng phiên bản Node.js, cấu hình mã nguồn và biến môi trường, rồi dùng systemd quản lý tiến trình. Nginx giúp tiếp nhận kết nối web, còn HTTPS bảo vệ dữ liệu trao đổi với người dùng. Sau khi đưa ứng dụng lên máy chủ, hãy theo dõi nhật ký, cập nhật phần mềm và sao lưu dữ liệu định kỳ.
Nếu đang tìm môi trường để tự triển khai, bạn có thể tham khảo các gói VPS AMD EPYC Gen 3 hoặc VPS Platinum Gen 2 của VibeVPS, có giá từ 81.000đ/tháng. Hãy chọn cấu hình phù hợp với yêu cầu ứng dụng và tài nguyên dự kiến.
Hướng dẫn cài WireGuard trên VPS Ubuntu, cấu hình đường hầm VPN và kết nối máy tính hoặc điện thoại. Có hướng dẫn mở cổng, kiểm tra kết nối và xử lý lỗi thường gặp.