На всю уходящую неделю я перевоплотился из разработчика в начинающего девопсера: разбирался с системами мониторинга и настраивал инфраструктуру с нуля на отечественном сервере, расположенном в Питере. Ох, как же было ссыкотно прошлым летом, когда оказалось, что я не могу оплатить иностранный хостинг. Решение этого вопроса потребовало дальней дороги, времени, денег и сил, но стоило того. Тем не менее, считаю, что нужно продолжать курс на создание изолированных окружений в обеих частях Интернета, чтобы быть готовым к любому стечению обстоятельств.
Настройка VPS — это каждый раз очень интересный процесс, повторяющийся раз в несколько лет. Если не считать первые shared хостинги, где вся конфигурация сводилась к закидыванию файлов через FTP или веб-морду (и немного манипуляций с .htaccess), то за всё время я прошёл через 3 итерации (и все до сих пор работают!):
1) полностью нативный софт на хост-системе (или стоит их называть хост-виртуалками?);
2) завёрнутые в контейнеры приложения, проксируемые всё тем же system wide nginx'ом;
3) полностью переносимая конфигурация из набора docker-compose.yml файлов и Makefile'а, создающая контейнеры как под приложения, так и под всю инфраструктуру.
Я всё ещё отстаю от всего прогрессивного мира, использующего Kubernetes, но для пары серваков это всё же был бы перебор. При этом кажется, что ниша нищебродских решений для ИТ-бомжей представлена хуже всего: есть чёткие решения для начинающих и куча готовых решений для больших взрослых дядей с кучей серверов, терабайтами дискового пространства и сотнями гигабайт оперативной памяти, но вот когда хочешь что-то среднее, то постоянно натыкаешься на какие-либо грабли и не находишь на 100% подходящих решений. Либо я плохо искал.
Традиционный ELK стэк оказался очень тяжёлым. Для запуска одного Elastic Search рекомендуется иметь не менее 2 Гб ОЗУ. Широко известный cAdvisor тоже с лёгкостью отжирал треть памяти на гигабайтовой бич-машинке. Пришлось от них отказаться и поставить тупо Prometheus, чтобы собирать хотя бы метрики. Кажется, правильно я сделал, что вместо Спринга решил писать новый проект на Кваркусе и компилировать в нативный код с помощью GraalVM.
При этом оказалось, что собрать логи со всех контейнеров, не связанных оркестратором и приблудами вроде Istio, — тоже процесс весьма нетривиальный. После потраченного на поиски дня я плюнул и написал простой shell-скрипт, выставляющий метрики, напрямую вызывая docker logs: https://gist.github.com/kozalosev/4bfa8f07fb48df66136c53f5391b219f (даже немного удивительно, что создать простейший HTTP-сервер можно с помощью базовых консольных утилит)
Но есть и хорошие моменты: nginx-proxy и его acme-companion — шикарные штуки. Автоматически генерируемые виртуальные хосты с автоматически выпускаемыми сертификатами — это прекрасно! Рекомендую. Watchtower, который проверяет наличие новых образов для всех или указанных контейнеров, ещё не успел распробовать, но должно быть тоже офигенно. Последний кирпичик по автоматизации деплоя, чтобы просто создать релиз в Гитхабе и случилась магия!