Если вы задумались над тем, как задеплоить свой проект на 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

Без регистрации и смс