Django как развернуть приложение
Наше развертывание мы разделим на два этапа:
- Установка и настройка среды Python и UWSGI.
- Настройка веб-сервера NGINX.
Рассмотрим эти процессы по шагам.
Python, Django и UWSGI
Устанавливаем необходимые пакеты:
apt-get install nginx uwsgi python3 uwsgi-plugin-python3 python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
Устанавливаем пакеты для Python:
pip3 install virtualenv uwsgi django
Создаем директорию для хранения стачичных файлов (css, js, img):
mkdir -p /var/www/my_app/static /var/www/my_app/media
chown www-data.www-data /var/www/my_app/media
chown www-data.www-data /var/www/my_app/static
Копируем наше приложение в папку /var/www/my_app, структура должна получиться примерно такой:
Вносим изменения в конфигурационный файл нашего проекта:
- ALLOWED_HOSTS — разрешенные доменные имена, на которых должен открываться наш сайт.
- DATABASES — данные для подключения к базе данных. Подробнее, данная настройка описана ниже.
Запускаем команду для сбора всех статических файлов в нашем проекте (из корня проекта):
[uwsgi]
chdir = var/www/my_app
env = DJANGO_SETTINGS_MODULE=project.settings.production
wsgi-file = my_app/wsgi.py
workers = 1max-requests=5000
plugins=python3
processes = 5
threads = 2
master = true
die-on-term = true
socket = sedova.sock
chmod-socket = 660
vacuum = true
uid = www-data
gui = www-data
- chdir — указываем директорию нашего проекта.
- env — конфигурационный файл нашего приложения.
- wsgi-file — относительный путь до файла wsgi.py нашего приложения.
Перезапускаем сервис uwsgi:
service uwsgi restart
Настройка Nginx
Создаем файл конфигурации для нашего приложения
Содержимое файла должно быть примерно следующим:
server listen 80;
server_tokens off;
server_name my_app my_app.domain.local;
location / include uwsgi_params;
uwsgi_pass unix:///run/uwsgi/app/sedova/socket;
>
location /static/ alias /var/www/my_app/static/;
>
location /media/ alias /var/www/my_app/media/;
>
>
systemctl restart nginx
Подключение к базе данных
Рассмотрим пример настройки подключения к СУБД MariaDB/MySQL. Нам необходимо будет настроить как сам сервер баз данных, так и фреймворк. В инструкции опишем полный процесс, начиная от установки СУБД.
MariaDB
Выполним установку и настройку сервера баз данных. Начнем с установки:
apt-get install mariadb-server
Разрешаем автозапуск СУБД:
systemctl enable mariadb
Зададим пароль для учетной записи mysql-root:
mysqladmin -u root password
Установка и запуск завершены. Перейдем к настройке.
Для Django важно, чтобы кодировка была UTF-8. Откроем конфигурационный файл клиента:
[mysql]
.
default-character-set = utf8
Аналогичную настройку выполняем в следующем файле:
[mysql]
.
default-character-set = utf8
Редактируем файл для настройки сервера:
Задаем значения для опций:
character-set-server = utf8
collation_server = utf8_unicode_ci
Для применения настроек перезапускаем сервис:
systemctl restart mariadb
Подготовка базы данных
Предполагается, что у нас есть база данных, которую мы либо создадим на сервере, либо восстановим из резервной копии.
Не забываем также настроить права доступа на базу.
Установка модуля для Python
Для возможности подключения к базе, мы должны установить клиента mysql на сервер. Для этого выполняем две команды:
apt-get install libmysqlclient-dev
pip3 install mysqlclient
Первая команда установит библиотеки, необходимые для установки mysqlclient через менеджер пакетов Python. Вторая, собственно, и установит клиента.
Настройка подключения
Откроем конфигурационный файл нашего приложения:
Данная настройка прописывается, как правило, по умолчанию и позволяет использовать базу sqlite3. Поменяем ее:
* в данном примере:
- NAME — имя базы данных, к которой мы подключимся.
- HOST — сервер баз данных.
- USER — пользователь с привилегиями работы с базой данных.
- PASSWORD — пароль для пользователя.
Делаем выборку
Для проверки настройки создадим select-запрос с нашей базе. Предположим, к таблице users. Пример кода будет таким:
- from django.db import connection
- cursor = connection.cursor()
- cursor.execute("SELECT * FROM users")
- print(cursor.fetchall())
В данном примере мы извлечем все содержимое таблицы users и выведем это на экран.
После того, как мы закончили разработку веб-приложения, оно должно быть размещено на хосте, чтобы общественность могла получить доступ к нему из любого места. Мы посмотрим, как развернуть и разместить приложение на экземпляре AWS EC2, используя Nginx в качестве веб-сервера и Gunicorn в качестве WSGI.
AWS EC2
Amazon Elastic Compute Cloud (Amazon EC2) - это веб-сервис, обеспечивающий масштабируемость вычислительных мощностей в облаке. Мы устанавливаем и размещаем наши веб-приложения на экземпляре EC2 после выбора AMI (OS) по нашему усмотрению. Подробнее об этом мы поговорим в следующих разделах.
NGINX
Nginx - это веб-сервер с открытым исходным кодом. Мы будем использовать Nginx для сервера наших веб-страниц по мере необходимости.
GUNICORN
Gunicorn - это серверная реализация интерфейса шлюза Web Server Gateway Interface (WSGI), который обычно используется для запуска веб-приложений Python.
WSGI - используется для переадресации запроса с веб-сервера на Python бэкэнд.
Мы не будем использовать сервер, который поставляется с django по умолчанию в производстве.
Развертывание приложения
Мы запустим EC2 экземпляр на AWS, для этого войдите в консоль aws.
Выберите EC2 из всех сервисов
Выберите запуск New instance и выберите Ubuntu из списка.
Выберите любой из экземпляров, каждый из них имеет различные конфигурации, мы выберем тот, который имеет свободный уровень.
Теперь настройте группы безопасности и откройте порты 8000 и 9000, так как мы будем использовать эти порты . Просмотрите и запустите ваш экземпляр, может потребоваться некоторое время, чтобы он запустился.
Подключение к Экземпляру
Мы можем подключиться к экземпляру, используя опцию 'connect' в консоли (или с помощью putty или любого другого подобного инструмента ). После подключения запустите следующие команды
Установите python , pip и django
Теперь, когда мы установили наши зависимости, мы можем создать папку, в которую мы скопируем наше приложение django.
Теперь мы поместим наш код по следующему пути.
/home/ubuntu/Project/ProjectName
GitHub
Убедитесь, что ваш код находится в репозитории, чтобы мы могли легко втянуть его в наш экземпляр ec2.
Перейдите в только что созданную папку ( /home/ubuntu/Project/ProjectName/ )
git clone <repository-url>
Это клонирует репозиторий в папку, и в следующий раз мы сможем просто вытащить изменения с помощью git pull .
Settings.py Файл.
Мы должны внести некоторые изменения в settings.py в нашем проекте.
Вставьте свои секретные ключи и пароли в переменные окружения
Установить Debug = False
Добавте Ваш домейн в ALLOWED_HOSTS
Выполните следующие действия, чтобы миграция модели произошла и все статические файлы были собраны в общую папку (путь указан в STATIC_ROOT).
Установка Nginx
Для установки Nginx выполните команду
Есть конфигурационный файл с именем по умолчанию в /etc/nginx/sites-enabled/ , который имеет базовую настройку для NGINX, мы отредактируем этот файл.
Файл будет выглядеть так после добавления необходимой конфигурации, а остальная часть файла останется такой же.
Теперь запустите сервер nginx
Установка Gunicorn
Убедитесь, что Вы находитесь в папке проекта, например: /home/ubuntu/Project , и запустите следующую команду, чтобы запустить gunicorn
Теперь, когда мы установили и настроили nginx и gunicorn, к нашему приложению можно получить доступ через DNS экземпляра ec2.
Heroku - это облачная платформа, предоставляющая услуги хостинга. Она поддерживает несколько языков программирования, включая PHP, Node.js и Python. Это платформа как сервис (PaaS), который позволяет вам управлять приложениями веб-сайтов, одновременно заботясь о ваших серверах, сетях, хранилище и других облачных компонентах.
В этой статье мы рассмотрим, как развернуть приложение Django на Heroku с помощью Git.
Предпосылки
Ниже приведен список вещей, которые необходимо сделать, прежде чем мы начнем развертывание:
- Git
- Учетная запись Heroku и интерфейс командной строки
- Приложение Django
Интерфейс командной строки Heroku (CLI) позволяет легко создавать приложения Heroku и управлять ими прямо из терминала. Это важная часть использования Heroku.
Чтобы установить Heroku CLI (он же Heroku Toolbelt), следуйте инструкциям на официальном сайте.
Убедитесь, что ваше приложение Django работает в виртуальной среде, которую вам необходимо поддерживать в течение всего процесса развертывания.
Аккаунт Heroku
После того, как все эти вещи будут установлены, следующим шагом будет создание бесплатной учетной записи Heroku здесь, если у вас еще нет учетной записи.
После написания в терминале следующего:
Настроить приложение Django для Heroku
Теперь, когда мы сделали все необходимое, давайте подготовим наше приложение Django для Heroku.
Procfile
PROCFILE файл с именем Procfile без расширения файла, помещенного в корневом каталоге вашего приложения. В нем перечислены типы процессов в приложении, и каждый тип процесса является объявлением команды, которая выполняется при запуске контейнера / динамометрического стенда этого типа процесса.
Перед созданием Procfile вы захотите установить django gunicorn в каталог вашего проекта:
Хотя Django поставляется со своим собственным сервером WSGI, мы скажем Heroku использовать Gunicorn для обслуживания нашего приложения, что также рекомендуется Heroku.
Теперь создайте Procfile в родительском каталоге и добавьте следующую строку:
Замените yourdjangoweb фактическим названием вашего проекта.
Runtime.txt
Создайте текстовый файл с именем runtime.txt в том же каталоге, что и Procfile . Он сообщает Heroku, какую версию Python использует ваше приложение. Если вы не уверены в версии, введите в терминал python --version с активированной виртуальной средой Django.
Затем добавьте версию в runtime.txt :
Посмотреть поддерживаемые версии Python на Heroku можно здесь.
Разрешенные хосты
В качестве альтернативы вы можете разрешить все приложения от Heroku, опуская имя приложения, например:
Вы также можете использовать ['*'] , чтобы разрешить все хосты. Вы можете найти более подробную информацию в документации.
Установить пакеты
Ниже приведены дополнительные пакеты, которые необходимо установить в нашей виртуальной среде.
Чтобы подключить нашу базу данных Django к Heroku, установите dj-database-url , выполнив:
Поскольку Heroku использует базы данных Postgres, нам также понадобится его адаптер для Python:
И, наконец, мы будем использовать WhiteNoise для обслуживания статических файлов на рабочем сервере. Что мы можем установить, выполнив:
Мы уже настроили gunicorn , давайте добавим конфигурацию для whitenoise и dj-database-url .
Настройка статических файлов
Сначала добавьте базовые настройки для обслуживания статических файлов в любом проекте Django. Вы можете скопировать и вставить следующие настройки в свой settings.py :
Добавьте WhiteNoise в список MIDDLEWARE , сразу после SecurityMiddleware :
Настройка базы данных
Мы используем dj-database-url для настройки нашей базы данных. Добавьте эти строки внизу settings.py :
Requirements.txt
Heroku распознает развернутое приложение как приложение Python, только если у него есть файл requirements.txt в корневом каталоге. Он сообщает Heroku, какие пакеты необходимы для запуска вашего приложения.
Для этого мы можем использовать pip freeze и передать вывод в файл requirements.txt :
Ваш requirements.txt должен выглядеть примерно так:
Примечание: Вышеуказанные версии используются нашим приложением Django и могут отличаться для вашего.
Подключите приложение Heroku к Git
Теперь нам нужно создать приложение Heroku:
Инициализируйте пустой репозиторий в каталоге вашего проекта:
Подключите приложение Heroku к пустому git репозиторию:
Зафиксируйте изменения / файлы:
Наконец, отправьте проект в git репозиторий, размещенный на Heroku:
Если все пойдет нормально, вы увидите такой вывод:
Ошибка collectstatic
Вы можете получить ошибку collectstatic , связанную с запуском команды git push heroku master . Это связано с каталогом статических файлов, и вы можете обойти его с помощью следующей команды:
Он скажет Heroku не запускать команду collectstatic во время развертывания приложения. Вы можете запустить его позже, используя bower :
Это может произойти по многим причинам, включая, помимо прочего:
- Ваш список STATICFILES_DIRS пуст или настроен неправильно.
- В вашем каталоге static нет файлов для отслеживания git . Вы можете добавить любой временный файл в свой каталог static , чтобы он работал.
Перенести базу данных
Последний шаг - отразить models , вашу базу данных в Heroku, выполнив миграции:
Добавление собственного доменного имени
1. Войдите в панель управления Heroku.
2. Выберите ваше текущее приложение из списка:
3. Выберите Settings на панели навигации и прокрутите вниз, чтобы найти раздел Domain:
4. Нажмите на Add domain, где вы сможете добавить свое доменное имя.
Этот вариант доступен только для проверенных учетных записей. Вам будет предложено ввести данные кредитной карты на Heroku для подтверждения вашей учетной записи. Вы можете найти более подробную информацию о добавлении доменов и субдоменов на этой странице.
Вывод
В этой статье мы развернули приложение Django на Heroku с пользовательским доменным именем, используя Git.
В этой статье мы расскажем о развертывании приложения Django в конвейере Heroku из репозитория GitHub.
Вступление
Heroku -это популярная Платформа как услуга (PaaS), которая позволяет разработчикам запускать и развертывать приложения, используя инфраструктуру, необходимую с точки зрения аппаратного и программного обеспечения.
Это означает, что нам не нужно инвестировать в аппаратное и программное обеспечение, необходимое для предоставления наших приложений конечным пользователям, и эта свобода позволяет нам сосредоточиться на нашей бизнес-логике вместо развертывания.
В этом посте мы расскажем, как развернуть простое приложение Django в конвейере Heroku. Он ориентирован на существующих разработчиков Python и предполагает базовое понимание настройки и запуска приложения Django.
Предпосылки
Для этого поста нам понадобится:
- Бесплатный уровень Учетная запись Heroku ,
- Установлен Python 3+ и Virtualenv установлен и учетная запись GitHub.
Демонстрационное Приложение
Загрузка приложения Django
Перед развертыванием вашего приложения Django нам нужно будет подготовить его в соответствии с требованиями Heroku. Мы начнем с создания виртуальной среды, активации ее и установки необходимых пакетов, и, наконец, загрузим простое приложение Django:
Если все пойдет хорошо, то на нашем локальном сервере должна быть запущена следующая целевая страница:
На данный момент структура папок нашего проекта выглядит следующим образом:
Прежде чем мы развернемся на Heroku, нам нужно будет внести некоторые изменения. Во-первых, нам нужно изменить настройку ALLOWED_HOSTS в нашем plaindjango/settings.py к:
Когда Heroku развертывает наше приложение, он запускает команду django-admin collectstatic , которая связывает и сохраняет все статические файлы в указанной папке. Эта папка будет находиться в корневом каталоге нашего проекта.
Подготовка приложения к развертыванию
Когда наше приложение Django готово, Heroku требует, чтобы мы включили следующие файлы в корень нашего проекта, чтобы он был готов к развертыванию:
- Когда наше приложение Django готово, Heroku требует, чтобы мы включили следующие файлы в корень нашего проекта, чтобы он был готов к развертыванию:
Цель этого файла-указать версию Python, которая будет использоваться для запуска нашего проекта. В нашем случае файл будет просто содержать:
Этот файл определяет команды, которые будут выполняться при запуске программы.
В то время как Django поставляется со своим собственным сервером WSGI, наш профиль скажет Heroku использовать Gunicorn для обслуживания нашего приложения. Содержимое этого файла будет:
Эта строка говорит Heroku, что наш web процесс или приложение, которое будет запущено с помощью gunicorn . Gunicorn затем будет использовать файл WSGI нашего проекта для запуска нашего сервера приложений.
Наконец, нам нужен requirements.txt файл, определяющий требования нашего приложения Django. Мы можем создать это в нашей виртуальной среде, выполнив следующую команду:
Окончательная структура папок нашего приложения Django, содержащая дополнительные файлы, теперь будет:
С этими файлами на месте наше приложение готово к Heroku.
Развертывание в Heroku через GitHub
Хотя Heroku предлагает свою собственную платформу Git, которую мы можем использовать для наших развертываний, она не так богата функциями, как GitHub. Heroku также позволяет нам извлекать наш код из GitHub и развертывать его.
Наш код готов к развертыванию, поэтому мы можем пойти дальше и создать репозиторий GitHub и продвинуть наш код.
Для справки, вот пример приложения Django на GitHub , которое готово к развертыванию на Heroku.
Мы предоставляем имя нашего конвейера и репозитория GitHub для подключения:
A pipeline представляет собой группу приложений Heroku, которые используют одну и ту же кодовую базу. В конвейере мы можем определить различные этапы непрерывного процесса доставки.
Это означает, что через Heroku мы можем развернуть наш код в нашей производственной, промежуточной и среде разработки одновременно, все из GitHub.
При использовании GitHub в качестве источника нашего приложения мы можем настроить конвейеры Heroku для развертывания кода из разных ветвей в разные среды.
Это дает нам видимость нашего проекта на нескольких этапах, улучшая нашу доставку.
Трубопровод Heroku
Это вид нашего недавно созданного конвейера для нашего приложения на GitHub:
Heroku позволяет нам добавлять существующие приложения в конвейер или создавать новые. Поскольку это новый конвейер, мы создадим новое приложение под названием plaindjango-production , которое будет нашей производственной средой.
Наше рабочее приложение было создано, но наш код еще не запущен. Следующим шагом является выбор ветви, из которой код будет развернут в нашей производственной среде:
В самом конце журналов есть ссылка на наше запущенное приложение. Когда мы переходим по ссылке, нас приветствует наша целевая страница Django:
Мы успешно развернули наше производственное приложение Django в Heroku через GitHub. Чтобы создать приложение для нашей промежуточной среды, выполняются те же шаги, что и для основной среды.
Запрос pull можно увидеть здесь , на GitHub , и это результат на нашем конвейере Heroku:
Мы видим, что для нашего запроса на вытягивание было создано новое приложение, и когда мы открываем его, мы видим изменения, которые запрос на вытягивание вносит в наш проект:
Наш запрос на вытягивание был успешно развернут, и мы можем просмотреть его перед объединением изменений в master. При активированном автоматическом развертывании Heroku развернет наши изменения, как только мы объединим запрос на вытягивание в главную ветвь, и изменения будут запущены автоматически.
Вывод
Наше приложение Django было развернуто в Heroku из GitHub с помощью конвейера. Хотя это не единственный способ развертывания приложения Django в Heroku, он наиболее подходит для совместного проекта.
Контейнеризированные приложения можно развернуть на Heroku, создав образы Docker и опубликовав их либо в Dockerhub, либо в собственном реестре контейнеров Heroku. Более подробную информацию о развертывании докеризованных приложений в Heroku можно найти в официальной документации . Heroku также предоставляет платформу Git, которую можно использовать для развертывания приложений в сочетании с их инструментом CLI.
Благодаря интеграции с функциональными возможностями git и Github, позволяющими развертывать контейнерные приложения, Heroku-это способная платформа для удовлетворения ваших потребностей в разработке. Платформа также предоставляет дополнения через маркетплейс.
Эти дополнения представляют собой сервисы или части инфраструктуры, которые могут быть использованы для улучшения наших приложений. Такие дополнения позволяют нам интегрировать наше приложение в базы данных и хранилища данных, включая PostgreSQL, MySQL и Redis.
С приложениями Django на Heroku можно добиться большего, и этот пост должен был представить простой взгляд на то, как развернуть приложение Django на платформе таким образом, чтобы оно соответствовало нашему ежедневному рабочему процессу.
Готовый к Heroku Djangoproject можно найти здесь, на GitHub , а также открытый запрос pull, который также был развернут.
Данная заметка это продолжение статьи про написание telegram бота, в ней я постараюсь максимально подробно осветить тему разворачивания (deploy) полноценного, хотя и маленького, Django приложения в production среде на ОС Linux, Ubuntu 14.04 LTS. К концу статьи у нас будет полноценный telegram бот, крутящийся в вебе и принимающий команды от пользователей этого мессенджера.
Чему вы научитесь после прочтения заметки:
- Разворачивать Django приложение (да и любое WSGI приложение) на хостинге Digital Ocean в среде Linux
- Работать с веб-серверами nginx и gunicorn
- Управлять процессами, используя утилиту supervisord
- Настраивать virtualenv с помощью pyenv
- Автоматически запускать веб-приложение даже после перезагрузки сервера
В сентябре 2015 года мы проводили Python митап в Алматы на котором я выступал с докладом на тему веб-разработки на Python. Во время выступления я вкратце описал веб эко-систему Python и сделал краткий обзор популярного инструментария. К сожалению, формат митапа не предусматривал детальный разбор темы, поэтому новичкам в этой области обычно приходится дальше копаться самостоятельно. Сегодня я постараюсь восполнить этот пробел и немного углубиться в "горячую" тему деплоя веб приложений на Python. Несмотря на то, что в статье речь будет идти о Django приложении, описываемые рецепты будут актуальны и для других веб-проектов, разработанных на Python с использованием WSGI-совместимых фреймворков (Flask, Bottle, Pyramid, Falcon, web2py и так далее).
В заметке я буду делать деплой на виртуальном хостинге от Digital Ocean. Если вы зарегистрируетесь по этой ссылке, то после подтверждения платёжных данных, счёт вашего аккаунта сразу пополнится на $10, которые можно потратить на создание маленьких дроплетов (виртуальных серверов) и потренироваться в разворачивании веб проектов на Python. Сразу скажу, что вам необязательно всё делать на удалённой машине и вообще использовать хостинг-провайдер, можно обойтись и локальной виртуалкой, например, используя VirtualBox и Vagrant (но в таком случае невозможно будет установить webhook).
Создание виртуального сервера
Как я ранее уже упоминал, деплой мы будет производить на одном из виртуальных серверов DigitalOcean с его мощным API :)
Создаём дроплет, нажимая на "Create droplet" в правом верхнем углу панели управления:
Выбираем самый минимальный тариф за 5 долларов в месяц с операционной системой Ubuntu 14.04.4 LTS на борту будущей виртуальной машины.
В качестве дата-центра я практически всегда выбираю Frankfurt, так как до него у меня самый лучший пинг. После заполнения всех необходимых полей, нажимаем кнопку "Create". Дроплет создаётся в течение 60 секунд после которых на почту поступает вся необходимая для доступа информация о новой виртуальной машине: IP адрес, логин и пароль.
Настройка сервера
После успешного создания нам необходимо авторизоваться на сервере. Сразу после входа, система попросит установить новый пароль для суперпользователя root.
Далее необходимо завести отдельного sudo пользователя из под которого будем запускать Django приложение.
Заходим под новым юзером django на сервер, и все остальные команды выполняем из под данного юзера.
Устанавливаем необходимый арсенал для настройки виртуального окружения через Pyenv и сборки самой последней версии Python (2.7.11).
После этого ставим сам Pyenv. Подробнее о том что такое Pyenv и как его настроить можно прочитать здесь:
Устанавливаем Python самой последней версии (Python 2.7.11):
Выполнение команды займёт некоторое время (скрипт скачает Python и скомпилирует его из исходников). Устанавливая отдельный интерпретатор питона мы тем самым никак не влияем на работу системного, более того, в последней LTS версии Ubuntu (14.04) используется версия 2.7.6, в которой существует ряд серьёзных уязвимостей, включая баг с SSL, а также отсутствует поддержка TLS 1.2
Клонируем репозиторий с Django проектом:
Далее настраиваем виртуальное окружения Python, используя всё тот же pyenv.
Ставим зависимости через менеджер пакетов pip.
Django приложение, написанное в первой части, претерпело незначительные изменения. В частности я перенёс изменяемые части кода в специальный .env файл, используя библиотеку django-environ. Ознакомиться с изменениями можно по этой ссылке.
Создаём .env файл из шаблона и заполняем необходимые настройки.
В частности необходимо изменить режим DEBUG на False, прописать токен для Telegram бота и указать дополнительный хост через запятую в ALLOWED_HOSTS. В моём случае ALLOWED_HOSTS выглядит вот так:
То есть я завёл дополнительный поддомен на котором и будет крутиться Telegram бот.
Настройка SSL сертификата
В прошлой статье я писал о том, что в случае использования API вызова setWehook, хосту необходимо иметь валидный SSL сертификатом (Telegram позволяет использовать также самоподписанные сертификаты). Сертификат мы будет создавать через бесплатный сервис выдачи SSL сертификатов Let's Encrypt.
Настройка Nginx
Заполняем новый файл telegram_bot.conf следующим содержимым:
Прописываем наш новый конфиг в настройки nginx и перезагружаем его, чтобы изменения вступили в силу:
Что мы только что сделали?
Чтобы проверить успешность наших настроек, можно запустить django приложение через тестовый сервер командой runserver на 8001 порту и зайти на сайт:
URL Not Found это нормальное явление, так как у нас задан всего 1 валидный URL для непосредственной работы с Telegram - /planet/bot/<BOT_TOKEN>/ (не считая настройки Django админки).
Настройка Gunicorn через Supervisor
Пора приступить к настройке production-ready HTTP сервера Gunicorn, который, кстати, полностью написан на языке Python и хорошо зарекомендовал себя в реальном бою (к слову, во всех "живых" проектах я использую именно эту связку: nginx+gunicorn)
Что такое Supervisor?
Supervisor это утилита процесс-менеджер. Она "следит за здоровьем" ваших процессов-демонов и в случае их падения, старается снова их поднять. Если в ходе работы Gunicorn "падает" (системная ошибка, не та фаза луны и так далее), Supervisor старается его снова "поднять", таким образом работоспособность сайта не страдает. К слову, у меня в планах есть идея написать небольшую заметку про эту утилиту, так сказать Supervisor Advanced Usage. Стоит отметить, что все процессы, запущенные в Supervisor должны работать в foreground режиме, чтобы утилита понимала когда что-то идёт не по плану.
Для начала составим конфигурационный файл для запуска Gunicorn внутри Supervisor. Его содержимое выглядит вот так:
Сохраняем файл под именем gunicorn.conf (
/planetpython_telegrambot/gunicorn.conf). К слову, Gunicorn прописан в зависимостях нашего проекта (requirements.txt) и так как мы его уже установили в наше окружение, то узнать путь исполняемого файла можно выполнив команду внутри активированного виртуального окружения (активация происходит автоматически при переходе в директорию веб-приложения из-за наличия там файла .python-version, созданного через pyenv local):
Содержимое конфигурационного файла для supervisord:
Далее выполняем запуск Supervisor демона командой:
Запуск должен пройти без каких либо ошибок. Чтобы узнать статус текущих процессов, запускаем утилиту supervisorctl:
Для получения помощи, можно выполнить команду help. А для получения информации о команде - help . Например:
После успешного запуска supervisor, сайт должен быть доступен онлайн.
Автозапуск веб-приложения при перезагрузке
Доводилось ли вам слышать про так называемые upstart файлы? Именно написанием одного из них мы сейчас и займёмся. К слову, на текущий момент Upstart признана устаревшей и в новых версиях ОС на базе Linux планируется полный переход на systemd.
Файл должен быть помещён в /etc/init/ (в моём случае я дал ему имя telegram_bot.conf). Если ранее все запуски не вызывали проблем, то после рестарта системы, приложение автоматически будет запущено:
Теперь необходимо прописать наш URL на стороне Telegram используя вызов API метода setWebhook:
На этом настройка бота закончена. Посылаем команды нашему боту @PythonPlanetBot и получаем адекватные ответы :)
Читайте также: