Плагин для Docker для быстрого деплоя

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Часть своих сервисов я держал в облаке, но когда счёт за AWS начал превышать ожидания, стало понятно: пора переносить их домой. Несколько месяцев назад я купил мини-ПК, но всё никак не находил времени его задействовать. Так я занялся решением проблемы локального деплоя.


Все приложения у меня уже контейнеризированы и запускаются через Docker Compose. В большинстве случаев для переноса достаточно было скопировать на удалённую машину файлы compose.yaml и .env по SSH. Но для некоторых сервисов потребовались дополнительные изменения в конфигурации.

В AWS у меня был настроен полноценный процесс поставки. Инфраструктура описывалась через Terraform, а деплой запускался SSM-командой после каждого коммита в master.

Локально я хотел сделать попроще и возникла другая проблема - синхронизация изменений. Один раз подключиться по SSH, скопировать файлы и запустить compose несложно. Но когда приходится регулярно вносить правки и повторять одни и те же команды, процесс быстро начинает утомлять. Хотелось редактировать compose локально и отправлять изменения на сервер без полноценного CI/CD.

Очевидные варианты мне не подошли.

Watchtower выглядел хорошим решением в связке с контейнерным реестром. Он отслеживает запущенные контейнеры и автоматически обновляет их при появлении новых образов. Однако поднимать собственный реестр я не планировал. Это означало бы публикацию новой версии образа после каждого изменения, а это дополнительные накладные расходы. Для нескольких домашних сервисов такой подход выглядел избыточным.

Remote Docker Context позволяет запускать локальный compose на удалённом docker-демоне. Но после перезагрузки могут возникать проблемы с контекстами, которые не всегда очевидны. Файлы проекта должны находиться на удалённой машине.

Ansible и Terraform тоже не выглядели удачным выбором. Это отличные инструменты для управления инфраструктурой в масштабе, но в моём случае речь шла об одном мини-ПК и нескольких compose-проектах. Использовать их для такой задачи казалось чрезмерным.

Мне хотелось найти решение, которое позволит хранить сompose-проект на сервере и быстро синхронизировать его с локальной машиной при каждом деплое. Без оверинжиниринга, без лишних зависимостей и без дополнительной инфраструктуры. Небольшой инструмент с одной задачей, который выполняет её хорошо.

В итоге я написал его сам.

docker-deploy — это CLI-плагин для Docker. Он расширяет стандартный набор команд и запускается как docker deploy.

Под капотом плагин копирует compose-проект на удалённую машину по SFTP и запускает docker compose. Для работы используется всего одно SSH-соединение. Никакого контейнерного реестра. Никакого git на сервере. Никаких агентов. Требуются только доступ по SSH и установленный Docker.

docker deploy --host minipc

Достаточно указать IP-адрес или имя хоста из ~/.ssh/config. Инструмент использует существующие SSH-ключи и настройки. Если беспарольный доступ уже настроен, всё работает сразу. Можно использовать и преднастроенный конфиг деплоя.

Для меня были важны несколько деталей. Деплой автоматически повторяется при временных сбоях сети, инструмент предупреждает о запуске от имени root, показывает состояние контейнеров сразу после завершения и корректно обрабатывает compose override-файлы. Есть установочный скрипт, homebrew tap для macOS и возможность установки через go install.

Я начал использовать этот инструмент для быстрого деплоя и мне понравилось.

Главный вывод оказался вовсе не про Docker.

Иногда быстрее написать небольшой специализированный инструмент, чем адаптировать решение, которое «почти подходит». На исследование существующих вариантов деплоя я потратил больше времени, чем на разработку первой версии docker-deploy.

Была и вторая цель: написать что-то реальное на Go с использованием GSD. Не учебный проект, а инструмент, которым я буду пользоваться сам и который имеет смысл поддерживать.

Сейчас все мои сервисы работают дома. Деплой выполняется одной командой. Именно то, что мне было нужно.

Если вам тоже приходилось переносить сервисы из облака на домашний сервер или VPS, интересно узнать, какой подход оказался удобным для вас.

Проект с открытым исходным кодом:

https://github.com/webcane/docker-deploy

Буду рад любой обратной связи.

А если вы решили эту задачу иначе — расскажите, как именно.

Источник: https://habr.com/ru/articles/1044214/


Интересные статьи

Интересные статьи

В последнее время я часто работал с разными ML-проектами в GitLab. В каждом был свой .gitlab-ci.yml, своя обвязка вокруг MLFlow, своя регистрация и валидация модели. Со временем я понял, что MLOps-пай...
Управление большим числом изменяемых шаблонов бизнес-процессов — непростая задача. А необходимость поддержки актуальных версий шаблонов на нескольких копиях проекта добавляет еще больше сложностей. Де...
Изображение с сайта Mathematical Art Galleries В этой серии из двух статей я приглашаю вас заглянуть в один любопытный и не самый популярный уголок математики, в котором обитают необычные создания ...
Устраивать конкурсы в инстаграме сейчас модно. И удобно. Инстаграм предоставляет достаточно обширный API, который позволяет делать практически всё, что может сделать обычный пользователь ручками.
Как широко известно, с 1 января 2017 года наступает три важных события в жизни интернет-магазинов.