0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Triển khai ứng dụng FastAPI trên Digital Ocean với Nginx

Đăng vào 1 tháng trước

• 6 phút đọc

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

  1. Yêu cầu
  2. Thiết lập Droplet trên Digital Ocean
  3. Cài đặt máy chủ và ứng dụng
  4. Cấu hình Nginx như một Reverse Proxy
  5. Triển khai ứng dụng một cách thủ công
  6. Tự động hóa triển khai với GitHub Actions CI/CD
  7. Mẹo và Thực hành tốt
  8. Các vấn đề thường gặp
  9. 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:
Copy
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):

Copy
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:

Copy
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:

Copy
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.

Copy
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.

Copy
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.

Copy
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ó.

Copy
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:

Copy
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:

Copy
sudo nginx -t

Nếu thành công, khởi động lại Nginx:

Copy
sudo systemctl restart nginx

Triển khai ứng dụng một cách thủ công

Clone repository của bạn:

Copy
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:

Copy
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:

Copy
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:

Copy
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ụ:

Copy
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):

Copy
[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ụ:

Copy
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:

  1. SSH vào Droplet của bạn.
  2. git pull mã mới nhất.
  3. pipenv install bất kỳ phụ thuộc mới nào.
  4. 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!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào