Плагин для 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/