Hướng dẫn triển khai ứng dụng FastAPI trên Digital Ocean với Nginx và CI/CD
Triển khai một ứng dụng FastAPI trên Digital Ocean có thể là một thử thách, đặc biệt là đối với những người mới bắt đầu. Hướng dẫn này sẽ hướng dẫn bạn từng bước từ việc thiết lập một Droplet, cài đặt các phụ thuộc cần thiết, cấu hình Nginx như một reverse proxy và thiết lập pipeline CI/CD với GitHub Actions.
Mục lục
- Yêu cầu
- Thiết lập Droplet trên Digital Ocean
- Cài đặt máy chủ và ứng dụng
- Cấu hình Nginx như một Reverse Proxy
- Triển khai ứng dụng một cách thủ công
- Tự động hóa triển khai với GitHub Actions CI/CD
- Mẹo và Thực hành tốt
- Các vấn đề thường gặp
- Kết luận
Yêu cầu
- Tài khoản Digital Ocean.
- Ứng dụng FastAPI trong kho GitHub.
- Kiến thức cơ bản về dòng lệnh và SSH.
Thiết lập Droplet trên Digital Ocean
1. Tạo một Droplet:
- Đăng nhập vào bảng điều khiển Digital Ocean và nhấp vào "Tạo" -> "Droplets".
- Chọn Ubuntu (phiên bản LTS gần đây như 22.04 hoặc 24.04) làm hệ điều hành.
- Chọn gói. Gói Basic Shared CPU là lựa chọn tốt để bắt đầu.
- Chọn khu vực trung tâm dữ liệu gần bạn nhất.
- Xác thực: Để bảo mật, ưu tiên sử dụng SSH keys thay vì mật khẩu. Thêm khóa công khai SSH của bạn. Nếu bạn chưa thiết lập, hãy làm theo hướng dẫn này.
- Hoàn tất và tạo Droplet.
2. Truy cập vào Droplet của bạn:
- Sau khi tạo xong, tìm địa chỉ IP công cộng của Droplet trong bảng điều khiển.
- Mở terminal của bạn và kết nối:
ssh root@your_droplet_ip_address
Cài đặt máy chủ và ứng dụng
Khi đã đăng nhập với quyền root, chạy các lệnh sau để chuẩn bị cho máy chủ của bạn.
Tạo người dùng không phải root (Thực hành bảo mật tốt):
adduser deployer
usermod -aG sudo deployer
Điều này tạo một người dùng mới có tên deployer và thêm vào nhóm sudo.
Sao chép khóa SSH của bạn đến người dùng mới:
rsync --archive --chown=deployer:deployer ~/.ssh /home/deployer
Giờ đây, bạn có thể ngắt kết nối và đăng nhập với người dùng mới: ssh deployer@your_droplet_ip_address.
Cập nhật hệ thống:
sudo apt update && sudo apt upgrade -y
Cài đặt Python, Pip và Pipenv:
Chúng ta sẽ sử dụng pipenv để quản lý môi trường ảo và các phụ thuộc của ứng dụng.
sudo apt install python3-pip -y
pip3 install pipenv
Cài đặt Nginx:
Nginx sẽ hoạt động như một reverse proxy, xử lý yêu cầu của khách hàng và chuyển chúng đến ứng dụng FastAPI của bạn.
sudo apt install nginx -y
Thiết lập Firewall (UFW):
Cấu hình tường lửa để cho phép lưu lượng SSH, HTTP và HTTPS.
sudo ufw allow 'OpenSSH'
sudo ufw allow 'Nginx Full'
sudo ufw enable
Cấu hình Nginx như một Reverse Proxy
Tạo một tệp cấu hình Nginx:
Tạo một tệp mới cho trang web của bạn trong /etc/nginx/sites-available/. Dán cấu hình sau: Thay thế your_droplet_ip_address bằng địa chỉ IP thực tế hoặc tên miền nếu bạn có.
server {
listen 80;
server_name your_droplet_ip_address;
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;
}
}
Điều này yêu cầu Nginx lắng nghe trên cổng 80 và chuyển tiếp tất cả lưu lượng đến ứng dụng FastAPI đang chạy trên 127.0.0.1:8000.
Kích hoạt cấu hình:
Tạo một liên kết tượng trưng đến thư mục sites-enabled:
sudo ln -s /etc/nginx/sites-available/fastapi_app /etc/nginx/sites-enabled/
Kiểm tra cấu hình Nginx:
Kiểm tra cấu hình Nginx để phát hiện lỗi cú pháp:
sudo nginx -t
Nếu thành công, khởi động lại Nginx:
sudo systemctl restart nginx
Triển khai ứng dụng một cách thủ công
Clone repository của bạn:
git clone https://github.com/your_username/your_repo_name.git /home/deployer/app
cd /home/deployer/app
Cài đặt các phụ thuộc với Pipenv:
pipenv install
Chạy ứng dụng:
Hãy kiểm tra xem mọi thứ có hoạt động không. Chạy ứng dụng của bạn trong shell Pipenv:
pipenv run uvicorn main:app --host 0.0.0.0 --port 8000
Truy cập http://your_droplet_ip_address trong trình duyệt của bạn. Bạn sẽ thấy ứng dụng FastAPI của mình đang chạy phía sau Nginx! Nhấn Ctrl+C để dừng máy chủ.
Tự động hóa triển khai với GitHub Actions CI/CD
Chúng ta sẽ tạo một workflow tự động triển khai ứng dụng khi push lên nhánh main.
Tạo GitHub Secrets:
Trong kho GitHub của bạn, đi đến Cài đặt > Secrets và biến > Actions.
- Tạo hai bí mật mới:
HOST: Địa chỉ IP của Droplet của bạn.SSH_PRIVATE_KEY: Nội dung toàn bộ của khóa SSH riêng (khóa mà bạn đã thêm vào Digital Ocean).
Tạo tệp Workflow:
Trong kho của bạn, tạo thư mục .github/workflows/ và một tệp bên trong có tên deploy.yml.
Cấu hình Workflow triển khai:
Dán cấu hình YAML sau vào .github/workflows/deploy.yml:
name: Deploy to DigitalOcean Droplet
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Deploy to Droplet
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.HOST }}
username: deployer
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /home/deployer/app
git pull origin main
pipenv install
sudo systemctl restart fastapi.service
Tạo một dịch vụ Systemd:
Script CI/CD ở trên cố gắng chạy sudo systemctl restart fastapi.service. Chúng ta cần tạo dịch vụ này để chạy ứng dụng của chúng ta ở chế độ nền và khởi động lại khi khởi động lại.
Trên Droplet của bạn, tạo tệp dịch vụ:
sudo nano /etc/systemd/system/fastapi.service
Dán cấu hình sau, điều chỉnh các đường dẫn nếu cần thiết (User, WorkingDirectory, và lệnh):
[Unit]
Description=FastAPI Application
After=network.target
[Service]
User=deployer
Group=www-data
WorkingDirectory=/home/deployer/app
Environment="PATH=/home/deployer/.local/bin"
ExecStart=/usr/local/bin/pipenv run uvicorn main:app --host 0.0.0.0 --port 8000
[Install]
WantedBy=multi-user.target
Kích hoạt và khởi động dịch vụ:
sudo systemctl daemon-reload
sudo systemctl enable fastapi.service
sudo systemctl start fastapi.service
Bạn có thể kiểm tra trạng thái của nó với: sudo systemctl status fastapi.service.
Mẹo và Thực hành tốt
- Thực hành bảo mật: Hãy luôn sử dụng SSH key và không để mật khẩu mặc định.
- Sao lưu dữ liệu: Đảm bảo sao lưu thường xuyên dữ liệu và cấu hình của bạn.
- Giám sát ứng dụng: Sử dụng các công cụ giám sát để theo dõi hiệu suất ứng dụng.
Các vấn đề thường gặp
- Không thể truy cập ứng dụng: Đảm bảo rằng bạn đã mở cổng trên firewall và Nginx đang chạy.
- Lỗi khi khởi động ứng dụng: Kiểm tra các logs của ứng dụng và Nginx để xác định nguyên nhân.
Kết luận
Bạn đã thiết lập thành công một pipeline tự động để triển khai ứng dụng FastAPI của mình trên Digital Ocean. Bây giờ, mỗi khi bạn push mã lên nhánh main trên GitHub, GitHub Actions sẽ tự động:
- SSH vào Droplet của bạn.
git pullmã mới nhất.pipenv installbất kỳ phụ thuộc mới nào.- Khởi động lại
fastapi.serviceđể áp dụng thay đổi.
Bạn có thể truy cập địa chỉ IP của Droplet trong trình duyệt web và sẽ thấy ứng dụng FastAPI tự động triển khai của bạn!