Самохостинг приложений с 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 в 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.comDNS: добавьте 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:list14. Практические чек-листы
Чек-лист для разработчика перед деплоем:
- Локальные тесты пройдены
- Конфигурация и секреты созданы в 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 для плагинов и подробных команд.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента