Домашний сервер на Docker - 2

В прошлом посте был описан процесс подготовки VPS и установки Docker. Продолжим работу над нашим проектом.

На данный момент я уже в течение нескольких месяцев использую VPS с Docker-контейнерами под сервисы. Для себя я выявил несколько пунктов, которые смогут обеспечить мне комфортную работу:

  1. Конфигурация должна быть переносимой, т.е. все настройки должны находится в файлах, что позволяло бы хранить конфигурацию в git. Этот пункт специально отметил нулевым, т.к. для меня это фундаментальный пункт.
  2. Удобное использование сертификатов. Мы уже рассматривали вопрос выпуска сертификатов, осталось только подсунуть их прокси-серверу и научить его создавать самостоятельно сертификаты под отдельные домены.
  3. Синхронизация репозитория в git с текущим состоянием на сервере, наподобие GitOps.
  4. В связи с пунктом, указанным выше, нужна возможность хранить секреты вне репозитория.
  5. Защита для сервисов, которые не имеют своей системы аутентификации.
  6. Создать отдельную сеть для сервисов БД. Не вижу смысла в тестовом окружении иметь под каждый сервис свою БД.
  7. Мониторинг сервера и контейнеров. Интересует возможность отслеживания состояния контейнеров и нагрузки на железо.
  8. И последний пункт по порядку, но не последний по важности - создание резервных копий тех мест, которые униальны для конкретного сервера, следовательно, не хранятся в репозитории. Например, динамические тома хранения данных (volume).

Этот список будет определять план действий для настройки сервера.

GitOps

Как уже отмечалось выше, на мой взгляд было бы великолепно иметь возможность не заходя на сервер разворачивать новые сервисы, просматривать историю изменений на сервере. В этом поможет git-репозиторий. Остается его каким-то образом соединить с сервером.

Находясь в поисках решения было перелопачено множество решений, но все они были завязаны на Docker Swarm либо Kubernetes. Поэтому было решено разработать свой велосипед. Для разработки был выбран Python, так как мне кажется для постоянно работающего и не сильно съедающего ресурсы решения он отлично подходит. Как раз хотел подучить этот язык программирования.

На приложение я возложил следующие функции:

  • синхронизация с Git-репозиторием;
  • подкладывание переменных окружения из другого места;
  • возможность управлять контейнерами, как минимум, старт/стоп/рестарт.

Получившийся результат я выложил на GitHub (сильно не ругайте, первая программа на Python). Для настройки программы в файле надо прописать значения следующих переменных:

  • git_repository - адрес Git-репозитория для синхронизации;
  • git_branch - синхронизируемая ветка;
  • home_folder - корневая директория для размещения сервисов;
  • env_folder - директория с переменными окружения для сервисов;
  • http_enabled - включение веб-сервера для управления извне;
  • http_port - порт веб-сервера;
  • http_token - токен для проверки авторизированного обращения к веб-серверу.

Скрипт может работать в 2-ух режимах: разовый запуск и веб-сервер. В первом случае скрипт проведет синхронизацию и закончит работу. Во втором случае будет запущен веб-сервер, который будет отслеживать обращения и выполнять указанные действия. В общем случае нужное действие указывается как путь, токен и название сервиса для взаимодействия, если требуется, указываются как параметры. Например: https://s1.mydomain.com/action?service=service1&token=example, где action может быть:

  • update - команда на синхронизацию, можно использовать в веб-хуках;
  • start - запустить/перезапустить сервис;
  • stop - остановить сервис;
  • restart - перезагрузить контейнеры, связанные с сервисом.

Файлы с переменными окружения при надобности требуется положить в указанную выше в настройках директорию с именем сервиса и расширением .env, например, service1.env. Также в корне репозитория можно создать файл настроек settings.yml. На текущий момент существует только возможность указания списка приоритетных в запуске сервисов в параметре start.

Как запускать скрипт это уже личное решение. Так как с python’ом дела не имел, то предложить варианты будет сложно, не зная с чем можно столкнуться. Надеюсь, это не будет проблемой, и скрипт поможет облегчить работу.

Docker-compose

Для удобного управления сервисами очень советую использовать docker-compose, который умеет разворачивать сразу несколько контейнеров для одного сервиса. То есть, мы получаем физически (в отдельном файле) и логически (выделенная локальная сеть) разделенные сервисы. В скрипте, который указан в предыдущем разделе, как раз используется для работы docker-compose.

Так как команда представляет из себя python-скрипт, то установить его очень просто. Достаточно только скопировать сам скрипт из репозитория и разместить в удобном месте.

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

На этом этапе можно уже попробовать поэкспериментировать с работой синхронизации репозитория и контейнеров.

Теги