Flask на хостинге
Введение
Эта статья именно про запуск на виртуальном хостинге.
Про деплой на своём сервере есть отдельная статья:
«Запуск Flask приложения на сервере Linux (Nginx + Gunicorn)»
Про Flask в
Docker
читайте
здесь
Конечно, многое зависит от хостинга но основные проблемы, думаю, везде одинаковые.
Flask на хостинге
В интернете очень много статей о том как запустить Flask локально. Но мало руководств по настройке на виртуальном хостинге (UPD: за последние пару лет стало больше).
За материал к этому руководству, я благодарю техподдержку хостинга
beget.ru
их статью о настройке
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.ru , либо узнайте как это сделать на вашем хостинге, задав вопрос в техподдержку.
Подготовка окружения
После того как вы подключились к своему хостингу и зашли в докер окружение, вам возможно понадобится
подготовить рабочее окружения для установки 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.ru/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.ru нужно заменить на ваш домен.
РЕКЛАМА от Яндекса. Может быть недоступна в вашем регионе
Конец рекламы. Если там пусто считайте это рекламой моей телеги
С файлом 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.ru LETTER="t" USERNAME="tester" DOMAIN="testsetup.ru" 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