Bản hướng dẫn triển khai Project production full trên 1 VPS
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)
sudo adduser deploy sudo usermod -aG sudo deploy
- SSH key authentication: upload public key vào
/home/deploy/.ssh/authorized_keys
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
- Cập nhật hệ thống:
sudo apt update && sudo apt upgrade -y sudo apt install curl wget git ufw -y
- Firewall (mở 22, 80, 443):
sudo ufw allow 22 sudo ufw allow 80 sudo ufw allow 443 sudo ufw enable
2️⃣ Cài Node.js, PM2
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt install -y nodejs build-essential node -v npm -v sudo npm install -g pm2 pm2 -v
- PM2 startup:
pm2 startup systemd
3️⃣ Cài Docker + Docker Compose
sudo apt install -y docker.io docker-compose sudo systemctl enable docker sudo systemctl start docker sudo usermod -aG docker deploy
- Logout → login lại để cập nhật nhóm docker
docker --version docker compose version
4️⃣ Setup Backend Docker (NestJS) + Postgres + Redis
- Tạo thư mục:
mkdir -p ~/pingtotalk/backend cd ~/pingtotalk/backend
.envfile:
POSTGRES_USER=pingto_user POSTGRES_PASSWORD=StrongPass123! POSTGRES_DB=pingtotalk REDIS_PASSWORD=RedisStrongPass! BACKEND_PORT=3001
docker-compose.yml:
version: "3.9" services: postgres: image: postgres:15 environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - pgdata:/var/lib/postgresql/data networks: - backend redis: image: redis:7 environment: REDIS_PASSWORD: ${REDIS_PASSWORD} networks: - backend backend: build: . ports: - "3001:3001" env_file: - .env networks: - backend networks: backend: volumes: pgdata:
- Scale 2 container:
docker compose up -d --scale backend=2
5️⃣ Setup Frontend Next.js + PM2
- Clone project FE:
mkdir -p ~/pingtotalk/frontend cd ~/pingtotalk/frontend git clone YOUR_FE_REPO . npm install npm run build
- Chạy PM2 cluster:
pm2 start npm --name pingto-fe -- start -i max pm2 save
- Project 2: port 4000, PM2 cluster tương tự
6️⃣ Setup Nginx Reverse Proxy + Load Balancing
sudo apt install nginx -y
sudo nano /etc/nginx/sites-available/pingtotalk.com:
upstream backend_cluster { server 127.0.0.1:3001; server 127.0.0.1:3002; } server { listen 80; server_name pingtotalk.com www.pingtotalk.com; location /api/ { proxy_pass http://backend_cluster; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } location / { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
- Kích hoạt:
sudo ln -s /etc/nginx/sites-available/pingtotalk.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
- Project 2: tương tự, port FE 4000, backend 4001/4002
7️⃣ HTTPS với Let’s Encrypt
sudo apt install certbot python3-certbot-nginx -y sudo certbot --nginx -d pingtotalk.com -d www.pingtotalk.com sudo certbot --nginx -d example2.com -d www.example2.com
- HTTPS tự động, redirect HTTP → HTTPS
8️⃣ SSH Tunnel + GUI DB
- SSH tunnel cho DB:
ssh -L 5432:localhost:5432 deploy@YOUR_VPS_IP
- 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:
docker exec -t postgres pg_dumpall -c -U pingto_user > dump_$(date +%F).sql
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