
Vừa thuê VPS lần đầu, mở email lên thấy có IP, có root password, xong rồi sao? Bài này dắt tay từ lúc login SSH đầu tiên cho tới khi VPS sẵn sàng deploy app, không tốn quá 30 phút. Tất cả command thật, không lý thuyết suông.
Trước khi bắt đầu: bạn có gì trong tay
Sau khi mua VPS xong, provider sẽ gửi cho bạn 3 thứ cơ bản:
- IP public (ví dụ 103.245.x.x)
- Username (thường là
root) - Password root (chuỗi random ~16 ký tự)
Ở TND Cloud thì sau khi đặt gói VPS qua trang đăng ký Cloud VPS, máy ảo khởi tạo trong khoảng 60 giây và email thông tin về liền. OS mặc định thường là Ubuntu 22.04 hoặc 24.04 LTS, bài này mình dùng Ubuntu làm ví dụ vì 80% use case của dev VN là Ubuntu.
Bước 1: SSH login lần đầu
Trên macOS / Linux
Mở Terminal, gõ:
ssh [email protected]Lần đầu nó hỏi xác nhận fingerprint, gõ yes. Sau đó nhập password (lưu ý password sẽ KHÔNG hiện gì khi gõ, đừng tưởng máy treo).
Trên Windows
Windows 10/11 đã có sẵn OpenSSH client, mở PowerShell cũng dùng lệnh trên y chang. Còn nếu thích GUI thì dùng PuTTY hoặc MobaXterm: nhập IP, port 22, click Connect, nhập user/pass.
ping IP trước, nếu ping được mà SSH không vào thì check lại port 22.Bước 2: Đổi root password ngay (nếu provider gửi qua email)
Password trong email là dạng plaintext, ai access được email cũ của bạn cũng có quyền vào VPS. Đổi liền:
passwdNhập password mới 2 lần. Pick một chuỗi >= 16 ký tự, mix chữ hoa thường số ký tự đặc biệt. Lưu vào password manager (Bitwarden, 1Password).
Bước 3: Tạo non-root user (đừng làm việc bằng root)
Root có quyền vô hạn, một lệnh sai là banh server. Tạo user thường có quyền sudo để daily work:
adduser tnd
usermod -aG sudo tndNó hỏi password, hỏi full name (skip cho nhanh, Enter hết). Test thử bằng cách mở terminal mới:
ssh [email protected]
sudo whoami # phải trả về "root"Từ giờ trở đi, dùng user tnd để làm việc, chỉ sudo khi cần quyền cao.
Bước 4: SSH key authentication (mạnh hơn password nhiều)
Password dễ brute-force, SSH key dùng cặp khóa public/private 2048-4096 bit, gần như bất khả crack với hardware hiện tại.
Tạo key trên máy local
ssh-keygen -t ed25519 -C "tnd@laptop"Nhấn Enter chấp nhận đường dẫn default (~/.ssh/id_ed25519). Optional: set passphrase cho key. Sau khi xong, có 2 file: id_ed25519 (private, KHÔNG share) và id_ed25519.pub (public, copy lên server).
Copy public key lên VPS
ssh-copy-id [email protected]Nó tự append key vào ~/.ssh/authorized_keys của user tnd. Test lại:
ssh [email protected]Vào luôn không hỏi password nữa = thành công.
Disable password login (sau khi key chạy ngon)
Edit SSH config:
sudo nano /etc/ssh/sshd_configĐổi (hoặc thêm) 3 dòng:
PasswordAuthentication no
PermitRootLogin no
PubkeyAuthentication yesSave (Ctrl+O, Enter, Ctrl+X), reload SSH:
sudo systemctl reload sshBước 5: Update OS và setup timezone, hostname
sudo apt update && sudo apt upgrade -y
sudo timedatectl set-timezone Asia/Ho_Chi_Minh
sudo hostnamectl set-hostname web01Reboot 1 lần nếu kernel cập nhật: sudo reboot. Đợi ~30 giây rồi ssh lại.
Bước 6: ufw firewall, chỉ mở port cần thiết
Mặc định Ubuntu mở mọi port. Bật firewall, allow chỉ 22 (SSH) + 80/443 (web):
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verboseNếu chạy app port khác (3000, 8080), nhớ allow thêm. Còn nếu app chạy sau Nginx reverse proxy thì không cần mở 3000 ra ngoài, chỉ nội bộ 127.0.0.1.
Bước 7: fail2ban chặn brute-force SSH
Dù đã disable password, vẫn nên có fail2ban để giảm noise trong log và chặn các IP scan tự động:
sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshdMặc định ban 10 phút sau 5 lần fail. Muốn chỉnh thì edit /etc/fail2ban/jail.local.
Bước 8: Swap file 2GB (cứu RAM khi peak load)
VPS gói nhỏ RAM 2-4GB, khi build code hoặc run app nặng (Node, Python, Java) dễ bị OOM kill. Swap đóng vai trò "RAM phụ" trên disk, chậm hơn RAM thật nhưng cứu được crash:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -hDòng cuối kiểm tra: Swap: 2.0G là OK.
Bước 9: tmux để session không chết khi disconnect
Đây là vấn đề kinh điển: SSH đang chạy npm run build thì mất mạng, build hủy giữa chừng, mất 10 phút làm lại. tmux giải quyết bằng cách giữ session chạy trên server, bạn detach/attach lúc nào cũng được.
sudo apt install tmux -y
tmux new -s work # tạo session tên "work"
# Chạy lệnh dài, ví dụ:
npm run build
# Detach: Ctrl+B rồi D (session vẫn chạy)
# Reconnect lại:
tmux attach -t workCheatsheet tmux cơ bản (sau khi nhấn prefix Ctrl+B):
| Phím | Tác dụng |
|---|---|
| D | Detach session (giữ chạy nền) |
| C | Tạo window mới |
| N / P | Chuyển window kế / trước |
| % | Split pane dọc |
| " | Split pane ngang |
| arrow keys | Chuyển giữa các pane |
| X | Đóng pane hiện tại |
List session đang chạy: tmux ls. Kill session: tmux kill-session -t work.
Bước 10: Test stack cơ bản (Nginx + Node ví dụ)
Để chắc VPS ngon, deploy thử 1 trang hello world:
sudo apt install nginx -y
curl http://localhost # phải thấy "Welcome to nginx"
# Mở browser truy cập http://103.245.x.x cũng phải thấy trang đóNếu trên local browser không vào được, check ufw sudo ufw status coi port 80 mở chưa.
Cheatsheet 10 lệnh dùng hàng ngày
| Lệnh | Mục đích |
|---|---|
htop | Xem CPU/RAM realtime (cài: sudo apt install htop) |
df -h | Xem disk usage |
free -h | Xem RAM/swap |
journalctl -u nginx -f | Tail log service |
ss -tlnp | List port đang listen |
systemctl status nginx | Status service |
sudo reboot | Khởi động lại VPS |
uptime | Xem load average + thời gian on |
history | grep ssh | Tìm lệnh cũ đã gõ |
scp file.txt tnd@ip:~/ | Upload file lên VPS |
Lỗi thường gặp khi mới dùng VPS
"Connection refused" khi SSH
SSH service chưa start hoặc firewall chặn. Vào console của provider (TND có web console), check sudo systemctl status ssh.
"Permission denied (publickey)"
SSH key chưa setup đúng. Kiểm tra ~/.ssh/authorized_keys trên VPS có chứa public key chưa, permission file phải là 600, thư mục ~/.ssh là 700.
VPS bỗng dưng load cao, web chậm
Vào htop xem process nào ăn CPU. Thường là bị bot scan, crawl, hoặc app memory leak. Kết hợp với fail2ban + Cloudflare đứng trước domain là giảm 80% trường hợp này.
Hết disk
Check df -h, thường /var/log phình to. sudo journalctl --vacuum-time=7d dọn log cũ hơn 7 ngày.
Tổng kết: sau 30 phút bạn đã có gì
- VPS Ubuntu update mới, timezone VN
- Non-root user với sudo
- SSH key only, password disabled
- ufw firewall chỉ mở port cần
- fail2ban chặn brute-force
- Swap 2GB phòng OOM
- tmux để session không chết
- Stack web cơ bản test xong
Đây là baseline cho mọi VPS chạy production thật, không phải lab. Sau bước này bạn deploy được WordPress, Node app, Python API, Docker container, mua domain trỏ về là live. Nếu cần infra ổn định lâu dài (Ceph SSD, RAM ECC, datacenter VN giảm latency), tham khảo các gói Cloud VPS của TND với khởi tạo trong 60 giây.
Bài viết liên quan
Sẵn sàng VPS đầu tiên?
TND Cloud VPS từ 199k/tháng: SSD Ceph NVMe, RAM ECC, IPv4 + IPv6, datacenter VN. Cài Ubuntu xong là apply checklist này, 30 phút sau deploy app.
Xem bảng giá Cloud VPS- OpenClaw là gì? Hướng dẫn self-host OpenClaw trên VPS TND từ A-Z
- Next.js vs Rails vs Django: chọn framework cho SaaS 2026
- Chuyển server từ văn phòng sang datacenter Hà Nội
- Cảnh báo bảo mật khẩn: 2 lỗ hổng nghiêm trọng CVE-2026-31431 (Linux Kernel) và CVE-2026-41940 (cPanel) - Hướng dẫn xử lý
- Cài OpenClaw kết nối Telegram làm trợ lý cá nhân 24/7 trên VPS
- Setup Uptime Kuma trên VPS: monitor 20 endpoint free đẹp hơn UptimeRobot



