Гид по технологиям

Самохостинг приложений с Dokku: полное руководство

• 8 min read • DevOps • Обновлено 11 Dec 2025
Dokku — самохостинг PaaS на Docker
Dokku — самохостинг PaaS на Docker

Логотип Dokku

Быстрые ссылки

  • Getting Started
  • Configuring Dokku
  • Deploying Applications
  • Attaching App Domains
  • Adding SSL
  • Updating Your App
  • Managing Branches
  • Adding Extra Functionality
  • Conclusion

Dokku — это минималистичная реализация Platform-as-a-Service, которую вы можете запустить на собственном сервере или виртуальной машине. Докку использует Docker для автоматического создания и запуска контейнеров при выполнении git push из вашей рабочей станции. Это даёт знакомый Git-ориентированный рабочий процесс, низкие затраты по сравнению с коммерческими PaaS и упрощённое управление инфраструктурой.

Важно: Dokku подходит для небольших и средних проектов, прототипов и команд, которые хотят полный контроль над хостингом без тяжелой Kubernetes-ориентации.

Когда выбирать Dokku

  • Нужна быстрая и дешевая PaaS-платформа для веб-приложений.
  • Хотите простой Git-процесс развертывания.
  • Нужно управлять сервисами (БД, кэш) через плагины.
  • Не требуется крупномасштабная оркестрация контейнеров.

Кратко: Dokku хорош для self-hosting, когда важна простота, скорость и контроль.


1. Подготовка и требования

Минимальные требования и советы перед установкой:

  • Операционная система: современный дистрибутив Linux (Ubuntu LTS рекомендуется).
  • Доступ root или sudo.
  • Открытые порты 22 (SSH), 80 (HTTP) и 443 (HTTPS) — или проброс портов на другом хосте.
  • Резервная стратегия для /var/lib/dokku и Docker-томов.
  • DNS для доменов (A-запись или CNAME) при привязке доменов.

Совет по безопасности: настройте брандмауэр (ufw/iptables), ограничьте доступ по SSH ключам и отключите аутентификацию по паролю.

2. Getting Started — установка Dokku

Для установки на «чистой» Ubuntu удобно использовать официальный bootstrap-скрипт. Скрипт загрузит и установит Dokku и зависимости (включая Docker).

wget https://raw.githubusercontent.com/dokku/dokku/v0.24.7/bootstrap.sh

sudo DOKKU_TAG=v0.24.7 bash bootstrap.sh

Процесс может занять несколько минут в зависимости от скорости сети и производительности машины.

Запуск Dokku в контейнере Docker — вариант, если вы уже управляете Docker-хостом:

docker run \
  --env DOKKU_HOSTNAME=example.com \
  --name dokku \
  -p 3022:22 \
  -p 8080:80 \
  -p 8443:443 \
  -v /var/lib/dokku:/mnt/dokku \
  -v /var/run/docker.sock:/var/run/docker.sock \
  dokku/dokku:0.24.7

Замените example.com на хост, по которому планируете обращаться к серверу. В этом примере порты 80 и 443 проброшены на 8080 и 8443 хоста — удобно для тестовых окружений, где 80/443 уже заняты.

Важно: при запуске в контейнере Dokku не поддерживает веб-инсталлятор — конфигурацию нужно сделать через CLI и переменные окружения.

3. Конфигурация после установки

После завершения установки откройте в браузере IP-адрес сервера или указанный hostname. Веб-инсталлятор проведёт базовую настройку.

  • Вставьте ваш публичный SSH-ключ в поле «Публичный ключ». Dokku будет принимать подключения по этому ключу.
  • Укажите hostname для Dokku (домен или IP). Это нужно для генерации поддоменов приложений и корректной работы плагинов.

Скриншот веб-инсталлятора Dokku

Если вы установили Dokku в Docker-контейнер, веб-инсталлятор недоступен. Добавьте hostname при создании контейнера через переменную окружения DOKKU_HOSTNAME. Добавление SSH-ключей в контейнер:

docker exec -it dokku dokku ssh-keys:add my-key 

После добавления ключей и установки hostname дальнейшее управление — через Git и Dokku CLI.

Совет по DNS: если вы хотите, чтобы Dokku автоматически назначал поддомены, создайте A-запись для вашего hostname и (опционально) wildcard A-запись для поддоменов: *.example.com -> IP.

4. Развёртывание приложений

Основной поток — добавить удалённый репозиторий Dokku и git push:

Пример для React-приложения:

mkdir my-app
cd my-app
npx create-react-app .

git init
git add .
git commit -m "initial"

git remote add dokku dokku@example.com:my-app

git push dokku master

Что происходит при push:

  • Dokku принимает git-пакет.
  • Пытается определить buildpack (Herokuish или Cloud Native Buildpacks).
  • Если в проекте есть Dockerfile, можно использовать docker build вместо buildpacks.
  • Докку собирает образ и запускает контейнер, настраивая прокси (nginx) для маршрутизации трафика.

Важно: если вы используете приватные зависимости, настройте соответствующие переменные окружения или предоставьте доступ к registry.

Dockerfile vs buildpacks

  • Buildpacks удобны для большинства веб-фреймворков: Node, Python, Ruby, Java и т.д.
  • Dockerfile даёт полный контроль над сборкой и окружением — используйте, когда нужны нестандартные шаги.

Если вы хотите принудительно использовать Dockerfile, убедитесь, что buildpack-детекторы не мешают (в некоторых случаях Dokku может предпочесть buildpack).

5. Привязка домена

Добавление домена к приложению производится через CLI:

dokku domains:add my-app example.com

DNS: добавьте A-запись (или CNAME) для example.com, указывающую на ваш Dokku-хост. Для поддоменов используйте CNAME или wildcard A.

Совет: при использовании wildcard-поддоменов не забудьте о правильной настройке сертификатов.

6. SSL и Let’s Encrypt

Dokku поддерживает плагин для интеграции с Let’s Encrypt. Установка и включение:

dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git

dokku config:set --global no-restart DOKKU_LETSENCRYPT_EMAIL=me@example.com

dokku letsencrypt:cron-job --add

dokku letsencrypt my-app

Важно: Let’s Encrypt требует доступности портов 80 и 443 для прохождения проверки. Если вы используете NAT или проброс портов, убедитесь, что внешние запросы достигают контейнера.

Проверка и ручное продление:

dokku letsencrypt:renew my-app

Если автоматическое обновление не срабатывает, проверьте задачи cron и логи Dokku.

7. Обновление приложения и безотказные деплойменты

При каждом git push Dokku создает новый образ и запускает новый контейнер. Практически без простоев:

  • Новый контейнер создаётся и проходит начальную проверку.
  • Dokku ждёт ~10 секунд после завершения сборки перед переключением трафика, чтобы дать время bootstrap-скриптам.

Рекомендации:

  • Используйте healthchecks внутри приложения, если нужно дополнительное подтверждение готовности.
  • Храните состояние вне контейнера (БД, внешнее хранилище) для безопасных деплоев.

8. Управление ветвями и стратегии деплоя

По умолчанию Dokku разворачивает ветку master. Чтобы изменить ветку глобально или для конкретного приложения:

dokku git:set --global deploy-branch dokku-deploy

dokku git:set my-app deploy-branch production

Стратегии:

  • Прямая настройка ветки для автоматического деплоя.
  • CI-пайплайн, где этап развёртывания — git push dokku после успешных тестов.
  • Использование тегов Git и ручной команды git push dokku :master для контроля версий.

9. Расширения и плагины

Плагины позволяют подключать состояние и сервисы (БД, кеши, очереди) прямо в Dokku. Пример добавления MySQL:

dokku plugin:install https://github.com/dokku/dokku-mysql.git

dokku mysql:create demo-db

dokku mysql:link demo-db my-app

После связки Dokku установит переменную окружения DATABASE_URL в контейнере приложения.

Популярные плагины:

  • dokku-postgres, dokku-mysql — реляционные БД
  • dokku-redis — кеш/хранилище данных в памяти
  • dokku-letsencrypt — автоматические SSL-сертификаты
  • monitoring-плагины и плагины бэкапов (проверьте официальные репозитории и сообщество)

Совет по резервному копированию сервисов: экспортируйте дампы БД и храните их вне сервера (облачное хранилище, S3). Для томов Docker используйте snapshot/rsync.

10. Безопасность и эксплуатация

Рекомендации по харднингу:

  • Отключите SSH-пароли, используйте только ключи.
  • Ограничьте доступ к серверу по IP (если возможно).
  • Настройте ufw: разрешите порты 22, 80, 443 и закройте всё остальное.
  • Регулярно обновляйте систему и Docker.
  • Разделите роли: у разработчиков — доступ к git, у админов — доступ к серверу.

Мониторинг и логи:

  • Используйте dokku logs my-app для чтения логов приложения.
  • Интеграция с внешними системами логирования (ELK, Papertrail) через плагины или stdout/rsyslog.

11. CI/CD и автоматизация

Интеграция с CI обычно заключается в том, что финальный этап пайплайна выполняет git push dokku. Пример фрагмента для GitHub Actions:

# Пример: шаг в GitHub Actions для деплоя
- name: Push to Dokku
  run: git push dokku ${{ github.ref }}:master
  env:
    GIT_SSH_COMMAND: 'ssh -o StrictHostKeyChecking=no'

Важно: настройте секреты для SSH-ключа в CI и убедитесь, что CI может подключиться по SSH к Dokku-хосту.

12. Резервное копирование и откат

Резервные шаги:

  • Экспорт базы данных (mysqldump/pg_dump).
  • Копирование томов Docker (rsync, snapshots диска).
  • Хранение git-тегов и контейнерных образов в registry при необходимости.

Откат: самый надёжный способ откатиться — выполнить git push предыдущего коммита или тега на Dokku. Это гарантированно восстановит предыдущее состояние приложения.

Пример отката через git:

git checkout 
git push dokku HEAD:master

13. Отладка и распространённые проблемы

Проблемы и действия:

  • Проблемы с SSL: проверьте доступность портов 80/443 и логи плагина Let’s Encrypt.
  • Сборка зависает: проверьте логи сборщика и ресурсы сервера (память/диск).
  • Ошибки доступа к БД: убедитесь, что приложение получает правильные переменные окружения (DATABASE_URL).
  • Проблемы с DNS: используйте dig/nslookup для проверки записей.

Команды для диагностики:

dokku logs my-app --num 200

dokku ps:report my-app

dokku apps:list

14. Практические чек-листы

Чек-лист для разработчика перед деплоем:

  • Локальные тесты пройдены
  • Конфигурация и секреты созданы в Dokku (config vars)
  • Миграции БД проверены
  • Тег/ветка готова для релиза

Чек-лист для оператора при установке сервера:

  • Настроен брандмауэр
  • Обновлён kernel и пакеты безопасности
  • Установлен правильный SSH-ключ
  • Настроен backup для /var/lib/dokku

Роли и обязанности:

  • Разработчик: код, тесты, артефакты сборки.
  • DevOps/админ: установка Dokku, безопасность, бэкапы, мониторинг.

15. Критерии приёмки

  • Приложение доступно по назначенному домену по HTTPS.
  • Логи приложения доступны и не содержат критических ошибок при старте.
  • Автоматический деплой из CI проходит без ошибок.
  • Резервная копия базы данных создаётся и восстанавливается в тестовом окружении.

16. Модель принятия решений — порт vs поддомен

Если у вас нет домена или хотите быстро тестировать — используйте портовый доступ. Для публичных приложений и сертификатов используйте домены и virtualhost-названия.

flowchart TD
  A[Нужен публичный доступ?] -->|Да| B{Есть домен?}
  A -->|Нет| C[Использовать порт доступа]
  B -->|Да| D[Настроить A/CNAME + virtualhost]
  B -->|Нет| C
  D --> E[Включить Let's Encrypt]
  C --> F[Документация: использовать порты и проброс]

17. Что делать, если Dokku не подходит

Контрпримеры/ограничения:

  • Для высоконагруженных распределённых систем и сложной оркестрации лучше выбирать Kubernetes.
  • Если нужна полностью управляемая платформа (SLA, поддержка), рассмотрите коммерческие PaaS.

Альтернативы:

  • Heroku (удобство, но дороже)
  • Managed Kubernetes (для сложных микросервисов)
  • Документированные VPS/VM + Docker Compose (простая альтернатива)

18. Советы по миграции на Dokku

  • Экспортируйте данные и убедитесь, что зависимости корректно устанавливаются в окружении Dokku.
  • Тестируйте локально сборку в контейнере с теми же переменными окружения.
  • Подготовьте план отката и резервное хранилище для данных.

19. Примеры приемочных тестов

  • Проверка доступности приложения по HTTPS: 200 OK на главной странице.
  • Проверка ссылок на API: валидные ответы и время отклика.
  • Проверка переменных окружения: echo $DATABASE_URL внутри контейнера.

20. Часто задаваемые вопросы

Как убрать приложение из Dokku?

dokku apps:destroy my-app

Как просмотреть логи приложения?

dokku logs my-app --num 100

Как вручную обновить сертификат Let’s Encrypt?

dokku letsencrypt:renew my-app

Итог: Dokku даёт простой путь к самохостингу приложений с привычным Git-флоу. Он легко расширяется плагинами, поддерживает SSL и подходит для большинства веб-приложений, где не требуется сложная оркестрация.

Ключевые ссылки: официальная документация Dokku на GitHub для плагинов и подробных команд.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро