solovyov.net

Dokku

3 min read · 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. :)

If you like what you read — subscribe to my Twitter, I always post links to new posts there. Or, in case you're an old school person longing for an ancient technology, put a link to my RSS feed in your feed reader (it's actually Atom feed, but who cares).

Other recent posts

History snapshotting in TwinSpark.js
Code streaming: hundred ounces of nuances
Useful shell prompt
API pagination design
ElasticSearch query builder