Развёртывание с Fabric
Fabric — это инструмент для Python, подобный Makefiles, но с возможностью выполнения команд на удалённом сервере. В сочетании с правильно настроенным пакетом Python (Большие приложения как пакеты) и хорошей концепцией конфигураций (Обработка конфигураций) очень легко развёртывать приложения Flask на внешние серверы.
Прежде чем начать, вот быстрый контрольный список вещей, которые нужно гарантировать:
- Fabric 1.0 должен быть установлен локально. В этом руководстве предполагается использование последней версии Fabric.
- Приложение должно быть уже пакетом и требовать работоспособного файла
setup.py(Развёртывание с Setuptools). - В следующем примере мы используем
mod_wsgiдля удалённых серверов. Конечно, вы можете использовать свой любимый сервер, но для этого примера мы выбрали Apache +mod_wsgi, потому что его очень легко настроить и есть простой способ перезагрузки приложений без прав администратора.
Создание первого Fabfile
Fabfile — это то, что контролирует выполнение Fabric. Он называется fabfile.py и выполняется командой fab. Все функции, определённые в этом файле, будут отображаться как подкоманды fab. Они выполняются на одном или нескольких хостах. Эти хосты могут быть определены либо в fabfile, либо в командной строке. В этом случае мы добавим их в fabfile.
Это базовый пример, который имеет возможность загрузить текущий исходный код на сервер и установить его в существующую виртуальную среду:
from fabric.api import *
# the user to use for the remote commands
env.user = 'appuser'
# the servers where the commands are executed
env.hosts = ['server1.example.com', 'server2.example.com']
def pack():
# build the package
local('python setup.py sdist --formats=gztar', capture=False)
def deploy():
# figure out the package name and version
dist = local('python setup.py --fullname', capture=True).strip()
filename = f'{dist}.tar.gz'
# upload the package to the temporary folder on the server
put(f'dist/{filename}', f'/tmp/{filename}')
# install the package in the application's virtualenv with pip
run(f'/var/www/yourapplication/env/bin/pip install /tmp/{filename}')
# remove the uploaded package
run(f'rm -r /tmp/{filename}')
# touch the .wsgi file to trigger a reload in mod_wsgi
run('touch /var/www/yourapplication.wsgi')
Выполнение Fabfiles
Теперь как выполнить этот fabfile? Вы используете команду fab. Чтобы развернуть текущую версию кода на удалённом сервере, используйте эту команду:
$ fab pack deploy
Однако это требует, чтобы на нашем сервере уже была создана папка /var/www/yourapplication и /var/www/yourapplication/env была виртуальной средой. Кроме того, мы не создаём конфигурацию или файл .wsgi на сервере. Итак, как мы запустим новый сервер в нашей инфраструктуре?
Это зависит от количества серверов, которые мы хотим настроить. Если у нас только один сервер приложения (что характерно для большинства приложений), создание команды в fabfile для этого излишне. Но, очевидно, вы можете это сделать. В этом случае вы, вероятно, назовёте её setup или bootstrap и затем передадите имя сервера явно в командной строке:
$ fab -H newserver.example.com bootstrap
Для настройки нового сервера примерно выполните эти шаги:
-
Создайте структуру каталогов в
/var/www:$ mkdir /var/www/yourapplication $ cd /var/www/yourapplication $ virtualenv --distribute env
- Загрузите новый файл
application.wsgiна сервер и файл конфигурации для приложения (например:application.cfg) - Создайте новую конфигурацию Apache для
yourapplicationи активируйте её. Убедитесь, что активирована функция отслеживания изменений файла.wsgi, чтобы мы могли автоматически перезагрузить приложение, изменив его. См. mod_wsgi (Apache).
Теперь вопрос в том, откуда берутся файлы application.wsgi и application.cfg?
Файл WSGI
Файл WSGI должен импортировать приложение и также установить переменную среды, чтобы приложение знало, где искать конфигурацию. Это короткий пример, который делает именно это:
import os os.environ['YOURAPPLICATION_CONFIG'] = '/var/www/yourapplication/application.cfg' from yourapplication import app
Само приложение должно инициализироваться таким образом, чтобы искать конфигурацию в этой переменной среды:
app = Flask(__name__)
app.config.from_object('yourapplication.default_config')
app.config.from_envvar('YOURAPPLICATION_CONFIG')
Этот подход подробно описан в разделе Обработки конфигураций документации.
Файл конфигурации
Как упоминалось выше, приложение найдёт правильный файл конфигурации, посмотрев на переменную среды YOURAPPLICATION_CONFIG. Поэтому мы должны поместить конфигурацию в место, где приложение сможет её найти. Файлы конфигурации обладают неприятным свойством быть разными на всех компьютерах, поэтому обычно их не включают в систему контроля версий.
Популярный подход — хранить файлы конфигурации для разных серверов в отдельном репозитории системы контроля версий и выгружать их на все серверы. Затем создайте символическую ссылку на файл, активный для сервера, в место, где он ожидается (например: /var/www/yourapplication).
В любом случае, в нашем случае мы ожидаем только один или два сервера, и мы можем загрузить их заранее вручную.
Первое развёртывание
Теперь мы можем выполнить первое развёртывание. Мы настроили серверы таким образом, что у них есть виртуальные среды и активированы конфигурации Apache. Теперь мы можем упаковать приложение и развернуть его:
$ fab pack deploy
Fabric теперь подключится ко всем серверам и выполнит команды, как написано в fabfile. Сначала он выполнит упаковку, чтобы у нас был готов наш tarball, а затем выполнит deploy и загрузит исходный код на все серверы и установит его там. Благодаря файлу setup.py мы автоматически подтянем необходимые библиотеки в нашу виртуальную среду.
Следующие шаги
С этого момента есть множество возможностей, которые можно реализовать, чтобы сделать развёртывание действительно приятным:
- Создайте команду
bootstrapдля инициализации новых серверов. Она может инициализировать новую виртуальную среду, правильно настроить Apache и т. д. - Поместите файлы конфигурации в отдельный репозиторий контроля версий и создайте символические ссылки на активные конфигурации.
- Вы также можете поместить код приложения в репозиторий и выгрузить последнюю версию на сервер, а затем установить. Таким образом, вы также легко сможете вернуться к более ранним версиям.
- Включите функциональность тестирования, чтобы вы могли развернуть приложение на внешнем сервере и запустить набор тестов.
Работа с Fabric — это весело, и вы заметите, что очень приятно ввести fab deploy и увидеть, как ваше приложение автоматически развёртывается на одном или нескольких удалённых серверах.
© 2007–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.1.x/patterns/fabric/