Dokku — это компактная PaaS-платформа для одного сервера. Она повторяет привычный сценарий Heroku: вы добавляете git-remote, делаете push, а Dokku собирает образ, запускает контейнеры, настраивает прокси и выдаёт сертификат. Для небольших проектов, внутренних сервисов и домашней лаборатории это заметно проще, чем поднимать Kubernetes.

Ниже — практический маршрут: установка на Ubuntu, первый деплой, домен и HTTPS, база данных, постоянное хранилище, обновление и диагностика.

Что даёт Dokku и чего он не делает

Dokku работает поверх Docker и управляет жизненным циклом приложения: сборка, запуск, масштабирование процессов, переменные окружения, домены, TLS, плагины для баз данных. Всё управляется командами dokku по SSH.

  • Один хост — одна точка отказа. Для отказоустойчивости нужен кластер, а не Dokku.
  • Плагины баз данных запускают контейнер на том же сервере, а не управляемый сервис.
  • Обновления и бэкапы лежат на администраторе: панель не сделает это сама.

Для сайта, API и пары фоновых обработчиков возможностей достаточно. Для десятков команд и строгих требований к изоляции смотрите в сторону Kubernetes или Nomad.

Установка на Ubuntu

Актуальная ветка Dokku — 0.38.x; проект поддерживает Ubuntu 24.04 и 26.04. Минимально нужен сервер с 2 ГБ RAM и 20 ГБ диска, публичным IP и настроенным DNS.

wget -NP . https://dokku.com/install/v0.38.34/bootstrap.sh
sudo DOKKU_TAG=v0.38.34 bash bootstrap.sh
sudo dokku version
dokku domains:set-global example.com

Скрипт установит Docker, создаст пользователя dokku и настроит SSH-доступ. Сразу проверьте, что порты 80 и 443 открыты, а A-запись домена и wildcard *.example.com указывают на сервер. Если используете файрвол, разрешите также SSH.

sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
dig +short example.com
ssh dokku@example.com version

Доступ и базовая безопасность

Панель Dokku не имеет веб-интерфейса: управление идёт по SSH под пользователем dokku. Сгенерируйте отдельный ключ для администрирования и не переиспользуйте личный ключ разработчика. Пользователь dokku входит в группу docker, а это фактически эквивалентно root, поэтому доступ к нему нужно ограничить. Для команды заведите по ключу на человека, чтобы отзывать доступ точечно.

ssh-keygen -t ed25519 -C "dokku-admin"
cat ~/.ssh/id_ed25519.pub | sudo dokku ssh-keys:add admin
ssh dokku@example.com apps:list
sudo apt install fail2ban

Настройте fail2ban для SSH, включите автоматические обновления безопасности и не устанавливайте плагины без необходимости: каждый плагин расширяет поверхность атаки. Отдельно проверьте, что порт Docker API не опубликован наружу — Dokku использует локальный сокет. Команды администратора выполняются через sudo dokku.

Резервный вход через консоль провайдера держите под рукой. Если ключ утерян, а других административных ключей нет, доступ восстанавливается через консоль добавлением нового в ~dokku/.ssh/authorized_keys.

Первый деплой

Создайте приложение и добавьте remote. Dokku определяет тип проекта автоматически, но для предсказуемости лучше явно указать способ сборки.

dokku apps:create myapp
dokku builder:set myapp selected dockerfile
git remote add dokku dokku@example.com:myapp
git push dokku main

В корне проекта нужен Dockerfile; приложение должно слушать порт из переменной PORT, а для нескольких процессов понадобится Procfile:

web: node server.js
worker: node worker.js

После push проверьте состояние процессов и логи. Если контейнер падает, Dokku покажет это в отчёте, но причину придётся искать в логах.

dokku ps:report myapp
dokku logs myapp -t
curl -I http://example.com

Домен и HTTPS

По умолчанию приложение доступно по имени вида myapp.example.com. Свой домен добавляется отдельно; DNS должен уже указывать на сервер, иначе выпуск сертификата не пройдёт.

dokku domains:add myapp example.com
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git
dokku letsencrypt:set myapp email admin@example.com
dokku letsencrypt:enable myapp
dokku letsencrypt:cron-job --add

Плагин выпускает сертификат, но задание автопродления нужно добавить отдельно: без него сертификат проживёт 90 дней. Для нескольких доменов повторите domains:add и перевыпустите сертификат.

Базы данных и постоянные файлы

Контейнеры приложения эфемерны: всё, что записано в контейнер, исчезнет при пересборке. Базу удобно поднять плагином, а пользовательские файлы вынести на постоянный том.

dokku postgres:create appdb
dokku postgres:link appdb myapp
dokku storage:create myapp-data
dokku storage:mount myapp myapp-data --container-dir /app/storage

Команда link добавляет переменную DATABASE_URL и перезапускает приложение. Не храните пароли в репозитории: используйте config:set. Дамп базы делайте по расписанию и складывайте за пределы сервера.

dokku postgres:export appdb > /var/backups/appdb.dump
dokku postgres:import appdb < /var/backups/appdb.dump
dokku config:show myapp
dokku storage:list myapp

Масштабирование и логи

Процессы описываются в Procfile и масштабируются независимо. Такой подход удобен, когда веб-часть и обработчик очереди должны работать с разной нагрузкой.

dokku ps:scale myapp web=2 worker=1
dokku ps:restart myapp
dokku enter myapp web
dokku logs myapp -n 200

Команда enter открывает shell внутри контейнера — это быстрый способ проверить переменные окружения и доступность базы. Помните, что изменения внутри контейнера не сохраняются.

Обновление и резервное копирование

Перед обновлением прочитайте release notes: мажорные версии иногда меняют поведение плагинов. Обновляйте сначала тестовый сервер, затем рабочий.

sudo dokku plugin:install https://github.com/dokku/dokku-update.git
sudo dokku-update run
dokku config:export --format envfile myapp > /var/backups/myapp.env
dokku postgres:export appdb > /var/backups/appdb.dump

Единой команды резервного копирования в Dokku нет: состояние лежит в каталогах /home/dokku и /var/lib/dokku. Снимите дампы баз, сохраните переменные окружения и архив каталогов, затем проверьте восстановление на тестовом сервере.

sudo tar -czf /var/backups/dokku-state.tgz /home/dokku /var/lib/dokku/config /var/lib/dokku/data /var/lib/dokku/services
dokku postgres:import appdb < /var/backups/appdb.dump
sudo tar -xzf /var/backups/dokku-state.tgz -C /
dokku ps:rebuild --all

Остановите сервисы перед копированием /var/lib/dokku/services или используйте штатный экспорт базы: файлы работающей СУБД могут быть скопированы в несогласованном состоянии. Тестовое восстановление раз в квартал надёжнее любого регламента.

Диагностика: короткий чек-лист

  • Приложение не отвечает: проверьте ps:report, логи и healthcheck.
  • Ошибка TLS: DNS, порт 80, лимиты Let’s Encrypt.
  • Кончилось место: docker system df и старые образы.
  • Сборка падает: нехватка памяти или неверный Dockerfile.
dokku ps:report myapp
dokku nginx:show-config myapp
docker system df
sudo journalctl -u docker --since "1 hour ago"

Держите включённым мониторинг диска и памяти: Dokku не резервирует ресурсы автоматически. Для регулярной очистки используйте dokku repo:gc myapp и docker image prune после проверки.

Итог

Dokku даёт понятный PaaS-сценарий на одном сервере: git push, автоматическая сборка, домены, TLS и плагины. Начните с фиксированной версии, явного builder и DNS; затем добавьте базу, постоянный том и внешние бэкапы. Отдельно продумайте обновления и мониторинг — именно они превращают демонстрацию в рабочую площадку.

Насколько публикация полезна?

Нажмите на звезду, чтобы оценить!

Средняя оценка 0 / 5. Количество оценок: 0

Оценок пока нет. Поставьте оценку первым.

Поделиться: Telegram ВКонтакте