- Запуск бота в фоновом режиме
- Подготовка
- Screen — самый простой метод
- Systemd
- PM2
- Python: установка virtualenv
- Версии Python
- Установка в корень аккаунта
- Установка в конкретный каталог
- Использование PIP
- Основные команды pip
- Файл requirements.txt
- Восстановление виртуального окружения с помощью requirements.txt
- Возможные ошибки
- No module named ‘имя_модуля’
- Target WSGI script ‘/путь/до/скрипта/index.wsgi’ cannot be loaded as Python module
- DisallowedHost at / Invalid HTTP_HOST header
- AttributeError: module ‘MySQLdb.constants.FIELD_TYPE’ has no attribute ‘JSON’
- The SECRET_KEY setting must not be empty
- Как развернуть готовый проект на Flask/Bottle в Timeweb?
- Ответы (5)
- Похожие вопросы
- Не приходят сообщения на почту с выгруженного сайта 🙁 Поддержка не может помочь
Запуск бота в фоновом режиме
Вы можете запустить на сервере бот, написанный на Python или любом другом языке программирования. Чтобы обеспечить постоянную и надежную работу скрипта, потребуется настроить автозапуск и перезагрузку.
Подготовка
Загрузите файлы бота, например, в директорию /home/me и создайте виртуальное окружение:
Далее установите все пакеты:
pip install -r requirements.txt
Если файл requirements.txt со списком пакетов отсутствует, установите все расширения вручную.
Screen — самый простой метод
Для простого запуска скрипта в фоне можно воспользоваться утилитой screen , которая позволяет создавать неограниченое количество сессий в терминале.
Ее необходимо установить из репозитория:
Запустите новое окно командой:
Активируйте виртуальное окружение и запустите бота:
source ./venv/bin/activate
python main.py
Осталось свернуть сессию. Для этого необходимо зажать сочетание клавиш Ctrl + A, после чего нажать D.
- screen — запуск новой сессии;
- screen -ls — просмотр всех сессий;
- screen -r — открыть конкретную сессию (если сессия всего одна, то имя можно не указывать).
Это простой метод, который не требует создания конфигурационных файлов. Однако если сервер будет перезагружен или во время работы скрипта возникнет ошибка, бот будет нужно запустить заново.
Systemd
Рассмотрим запуск приложения в роли службы. Systemd — это менеджер системы и служб Linux. Он управляет службами, которые описаны в конфигурационных файлах, и запускает их.
Создайте новый юнит systemd:
sudo nano /lib/systemd/system/bot.service
Добавьте в него следующее содержимое:
[Unit]Description=Timeweb Bot Service
After=network.target
[Service]Type=idle
Restart=always
RestartSec=3
User=root
WorkingDirectory=home/me/bot
ExecStart=/home/me/bot/venv/bin/python /home/me/bot/main.py
[Install]WantedBy=multi-user.target
- Description — название службы,
- ExecStart — путь до интерпретатора Python и скрипта,
- User — пользователь, от которого будет запущена служба,
- Restart=always — указание, что необходимо перезапустить бота после ошибки.
Осталось перезагрузить юниты, добавить службу в автозапуск и активировать бота:
sudo systemctl daemon-reload
sudo systemctl enable bot.service
sudo systemctl start bot.service
Теперь проверьте работу бота. Если бот не отвечает, попробуйте запустить его в терминале и посмотреть, нет ли ошибок
PM2
Еще один способ запустить бота — использовать менеджер процессов PM2. О нем мы подробнее писали в Community. PM2 автоматически перезапускает бота и сохраняет логи.
Установите следующие пакеты:
sudo apt install nodejs
sudo apt install npm
Для запуска бота перейдите в директорию с ботом и запустите его командой:
pm2 start main.py --interpreter=python3
Python: установка virtualenv
Виртуальное окружение virtualenv — это инструмент, позволяющий создавать изолированные среды для отдельных проектов Python, решая тем самым проблему зависимостей и совместимости приложений разных версий. Подробнее о виртуальном окружении Python можно прочитать в официальной документации .
После установки virtualenv вы можете использовать pip для установки библиотек Python.
В зависимости от ваших задач установку можно выполнить в домашнюю директорию или в директорию конкретного сайта.
Версии Python
По умолчанию на наших серверах доступны версии Python 2 и Python 3.6, но вы также можете использовать версию Python 3.5.
Проверить версии Python на сервере можно с помощью команд:
# Версии Python 2:
python -V
# Версии Python 3:
python3 -V
Версии Python обратно совместимы, то есть приложение, написанное на 3.6, скорее всего, будет работать под 3.7, и так далее. Однако не всегда код, написанный на новых версиях, будет корректно работать на старых версиях из-за возможного нового синтаксиса и функций языка. Также обратите внимание, что Python 2 и Python 3 несовместимы между собой.
При создании виртуального окружения нужно использовать корректное имя интерпретатора, в зависимости от нужной вам версии Python:
# Если требуется Python2:
python virtualenv.pyz venv
# Если требуется Python3.5:
python3.5 virtualenv.pyz venv
# Если требуется Python3.6:
python3.6 virtualenv.pyz venv
Таким образом, при выполнении команды:
python3 virtualenv.pyz venv
окружение будет содержать интерпретатор Python3. Если вам нужна версия 2, то необходимо вызывать python :
python virtualenv.pyz venv
Обратите внимание, что в виртуальном окружении доступна только та версия Python 3 , которая была выбрана при создании виртуального окружения. Например, запустить скрипт через Python 3.5 в виртуальном окружении, созданном через Python 3.6, не получится:
(env) $ python3.5 --version
Command 'python3.5' not found
При этом Python 2 будет доступен:
(env) $ python2 --version
Python 2.7.17
Проверить версию Python в созданном виртуальном окружении можно командой:
(env) $ python --version
Python 3.6.9
Установка в корень аккаунта
Установить одну из последних версий виртуального окружения в корень аккаунта можно по инструкции ниже.
wget https://bootstrap.pypa.io/virtualenv/X.X/virtualenv.pyz
wget https://bootstrap.pypa.io/virtualenv/3.6/virtualenv.pyz
# Если требуется Python3:
python3 virtualenv.pyz venv
# Если требуется Python2:
python virtualenv.pyz venv
При этом будет создана директория venv , из которой будет запускаться виртуальное окружение (имя директории можно задать любое).
Далее вы можете приступить к установке библиотек с помощью pip . После отключить виртуальное окружение можно командой deactivate .
Установка в конкретный каталог
Если виртуальное окружение требуется для конкретного сайта , можно установить его в соответствующий каталог public_html :
cd /home/u/user/директория_сайта/public_html
wget https://bootstrap.pypa.io/virtualenv/X.X/virtualenv.pyz
wget https://bootstrap.pypa.io/virtualenv/3.6/virtualenv.pyz
# Если требуется Python 3:
python3 virtualenv.pyz venv
# Если требуется Python 2:
python virtualenv.pyz venv
При этом будет создана директория venv, из которой будет запускаться виртуальное окружение (имя директории можно задать любое).
source /home/u/user/директория_сайта/public_html/venv/bin/activate
Далее вы можете приступить к установке библиотек с помощью pip . После отключить виртуальное окружение можно командой deactivate .
Использование PIP
PIP — система управления пакетами для установки и управления программными пакетами на Python.
Основные команды pip
# Установка пакета
pip install имя_пакета
# Обновление пакета
pip install -U имя_пакета
# Удаление пакета
pip uninstall имя_пакета — удаление пакета
# Вывод установленных пакетов
pip freeze
# Просмотр версии pip
pip --version
# Обновление pip
pip install -U pip
Файл requirements.txt
Файл содержит вывод команды pip freeze и является списком зависимостей, которые необходимо установить в виртуальное окружение для работы приложения.
Пример содержимого requirements.txt :
asgiref==3.4.1
Django==3.2.7
pytz==2021.1
sqlparse==0.4.2
typing-extensions==3.10.0.2
Вместо обозначения == может встретиться >= , что означает версию равную или выше.
Восстановление виртуального окружения с помощью requirements.txt
С помощью requirements.txt можно выполнить рекурсивную установку пакетов. В этом случае нет необходимости устанавливать пакеты вручную.
Выполнить установку можно командой:
pip install -r requirements.txt
Возможные ошибки
No module named ‘имя_модуля’
Ошибка сообщает о том, что импортируемый в коде модуль не установлен. Пример сообщения в логе об ошибке:
plain.webtm.ru [Tue Jul 07 06:18:52 2020] [error] [pid 74988] src/server/wsgi_logger.c(147): [client 5.16.118.157:33342] import pygame
plain.webtm.ru [Tue Jul 07 06:18:52 2020] [error] [pid 74988] src/server/wsgi_logger.c(147): [client 5.16.118.157:33342] ModuleNotFoundError: No module named 'pygame'
Если вы уверены, что модуль установлен, но ошибка все равно возникает, необходимо проверить корректность путей в файле index.wsgi и указать в скрипте корректный путь до интерпретатора Python.
Например, если виртуальное окружение было установлено в директорию /mysite/public_html , в начало скрипта необходимо добавить строку:
#!/home/u/user/mysite/public_html/venv/bin/python3.6
Также следует убедиться, что используется нужная версия пакетов или самого Python.
Target WSGI script ‘/путь/до/скрипта/index.wsgi’ cannot be loaded as Python module
Возникает при неправильной настройке файла index.wsgi .
Необходимо сверить файл с инструкциями по ссылкам: Django , Flask .
DisallowedHost at / Invalid HTTP_HOST header
Для устранения ошибки необходимо указать доменное имя в качестве переменной в файле /имя_проекта/settings.py , например:
ALLOWED_HOSTS = ['example.com']
Для работы сайта от любого домена нужно указать символ * :
AttributeError: module ‘MySQLdb.constants.FIELD_TYPE’ has no attribute ‘JSON’
Необходимо обновить mysqlclient командой:
pip install -U mysqlclient
The SECRET_KEY setting must not be empty
Нужно проверить корректность указанного имени модуля настроек в wsgi-скрипте или наличие SECRET_KEY в файле settings.py .
Пример сообщения об ошибке в логе:
Jan 28 02:12:27 vh328 apache_error[58945]: ce05390-django.tw1.ru [Thu Jan 28 02:12:27 2021] [error] [pid 35894] src/server/wsgi_logger.c(147): [client 188.163.65.63:37230] django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty.
Как развернуть готовый проект на Flask/Bottle в Timeweb?
Подскажите, пожалуйста, способ разворачивания Flask/Bottle приложений на обычном шаред хостинге Timeweb? Возможно ли это?
Поясню: у клиента есть шаред (тариф битриксовый, Etherno) на Таймвебе, где куча его сайтов, и брать ещё отдельный VDS (особенно дорогущий от Таймвеба) и переносить всё туда — нет желания. Плюс у него там по eCommerce много завязано на текущий IP сервера (как-то так он сказал).
Видела тут в комьюнити про деплой Django, но этот способ не сработал для, например, Flask проекта. Точно так же, всё что предлагает гугл — выдаёт 500 ошибку.
Если есть реальный кейс, то поделитесь пожалуйста!
Ответы (5)
Почему-то в этом сообществе(Таймвэб) не принято делиться советами или решать актуальные проблемы. Очень вяло-текущий режим.
public_html/.htaccess:
Options +ExecCGI
AddHandler wsgi-script .wsgi
RewriteEngine On
RewriteCond % !-f
RewriteRule ^(.*)$ /index.wsgi/$1 [QSA,PT,L]
public_html/index.wsgi:
activate_this = ‘/home////bin/activate_this.py’
execfile(activate_this, dict(__file__=activate_this))
import sys
sys.path.insert(0, ‘/home///flask_test/’)
from flask_test.app import app as application
структура проекта:
flask_test/:
— flask_test/:
—- __init__.py
—- app.py
Добрый день! Получилось запустить Flask-проект на Python 3.4
может это кому-то поможет, я использовал следующие настройки:
public_html/.htaccess: (такой как и советовал Котов Артур Сергеевич)
Options +ExecCGI
AddHandler wsgi-script .wsgi
RewriteEngine On
RewriteCond % !-f
RewriteRule ^(.*)$ /index.wsgi/$1 [QSA,PT,L]
public_html/index.wsgi: (тут заменен execfile на exec и добавлен путь к библиотекам в myenv)
activate_this = ‘/home////bin/activate_this.py’
#execfile(activate_this, dict(__file__=activate_this))
exec(open(activate_this).read())
import sys
sys.path.insert(0, ‘/home///projectstar/public_html/projectstar/’)
sys.path.insert(1, ‘/home////lib/python3.4/site-packages/’)
from app import app as application
структура проекта:
projectstar/:
-public_html/:
— projectstar/:
—- __init__.py
—- app.py
Для bottle ->
———- .htaccess ————-
Options +ExecCGI
AddHandler wsgi-script .wsgi
RewriteEngine On
RewriteCond % !-f
RewriteRule ^(.*)$ /index.wsgi/$1 [QSA,PT,L]
——— index.wsgi ————-
import os
import sys
BASE_DIR = ‘/home/c/[ ля ля ля ]/public_html’ # путь до сайта
# Добавляем путь в переменные среды/переменное окружение
sys.path.append(BASE_DIR)
# делаем этот путь активным каталогом (т.е переходим в него)
os.chdir(BASE_DIR)
# $$$ Подключение виртуальной среды python (опционально)
# Указываем путь до активации виртуальной среды (замена source activate)
activate_this = BASE_DIR + ‘/env/bin/activate_this.py’
# Выполняем активацию
exec(open(activate_this).read())
# Добавляем путь в переменные среды пакеты python
sys.path.append(BASE_DIR + ‘/env/lib/python3.4/site-packages’)
# $$$
# Bottle в данной конфигурации поставлен как свой пакет обычной копипастой(нужно если не использовать virtualenv)
from bottle.bottle import default_app
# Если используем virtualenv то устанавливаем окружение, заходим в него и ставим пакет bottle
# следовательно его подключение будет выглядеть так from bottle import default_app
# подключаем наш проект (стартовый файл)
from main import main
# загружаем приложение
application = default_app()
Похожие вопросы
Не приходят сообщения на почту с выгруженного сайта 🙁 Поддержка не может помочь
Выгрузила готовый сайт на timeweb, настроила их почту через smtp (создала у них почту и настроила, чтобы сообщения на мою почту mail приходили от их). Проверила работает ли по локальному сайту — сообщения приходят, все работает. Проверяю на выгруженном.