Flask на хостинге

Введение

Эта статья именно про запуск на виртуальном хостинге.

Про деплой на своём сервере есть отдельная статья:

«Запуск Flask приложения на сервере Linux (Nginx + Gunicorn)»

Про Flask в Docker читайте здесь

Конечно, многое зависит от хостинга но основные проблемы, думаю, везде одинаковые.

Flask Logo

Flask на хостинге

В интернете очень много статей о том как запустить Flask локально. Но мало руководств по настройке на виртуальном хостинге (UPD: за последние пару лет стало больше).

За материал к этому руководству, я благодарю техподдержку хостинга beget.com их статью о настройке Flask на хостинге можете изучить здесь

Начало работы с Flask на хостинге

Сперва нужно подключиться к своему аккаунту на хостинге через SSH.

В Linux SSH клиент скорее всего встроен.

В Windows можно установить SSH из Powershell или Windows Settings или использовать дополнительный терминал подобный Putty или MobaXterm

Подключиться к аккаунту проще всего по имени домена

ssh username@your_domain

Можно подключиться и по IP. Чтобы его узнать - выполнить

ping your_domain

ssh username@ip

Если на Вашем хостинге установлен Docker - перейдите в контейнер командой

ssh localhost -p222

Слева в приглашении командной строки появится (docker)

(docker) username@server:~/your_domain.ru

Если это beget.com , либо узнайте как это сделать на вашем хостинге, задав вопрос в техподдержку.

Подготовка окружения

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

Нужно установить Python 3.6 или выше. Подробнее про установку с помощью configure make install вы можете прочитать здесь .

Если Python версии 3.10 и выше, то нужно будет обновить openssl

Рекомендуется создать в домашней директории временную папку

cd ~/.beget
mkdir tmp

Обновление OpenSSL

cd ~/.beget/tmp wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz tar -xvzf openssl-1.1.1l.tar.gz && cd openssl-1.1.1l ./config --prefix=$HOME/.local --openssldir=$HOME/.local/ssl '-Wl,--enable-new-dtags,-rpath,$(LIBRPATH)'

… ********************************************************************** *** *** *** OpenSSL has been successfully configured *** *** *** *** If you encounter a problem while building, please open an *** *** issue on GitHub <https://github.com/openssl/openssl/issues> *** *** and include the output from the following command: *** *** *** *** perl configdata.pm --dump *** *** *** *** (If you are new to OpenSSL, you might want to consult the *** *** 'Troubleshooting' section in the INSTALL file first) *** *** *** **********************************************************************

make -j$((`nproc`/4)) && make install
~/.local/bin/openssl version

OpenSSL 1.1.1l 24 Aug 2021

Установка Python

На момент написания этой статьи на хостинге Beget гарантированно можно установить Python 3.11.0. Если вы пользуетесь другим хостингом - уточните какова последняя поддерживаемая версия.

cd ~/.beget/tmp wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz tar -xvzf Python-3.11.0.tgz && cd Python-3.11.0 ./configure --prefix=$HOME/.local --with-openssl=$HOME/.local --with-openssl-rpath=auto --enable-optimizations --enable-loadable-sqlite-extensions LDFLAGS="-Wl,-rpath /usr/local/lib" make -j$((`nproc`/4)) && make install python3 -V

Python 3.11.0

Установка Flask

Обновите pip

python3 -m pip install --upgrade pip

Установите flask

python3 -m pip install flask

или

pip3 install flask --user --ignore-installed

Создание необходимых файлов и директорий

Создадим простейшее web приложение в корне вашего сайта.

Если у Вас на сайте уже есть папка public_html - сохраните её куда-нибудь в надёжное место и удалите с сайта.

Начинаем в абсолютно пустой директории, наша цель - создать такую структуру (skeleton)

. └── your_domain.ru ├── HelloFlask │ └── __init__.py ├── .htaccess ├── passenger_wsgi.py └── tmp

Создайте две директории HelloFlask и tmp

mkdir HelloFlask tmp

Создаём два файла в корневой директории .htaccess и passenger_wsgi

touch .htaccess
touch passenger_wsgi.py

Если Вы умеете редактировать файлы на хостинге - продолжайте читать эту статью. Если это вызывает проблемы - прочитайте мою статью «Текстовый редактор vi»

.htaccess

Если вы этого ещё не сделали - в корневой директории проекта выполните

touch .htaccess

В файле .htaccess напишите

PassengerEnabled On PassengerPython /home/a/username/.local/bin/python3

Причём /home/a/username/.local/bin/python3 Вам нужно будет заменить на путь до Вашего python3.

Чтобы его узнать выполните

which python3

Нужно именно which python3 так как which python вернёт путь до Python 2.7.17 /usr/bin/python

С файлом .htaccess разобрались, теперь редактируем passenger_wsgi.py

passenger_wsgi

# -*- coding: utf-8 -*- import sys, os # указываем директорию с проектом sys.path.append('/home/a/username/testsetup.site/HelloFlask') # указываем директорию с библиотеками, куда поставили Flask sys.path.append('/home/a/username/.local/bin/flask') from HelloFlask import app as application # Когда Flask стартует, он ищет application. # Если не указать 'as application', сайт не заработает from werkzeug.debug import DebuggedApplication # Опционально: подключение модуля отладки application.wsgi_app = DebuggedApplication(application.wsgi_app, True) # Опционально: включение модуля отадки application.debug = False # Опционально: True/False устанавливается по необходимости в отладке

Где в /home/a/username/ нужно везде заменить a/username на ваше имя пользователя

А testsetup.site нужно заменить на ваш домен.

С файлом passenger_wsgi.py разобрались, переходим в папку HelloFlask

cd HelloFlask

Создаём там файл __init__.py

touch __init__.py

И пишем там

from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello Flask!' if __name__ == '__main__': app.run()

С файлом __init__.py разобрались, возвращаемся в корневую директорию

cd ..

И выполняем

ln -s public_html public
touch tmp/restart.txt

Открывайте Ваш сайт и убедитесь, что там написано Hello Flask!

Когда Вы внесете какие-то обновления не забудьте после сохранения выполнять перезагрузку командой.

touch tmp/restart.txt

Flask API для сайта на PHP

Допустим у вас уже есть сайт на PHP и нужно сделать для него REST API на основе Flask. Для этого не обязательно заказывать выделенный сервер - на хостинге Beget вам помогут реализовать эту идею даже на самом простом тарифе.

В корневой директории сайта создайте директорию flaskapi

Она будет на одном уровне с public_html

Там же создайте файл .htaccess

mkdir flaskapi
touch .htaccess
ls -a

flaskapi public_html .htaccess

vi .htaccess

PassengerEnabled On PassengerPython /home/u/user/.local/bin/python3 PassengerAppRoot /home/u/user/domainname.ru/flaskapi PassengerBaseURI /flaskapi

Перейдтие в директорию flaskapi создайте ссылку public , папку с проектом HelloFlask и создайте там файл passenger_wsgi.py

cd flaskapi
ln -s public_html public
mkdir HelloFlask
touch HelloFlask/__init__.py
touch passenger_wsgi.py
vi passenger_wsgi.py

# -*- coding: utf-8 -*- import sys, os # указываем директорию с проектом sys.path.append('/home/u/user/domainame.ru/flaskapi/HelloFlask') # указываем директорию с библиотеками, куда поставили Flask sys.path.append('/home/u/user/.local/lib/python3.7/site-packages') #from flaskapi import app as application from HelloFlask import app as application # Когда Flask стартует, он ищет application. # Если не указать 'as application', сайт не заработает from werkzeug.debug import DebuggedApplication # Опционально: подключение модуля отладки application.wsgi_app = DebuggedApplication(application.wsgi_app, True) # Опционально: включение модуля отадки application.debug = False # Опционально: True/False устанавливается по необходимости в отладке

Отредактируйте второй .htaccess файл - тот, который в public_html

Нужно убедиться, что PassengerEnabled off

vi public_html/.htaccess

PassengerEnabled off

Теперь нужно роутинга директорий на Apache Virtual Host добавить:

Alias /flaskapi /home/user/user/domainname.ru/flaskapi

На это действие у вас недостаточно прав - поэтому нужно попросить это сделать техническую поддержку

Если Вы ещё не определилсь с выбором хостинга советую прочитать мою статью

«Какой хостинг выбрать»

Скрипт для автоматической установки

Если вы установили Python3 и убедились, что стоит нужная OpenSSL - вы можете воспользоваться моим скриптом для запуска тестового Flask.

Создайте в абсолютно пустой директории вашего сайта скрипт install_flask_vhost.sh скопируйте туда следующий код, замените LETTER, USER и DOMAIN на ваши значения и запуститите скрипт

# install Flask on Beget # author: Andrey Olegovich # for: www.devhops.site LETTER="t" USERNAME="tester" DOMAIN="testsetup.site" python3 -m pip install --upgrade pip python3 -m pip install flask mkdir HelloFlask tmp touch .htaccess passenger_wsgi.py echo "PassengerEnabled On" > .htaccess echo "PassengerPython /home/${LETTER}/${USERNAME}/.local/bin/python3" >> .htaccess echo "import sys, os" > passenger_wsgi.py echo "" >> passenger_wsgi.py echo "sys.path.append('/home/${LETTER}/${USERNAME}/${DOMAIN}/HelloFlask')" >> passenger_wsgi.py echo "sys.path.append('/home/${LETTER}/${USERNAME}/.local/bin/flask')" >> passenger_wsgi.py echo "from HelloFlask import app as application" >> passenger_wsgi.py echo "from werkzeug.debug import DebuggedApplication" >> passenger_wsgi.py echo "application.wsgi_app = DebuggedApplication(application.wsgi_app, True)" >> passenger_wsgi.py echo "application.debug = False" >> passenger_wsgi.py echo "" >> passenger_wsgi.py cd HelloFlask touch __init__.py echo "from flask import Flask" > __init__.py echo "app = Flask(__name__)" >> __init__.py echo "" >> __init__.py echo "@app.route('/')" >> __init__.py echo "def hello_world():" >> __init__.py echo " return 'Hello Flask!'" >> __init__.py echo "if __name__ == '__main__':" >> __init__.py echo " app.run()" >> __init__.py echo "" >> __init__.py cd .. ln -s public_html public touch tmp/restart.txt

touch install_flask_vhost.sh chmod +x install_flask_vhost.sh ./install_flask_vhost.sh

Автор статьи: Андрей Олегович