Всем привет! Продолжаю раскрывать тему простой настройки 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. За годы работы программистом я накопил обширные знания и с радостью поделюсь ими с вами. Если вам интересно продолжение этой или других тем, дайте знать. Ваши положительные отклики вдохновляют на создание новых материалов. Надеюсь на вашу поддержку и понимание.

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

Комментарии (11)


  1. turbo_nyasha
    06.06.2024 19:27
    +1

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

    То есть вы показываете как поднять комбайн с веб-приложением и проксирующим сервером. Даже прикручиваете к нему сертификат, но примером доставки у вас является SFTP? Серьезно?


    1. yakvenalex Автор
      06.06.2024 19:27

      "Для примера будем использовать FTP-клиент FileZilla. Опытные пользователи могут использовать GitHub или другие методы." - это цитата с моего же текста. Если вы новичек вам будет геморно разбираться ещё и в гите, устанавливать доп софт и прочее. С тем же успехом вы можете сказать за SCREEN. Да, в этом примере используется эта утилита)


      1. VRyabchevsky
        06.06.2024 19:27
        +1

        Не совсем согласен с вашим тезисом. Да, github/gitlab ci и другие инструменты- для профессионалов, но обычная система контроля версий довольно простой и удобный инструмент, который идет в начале многих курсов по программированию. Из личного опыта: когда вел пары по программированию - сразу давал базовые команды для коммита и пуша, студенты только там сдавали свои работы.

        1. Потом на серваке установить ещё нужно все.

        На сколько помню, многие линуксы из коробки имеют гит, поправьте, если ошибаюсь.

        Сама статья хорошая, продолжайте делиться опытом:)


        1. yakvenalex Автор
          06.06.2024 19:27
          +1

          Спасибо за конструктивный комментарий. Приятно читать. Возможно вы правы, но мне казалось что SCREEN и FileZilla будет наилучшим решением, чтоб любой новичек смог легко и просто войти в эту тему. Знаете, этот первый позитивный опыт)


    1. mgis
      06.06.2024 19:27

      Тоже был удивлен увидев методом доставки кода на прод FileZilla.
      Когда всего то нужно ввести команду git pull.


      1. yakvenalex Автор
        06.06.2024 19:27

        Ну так до этого же ещё нужно:

        1. Зарегистрироваться на гитхабе

        2. Себе на комп поставить гит

        3. Перенести файлы на гит

        4. Потом на серваке установить ещё нужно все.

        Разве не проще в учебном процессе воспользоваться FileZilla?)


        1. t38c3j
          06.06.2024 19:27
          +4

          А что гит прибит гвоздями к гитхабу?

          В учебном процессе лучше сразу смотреть на современные решения, все ваше решения может заменить докер и траефик, меньше возни, проще, продуктивнее


          1. yakvenalex Автор
            06.06.2024 19:27
            +1

            Тоже верно. В других статьях буду больший упор делать на современные решения.


  1. it_police
    06.06.2024 19:27

    Добавил в закладки. Спасибо не глядя.


  1. alex_kag
    06.06.2024 19:27
    +4

    Народ, способ доставки - фигня, а вот предложение запускать сервис через screen - за это надо ручки ломать....


    1. Vinni37
      06.06.2024 19:27
      +1

      Полностью согласен, залить скрипт на сервер через sftp это нормально, а вот запуск в screen это боль.