Triển khai Next.js trên VPS Ubuntu: Quy trình chuẩn, dễ áp dụng cho dự án thật
Triển khai Next.js lên VPS Ubuntu nghe đơn giản: git pull, npm run build, npm start. Nhưng dự án thật hiếm khi chỉ vậy. Bạn cần Node đúng phiên bản, process manager, reverse proxy, SSL, env, log, deploy lại không downtime, rollback khi lỗi.
Bài viết này đưa ra quy trình thực chiến: đủ chuẩn cho production, dễ áp dụng cho team nhỏ, startup, freelance project, SaaS MVP.
1. Kiến trúc triển khai đề xuất
Mô hình phổ biến:
User → Domain → Nginx → Next.js app → DB/API
Trong đó:
– Ubuntu VPS: server chính.
– Nginx: reverse proxy, xử lý domain, SSL, gzip, cache cơ bản.
– Next.js app: chạy qua Node.js.
– PM2: giữ app sống, tự restart khi crash.
– Git: lấy source code.
– Certbot: cấp SSL miễn phí từ Let’s Encrypt.
Ưu điểm:
– Dễ cài.
– Dễ debug.
– Không phụ thuộc nền tảng cloud đắt tiền.
– Phù hợp dự án thật: landing, dashboard, app nội bộ, e-commerce nhỏ, SaaS MVP.
2. Chuẩn bị VPS Ubuntu
Nên chọn:
– Ubuntu 22.04 LTS hoặc 24.04 LTS.
– RAM tối thiểu 1GB; khuyến nghị 2GB+.
– CPU 1 core trở lên.
– SSD.
– Quyền SSH root hoặc user sudo.
Đăng nhập:
ssh root@YOUR_SERVER_IP
Cập nhật hệ thống:
apt update && apt upgrade -y
Cài công cụ cơ bản:
apt install -y curl git ufw nginx
Tạo user deploy, tránh chạy app bằng root:
adduser deploy
usermod -aG sudo deploy
Chuyển sang user:
su - deploy
3. Cài Node.js đúng cách
Không nên dùng Node.js mặc định từ apt vì thường cũ. Dùng nvm linh hoạt hơn.
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
13. Lỗi thường gặp
502 Bad Gateway
Nguyên nhân thường gặp:
– App chưa chạy.
– Sai port.
– PM2 crash.
– Nginx proxy sai.
Kiểm tra:
pm2 status
pm2 logs next-app
curl http://localhost:3000
sudo nginx -t
Environment variable không nhận
Sau khi sửa .env.production, cần build lại:
npm run build
pm2 restart next-app
Biến NEXT_PUBLIC_ được bake vào bundle lúc build.
Domain redirect sai khi dùng NextAuth
Kiểm tra:
NEXTAUTH_URL=https://example.com
Sai URL → callback lỗi, login loop, cookie sai domain.
Build trên server quá chậm
Giải pháp:
– Tăng RAM/swap.
– Build ở CI rồi upload artifact.
– Dùng Docker image build sẵn.
– Dùng server mạnh hơn.
14. Checklist production nhanh
Trước khi bàn giao:
– Domain trỏ đúng IP.
– HTTPS hoạt động.
– Nginx reverse proxy ổn.
– PM2 auto restart sau reboot.
– .env.production đầy đủ.
– Port 3000 không public.
– Log kiểm tra được.
– Deploy script có set -e.
– Backup DB nếu có dữ liệu thật.
– Monitoring tối thiểu: uptime check.
Có thể dùng UptimeRobot, Better Stack, Grafana Cloud hoặc cron đơn giản để ping endpoint health.
Kết luận
Triển khai Next.js trên VPS Ubuntu không khó nếu đi đúng quy trình: Node LTS → build production → PM2 → Nginx → SSL → firewall → deploy script. Đây là stack gọn, rẻ, dễ kiểm soát, đủ tốt cho nhiều dự án thật.
Khi app lớn hơn, bạn có thể nâng cấp dần: CI/CD, Docker, blue-green deploy, load balancer, object storage, managed database. Nhưng nền tảng vẫn vậy: server rõ ràng, config rõ ràng, log rõ ràng, rollback được.
Bắt đầu đơn giản. Chuẩn hóa sớm. Production sẽ bớt đau.