Pull to refresh

Простая настройка VPS, NGINX и FastAPI: Пошаговое руководство. Часть 2

Level of difficultyMedium
Reading time6 min
Views4.6K

Всем привет! Продолжаю раскрывать тему простой настройки VPS, NGINX и FastApi. В прошлой части мы раскрыли следующие темы: покупка VPS сервера, покупка доменного имени и создали простое FastApi приложение, которое подгружает index.html файл с простыми стилями.

Напоминаю, что написание всего контента было в рамках темы про запуск aiogram 3.x телеграм бота с технологией вебхуков в связке с FastApi. Раскрыл тему максимально подробно, так что если для вас было проблематично работать с вебхкуками, то милости прошу к моей статье.

Небольшой дисклеймер

Все мои последние посты ориентированы на новичков. Если у вас есть альтернативные решения, такие же простые и доступные, буду рад увидеть их в комментариях. Важно, чтобы наши обсуждения оставались конструктивными и уважительными. Благодарю за понимание и надеюсь, что эта просьба больше не будет повторяться.

Теперь к делу. Сегодня мы:

  • Настроим сервер (установим NGINX, настроим виртуальное окружение, установим утилиту SCREEN);

  • Запустим NGINX;

  • Загрузим файлы нашего FastAPI приложения на VPS сервер;

  • Запустим FastAPI приложение через SCREEN;

  • Привяжем к нашему домену HTTPS (бесплатно и просто через специального бота);

  • Вскользь коснёмся темы вебхуков;

Загрузка FASTAPI приложения на сервер

Для примера будем использовать FTP-клиент FileZilla. Опытные пользователи могут использовать GitHub или другие методы.

К этому этапу у вас должно быть готово простое FastAPI приложение. Если это не так, прочитайте предыдущий пост, где это подробно объяснено. Пример который я описал там можете просто копировать (для учебных целей пойдет). Итак:

Качаем FileZilla (или любой другой FTP клиент).

·  Подключаемся к серверу, введя:

  • Хост (IP адрес сервера)

  • Имя пользователя (часто это root)

  • Пароль

  • Порт (для SSH это 22)

·  Нажимаем быстрое соединение.

·  Создаём директорию для размещения FastAPI (например, в папке /home).

·  Перекидываем файлы бота в указанную папку (без виртуального окружения — его мы настроим отдельно).

·  Работа с FTP-клиентом завершена. Далее будем работать в консоли.

Пример входа. Создаем папку и закидываем в нее файлы бота. Я для небольших проетов использую папку home обычно.
Пример входа. Создаем папку и закидываем в нее файлы бота. Я для небольших проетов использую папку home обычно.

Настройка сервера

Обновляем Ubuntu и догружаем пакеты:

sudo apt update -y 
sudo apt upgrade -y

Устанавливаем пакетный менеджер pip и python3 (если не устанавливали)

sudo apt install -y python3 python3-pip

Устанавливаем дополнительные пакеты для стабильной работы:

sudo apt install -y build-essential libssl-dev libffi-dev python3-dev

Установка venv (Virtual Environment)

sudo apt install -y python3-venv

Далее при помощи команды cd ПУТЬ К ПАПКЕ (cd ../home/app_dir) переходим в созданную папку через FileZilla и там вводим:

python3 -m venv env

Этой командой мы создали виртуальное окружение, которое очень удобно для разработки и выполнения программ. Это замечательный инструмент, позволяющий разработчикам изолировать зависимости, библиотеки и пакеты для каждого проекта, предотвращая конфликты между ними.

Теперь давайте активируем его:

source env/bin/activate

Устанавливаем необходимые модули:

pip install jinja2 fastapi uvicorn

Если у вас есть файл с зависимостями (requirements.txt), используйте:

pip install -r requirements.txt

Запускаем FastAPI:

python3 app.py // или другое имя файла

Если ошибок нет и вы видите техническую информацию от FastAPI, значит, всё выполнено верно! Останавливаем приложение сочетанием клавиш CTRL + C

Деактивируем виртуальное окружение:

deactivate

Настройка NGINX

Устанавливаем NGINX, certbot и необходимые модули:

sudo apt install nginx certbot python3-certbot-nginx

Открываем конфигурационный файл NGINX для редактирования:

nano /etc/nginx/sites-available/myapp

Вместо myapp укажите название своего FastApi приложения. Далее примерные настройки:

server {
    listen 80;
    server_name MY_DOMEN www.MY_DOMEN;

    location / {
        proxy_pass http://MY_IP_ADRESS:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location /static/ {
        alias /home/my_site/static/;
    }

    location /media/ {
        alias /home/my_site/media/;
    }
}

Пояснения к настройкам

server { ... }

Блок server определяет настройки для конкретного виртуального сервера, включая IP-адреса, доменные имена и поведение для различных запросов.

listen 80;

Эта строка указывает NGINX прослушивать HTTP-запросы на порту 80. Это стандартный порт для HTTP.

server_name MY_DOMAIN www.MY_DOMAIN;

Директива server_name указывает доменные имена, для которых этот серверный блок будет обрабатывать запросы. Вместо MY_DOMAIN и www.MY_DOMAIN укажите свой домен.

location / { ... }

Блок location / определяет настройки для корневого URL-пути. Все запросы к корню вашего домена будут обрабатываться здесь.

proxy_pass http://MY_IP_ADDRESS:5000;

Эта строка перенаправляет все запросы, приходящие на NGINX, к вашему FastAPI приложению, запущенному на IP-адресе вашего сервера и порту 5000. Вместо MY_IP_ADDRESS укажите IP-адрес вашего сервера.

proxy_set_header Host $host;

Эта директива устанавливает заголовок Host для проксируемых запросов, передавая имя хоста клиента на backend-сервер.

proxy_set_header X-Real-IP $remote_addr;

Эта директива добавляет заголовок X-Real-IP, который передает реальный IP-адрес клиента на backend-сервер. Это полезно для логирования и аутентификации.

location /static/ { ... }

Этот блок обрабатывает запросы к статическим файлам. Директива alias указывает, что файлы, запрашиваемые по пути /static/, будут находиться в директории /home/my_site/static/ на сервере. Убедитесь, что этот путь соответствует расположению ваших статических файлов.

location /media/ { ... }

Этот блок аналогичен предыдущему, но предназначен для медиафайлов. Директива alias указывает, что файлы, запрашиваемые по пути /media/, будут находиться в директории /home/my_site/media/.

Общий процесс

  1. Запросы к корню сайта (/): Они перенаправляются к FastAPI приложению, запущенному на IP-адресе вашего сервера и порту 5000.

  2. Запросы к статическим файлам (/static/): Они обрабатываются NGINX и обслуживаются из директории /home/my_site/static/.

  3. Запросы к медиафайлам (/media/): Они также обрабатываются NGINX и обслуживаются из директории /home/my_site/media/.

Эти настройки позволяют вам эффективно использовать NGINX как обратный прокси для вашего FastAPI приложения и одновременно обслуживать статические и медиафайлы.

После сохраняем комбинацией клавиш CTRL + X далее y.

Создаем символическую ссылку на этот файл в директории sites-enabled:

ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/

Перезапускаем ngix:

systemctl restart nginx

Запускаем приложение через SCREEN

Да, сейчас снова дисклеймер. Я буду использовать утилиту SCREEN, а не systemct или ее аналог, так как по моему мнению, для новичков это проще. Если у кого-то будет желание рассмотреть формат запуска FastApi через другие методы – пишите об этом в комментариях либо найдите информацию самостоятельно в сети. Там не особо трудно.

Screen позволяет переключаться между терминалами, в которых выполняются процессы, не прерывая их. Как вы понимаете очень удобно. Окон может быть сколько угодно, но есть большой недостаток. При критической ошибке в программе (не обязательно в самом FastApi) либо сбоях на сервере ваша программа самостоятельно не поднимется, но мы тут скорее учимся, так что для учебных целей воспользуемся SCREEN.

Устанавливаем утилиту SCREEN:

sudo apt install -y screen

Флаг -y я использую чтоб небыло необходимости каждый раз отвечать Y (согласны). По умолчанию – да.

Переходим в папку с FastApi приложением (если с нее вышли) и вводим команду:

screen

После появится сообщение. Пропускаем его кликом на ENTER.

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

source env/bin/activate
python3 app.py

Для выхода из экрана (приложение останется запущенным):

CTRL + A, затем D

Далее просто переходим на наш сайт по доменному имени которое вы к серверу привязали на предыдущем этапе. Если все хорошо – ваш сайт запустится и будет работать, но немного огорчит вас открытым замком (незащищенный сертификат), но ничего – это мы сейчас быстро поправим.

Кстати да. Вот пару команд по SCREEN

Для просмотра всех окон:

screen -ls

Для входа в сеанс:

screen -r номер сeанса + ENTER

Установка HTPPS сертификата

Для того чтоб его установить мы воспользуемся мега-полезной утилитой – certbot. Ее мы должны были установить на предыдущем шаге. Если нет вводим:

sudo apt-get install certbot python3-certbot-nginx

Запускаем:

sudo certbot –nginx
  1. Вводим почту

  2. Выбираем домен на переадресацию (обычно вводим 1)

  3. Жмем ENTER. После успешного подключения certbot вас поздравит и вам останется только перезапустить NGINX:

sudo systemctl restart nginx

Теперь ваш сайт будет доступен по HTTPS, что подтвердит «зеленый замок».

Немного про вебхуки

Я писал статью про вебхуки в связке с aiogram 3 и FastApi и у людей были вопросы на счет того почему код так просто выглядит и я не заморачивался с сертификатами. Так вот. Фишка в том, что FastApi берет на себя эти все особенности. То есть устанавливаете защищенный сертификат на FastApi и боту этого будет достаточно чтоб полноценно работать в режиме вебхука.

Выводы

Этой статьей я завершаю серию постов по вебхукам, FastAPI и VPS. За годы работы программистом я накопил обширные знания и с радостью поделюсь ими с вами. Если вам интересно продолжение этой или других тем, дайте знать. Ваши положительные отклики вдохновляют на создание новых материалов. Надеюсь на вашу поддержку и понимание.

Благодарю за внимание. Пока у меня все.

Only registered users can participate in poll. Log in, please.
Была ли эта инструкция полезной
39.39% Да13
60.61% Нет20
33 users voted. 2 users abstained.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 10: ↑2 and ↓8-6
Comments13

Articles