0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Теперь, когда у нас есть готовый образ приложения, выполним его деплой. Деплой через Docker содержит такие шаги:</p>
1
<p>Теперь, когда у нас есть готовый образ приложения, выполним его деплой. Деплой через Docker содержит такие шаги:</p>
2
<ol><li>Скачивание нужного образа на сервера</li>
2
<ol><li>Скачивание нужного образа на сервера</li>
3
<li>Остановка старого контейнера</li>
3
<li>Остановка старого контейнера</li>
4
<li>Запуск нового контейнера из скаченного образа</li>
4
<li>Запуск нового контейнера из скаченного образа</li>
5
</ol><p>В продвинутых сценариях деплой образов выполняется с помощью Kubernetes. А здесь мы выполняем деплой напрямую, с помощью Ansible. Почему именно он? Ansible наиболее простой и удобный инструмент, из существующих, который позволяет буквально небольшим<em>yaml</em>файлом описать процесс деплоя и использовать его для любого количества серверов. Ansible берет на себя обработку ошибок, параллельное выполнение и многое другое.</p>
5
</ol><p>В продвинутых сценариях деплой образов выполняется с помощью Kubernetes. А здесь мы выполняем деплой напрямую, с помощью Ansible. Почему именно он? Ansible наиболее простой и удобный инструмент, из существующих, который позволяет буквально небольшим<em>yaml</em>файлом описать процесс деплоя и использовать его для любого количества серверов. Ansible берет на себя обработку ошибок, параллельное выполнение и многое другое.</p>
6
<h2>Подготовка сервера</h2>
6
<h2>Подготовка сервера</h2>
7
<p>Подготовка сервера для деплоя Docker приложения, очень простая задача. В таком случае, вся настройка сведется добавлению ssh-ключей для доступа без пароля и установке Docker.</p>
7
<p>Подготовка сервера для деплоя Docker приложения, очень простая задача. В таком случае, вся настройка сведется добавлению ssh-ключей для доступа без пароля и установке Docker.</p>
8
<p>Создайте самый дешевый сервер (Droplet в терминах DigitalOcean, Compute Cloud у Yandex Cloud) для деплоя. Его стоимость 5$ в месяц. Здесь есть хитрость, по умолчанию DO предлагает сервера с чистыми операционными системами, но если переключиться на вкладку<em>Markeplace</em>, то там есть Ubuntu с предустановленным Docker. То что нам нужно.</p>
8
<p>Создайте самый дешевый сервер (Droplet в терминах DigitalOcean, Compute Cloud у Yandex Cloud) для деплоя. Его стоимость 5$ в месяц. Здесь есть хитрость, по умолчанию DO предлагает сервера с чистыми операционными системами, но если переключиться на вкладку<em>Markeplace</em>, то там есть Ubuntu с предустановленным Docker. То что нам нужно.</p>
9
<p>Во время создания, вам предложат выбор как подключаться к серверу: по паролю или через ssh-ключ. Выберите ssh-ключ и добавьте его. Если у вас нет ssh-ключа, то создайте его по<a>этой инструкции</a>.</p>
9
<p>Во время создания, вам предложат выбор как подключаться к серверу: по паролю или через ssh-ключ. Выберите ssh-ключ и добавьте его. Если у вас нет ssh-ключа, то создайте его по<a>этой инструкции</a>.</p>
10
<p>Когда сервер будет готов, DO покажет вам его ip-адрес. Возьмите этот адрес и попробуйте подключиться к серверу по ssh. Если у вас получилось, то можно готовиться к деплою.</p>
10
<p>Когда сервер будет готов, DO покажет вам его ip-адрес. Возьмите этот адрес и попробуйте подключиться к серверу по ssh. Если у вас получилось, то можно готовиться к деплою.</p>
11
<h2>Подготовка к деплою</h2>
11
<h2>Подготовка к деплою</h2>
12
<p>Для деплоя нам понадобится настроенный Ansible.<a>Установите его</a>локально на свой компьютер. Все файлы Ansible мы будем хранить в директории<em>ansible</em>.</p>
12
<p>Для деплоя нам понадобится настроенный Ansible.<a>Установите его</a>локально на свой компьютер. Все файлы Ansible мы будем хранить в директории<em>ansible</em>.</p>
13
<p>Создадим плейбук, который выполняет всю работу по деплою приложения. Первым делом нам нужно установить python-пакет<em>docker</em>, который используется Ansible для управления Docker. В свою очередь python-пакеты устанавливаются через<em>pip3</em>, который тоже нужно установить. В ручную мы бы сделали это так:</p>
13
<p>Создадим плейбук, который выполняет всю работу по деплою приложения. Первым делом нам нужно установить python-пакет<em>docker</em>, который используется Ansible для управления Docker. В свою очередь python-пакеты устанавливаются через<em>pip3</em>, который тоже нужно установить. В ручную мы бы сделали это так:</p>
14
<p>Теперь тоже самое, но через Ansible:</p>
14
<p>Теперь тоже самое, но через Ansible:</p>
15
<p>Осталось добавить старт приложения и можно пробовать запускать. Для работы с Docker у Ansible есть специальный модуль<a>community.docker.docker_container</a>. У него много настроек, но нам сейчас нужны лишь некоторые:</p>
15
<p>Осталось добавить старт приложения и можно пробовать запускать. Для работы с Docker у Ansible есть специальный модуль<a>community.docker.docker_container</a>. У него много настроек, но нам сейчас нужны лишь некоторые:</p>
16
<p>Процесс деплоя состоит буквально из одной задачи, которая скачивает новый образ и перезапускает приложение.</p>
16
<p>Процесс деплоя состоит буквально из одной задачи, которая скачивает новый образ и перезапускает приложение.</p>
17
<p>Осталось создать inventory-файл. Здесь все просто. Добавляем группу<em>webservers</em>с одним сервером<em>web1</em>:</p>
17
<p>Осталось создать inventory-файл. Здесь все просто. Добавляем группу<em>webservers</em>с одним сервером<em>web1</em>:</p>
18
<p>По необходимости сюда легко добавляются новые сервера. Схема с деплоем на множество серверов рассматривается в одном из следующих уроков.</p>
18
<p>По необходимости сюда легко добавляются новые сервера. Схема с деплоем на множество серверов рассматривается в одном из следующих уроков.</p>
19
<h2>Деплой</h2>
19
<h2>Деплой</h2>
20
<p>Когда все готово, остается запустить одну команду, которая выполнит деплой:</p>
20
<p>Когда все готово, остается запустить одну команду, которая выполнит деплой:</p>
21
<p>Во время деплоя передается версия, которую мы хотим выкатить. В нашем случае она совпадает с именем тега у Docker-образа и git-репозитория.</p>
21
<p>Во время деплоя передается версия, которую мы хотим выкатить. В нашем случае она совпадает с именем тега у Docker-образа и git-репозитория.</p>
22
<p>У такого способа деплоя, когда рестартует контейнер, есть одна особенность о которой нужно знать. Остановка старого контейнера и запуск нового - не моментальная операция. Какое-то время не будет запущен ни один контейнер, а значит пользователь увидит ошибку. Чтобы избежать этого, нужно перед приложением добавить реверспрокси (Nginx, Caddy, ...), в котором будет настроена обработка подобных ошибок и возврат красивой страницы с объяснением того, что происходит. Об этом в следующем уроке.</p>
22
<p>У такого способа деплоя, когда рестартует контейнер, есть одна особенность о которой нужно знать. Остановка старого контейнера и запуск нового - не моментальная операция. Какое-то время не будет запущен ни один контейнер, а значит пользователь увидит ошибку. Чтобы избежать этого, нужно перед приложением добавить реверспрокси (Nginx, Caddy, ...), в котором будет настроена обработка подобных ошибок и возврат красивой страницы с объяснением того, что происходит. Об этом в следующем уроке.</p>
23
<h2>Откат</h2>
23
<h2>Откат</h2>
24
<p>Во время деплоя могут возникнуть проблемы и тогда потребуется откат. Как его выполнять? Секрет в том, что откатов не существует. Мы всегда движемся вперед, даже если переключаемся на старую версию кода. Все что нужно - выполнить плейбук с нужной версией кода:</p>
24
<p>Во время деплоя могут возникнуть проблемы и тогда потребуется откат. Как его выполнять? Секрет в том, что откатов не существует. Мы всегда движемся вперед, даже если переключаемся на старую версию кода. Все что нужно - выполнить плейбук с нужной версией кода:</p>
25
<p>Ситуация чуть сложнее когда у нас есть база данных, но об этом дальше по курсу.</p>
25
<p>Ситуация чуть сложнее когда у нас есть база данных, но об этом дальше по курсу.</p>
26
<h2>Разделение плейбуков</h2>
26
<h2>Разделение плейбуков</h2>
27
<p>Плейбук, который мы создали выше, состоит из двух независимых частей - настройки сервера и самого деплоя. В простейшем случае мы можем оставить все как есть, но настройка может усложниться и замедлить скорость деплоя. Поэтому, лучше, вынести настройку в отдельный плейбук и запускать ее независимо. Такая схема безопаснее, если вы захотите обновить сервер, то случайно не перезапустите приложение и наоборот, если захотите деплоить, то случайно не обновите сервер.</p>
27
<p>Плейбук, который мы создали выше, состоит из двух независимых частей - настройки сервера и самого деплоя. В простейшем случае мы можем оставить все как есть, но настройка может усложниться и замедлить скорость деплоя. Поэтому, лучше, вынести настройку в отдельный плейбук и запускать ее независимо. Такая схема безопаснее, если вы захотите обновить сервер, то случайно не перезапустите приложение и наоборот, если захотите деплоить, то случайно не обновите сервер.</p>
28
28