Cách tự động deploy Next.js lên VPS bằng GitHub Actions tiết kiệm thời gian
Deploy thủ công nghe có vẻ đơn giản: SSH vào VPS, git pull, npm install, npm run build, restart app. Nhưng sau vài lần sửa bug gấp, deploy lúc nửa đêm, quên build, sai branch, thiếu biến môi trường… bạn sẽ thấy thủ công → rủi ro.
Giải pháp: tự động deploy Next.js lên VPS bằng GitHub Actions. Mỗi khi push code lên branch chính, GitHub tự kết nối VPS, kéo code mới, build, restart ứng dụng. Kết quả: nhanh hơn, ít lỗi hơn, quy trình chuyên nghiệp hơn.
Bài này hướng dẫn setup thực tế: Next.js + VPS Ubuntu + GitHub Actions + PM2 + Nginx.
Tổng quan quy trình deploy tự động
Luồng cơ bản:
1. Dev push code lên GitHub.
2. GitHub Actions chạy workflow.
3. Workflow SSH vào VPS.
4. VPS pull code mới.
5. Cài dependency nếu cần.
6. Build Next.js.
7. Restart app bằng PM2.
8. Nginx reverse proxy request tới app.
– Tiết kiệm thời gian: deploy vài giây/phút.
– Giảm lỗi thao tác tay.
– Có lịch sử deploy trong GitHub Actions.
– Dễ rollback nếu dùng Git tag/commit.
– Phù hợp solo dev, team nhỏ, startup.
– on.push.branches.main: chỉ deploy khi push lên main.
– appleboy/ssh-action: action SSH vào VPS.
– git reset --hard origin/main: đồng bộ server đúng code trên GitHub.
– npm ci: cài dependency ổn định theo package-lock.json.
– npm run build: build production.
– pm2 restart: reload app.
– Biến NEXT_PUBLIC_* sẽ được nhúng vào client bundle.
– Secret như DB password, token → không dùng prefix NEXT_PUBLIC_.
– Đổi env production → cần build lại.
Rollback khi deploy lỗi
Tự động deploy không có nghĩa bỏ qua rollback.
Cách nhanh:
cd /var/www/my-next-app
git log --oneline
git reset --hard COMMIT_ID
npm ci
npm run build
pm2 restart my-next-app
Có thể thêm tag release:
git tag v1.0.0
git push origin v1.0.0
Team lớn hơn nên dùng strategy:
– Deploy theo tag.
– Giữ thư mục release.
– Symlink current.
– Health check trước khi switch traffic.
Nhưng với VPS nhỏ, rollback theo commit → thực tế, nhanh.
Lỗi thường gặp
Permission denied khi GitHub Actions SSH
Nguyên nhân:
– Sai private key.
– Public key chưa nằm trong authorized_keys.
– Sai user.
– Sai port SSH.
Nếu lỗi → thêm public key VPS vào GitHub Deploy keys.
Build thành công nhưng web không đổi
Có thể PM2 chưa restart đúng app.
Kiểm tra:
pm2 list
pm2 restart my-next-app
pm2 logs my-next-app
Nginx 502 Bad Gateway
App Next.js chưa chạy hoặc sai port.
Kiểm tra:
curl http://127.0.0.1:3000
pm2 logs
nginx -t
Kết luận
Tự động deploy Next.js lên VPS bằng GitHub Actions giúp biến deploy từ thao tác thủ công dễ lỗi thành quy trình rõ ràng:
push code → GitHub Actions → VPS tự build/restart → website cập nhật
Setup ban đầu mất khoảng 30–60 phút, nhưng tiết kiệm rất nhiều thời gian về sau. Với một VPS nhỏ, PM2, Nginx, SSL, GitHub Actions, bạn đã có pipeline production đủ dùng cho blog, landing page, SaaS nhỏ, dashboard nội bộ.
Khuyến nghị thực tế:
– Dùng SSH key, không dùng password.
– Lưu secret trong GitHub Secrets.
– Dùng PM2 quản lý process.
– Luôn có cách rollback.
– Theo dõi log sau mỗi lần deploy.