Всем привет! Продолжаю раскрывать тему простой настройки 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 обычно.](https://habrastorage.org/getpro/habr/upload_files/230/661/723/2306617234259c4b15bc78a3d3ed37f8.png)
Настройка сервера
Обновляем 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/
.
Общий процесс
Запросы к корню сайта (/): Они перенаправляются к FastAPI приложению, запущенному на IP-адресе вашего сервера и порту 5000.
Запросы к статическим файлам (/static/): Они обрабатываются NGINX и обслуживаются из директории
/home/my_site/static/
.Запросы к медиафайлам (/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)
Жмем ENTER. После успешного подключения certbot вас поздравит и вам останется только перезапустить NGINX:
sudo systemctl restart nginx
Теперь ваш сайт будет доступен по HTTPS, что подтвердит «зеленый замок».
Немного про вебхуки
Я писал статью про вебхуки в связке с aiogram 3 и FastApi и у людей были вопросы на счет того почему код так просто выглядит и я не заморачивался с сертификатами. Так вот. Фишка в том, что FastApi берет на себя эти все особенности. То есть устанавливаете защищенный сертификат на FastApi и боту этого будет достаточно чтоб полноценно работать в режиме вебхука.
Выводы
Этой статьей я завершаю серию постов по вебхукам, FastAPI и VPS. За годы работы программистом я накопил обширные знания и с радостью поделюсь ими с вами. Если вам интересно продолжение этой или других тем, дайте знать. Ваши положительные отклики вдохновляют на создание новых материалов. Надеюсь на вашу поддержку и понимание.
Благодарю за внимание. Пока у меня все.