Giới thiệu

Việc triển khai một website lên môi trường thực tế không chỉ đòi hỏi kiến thức về server mà còn cần hiểu rõ cách đóng gói ứng dụng để giảm thiểu lỗi cấu hình. Docker là công cụ mạnh mẽ giúp tạo ra các container độc lập, tái sử dụng và dễ dàng di chuyển giữa các môi trường. Bài viết này sẽ hướng dẫn chi tiết cách chuẩn bị VPS, xây dựng Docker image cho một ứng dụng Node.js, và cấu hình SSL để website luôn chạy trên giao thức HTTPS an toàn.

Chuẩn bị môi trường VPS

Cài đặt Docker

Trước tiên, bạn cần một VPS chạy hệ điều hành Ubuntu 20.04 hoặc mới hơn. Đăng nhập bằng ssh và thực hiện các lệnh sau để cài Docker:

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker

Sau khi cài xong, kiểm tra phiên bản Docker bằng docker --version để chắc chắn mọi thứ đã sẵn sàng.

Đóng gói ứng dụng vào Docker image

Tạo Dockerfile cho ứng dụng Node.js

Giả sử dự án của bạn có cấu trúc chuẩn với file package.json và thư mục src. Tạo một file Dockerfile ở thư mục gốc dự án:

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "src/index.js"]

Dockerfile trên sử dụng image Node.js chính thức, sao chép các file cần thiết, cài đặt phụ thuộc và khởi chạy ứng dụng trên cổng 3000.

Xây dựng Docker image

Sử dụng lệnh docker build để tạo image:

docker build -t mynodeapp:latest .

Sau khi quá trình xây dựng hoàn tất, bạn có thể kiểm tra bằng docker images để xác nhận image đã tồn tại.

Triển khai và quản lý container

Sử dụng docker-compose

Để dễ dàng quản lý nhiều container (ví dụ: ứng dụng Node.js và cơ sở dữ liệu MySQL), chúng ta sẽ dùng docker-compose. Tạo file docker-compose.yml với nội dung:

version: "3.8"
services:
web:
image: mynodeapp:latest
restart: always
ports:
- "80:3000"
environment:
- NODE_ENV=production
db:
image: mysql:8.0
restart: always
environment:
- MYSQL_ROOT_PASSWORD=StrongPass123
- MYSQL_DATABASE=mydb
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:

Chạy docker-compose up -d để khởi động cả hai container trong chế độ nền. Ứng dụng web sẽ được ánh xạ tới cổng 80 của VPS, sẵn sàng phục vụ lưu lượng truy cập.

Cấu hình SSL và chuyển hướng HTTPS

Sử dụng Nginx làm reverse proxy

Để cung cấp chứng chỉ SSL miễn phí từ Let's Encrypt, chúng ta sẽ đặt Nginx làm reverse proxy phía trước Docker container. Cài đặt Nginx và Certbot:

sudo apt-get install -y nginx certbot python3-certbot-nginx
sudo systemctl start nginx
sudo systemctl enable nginx

Sau khi cài xong, chạy lệnh sau để lấy chứng chỉ và tự động cấu hình Nginx:

sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com

Certbot sẽ tạo file cấu hình Nginx tương tự:

server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
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;
}
}

Redirect HTTP sang HTTPS bằng .htaccess (đối với Apache)

Nếu server của bạn chạy Apache, bạn có thể sử dụng file .htaccess để chuyển hướng tất cả yêu cầu HTTP sang HTTPS:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Đặt file này vào thư mục gốc của website và đảm bảo module mod_rewrite đã được kích hoạt.

Kết luận

Việc triển khai website lên VPS bằng Docker giúp giảm thiểu rủi ro cấu hình và tăng tính di động của ứng dụng. Khi đã hoàn thiện quy trình trên, bạn sẽ có một môi trường production ổn định, bảo mật với SSL và dễ dàng mở rộng trong tương lai. Tham khảo khóa học "Deploy Web - Triển khai website lên môi trường Internet" tại đây.