Если вы задумались над тем, как задеплоить свой проект на FastAPI в продакшн, значит, вы уже сделали значительную часть работы: написали сервер, протестировали его локально и уверены, что он готов к бою. Теперь остался последний (и, честно говоря, весьма увлекательный) шаг – развернуть всё это дело на реальном сервере. Давайте разберемся, как это сделать правильно, безопасно и с минимальными хлопотами.
В этой статье мы пошагово разберём весь процесс деплоя FastAPI на Ubuntu. Для удобства разделим материал на три части:
- Подготовка сервера и окружения.
- Установка и настройка FastAPI (и его соседа Uvicorn).
- Настройка сервера Nginx и обеспечения безопасности (включая SSL).
Часть 1: Подготовка сервера и окружения
Выбираем сервер
Прежде чем начать, убедитесь, что у вас есть сервер с установленной Ubuntu (желательно последней стабильной версии, например, 22.04 LTS). Если сервера пока нет, можно взять виртуальную машину у любого провайдера (DigitalOcean, AWS, Hetzner, или даже ваш хостинг).
Минимальные требования: 1 ядро процессора, 1 ГБ оперативной памяти и 10 ГБ свободного места на диске. Однако для более серьёзных приложений лучше предусмотреть хотя бы 2 ядра и 2 ГБ ОЗУ.
Подключение к серверу
Как только сервер готов, подключаемся к нему по SSH. Если вы работаете на Windows, лучше всего использовать PuTTY или встроенный терминал WSL. На macOS и Linux достаточно открыть терминал.
ssh username@your-server-ip
Замените username на имя пользователя (обычно root) и your-server-ip на IP-адрес вашего сервера.
После подключения рекомендуется сразу обновить систему:
sudo apt update && sudo apt upgrade -y
Создаём нового пользователя
Работать под пользователем root – это не очень хорошая идея, особенно на боевом сервере. Давайте создадим отдельного пользователя:
adduser fastapi-user
Следуйте инструкциям: введите пароль и при необходимости заполните дополнительные поля. После этого добавьте нового пользователя в группу sudo, чтобы он имел права администратора:
usermod -aG sudo fastapi-user
Теперь переключитесь на нового пользователя:
su - fastapi-user
Устанавливаем Python
FastAPI – это Python-фреймворк, поэтому нам нужен актуальный Python (например, 3.10 или выше). Убедитесь, что он установлен:
python3 --version
Если версия ниже 3.10, обновите её. Для этого сначала установите зависимости:
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.10 python3.10-venv python3.10-dev -y
Теперь убедитесь, что Python установлен:
python3.10 --version
И настройте его как основную версию (если требуется):
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
Устанавливаем pip и виртуальное окружение
Пакетный менеджер pip обычно уже входит в комплект Python, но проверим:
python3 -m ensurepip --upgrade
pip3 --version
Создавать проекты лучше в виртуальном окружении, чтобы изолировать зависимости. Установим и создадим окружение:
python3 -m venv venv
source venv/bin/activate
После активации в командной строке появится указание на виртуальное окружение, например: (venv) fastapi-user@server:~$.
Устанавливаем Git
Вам понадобится Git, чтобы клонировать ваш репозиторий или работать с версиями кода:
sudo apt install git -y
После установки убедитесь, что всё работает:
git --version
Подготовка firewall
Для защиты сервера настройте ufw (Uncomplicated Firewall):
sudo apt install ufw -y
sudo ufw allow OpenSSH
sudo ufw enable
Если вы уже знаете, что будете использовать Nginx, заранее откройте порт 80 (HTTP) и 443 (HTTPS):
sudo ufw allow 'Nginx Full'
Часть 2: Установка и настройка FastAPI
Теперь пора перейти ко второй части – установке и настройке FastAPI. В этом разделе мы разберёмся, как развернуть приложение, настроить Uvicorn, превратить его в сервис и убедиться, что всё работает без сбоев.
Клонируем проект
Если ваш проект хранится в Git-репозитории, клонируйте его на сервер. Например:
git clone https://github.com/your-username/your-fastapi-project.git
cd your-fastapi-project
Убедитесь, что вы клонировали репозиторий в домашнюю директорию пользователя (например, /home/fastapi-user/), чтобы избежать проблем с правами доступа.
Если у вас нет репозитория, просто перенесите файлы через scp или любой другой метод. Например:
scp -r /path/to/your/project fastapi-user@your-server-ip:/home/fastapi-user/
Активируем виртуальное окружение
Убедитесь, что вы находитесь в папке с проектом. Затем активируйте виртуальное окружение:
source venv/bin/activate
Теперь все зависимости будут устанавливаться в этом окружении.
Устанавливаем зависимости
Убедитесь, что у вас есть файл requirements.txt, и выполните установку зависимостей:
pip install -r requirements.txt
Если используется pyproject.toml (например, для Poetry), установите зависимости соответствующим инструментом.
Для тестового запуска выполните:
uvicorn main:app --reload --host 0.0.0.0 --port 8000
Перейдите по адресу http://<ваш-IP>:8000, чтобы проверить приложение. Остановите сервер (Ctrl+C), если всё работает.
Настраиваем Gunicorn (или Uvicorn как сервис)
Устанавливаем Gunicorn
Установите Gunicorn (опционально):
pip install gunicorn
Создаём systemd-сервис
Создайте файл сервиса:
sudo nano /etc/systemd/system/fastapi.service
Вставьте текст (обновив пути и имена):
[Unit]
Description=FastAPI application
After=network.target
[Service]
User=fastapi-user
Group=fastapi-user
WorkingDirectory=/home/fastapi-user/your-fastapi-project
ExecStart=/home/fastapi-user/venv/bin/gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8000
[Install]
WantedBy=multi-user.target
Запускаем и тестируем сервис
Запустите сервис:
sudo systemctl daemon-reload
sudo systemctl enable fastapi.service
sudo systemctl start fastapi.service
Проверьте статус:
sudo systemctl status fastapi.service
Сервис должен быть активен и работать на порту 8000.
Настраиваем firewall
Откройте порт 8000, если это не сделано:
sudo ufw allow 8000
Подготовка к Nginx
На данном этапе приложение готово к работе через Gunicorn/Uvicorn. В следующей части мы добавим поддержку Nginx и SSL для продакшена.
Часть 3: Настройка Nginx и обеспечение безопасности
Мы подошли к заключительной части нашего руководства. Ваш FastAPI-сервер уже работает и отвечает на запросы, но для завершения конфигурации нужно сделать несколько вещей: настроить Nginx как обратный прокси и добавить поддержку SSL для безопасного соединения. Это не только улучшит производительность, но и сделает ваш сервис готовым к боевому использованию.
Установка Nginx
Если у вас ещё не установлен Nginx, давайте это исправим:
sudo apt update
sudo apt install nginx -y
После установки убедитесь, что сервер работает:
sudo systemctl status nginx
По умолчанию он будет слушать порт 80. Если вы перейдёте по IP-адресу вашего сервера, вы увидите стартовую страницу Nginx.
Настройка обратного прокси
Теперь мы настроим Nginx, чтобы он перенаправлял HTTP-запросы на ваше приложение, которое работает на порту 8000.
Создаём конфигурацию
Создайте новый конфигурационный файл для вашего приложения:
sudo nano /etc/nginx/sites-available/fastapi
Вставьте следующую конфигурацию:
server {
listen 80;
server_name your-domain.com; # Замените на ваш домен или IP-адрес
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;
}
}
Сохраните файл и выйдите из редактора (Ctrl+O, Ctrl+X).
Активируем конфигурацию
Теперь нужно активировать новую конфигурацию:
sudo ln -s /etc/nginx/sites-available/fastapi /etc/nginx/sites-enabled/
Удалите стандартную конфигурацию, чтобы избежать конфликтов:
sudo rm /etc/nginx/sites-enabled/default
Проверьте конфигурацию на наличие ошибок:
sudo nginx -t
Если всё в порядке, перезапустите Nginx:
sudo systemctl restart nginx
Теперь ваш сервер перенаправляет HTTP-запросы с порта 80 на ваше приложение FastAPI.
Настройка HTTPS с Let’s Encrypt
Шифрование соединений – это стандарт в современном вебе. Настроим бесплатный SSL-сертификат с помощью Certbot.
Установка Certbot
Установим Certbot и плагин для Nginx:
sudo apt install certbot python3-certbot-nginx -y
Получение SSL-сертификата
Теперь выполните команду для автоматической настройки SSL:
sudo certbot --nginx -d your-domain.com
Замените your-domain.com на ваш реальный домен. Если вы настраиваете сертификат впервые, Certbot попросит указать ваш email для уведомлений и принять лицензионное соглашение.
Проверка работы HTTPS
Перейдите на свой сайт, используя https://your-domain.com, и убедитесь, что соединение защищено (значок замка в браузере).
Автоматическое обновление сертификатов
Let’s Encrypt выдаёт сертификаты на 90 дней, но Certbot позволяет настроить автоматическое продление:
sudo certbot renew --dry-run
Эта команда проверяет, что автообновление работает. Если всё в порядке, система автоматически продлит сертификаты.
Оптимизация и защита
Для повышения безопасности и производительности можно добавить несколько улучшений в конфигурацию Nginx:
Отключение лишних протоколов (например, старых версий TLS):
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers HIGH:!aNULL:!MD5;
Gzip-сжатие для уменьшения размера передаваемых данных:
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 1000;
Добавьте эти настройки в секцию server.
Проверка конечного результата
Чтобы убедиться, что всё работает как нужно:
- Проверьте доступность вашего сервиса через HTTPS.
- Используйте команды вроде curl для проверки ответа от сервера:
curl -I https://your-domain.com
Подключите мониторинг (например, UptimeRobot), чтобы отслеживать состояние сервиса.
Комментарии
0