0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы узнаем, что такое конфигурация и как настраивать и деплоить приложение.</p>
1
<p>В этом уроке мы узнаем, что такое конфигурация и как настраивать и деплоить приложение.</p>
2
<h2>Конфигурация</h2>
2
<h2>Конфигурация</h2>
3
<p>Любое нетривиальное приложение взаимодействует с внешним миром: использует базу данных, обращается к внешним сервисам (например, платежным), отправляет письма и получает список друзей, например, из Facebook. Для подавляющего большинства этих операций необходимы специальные параметры: ключи, пароли, адреса серверов и порты. Все эти параметры называются конфигурацией приложения.</p>
3
<p>Любое нетривиальное приложение взаимодействует с внешним миром: использует базу данных, обращается к внешним сервисам (например, платежным), отправляет письма и получает список друзей, например, из Facebook. Для подавляющего большинства этих операций необходимы специальные параметры: ключи, пароли, адреса серверов и порты. Все эти параметры называются конфигурацией приложения.</p>
4
<p>Возникает вопрос, где хранить конфигурацию? Самый простой и самый неправильный ответ - прямо в приложении. Проблем у такого подхода две:</p>
4
<p>Возникает вопрос, где хранить конфигурацию? Самый простой и самый неправильный ответ - прямо в приложении. Проблем у такого подхода две:</p>
5
<ul><li><p>Часть этих данных секретная. Хранить их в репозитории просто нельзя из-за возможных проблем с безопасностью. Любой кто имеет доступ к репозиторию сможет получить любой доступ.</p>
5
<ul><li><p>Часть этих данных секретная. Хранить их в репозитории просто нельзя из-за возможных проблем с безопасностью. Любой кто имеет доступ к репозиторию сможет получить любой доступ.</p>
6
</li>
6
</li>
7
<li><p>При изменении этих параметров придется заново деплоить приложение, хотя, по сути, ничего не изменилось, нет новых фич, нет исправления старых багов. Просто изменилась конфигурация.</p>
7
<li><p>При изменении этих параметров придется заново деплоить приложение, хотя, по сути, ничего не изменилось, нет новых фич, нет исправления старых багов. Просто изменилась конфигурация.</p>
8
</li>
8
</li>
9
</ul><p>В 2011 году разработчики компании<a>Heroku</a>выложили в интернете сайт, который называется<a>12factors</a>. Он описывает методологию для создания веб-приложений. Она уменьшает затраты на установку и настройку приложения, повышает переносимость между средами исполнения, позволяет масштабироваться без существенных изменений в инструментах, архитектуре и практике разработки. С тех пор эта методология фактически стала стандартом в индустрии.</p>
9
</ul><p>В 2011 году разработчики компании<a>Heroku</a>выложили в интернете сайт, который называется<a>12factors</a>. Он описывает методологию для создания веб-приложений. Она уменьшает затраты на установку и настройку приложения, повышает переносимость между средами исполнения, позволяет масштабироваться без существенных изменений в инструментах, архитектуре и практике разработки. С тех пор эта методология фактически стала стандартом в индустрии.</p>
10
<p>Рекомендуем полностью изучить этот документ. Сейчас же нас интересует один его аспект - конфигурация. Двенадцать факторов требуют строгого разделения конфигурации и кода. Конфигурация может меняться между развертываниями: локальное окружение разработчика, продакшен, среда для тестирования. Код не меняется.</p>
10
<p>Рекомендуем полностью изучить этот документ. Сейчас же нас интересует один его аспект - конфигурация. Двенадцать факторов требуют строгого разделения конфигурации и кода. Конфигурация может меняться между развертываниями: локальное окружение разработчика, продакшен, среда для тестирования. Код не меняется.</p>
11
<p>Конфигурация должна передаваться в приложение снаружи. Единственный универсальный способ сделать это - использовать переменные окружения.</p>
11
<p>Конфигурация должна передаваться в приложение снаружи. Единственный универсальный способ сделать это - использовать переменные окружения.</p>
12
<h3>Переменные окружения</h3>
12
<h3>Переменные окружения</h3>
13
<p>У Flask большое количество<a>настроек</a>для разных подсистем. Все они задаются в объекте app.config. Например, так можно запустить фреймворк в режиме отладки:</p>
13
<p>У Flask большое количество<a>настроек</a>для разных подсистем. Все они задаются в объекте app.config. Например, так можно запустить фреймворк в режиме отладки:</p>
14
<p>Таких переменных может быть довольно много - от настроек логгирования до путей к базе данных. Все они указываются в коде и могут загружаться из окружения.</p>
14
<p>Таких переменных может быть довольно много - от настроек логгирования до путей к базе данных. Все они указываются в коде и могут загружаться из окружения.</p>
15
<p>Некоторые такие настройки конфиденциальны и должны храниться отдельно от основного кода проекта. Для этих целей используются переменные окружения:</p>
15
<p>Некоторые такие настройки конфиденциальны и должны храниться отдельно от основного кода проекта. Для этих целей используются переменные окружения:</p>
16
<p>У данного способа есть несколько недостатков:</p>
16
<p>У данного способа есть несколько недостатков:</p>
17
<ul><li>Переменные загружаются только из окружения</li>
17
<ul><li>Переменные загружаются только из окружения</li>
18
<li>Необходимо обрабатывать исключения KeyError</li>
18
<li>Необходимо обрабатывать исключения KeyError</li>
19
<li>Необходимо конвертировать типы вручную (например, DEBUG=True из строки в bool)</li>
19
<li>Необходимо конвертировать типы вручную (например, DEBUG=True из строки в bool)</li>
20
</ul><p>Для простоты конфигурации Flask можно использовать стороннюю библиотеку<a>python-dotenv</a>. Она позволяет загружать переменные не только из окружения, но и из специального файла<em>.env</em>, который находится в корне проекта. Этот файл не должен храниться в репозитории, ведь в нем конфидециальные данные: ключи, пароли. Он специфичен для окружения, в котором идет запуск. Вот его пример:</p>
20
</ul><p>Для простоты конфигурации Flask можно использовать стороннюю библиотеку<a>python-dotenv</a>. Она позволяет загружать переменные не только из окружения, но и из специального файла<em>.env</em>, который находится в корне проекта. Этот файл не должен храниться в репозитории, ведь в нем конфидециальные данные: ключи, пароли. Он специфичен для окружения, в котором идет запуск. Вот его пример:</p>
21
<p>Это обычный текстовый файл, в каждой строке которого находится имя переменной и ее значение.<em>python-dotenv</em>автоматически подгружает его, и затем эти переменные используются в коде, если это необходимо.</p>
21
<p>Это обычный текстовый файл, в каждой строке которого находится имя переменной и ее значение.<em>python-dotenv</em>автоматически подгружает его, и затем эти переменные используются в коде, если это необходимо.</p>
22
<p>Чтобы подключить<em>python-dotenv</em>, необходимо в файле инициализации приложения (например,<em>app.py</em>) произвести следующие настройки:</p>
22
<p>Чтобы подключить<em>python-dotenv</em>, необходимо в файле инициализации приложения (например,<em>app.py</em>) произвести следующие настройки:</p>
23
<p>Теперь можно использовать переменные окружения, которые описаны в файле<em>.env</em>:</p>
23
<p>Теперь можно использовать переменные окружения, которые описаны в файле<em>.env</em>:</p>
24
<h2>WSGI</h2>
24
<h2>WSGI</h2>
25
<p>Любое веб-приложение, которое написано с использованием Flask, является<strong>WSGI-приложением</strong>- Web Server Gateway Interface. Оно используется практически всеми веб-фреймворками для Python. Это соглашение об описании веб-приложения в виде обычной функции request -> response.</p>
25
<p>Любое веб-приложение, которое написано с использованием Flask, является<strong>WSGI-приложением</strong>- Web Server Gateway Interface. Оно используется практически всеми веб-фреймворками для Python. Это соглашение об описании веб-приложения в виде обычной функции request -> response.</p>
26
<p>Приложение-функцию может вызывать любой WSGI-сервер, который берет на себя работу с сетью, запуск нужного количества копий приложения и раздачу им запросов.</p>
26
<p>Приложение-функцию может вызывать любой WSGI-сервер, который берет на себя работу с сетью, запуск нужного количества копий приложения и раздачу им запросов.</p>
27
<p>Обычно в продакшене используют сервер с многоядерным процессором, а одновременных запросов может приходить помногу каждую секунду. Интерпретатор Python в силу особенностей реализации многопоточности не слишком эффективно работает с большим количеством одновременных задач.</p>
27
<p>Обычно в продакшене используют сервер с многоядерным процессором, а одновременных запросов может приходить помногу каждую секунду. Интерпретатор Python в силу особенностей реализации многопоточности не слишком эффективно работает с большим количеством одновременных задач.</p>
28
<p>WSGI-сервер знает об этих особенностях и позволяет эффективно использовать ресурсы железа. Он запускает одновременно несколько работающих интерпретаторов, следит за каждым из них и раздает им запросы поровну. А WSGI-интерфейс позволяет веб-разработчикам использовать всю возможность WSGI-серверов вне зависимости от выбранного фреймворка.</p>
28
<p>WSGI-сервер знает об этих особенностях и позволяет эффективно использовать ресурсы железа. Он запускает одновременно несколько работающих интерпретаторов, следит за каждым из них и раздает им запросы поровну. А WSGI-интерфейс позволяет веб-разработчикам использовать всю возможность WSGI-серверов вне зависимости от выбранного фреймворка.</p>
29
<p>До этого момента мы запускали приложение с помощью команды flask. Эта команда запускает WSGI-приложение на упрощенном сервере разработчика. Этот сервер может обрабатывать только один запрос за раз и не позволяет запускать несколько интерпретаторов. При этом его не нужно настраивать, а приложение он умеет перезапускать сам, как только код будет изменен.</p>
29
<p>До этого момента мы запускали приложение с помощью команды flask. Эта команда запускает WSGI-приложение на упрощенном сервере разработчика. Этот сервер может обрабатывать только один запрос за раз и не позволяет запускать несколько интерпретаторов. При этом его не нужно настраивать, а приложение он умеет перезапускать сам, как только код будет изменен.</p>
30
<p>Это очень важные качества на этапе разработки. Поэтому веб-разработчик обычно использует и dev-сервер и полноценный WSGI-сервер - один при разработке, а второй в разработке для продакшена. Запустим наше приложение на продакшен-сервере.</p>
30
<p>Это очень важные качества на этапе разработки. Поэтому веб-разработчик обычно использует и dev-сервер и полноценный WSGI-сервер - один при разработке, а второй в разработке для продакшена. Запустим наше приложение на продакшен-сервере.</p>
31
<h2>Gunicorn</h2>
31
<h2>Gunicorn</h2>
32
<p>Один из самых популярных WSGI-серверов -<a>Gunicorn</a>. Установим его в наш проект - в то же виртуальное окружение, в которое установили flask:</p>
32
<p>Один из самых популярных WSGI-серверов -<a>Gunicorn</a>. Установим его в наш проект - в то же виртуальное окружение, в которое установили flask:</p>
33
<p>Когда Gunicorn будет установлен, для запуска приложения вместо команды flask можно будет запустить приложение так:</p>
33
<p>Когда Gunicorn будет установлен, для запуска приложения вместо команды flask можно будет запустить приложение так:</p>
34
<p>Это пример типичной команды для запуска. Он показывает две самых важных опции Gunicorn:</p>
34
<p>Это пример типичной команды для запуска. Он показывает две самых важных опции Gunicorn:</p>
35
<ul><li>Количество интерпретаторов, которые будут выполнять код приложения - воркеры</li>
35
<ul><li>Количество интерпретаторов, которые будут выполнять код приложения - воркеры</li>
36
<li>Адрес, запросы к которому и будет обслуживать сервер</li>
36
<li>Адрес, запросы к которому и будет обслуживать сервер</li>
37
</ul><p>Вот соответствующие опции в приведенной команде:</p>
37
</ul><p>Вот соответствующие опции в приведенной команде:</p>
38
<ul><li>--workers=4 - использовать четыре воркера</li>
38
<ul><li>--workers=4 - использовать четыре воркера</li>
39
<li>--bind=127.0.0.1:8000 - слушать порт 8000 на хосте 127.0.0.1</li>
39
<li>--bind=127.0.0.1:8000 - слушать порт 8000 на хосте 127.0.0.1</li>
40
</ul><p>WSGI-приложение указывается в виде полное.имя.модуля:переменная. Нужно указывать не имя файла, а имя модуля или пакета, который экспортирует переменную, ссылающуюся на WSGI-приложение - объект Flask.</p>
40
</ul><p>WSGI-приложение указывается в виде полное.имя.модуля:переменная. Нужно указывать не имя файла, а имя модуля или пакета, который экспортирует переменную, ссылающуюся на WSGI-приложение - объект Flask.</p>
41
<h2>Доставка приложений до сервера</h2>
41
<h2>Доставка приложений до сервера</h2>
42
<p>Когда сайт написан, его нужно выложить в интернет. Стандартный путь включает три пункта:</p>
42
<p>Когда сайт написан, его нужно выложить в интернет. Стандартный путь включает три пункта:</p>
43
<ol><li>Покупка домена</li>
43
<ol><li>Покупка домена</li>
44
<li>Покупка хостинга и его настройка</li>
44
<li>Покупка хостинга и его настройка</li>
45
<li>Деплой</li>
45
<li>Деплой</li>
46
</ol><p>Рассмотрим эти пункты более подробно.</p>
46
</ol><p>Рассмотрим эти пункты более подробно.</p>
47
<h3>Покупка домена</h3>
47
<h3>Покупка домена</h3>
48
<p>Чтобы приобрести домен, необходимо обратиться в компании-регистраторы. Домен оплачивается раз в год и закрепляется за определенным человеком или компанией. Иногда хостер и регистратор - одна и та же компания. Тогда домен и сервер связываются одновременно. Иначе нужно производить определенные настройки на стороне сервера и подтверждать свое право владения доменом.</p>
48
<p>Чтобы приобрести домен, необходимо обратиться в компании-регистраторы. Домен оплачивается раз в год и закрепляется за определенным человеком или компанией. Иногда хостер и регистратор - одна и та же компания. Тогда домен и сервер связываются одновременно. Иначе нужно производить определенные настройки на стороне сервера и подтверждать свое право владения доменом.</p>
49
<h3>Покупка хостинга и его настройка</h3>
49
<h3>Покупка хостинга и его настройка</h3>
50
<p>Хостинг - это ресурсы для размещения и обслуживания сайта в интернете. Хостинг бывает разным. Он может представлять уже полностью готовую среду, в которую заливается код сайта. Также он может быть просто железными серверами, которыми можно и нужно управлять самостоятельно.</p>
50
<p>Хостинг - это ресурсы для размещения и обслуживания сайта в интернете. Хостинг бывает разным. Он может представлять уже полностью готовую среду, в которую заливается код сайта. Также он может быть просто железными серверами, которыми можно и нужно управлять самостоятельно.</p>
51
<p>Обычно работа с хостингом выглядит следующим образом:</p>
51
<p>Обычно работа с хостингом выглядит следующим образом:</p>
52
<ol><li>Производится регистрации на сайте хостинга</li>
52
<ol><li>Производится регистрации на сайте хостинга</li>
53
<li>Выбирается подходящий тариф и вид хостинга (On-Prem, IaaS, PaaS, SaaS) и привязывается банковская карточка</li>
53
<li>Выбирается подходящий тариф и вид хостинга (On-Prem, IaaS, PaaS, SaaS) и привязывается банковская карточка</li>
54
<li>Предоставляется доступ к ресурсам, например, IP-адрес и пара логин/пароль для ssh- или ftp-доступа</li>
54
<li>Предоставляется доступ к ресурсам, например, IP-адрес и пара логин/пароль для ssh- или ftp-доступа</li>
55
<li>При необходимости производится настройка хостинга и деплой проекта</li>
55
<li>При необходимости производится настройка хостинга и деплой проекта</li>
56
</ol><h3>Деплой</h3>
56
</ol><h3>Деплой</h3>
57
<p><strong>Деплой</strong>- процесс выкладки новой версии сайта на сервер. Этот процесс может быть довольно сложным и зависит от используемых технологий. Во время деплоя могут выполняться следующие задачи:</p>
57
<p><strong>Деплой</strong>- процесс выкладки новой версии сайта на сервер. Этот процесс может быть довольно сложным и зависит от используемых технологий. Во время деплоя могут выполняться следующие задачи:</p>
58
<ol><li>Код проекта скачивается на сервер - обычно через клонирование Git</li>
58
<ol><li>Код проекта скачивается на сервер - обычно через клонирование Git</li>
59
<li>Ставятся все необходимые зависимости</li>
59
<li>Ставятся все необходимые зависимости</li>
60
<li>Выполняется процесс сборки, например, собирается фронтенд-часть</li>
60
<li>Выполняется процесс сборки, например, собирается фронтенд-часть</li>
61
<li>Выполняются<strong>миграции</strong>- SQL-скрипты, которые изменяют структуру базы данных</li>
61
<li>Выполняются<strong>миграции</strong>- SQL-скрипты, которые изменяют структуру базы данных</li>
62
<li>Запускается новая версия кода</li>
62
<li>Запускается новая версия кода</li>
63
</ol><p>Во многих компаниях этот процесс выполняется руками. Программист заходит на сервер, запускает git pull и далее проходится по списку выше. Это худший способ деплоить. Деплой относится к тем задачам, которые должны быть автоматизированы.</p>
63
</ol><p>Во многих компаниях этот процесс выполняется руками. Программист заходит на сервер, запускает git pull и далее проходится по списку выше. Это худший способ деплоить. Деплой относится к тем задачам, которые должны быть автоматизированы.</p>
64
<p>Несмотря на разнообразие способов деплоя, есть одно важное правило для всех - деплоить можно только вперед. Деплой нельзя откатывать. И в первую очередь это касается миграций. Если после или во время деплоя что-то пошло не так, то правильно деплоить снова, но предыдущую версию.</p>
64
<p>Несмотря на разнообразие способов деплоя, есть одно важное правило для всех - деплоить можно только вперед. Деплой нельзя откатывать. И в первую очередь это касается миграций. Если после или во время деплоя что-то пошло не так, то правильно деплоить снова, но предыдущую версию.</p>
65
<p>Также деплои можно классифицировать по способу обновления и отката:</p>
65
<p>Также деплои можно классифицировать по способу обновления и отката:</p>
66
<ul><li>Последовательное обновление - сервера обновляются по очереди</li>
66
<ul><li>Последовательное обновление - сервера обновляются по очереди</li>
67
<li><a>Сине-Зеленый деплой</a>- полное дублирование инфраструктуры с подменой</li>
67
<li><a>Сине-Зеленый деплой</a>- полное дублирование инфраструктуры с подменой</li>
68
</ul><p>Отдельно стоит сказать про канареечный релиз - canary release. При таком подходе переключение на использование новой версии происходит постепенно - сначала для небольшого процента пользователей, а затем и для всех.</p>
68
</ul><p>Отдельно стоит сказать про канареечный релиз - canary release. При таком подходе переключение на использование новой версии происходит постепенно - сначала для небольшого процента пользователей, а затем и для всех.</p>
69
<p>Способ деплоя зависит от используемого хостинга и способа настройки серверного окружения. Выделяют следующие типы хостингов:</p>
69
<p>Способ деплоя зависит от используемого хостинга и способа настройки серверного окружения. Выделяют следующие типы хостингов:</p>
70
<ul><li><strong>Виртуальный хостинг (Shared Hosting)</strong>- самый дешевый способ размещать сайт в интернете. Такая услуга включает доступ на сервер с уже настроенным программным обеспечением под конкретный стек, например, Linux + Python + MySQL. Этот способ подходит для самых простых сайтов и требует минимальной настройки</li>
70
<ul><li><strong>Виртуальный хостинг (Shared Hosting)</strong>- самый дешевый способ размещать сайт в интернете. Такая услуга включает доступ на сервер с уже настроенным программным обеспечением под конкретный стек, например, Linux + Python + MySQL. Этот способ подходит для самых простых сайтов и требует минимальной настройки</li>
71
<li><strong>VPS/VDS</strong>- наиболее сбалансированная услуга, в рамках которой предоставляется виртуальная машина. Плюс в том, что такой вид хостинга позволяет задействовать больше серверных мощностей: ЦПУ, память и диск. Предустановленного ПО нет, все нужно делать самостоятельно. По сравнению с виртуальным хостингом мы не ограничены в правах и можем настраивать сервер как угодно</li>
71
<li><strong>VPS/VDS</strong>- наиболее сбалансированная услуга, в рамках которой предоставляется виртуальная машина. Плюс в том, что такой вид хостинга позволяет задействовать больше серверных мощностей: ЦПУ, память и диск. Предустановленного ПО нет, все нужно делать самостоятельно. По сравнению с виртуальным хостингом мы не ограничены в правах и можем настраивать сервер как угодно</li>
72
<li><strong>Выделенный сервер (Dedicated Server)</strong>- сервер либо свой, либо арендованный. Такой хостинг требует больше всего участия, но зато мы получаем лучшее соотношение производительность/цена</li>
72
<li><strong>Выделенный сервер (Dedicated Server)</strong>- сервер либо свой, либо арендованный. Такой хостинг требует больше всего участия, но зато мы получаем лучшее соотношение производительность/цена</li>
73
<li><strong>IaaS (Infrastructure as a Service)</strong>- инфраструктура как сервис. Вид хостинга, при котором большая часть возможностей представляется как сервис, например, Amazon Web Service (AWS)</li>
73
<li><strong>IaaS (Infrastructure as a Service)</strong>- инфраструктура как сервис. Вид хостинга, при котором большая часть возможностей представляется как сервис, например, Amazon Web Service (AWS)</li>
74
<li><strong>PaaS (Platform as a Service)</strong>- платформа как сервис. Наиболее дорогой и самый автоматизированный способ из коробки по размещению сайтов. Выкладка сайта происходит по команде git push. Кроме цены важно учитывать используемые технологии и подходы. PaaS обладает наибольшим числом ограничений по тому, что и как можно делать, но в обмен мы получаем не просто автоматизированный хостинг, но и платформу, которая автоматически масштабируется под нагрузку</li>
74
<li><strong>PaaS (Platform as a Service)</strong>- платформа как сервис. Наиболее дорогой и самый автоматизированный способ из коробки по размещению сайтов. Выкладка сайта происходит по команде git push. Кроме цены важно учитывать используемые технологии и подходы. PaaS обладает наибольшим числом ограничений по тому, что и как можно делать, но в обмен мы получаем не просто автоматизированный хостинг, но и платформу, которая автоматически масштабируется под нагрузку</li>
75
</ul><p>Все способы деплоя можно разбить на две большие категории: деплой на PaaS и деплой на все остальное.</p>
75
</ul><p>Все способы деплоя можно разбить на две большие категории: деплой на PaaS и деплой на все остальное.</p>
76
<h4>Деплой на PaaS</h4>
76
<h4>Деплой на PaaS</h4>
77
<p>Самый простой способ начать деплоить. Большинство PaaS-хостеров имеют бесплатные планы, достаточные для публикации учебных проектов. Из плюсов: не придется покупать адрес, домен третьего уровня предоставляется бесплатно.</p>
77
<p>Самый простой способ начать деплоить. Большинство PaaS-хостеров имеют бесплатные планы, достаточные для публикации учебных проектов. Из плюсов: не придется покупать адрес, домен третьего уровня предоставляется бесплатно.</p>
78
<p>Самое популярное PaaS-решение на текущий день -<a>Heroku</a>. Также в качестве бесплатной альтернативы Heroku мы предлагаем<a>Render</a>. Он поддерживает деплой как из Github репозиториев, так и из локальных с помощью cli-утилиты.</p>
78
<p>Самое популярное PaaS-решение на текущий день -<a>Heroku</a>. Также в качестве бесплатной альтернативы Heroku мы предлагаем<a>Render</a>. Он поддерживает деплой как из Github репозиториев, так и из локальных с помощью cli-утилиты.</p>
79
<h4>Деплой на все остальное</h4>
79
<h4>Деплой на все остальное</h4>
80
<p>Если не брать в расчет самый примитивный виртуальный хостинг, который не позволяет настраивать серверное окружение, все остальные виды хостингов имеют схожие задачи для публикации.</p>
80
<p>Если не брать в расчет самый примитивный виртуальный хостинг, который не позволяет настраивать серверное окружение, все остальные виды хостингов имеют схожие задачи для публикации.</p>
81
<p>Самая первая задача - настроить окружение. Если в виртуальном хостинге всегда есть набор предустановленных программ, то в остальных видах хостинга нет ничего, кроме голой операционной системы. Установка необходимого ПО такой же автоматизируемый процесс, как процесс деплоя, и у него есть даже собственное название - Управление конфигурациями (Configuration Management).</p>
81
<p>Самая первая задача - настроить окружение. Если в виртуальном хостинге всегда есть набор предустановленных программ, то в остальных видах хостинга нет ничего, кроме голой операционной системы. Установка необходимого ПО такой же автоматизируемый процесс, как процесс деплоя, и у него есть даже собственное название - Управление конфигурациями (Configuration Management).</p>
82
<p>Рекомендуем использовать Ansible - популярное решение для настройки. На Хекслете есть соответствующий<a>курс</a>.</p>
82
<p>Рекомендуем использовать Ansible - популярное решение для настройки. На Хекслете есть соответствующий<a>курс</a>.</p>
83
<p>Ключевое понятие Ansible - Playbook (плейбук). Это файл или файлы в формате YAML. В них описывается, что нужно сделать на указанной машине. В каждом плейбуке используются готовые модули, которые поставляются вместе с Ansible. Этих модулей сотни, с помощью них можно делать практически всё: от установки программ до настройки сети и управления правами файловой системы.</p>
83
<p>Ключевое понятие Ansible - Playbook (плейбук). Это файл или файлы в формате YAML. В них описывается, что нужно сделать на указанной машине. В каждом плейбуке используются готовые модули, которые поставляются вместе с Ansible. Этих модулей сотни, с помощью них можно делать практически всё: от установки программ до настройки сети и управления правами файловой системы.</p>
84
<p>Например, для установки python нужно воспользоваться следующим playbook:</p>
84
<p>Например, для установки python нужно воспользоваться следующим playbook:</p>
85
<p>Ansible - универсальный инструмент, с его помощью можно не только настраивать окружение, но и деплоить. При этом для деплоя есть готовый модуль -<a>deploy helper</a>.</p>
85
<p>Ansible - универсальный инструмент, с его помощью можно не только настраивать окружение, но и деплоить. При этом для деплоя есть готовый модуль -<a>deploy helper</a>.</p>
86
<p>В более продвинутых случаях, там где используется, например, Docker, развертывание осуществляется системами оркестрации, среди которых выделяется<a>Kubernetes</a>.</p>
86
<p>В более продвинутых случаях, там где используется, например, Docker, развертывание осуществляется системами оркестрации, среди которых выделяется<a>Kubernetes</a>.</p>