Cách deploy ứng dụng Flask lên Ubuntu VPS từ A đến Z
Hướng dẫn chuẩn bị Ubuntu VPS, cài Flask trong môi trường ảo và cấu hình Gunicorn, Nginx, systemd cùng HTTPS để đưa dự án Python lên Internet.
- 8 phút đọc
- 5 lượt xem

Hướng dẫn chuẩn bị Ubuntu VPS, cài Flask trong môi trường ảo và cấu hình Gunicorn, Nginx, systemd cùng HTTPS để đưa dự án Python lên Internet.

Hướng dẫn chuẩn bị VPS Ubuntu, cài aaPanel và thiết lập website đầu tiên từ tên miền, mã nguồn đến cơ sở dữ liệu và SSL. Phù hợp cho người mới quản trị máy chủ.
Khởi tạo tự động ngay sau khi thanh toán, chuyển khoản bằng mã QR, bật tắt và cài lại máy chủ trong trang quản lý.
Flask phù hợp để xây dựng website và API bằng Python nhờ cấu trúc gọn, dễ bắt đầu. Tuy nhiên, chạy ứng dụng bằng máy chủ phát triển tích hợp của Flask không phải cách triển khai phù hợp cho môi trường thật. Trong hướng dẫn này, bạn sẽ thực hiện từng bước deploy Flask lên Ubuntu VPS: chuẩn bị máy chủ, cài Flask trên VPS, chạy ứng dụng với Gunicorn và cấu hình Nginx làm proxy ngược.
Các lệnh dưới đây dành cho Ubuntu và giả định bạn đã có quyền truy cập VPS qua SSH. Tên miền, nếu sử dụng, cần được trỏ về địa chỉ IP của máy chủ trước khi bật HTTPS.

Trong môi trường triển khai thông thường, Nginx tiếp nhận yêu cầu từ trình duyệt rồi chuyển tiếp đến Gunicorn. Gunicorn chạy ứng dụng Flask và trả kết quả về cho Nginx. Cách bố trí này giúp tách máy chủ web khỏi ứng dụng Python, đồng thời thuận tiện hơn khi quản lý dịch vụ.
Quy trình gồm các bước chính:
Trong các ví dụ, thư mục dự án là /var/www/myflaskapp, tên miền là example.com và ứng dụng Flask có biến app trong tệp app.py. Hãy thay các giá trị này bằng thông tin thực tế của bạn.

Đăng nhập bằng SSH, sau đó cập nhật danh sách gói và cài Python, Git, Nginx cùng các công cụ cần thiết:
sudo apt update
sudo apt upgrade -y
sudo apt install -y python3 python3-venv python3-pip git nginxTạo tài khoản hệ thống riêng để chạy ứng dụng thay vì để tiến trình hoạt động bằng tài khoản quản trị. Ví dụ:
sudo adduser --system --group --home /var/www/myflaskapp flaskappNếu Ubuntu hỏi thông tin bổ sung, bạn có thể làm theo hướng dẫn trên màn hình. Tài khoản này sẽ được dùng ở các bước tiếp theo.
Nếu máy chủ đang dùng UFW, hãy cho phép kết nối SSH và lưu lượng web trước khi bật tường lửa:
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw statusĐảm bảo quy tắc SSH được thêm trước khi bật UFW để tránh tự chặn kết nối quản trị. Nếu VPS có tường lửa ở lớp quản lý bên ngoài, hãy kiểm tra thêm quy tắc tương ứng tại đó.
Bạn có thể lấy mã nguồn từ Git hoặc tải dự án lên máy chủ theo quy trình đang sử dụng. Với kho mã nguồn có thể truy cập bằng Git, chạy:
sudo -u flaskapp git clone https://example.com/your-project.git /var/www/myflaskappThay URL mẫu bằng địa chỉ kho mã nguồn của bạn. Nếu thư mục đích đã có tệp, hãy kiểm tra trước khi clone để tránh ghi đè hoặc tạo sai cấu trúc dự án.
Tạo môi trường ảo Python riêng cho ứng dụng. Môi trường này giúp các thư viện của dự án không ảnh hưởng đến gói Python của hệ thống:
cd /var/www/myflaskapp
sudo -u flaskapp python3 -m venv venv
sudo -u flaskapp /var/www/myflaskapp/venv/bin/pip install --upgrade pipNếu dự án có tệp requirements.txt, cài các thư viện bằng pip trong môi trường ảo:
sudo -u flaskapp /var/www/myflaskapp/venv/bin/pip install -r /var/www/myflaskapp/requirements.txt
sudo -u flaskapp /var/www/myflaskapp/venv/bin/pip install gunicornNếu dự án chưa có requirements.txt, hãy tạo tệp này trong môi trường phát triển và khai báo các thư viện cần thiết, trong đó có Flask. Cài Gunicorn riêng như trên nếu thư viện này chưa được liệt kê.
Gunicorn cần biết điểm vào của ứng dụng. Với cấu trúc đơn giản, nếu tệp app.py khai báo biến Flask tên app, có thể tạo tệp wsgi.py tại thư mục dự án:
from app import appKhi đó, đường dẫn ứng dụng dùng với Gunicorn là wsgi:app. Nếu dự án dùng application factory hoặc cấu trúc thư mục khác, hãy điều chỉnh điểm vào cho phù hợp. Có thể kiểm tra nhanh bằng cách chạy lệnh sau trong thư mục dự án:
sudo -u flaskapp /var/www/myflaskapp/venv/bin/gunicorn --bind 127.0.0.1:8000 wsgi:appTruy cập từ chính VPS bằng curl http://127.0.0.1:8000 để xem ứng dụng có phản hồi hay không. Dừng tiến trình bằng Ctrl+C sau khi kiểm tra. Không dùng flask run hoặc chế độ debug làm máy chủ phục vụ website công khai.
Khởi chạy Gunicorn thủ công sẽ không thuận tiện sau khi đăng xuất hoặc khởi động lại VPS. Tạo một dịch vụ systemd để Ubuntu quản lý tiến trình. Mở tệp cấu hình:
sudo nano /etc/systemd/system/myflaskapp.serviceThêm nội dung sau:
[Unit]
Description=Gunicorn service for my Flask application
After=network.target
[Service]
User=flaskapp
Group=www-data
WorkingDirectory=/var/www/myflaskapp
ExecStart=/var/www/myflaskapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 wsgi:app
Restart=on-failure
[Install]
WantedBy=multi-user.targetLưu tệp, sau đó yêu cầu systemd đọc lại cấu hình và bật dịch vụ:
sudo systemctl daemon-reload
sudo systemctl start myflaskapp
sudo systemctl enable myflaskapp
sudo systemctl status myflaskappNếu trạng thái báo dịch vụ không hoạt động, xem nhật ký để tìm nguyên nhân:
sudo journalctl -u myflaskapp -n 50 --no-pagerKiểm tra tên mô-đun, biến ứng dụng, đường dẫn dự án và quyền đọc tệp. Tham số --workers 3 chỉ là giá trị ví dụ; số worker phù hợp phụ thuộc vào đặc điểm ứng dụng và tài nguyên VPS, nên cần theo dõi khi vận hành.
Không lưu mật khẩu, khóa API hay SECRET_KEY trực tiếp trong mã nguồn. Với dữ liệu nhạy cảm, hãy dùng biến môi trường hoặc tệp cấu hình được giới hạn quyền truy cập; sau đó khai báo cách nạp chúng trong dịch vụ systemd. Không bật debug=True trên máy chủ công khai.

Tạo cấu hình Nginx để chuyển yêu cầu từ tên miền đến Gunicorn đang lắng nghe trên 127.0.0.1:8000:
sudo nano /etc/nginx/sites-available/myflaskappThêm cấu hình:
server {
listen 80;
server_name example.com www.example.com;
location / {
proxy_pass http://127.0.0.1:8000;
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;
}
}Thay example.com bằng tên miền của bạn. Kích hoạt cấu hình, kiểm tra cú pháp và nạp lại Nginx:
sudo ln -s /etc/nginx/sites-available/myflaskapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxNếu kiểm tra cú pháp báo lỗi, hãy sửa tệp trước khi reload. Đồng thời xác nhận tên miền đã trỏ đến IP VPS và dịch vụ ứng dụng đang hoạt động.
Để bật HTTPS cho tên miền, cài Certbot và tiện ích tích hợp Nginx:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.comLàm theo hướng dẫn trên màn hình để hoàn tất. Nếu chỉ dùng một tên miền phụ, hãy bỏ tên miền không sử dụng khỏi lệnh. Sau khi cấp chứng chỉ, mở website bằng HTTPS và kiểm tra trang có tải đúng hay không. Chứng chỉ HTTPS cần tên miền hợp lệ trỏ về VPS; nếu chưa có tên miền, bạn vẫn có thể kiểm tra ứng dụng bằng IP nhưng không nên xem đó là cấu hình HTTPS hoàn chỉnh.
Sau khi cấu hình, hãy mở website trên trình duyệt và kiểm tra một vài trang, biểu mẫu hoặc API quan trọng. Khi gặp lỗi, các lệnh sau giúp xác định thành phần cần kiểm tra:
sudo systemctl status myflaskapp
sudo journalctl -u myflaskapp -n 100 --no-pager
sudo nginx -t
sudo tail -n 50 /var/log/nginx/error.logMột số tình huống phổ biến:
proxy_pass.WorkingDirectory chưa trỏ đến dự án. Cài lại gói bằng pip trong venv.Khi cập nhật ứng dụng, hãy đưa mã nguồn mới lên VPS, cài các thư viện mới nếu có, rồi khởi động lại dịch vụ:
sudo systemctl restart myflaskapp
sudo systemctl status myflaskappTriển khai Flask trên Ubuntu VPS sẽ dễ quản lý hơn khi mỗi thành phần có nhiệm vụ riêng: môi trường ảo giữ thư viện dự án, Gunicorn chạy ứng dụng, systemd quản lý tiến trình và Nginx tiếp nhận lưu lượng web. Hãy kiểm tra nhật ký sau mỗi lần thay đổi và bảo vệ thông tin bí mật trước khi đưa dự án lên môi trường công khai.
Nếu bạn cần máy chủ để tự triển khai dự án Python, có thể tham khảo các gói VPS AMD EPYC Gen 3 của VibeVPS từ 81.000đ/tháng. Hãy chọn cấu hình theo nhu cầu thực tế của ứng dụng và liên hệ để được tư vấn thêm trước khi bắt đầu.
Hướng dẫn tạo systemd service trên Linux để quản lý tiến trình ứng dụng, tự khởi động cùng VPS và kiểm tra trạng thái, nhật ký hoạt động.
Hướng dẫn cài n8n trên VPS Ubuntu bằng Docker Compose, kết nối tên miền và bật HTTPS. Tự host n8n giúp bạn chủ động dữ liệu, đồng thời dễ dàng xây dựng các quy trình tự động hóa.
CÔNG TY TNHH CÔNG NGHỆ INUX