Привет! Ты написал крутое FastAPI-приложение. Теперь его нужно показать миру. Но запуск через uvicorn main:app --reload подходит только для разработки. В продакшене нужен совсем другой подход.
В этой статье мы разберём полноценный production-деплой FastAPI на VPS (Ubuntu):
- Gunicorn как менеджер процессов
- Uvicorn-воркеры для асинхронности
- Nginx как reverse proxy
- systemd для автозапуска
- HTTPS через Certbot
- Что нужно знать перед началом
- Почему не uvicorn main:app --reload в продакшене?
- Подготовка сервера
- Подключение к серверу
- Обновление системы и установка зависимостей
- Настройка firewall
- Подготовка приложения
- Структура проекта
- Копирование кода на сервер
- Виртуальное окружение и зависимости
- Запуск через Gunicorn + UvicornWorker
- Тестовый запуск (проверка)
- Оптимальное количество воркеров
- systemd — автозапуск и перезапуск
- Создание service-файла
- Запуск и проверка
- Nginx — reverse proxy
- Создание конфигурации
- Активация и перезапуск
- HTTPS (Certbot)
- Установка Certbot
- Получение SSL-сертификата
- Автообновление сертификата
- Обновление приложения
- Процесс обновления
- Мониторинг и логи
- Логи приложения
- Логи Nginx
- Проверка статуса
- Шпаргалка
- Заключение
- Что дальше?
Что нужно знать перед началом
Для этого урока тебе понадобится:
- VPS с Ubuntu 22.04 или новее
- Домен (или IP-адрес для теста)
- SSH-доступ к серверу
Совет: FastAPI — ASGI-фреймворк, поэтому для продакшена нужен ASGI-сервер (Uvicorn) и процесс-менеджер (Gunicorn).
Почему не uvicorn main:app --reload в продакшене?
Правильная 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.serviceDescription=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/.envNginx — reverse proxy
Создание конфигурации
sudo nano /etc/nginx/sites-available/myappserver {
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.timerCertbot автоматически обновляет сертификаты (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 с Uvicorn-воркерами
- Создали systemd-сервис для автозапуска
- Настроили Nginx как reverse proxy
- Добавили HTTPS через Certbot
- Разобрали мониторинг и обновление








