solovyov.net

Dokku

· · linux

Недавно перевëз свой сервер на Digital Ocean, и заодно переехал с системы настройки “сча поправлю конфиг и забуду навсегда” на Dokku.

Докку - это система деплоя, такой себе “Heroku для дома”. У докку есть список так называемых “билдпаков”, которые описывают, как собирать тот или иной тип приложений. Эти билдпаки есть для питона, руби, джавы, и т.п. Пушишь гит-репозиторий с кодом в определëнное место (dokku@yourhost:project.git), докку проходит по списку билдпаков и у каждого из них спрашивает - тебе подходит? Кто первый согласился, тот и собирает.

Вся сборка происходит в LXC-контейнере с помощью Docker’а, и работает потом приложение внутри Docker’a, что довольно приятно - система не засоряется разными версиями библиотек и утилит, зависимости каждого приложения захламляют лишь его образ.

Конечно, иногда это выходит оверкиллом - я сейчас именно так деплою этот блог, и вместо того, чтоб лежать спокойно статическими файлами на диске, которые сервятся с помощью nginx’a, они лежат в контейнере, в котором запущен еще один nginx, на который главный всë проксирует. :) С другой стороны, я только что посмотрел - он съел 2 мб RSS и 3 мб кэша, вполне себе недорого. :)

Дебаг

Единственная штука - дебагать приложения немного тяжело. Поначалу особенно совершенно непонятно, что происходит - один раз минут 40 потратил на то, что приложение запускается нормально, в dokku logs app пишет Listening port 5000 и никаких ошибок нигде, а присоединиться к порту, на который его проксирует докер, я не могу.

Сильно помог nsenter, узнаëшь id контейнера из docker ps, а потом:

nsenter --target $(docker inspect --format {{.State.Pid}} bddaf1804e59) --mount --uts --ipc --net --pid bash

и ты внутри контейнера с работающим приложением. Пока я не нашëл это заклинание - страдал. А после того быстренько уловил, что просто приложение слушает только 127.0.0.1, а надо 0.0.0.0. :)

Закругляясь

В целом - удобно. Скажем, я тут внезапно провëл эксперимент и уничтожил свой сервер. Ребилд и восстановление основных приложений заняли около получаса, и вообще не пришлось ходить редактировать конфиги - только навесить нужные домены на виртуалхосты (что делается через один из плагинов к докку).

С другой стороны, для серьëзного приложения я бы докку не использовал. Меня очень беспокоит то, что сборка и запуск происходят в один момент в одном и том же месте. Куда разумнее было бы собирать контейнер в одном месте, запускать на него тесты, складывать уже готовый образ, а запуск иметь отдельным шагом и без всяких инструментов для сборки.

Я еще попытался посмотреть на альтернативы, и нашëл:

  • dokku-alt, который больше умеет, но что-то стало немного страшно возиться с еще более сложным проектом, который тоже написан на bash’e.

  • octohost, у которого немного отличается концепция - нет никаких билдпаков, всë строится из Dockerfile’а руками. Получается, вроде и гибче, и нет зависимости на то, что кто-то там в билдпаке сделал, но и думать больше надо, и какое-то оно незаконченное немного, что ли. Ну и оно использует Chef для того, чтоб себя установить и настроить, а я к нему серьëзную неприязнь испытываю.

  • flynn, оно типа в превью, и это посерьëзнее уже сервис, но они, похоже, будут хотеть брать деньги за сервера (судя по этой страничке), потому что всë как-то работает через их веб-интерфейс. Не уверен, что всë правильно понял, но беспокоит. :)

  • deis, который посерьëзнее, но и ресурсов требует побольше. Они там строят систему, которая строит образы и потом запускает их на сервере со свободными ресурсами, сама выбирает, где и как, и легко масштабируется. За это надо платить (по крайней мере так написано в доке) минимум 2 гб оперативки на каждом хосте плюс минимум 3 серверами чтоб это всë как-то вменяемо работало. Мне стало лень возиться с этим всем, но потенциально для больших деплойментов это всë интересно.

Так что остался пока на dokku. :)