Virtualization

VPS cho lập trình viên tự host code

Bạn vừa hoàn thành một side project, muốn demo cho khách hàng hoặc bạn bè xem thay vì chỉ đẩy code lên GitHub. Hoặc bạn đang muốn tự host một vài service cho riêng mình mà không muốn trả phí dịch vụ PaaS. Đó chính là lúc một VPS cho lập trình viên phát huy tác dụng. Bài này mình sẽ chỉ bạn cách chọn cấu hình VPS phù hợp, thiết lập bảo mật cơ bản và đưa code của bạn lên đó hoạt động thật sự, với ví dụ cụ thể trên Ubuntu 24.04.

  • Chọn VPS từ 2 GB RAM cho ứng dụng nhỏ, 4 GB trở lên nếu chạy Docker và nhiều service.
  • Bảo mật SSH bằng key ED25519, tắt đăng nhập root bằng mật khẩu ngay từ đầu.
  • Dùng nginx làm reverse proxy và cấu hình SSL bằng Certbot để chạy HTTPS chuẩn.
  • Thiết lập CI/CD đơn giản với GitHub Actions để mỗi lần push là code tự lên server.

Yêu cầu trước khi bắt đầu

  • Một VPS Linux chạy Ubuntu 24.04 LTS, tối thiểu 2 GB RAM, có quyền root (hoặc user sudo).
  • Tên miền trỏ về địa chỉ IP của VPS (bản ghi A) nếu bạn muốn cấu hình HTTPS, bài này mình sẽ dùng domain app.example.com.
  • Máy tính cá nhân đã cài Git và SSH client.
  • Kiến thức cơ bản về Linux và câu lệnh trong terminal.

Vì sao lập trình viên nên tự host trên VPS?

Dịch vụ PaaS như Heroku hay Render rất tiện, nhưng chi phí tăng nhanh khi ứng dụng của bạn cần nhiều resource hơn. Một VPS full root thường rẻ hơn rõ rệt và cho bạn toàn quyền kiểm soát: tự chọn ngăn xếp công nghệ, cài bất kỳ phần mềm nào, và học được cách vận hành hệ thống. Đây là kỹ năng quan trọng nếu bạn muốn đi sâu theo hướng DevOps hoặc tự xây dựng sản phẩm riêng.

Tự host cũng giúp bạn linh hoạt hơn trong việc triển khai. Với Docker, bạn có thể chạy nhiều ứng dụng trên cùng một VPS một cách cô lập, tránh xung đột thư viện. Khi cần scale, bạn có thể dùng VPS lớn hơn hoặc tách service ra các VPS riêng.

Bước 1 - Chọn cấu hình VPS và cài đặt hệ điều hành

Với hầu hết ứng dụng web và API của lập trình viên, một VPS 2 GB RAM là điểm khởi đầu hợp lý. Bạn có thể chạy Node.js, Python, hoặc một database nhỏ. Nếu bạn dùng Docker để chạy nhiều service cùng lúc, nên cân nhắc 4 GB RAM để thoải mái hơn.

# Kiểm tra cấu hình máy sau khi đăng nhập lần đầu
free -h
df -h
nproc

Output free -h cho bạn thấy RAM khả dụng, df -h kiểm tra dung lượng ổ đĩa, còn nproc xem số CPU. Đối với một VPS cho lập trình viên, việc kiểm tra này giúp bạn chắc chắn rằng cấu hình khớp với gói bạn đã chọn.

Thành phầnGói tối thiểu (2GB)Gói thoải mái (4GB)
RAM2 GB4 GB
vCPU1 - 22 - 4
Ổ đĩa20 GB NVMe50 GB NVMe
Phù hợp vớiNode.js / Python API, blog, service nhỏDocker, nhiều service, database

Lưu ý khi mua VPS: hãy chọn gói có NVMe SSD vì tốc độ đọc ghi nhanh hơn nhiều so với HDD hoặc SATA SSD, ảnh hưởng trực tiếp đến thời gian build và khởi động ứng dụng. Khi mua VPS, bạn thường được chọn hệ điều hành, hãy chọn Ubuntu 24.04 LTS cho ổn định và được hỗ trợ lâu dài.

Bước 2 - Bảo mật SSH và tạo user thường dùng

Việc đầu tiên sau khi có VPS là bảo mật SSH. Đăng nhập bằng mật khẩu mặc định là rủi ro vì các bot quét mạng sẽ tự động dò mật khẩu. Cách an toàn là tạo user thường, cấp quyền sudo, rồi đăng nhập bằng SSH key.

# Đăng nhập bằng user root mặc định
ssh root@your_server_ip

# Tạo user mới (thay 'deploy' bằng tên bạn muốn)
adduser deploy
usermod -aG sudo deploy

Trên máy tính cá nhân, tạo cặp SSH key ED25519 nếu bạn chưa có:

ssh-keygen -t ed25519 -C "[email protected]"

Sau đó copy public key lên VPS:

ssh-copy-id deploy@your_server_ip

Bây giờ bạn có thể đăng nhập bằng user deploy và không cần mật khẩu. Kiểm tra xem key đã hoạt động chưa:

ssh deploy@your_server_ip

Tiếp theo, chỉnh file /etc/ssh/sshd_config để tắt đăng nhập bằng mật khẩu và trực tiếp qua root. Sửa các dòng sau cho khớp:

# Dùng lệnh sudo để sửa file
sudo nano /etc/ssh/sshd_config

Trong file, tìm hoặc thêm các dòng:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

Kiểm tra cú pháp và khởi động lại SSH:

sudo sshd -t
sudo systemctl restart ssh

VERIFY: trước khi ngắt kết nối, hãy mở một terminal mới và thử ssh deploy@your_server_ip. Nếu đăng nhập được mà không cần mật khẩu, bạn đã bảo mật thành công. Nếu lỗi, có thể bạn đã cấu hình sai, mở terminal cũ và sửa lại ngay.

Cuối cùng, kích hoạt UFW firewall chỉ cho phép SSH, HTTP và HTTPS. Bài viết hướng dẫn cấu hình UFW cơ bản có thể giúp bạn chi tiết hơn, nhưng đây là các lệnh nhanh:

sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Bước 3 - Cài đặt và cấu hình nginx làm reverse proxy

Reverse proxy giúp bạn chạy nhiều ứng dụng trên cùng một VPS, mỗi ứng dụng một cổng riêng, và nginx sẽ đứng trước điều hướng theo tên miền. Ví dụ, app1.example.com trỏ về cổng 3000, app2.example.com trỏ về cổng 5000.

sudo apt update
sudo apt install nginx -y

Kiểm tra nginx đã chạy:

systemctl status nginx

Output kỳ vọng là active (running). Bây giờ tạo file cấu hình cho ứng dụng của bạn:

sudo nano /etc/nginx/sites-available/app.example.com

Nội dung file:

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Trong đó localhost:3000 là cổng ứng dụng của bạn. Kích hoạt site và kiểm tra cú pháp:

sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

VERIFY: chạy lệnh curl -I http://app.example.com, nếu trả về 200 OK hoặc status của ứng dụng bạn, tức là nginx đã hoạt động.

Bài viết cấu hình nginx reverse proxy trên Ubuntu 24.04 sẽ đi sâu hơn vào các tùy chọn như WebSocket hay HTTP/2.

Bước 4 - Cấu hình SSL với Let's Encrypt

Website chạy HTTP thuần không an toàn và hiện nay các trình duyệt đều cảnh báo. Chứng chỉ SSL miễn phí từ Let's Encrypt dễ dàng cài qua Certbot và tự động gia hạn.

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d app.example.com

Lệnh này sẽ tự động phát hiện cấu hình nginx và cài SSL cho domain của bạn. Khi được hỏi, bạn có thể chọn tự động chuyển hướng HTTP sang HTTPS.

Kiểm tra quá trình gia hạn tự động:

sudo systemctl status certbot.timer

Output kỳ vọng là active (waiting). Certbot tự động gia hạn chứng chỉ trước khi hết hạn, bạn không cần can thiệp. Nếu bạn cần SSL cho nhiều subdomain, có thể tham khảo gói chứng chỉ SSL wildcard cho phép bảo vệ tất cả subdomain trong một chứng chỉ.

Bước 5 - Triển khai code lên VPS và thiết lập CI/CD

Có nhiều cách để đưa code lên VPS: dùng Git trực tiếp, dùng rsync, hoặc dùng Docker. Cách đơn giản nhất để bắt đầu là dùng Git. Trên VPS, clone repository của bạn về:

sudo apt install git -y
git clone https://github.com/yourusername/your-repo.git /opt/myapp
cd /opt/myapp

Tạo file service cho ứng dụng của bạn bằng systemd để nó tự động chạy khi reboot. Tạo file /etc/systemd/system/myapp.service với nội dung tương tự:

[Unit]
Description=My App
After=network.target

[Service]
User=deploy
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/node server.js
Restart=always
Environment=NODE_ENV=production

[Install]
WantedBy=multi-user.target

Kích hoạt service:

sudo systemctl daemon-reload
sudo systemctl enable myapp
sudo systemctl start myapp

VERIFY: sudo systemctl status myapp phải hiển thị active (running)sudo journalctl -u myapp không chứa lỗi.

Để tự động triển khai mỗi khi bạn push code lên GitHub, thiết lập GitHub Actions. Tạo file .github/workflows/deploy.yml trong repository của bạn:

name: Deploy
on:
  push:
    branches: [ main ]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy to VPS
        uses: appleboy/[email protected]
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /opt/myapp && git pull
            sudo systemctl restart myapp

Trong GitHub, vào Settings > Secrets and variables > Actions, thêm các secret HOST, USERNAME (thường là deploy), và SSH_KEY (nội dung private key của bạn). Mỗi lần push lên nhánh main, GitHub sẽ tự động kéo code mới về VPS và khởi động lại ứng dụng. Nếu bạn muốn tìm hiểu sâu hơn, bài viết triển khai CI/CD với GitHub Actions và SSH có hướng dẫn chi tiết từng bước.

Xử lý lỗi thường gặp khi tự host

Lỗi 1: Không vào được web dù nginx đang chạy. Kiểm tra firewall đã mở port 80 và 443 chưa. Chạy sudo ufw status để xem; nếu chưa, dùng lệnh ở Bước 2. Cũng kiểm tra xem bản ghi DNS đã trỏ đúng IP chưa bằng dig app.example.com.

Lỗi 2: Ứng dụng chạy localhost nhưng không truy cập từ ngoài. Kiểm tra ứng dụng của bạn có đang bind vào localhost hay không. Với Node.js, nếu bạn dùng app.listen(PORT, '127.0.0.1') thì docker hoặc nginx vẫn truy cập được, nhưng nếu bind vào 0.0.0.0 thì cần chắc chắn firewall chỉ cho phép qua nginx.

Lỗi 3: Certbot báo lỗi không lấy được chứng chỉ. Thường do port 80 đang bị chặn hoặc domain chưa trỏ đúng. Kiểm tra sudo ufw status và dùng curl -I http://app.example.com từ máy ngoài để xác nhận domain đã hoạt động.

Lỗi 4: Ứng dụng bị kill khi OOM. Nếu VPS của bạn có ít RAM và chạy nhiều service, kernel sẽ tắt tiến trình ngốn RAM nhất. Xem log bằng sudo dmesg | grep -i oom hoặc journalctl -k để xác nhận. Giải pháp là giảm bớt service, thêm swap hoặc nâng cấp RAM. Bạn có thể tham khảo bài cách bật swap trên VPS ít RAM để giảm áp lực bộ nhớ.

Lưu ý về chi phí và lựa chọn nhà cung cấp

Chi phí thuê VPS cho lập trình viên hiện nay rất cạnh tranh, thường bắt đầu từ khoảng 189.000đ/tháng cho gói nhỏ, đủ để bạn chạy vài ứng dụng và thực hành. Bạn có thể thanh toán theo tháng, không cần cam kết dài hạn, và tự cài lại hệ điều hành bất kỳ lúc nào từ control panel. Nếu bạn chỉ muốn có một môi trường để code, deploy và học thêm về vận hành, hãy bắt đầu với gói nhỏ nhất rồi nâng cấp khi cần. Khi dự án phát triển, bạn có thể chuyển sang thuê dedicated server để có toàn bộ tài nguyên vật lý cho riêng mình.

Một điểm cộng nếu bạn ở Việt Nam và khách hàng của bạn cũng ở Việt Nam: chọn VPS có IPv4 đặt tại Việt Nam giúp đường truyền trong nước nhanh và ổn định hơn, phù hợp để demo sản phẩm cho khách trong nước.

Câu hỏi thường gặp

Tôi cần bao nhiêu RAM cho VPS để tự host code?

2 GB RAM là đủ cho một ứng dụng web hoặc API nhỏ chạy Node.js, Python hoặc Ruby. Nếu bạn dùng Docker để chạy nhiều service, cần database riêng, hoặc chạy ứng dụng Java nặng, hãy chọn 4 GB trở lên.

Tôi nên dùng Git hay Docker để triển khai code lên VPS?

Bắt đầu với Git và systemd là đơn giản nhất và dễ hiểu. Docker hữu ích khi bạn cần chạy nhiều service với phiên bản thư viện khó tương thích, hoặc muốn tái tạo môi trường giống hệt giữa máy local và server.

VPS cho lập trình viên có cần IP tĩnh không?

Có. Mọi VPS Linux đều có IPv4 tĩnh riêng, giúp bạn trỏ domain về và cấu hình SSL dễ dàng. IP tĩnh cũng cần thiết nếu bạn thiết lập email server hoặc các dịch vụ yêu cầu địa chỉ cố định.

Làm sao để đảm bảo VPS của tôi an toàn khi expose ra internet?

Bảo mật SSH bằng key, tắt mật khẩu, cài firewall UFW, và luôn cập nhật hệ điều hành (sudo apt update && sudo apt upgrade) là ba việc tối thiểu. Không chạy service không cần thiết và chỉ mở đúng port mà ứng dụng cần.

Tôi có thể chạy nhiều ứng dụng trên cùng một VPS không?

Được, bạn nên dùng nginx reverse proxy để mỗi ứng dụng có một domain hoặc subdomain riêng, trỏ về các cổng khác nhau. Điều này giúp quản lý SSL và tài nguyên gọn gàng.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.