Деплой FastAPI на сервер (Uvicorn + Nginx)

Деплой FastAPI на сервер (Uvicorn + Nginx) FastAPI

Привет! Ты написал крутое FastAPI-приложение. Теперь его нужно показать миру. Но запуск через uvicorn main:app --reload подходит только для разработки. В продакшене нужен совсем другой подход.

В этой статье мы разберём полноценный production-деплой FastAPI на VPS (Ubuntu):

  • Gunicorn как менеджер процессов
  • Uvicorn-воркеры для асинхронности
  • Nginx как reverse proxy
  • systemd для автозапуска
  • HTTPS через Certbot

Что нужно знать перед началом

Для этого урока тебе понадобится:

  • VPS с Ubuntu 22.04 или новее
  • Домен (или IP-адрес для теста)
  • SSH-доступ к серверу

Совет: FastAPI — ASGI-фреймворк, поэтому для продакшена нужен ASGI-сервер (Uvicorn) и процесс-менеджер (Gunicorn).

Почему не uvicorn main:app --reload в продакшене?

ПроблемаПочему это плохо
Один процессИспользует только одно ядро CPU 
Нет автозапускаПри падении процесс не восстановится 
--reloadПотребляет ресурсы на файловый вотчер 
Нет graceful shutdownПри обновлении теряются запросы 

Правильная production-схема: клиент → Nginx → Gunicorn (UvicornWorker) → FastAPI 

Подготовка сервера

Подключение к серверу

ssh username@your_server_ip

Обновление системы и установка зависимостей

sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 python3-pip python3-venv nginx git

Совет: Убедись, что Python 3.10+ установлен. FastAPI требует Python 3.7+.

Настройка firewall

sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable

Подготовка приложения

Структура проекта

myapp/
├── app/
│   ├── __init__.py
│   ├── main.py          # app = FastAPI()
│   ├── routers/
│   └── core/
├── requirements.txt
├── .env
└── README.md

Копирование кода на сервер

Вариант А — через Git:

git clone https://github.com/yourusername/myapp.git
cd myapp

Вариант Б — через SCP (локально):

scp -r ./myapp username@server_ip:/home/username/myapp

Виртуальное окружение и зависимости

cd /home/username/myapp
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
pip install gunicorn uvicorn[standard]

Совет: Установка uvicorn[standard] даёт максимальную производительность за счёт uvloop и httptools.

Запуск через Gunicorn + UvicornWorker

Тестовый запуск (проверка)

gunicorn -k uvicorn.workers.UvicornWorker app.main:app --bind 0.0.0.0:8000 --workers 2
  • -k uvicorn.workers.UvicornWorker — ASGI-воркер 
  • app.main:app — путь к переменной app (убедись, что в main.py есть app = FastAPI())
  • --workers 2 — количество воркеров

Совет: В main.py должен быть объект app, например: app = FastAPI().

Оптимальное количество воркеров

Формула для синхронных WSGI-приложений: (2 × CPU) + 1 .

Для FastAPI (асинхронного):

Тип нагрузкиРекомендация
I/O-интенсивная (БД, API)workers = CPU или меньше 
CPU-интенсивная(2 × CPU) + 1 

Проверь количество ядер:

nproc

Совет: Не забывай про память. Каждый воркер — отдельный процесс. Если приложение использует ML-модели, один воркер может занимать 300–500 МБ.

systemd — автозапуск и перезапуск

Создание service-файла

sudo nano /etc/systemd/system/myapp.service
Description=My FastAPI Application
After=network.target

[Service]
User=your_username
Group=your_username
WorkingDirectory=/home/your_username/myapp
Environment="PATH=/home/your_username/myapp/venv/bin:$PATH"
ExecStart=/home/your_username/myapp/venv/bin/gunicorn -k uvicorn.workers.UvicornWorker app.main:app --bind 0.0.0.0:8000 --workers 4
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Запуск и проверка

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

Совет: Если приложение использует переменные окружения, добавь в секцию [Service] строку:

EnvironmentFile=/home/your_username/myapp/.env

Nginx — reverse proxy

Создание конфигурации

sudo nano /etc/nginx/sites-available/myapp
server {
    listen 80;
    server_name your_domain.com;  # или IP-адрес

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        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;
    }

    # Для WebSocket (если нужен)
    location /ws/ {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }
}

Совет: proxy_set_header X-Forwarded-Proto $scheme передаёт информацию о протоколе (HTTP/HTTPS) в FastAPI.

Активация и перезапуск

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Совет: Если используешь IP вместо домена, в server_name укажи IP-адрес сервера.

HTTPS (Certbot)

Установка Certbot

sudo apt install certbot python3-certbot-nginx

Получение SSL-сертификата

sudo certbot --nginx -d your_domain.com

Для множества доменов:

sudo certbot --nginx -d your_domain.com -d api.your_domain.com

Автообновление сертификата

sudo systemctl status certbot.timer

Certbot автоматически обновляет сертификаты (2 раза в день). Проверить можно через sudo certbot renew --dry-run.

Обновление приложения

Процесс обновления

cd /home/your_username/myapp
git pull
source venv/bin/activate
pip install -r requirements.txt
sudo systemctl restart myapp
sudo systemctl status myapp

Совет: Для zero-downtime деплоя используй стратегию rolling restart с несколькими воркерами и сигналом SIGUSR2.

Мониторинг и логи

Логи приложения

sudo journalctl -u myapp -f

Логи Nginx

sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log

Проверка статуса

sudo systemctl status myapp
sudo systemctl status nginx

Шпаргалка

КомандаНазначение
gunicorn -k uvicorn.workers.UvicornWorker main:app --workers 4Запуск FastAPI 
sudo systemctl start myappЗапуск сервиса
sudo systemctl enable myappАвтозапуск при старте
sudo systemctl status myappСтатус сервиса
sudo journalctl -u myapp -fЛоги в реальном времени
sudo certbot --nginx -d domain.comSSL-сертификат 

Заключение

Сегодня мы:

  • Настроили Gunicorn с Uvicorn-воркерами
  • Создали systemd-сервис для автозапуска
  • Настроили Nginx как reverse proxy
  • Добавили HTTPS через Certbot
  • Разобрали мониторинг и обновление

Что дальше?

Оцените статью
IMI-DS - PYTHON LERNEN
Содержание
Оглавление ×