date
Dec 1, 2025
slug
ban-huong-dan-trien-khai-production
status
Published
tags
NodeJs
Backend
summary
Cách triển khai trên VPS
type
Post
Bản hướng dẫn triển khai Project production full trên 1 VPS từ trống đến chạy live, bao gồm:
  • Cài Node.js, Docker, PM2
  • Frontend Next.js PM2 cluster
  • Backend NestJS Docker, scale 2 container
  • Postgres + Redis internal
  • Nginx/Caddy multi-domain + HTTPS auto
  • SSH tunnel + GUI DB connection
  • Backup snapshot + DB dump

1️⃣ Chuẩn bị VPS

  • VPS: 4 vCPU, 8 GB RAM, 75 GB NVMe, Ubuntu 24.04 (hoặc 22.04)
  • Login bằng user deploy (không dùng root trực tiếp)
  • SSH key authentication: upload public key vào /home/deploy/.ssh/authorized_keys
  • Cập nhật hệ thống:
  • Firewall (mở 22, 80, 443):

2️⃣ Cài Node.js, PM2

  • PM2 startup:

3️⃣ Cài Docker + Docker Compose

  • Logout → login lại để cập nhật nhóm docker

4️⃣ Setup Backend Docker (NestJS) + Postgres + Redis

  • Tạo thư mục:
  • .env file:
  • docker-compose.yml:
  • Scale 2 container:

5️⃣ Setup Frontend Next.js + PM2

  • Clone project FE:
  • Chạy PM2 cluster:
  • Project 2: port 4000, PM2 cluster tương tự

6️⃣ Setup Nginx Reverse Proxy + Load Balancing

  • sudo nano /etc/nginx/sites-available/pingtotalk.com:
  • Kích hoạt:
  • Project 2: tương tự, port FE 4000, backend 4001/4002

7️⃣ HTTPS với Let’s Encrypt

  • HTTPS tự động, redirect HTTP → HTTPS

8️⃣ SSH Tunnel + GUI DB

  • SSH tunnel cho DB:
  • GUI: TablePlus / DBeaver / pgAdmin → connect localhost:5432
  • DB không public → bảo mật cao

9️⃣ Backup / Snapshot

  • Snapshot VPS định kỳ
  • Backup Postgres:

10️⃣ Multi-domain / Multi-project

  • Nginx / Caddy → server block cho mỗi domain
  • FE PM2 + BE Docker → port riêng
  • DB + Redis → internal network, schema riêng nếu nhiều project

Hoàn thiện

  • FE PM2 cluster → tận dụng 4 CPU
  • BE Docker scale 2 container + Nginx LB
  • Postgres + Redis → internal, secure
  • Multi-domain → Nginx / Caddy
  • HTTPS → Let’s Encrypt
  • SSH Tunnel → GUI DB an toàn
  • Backup → snapshot + DB dump

© Hiếu Trần 2020 - 2025

Tip: Use console.table() for better array logging!