💡 Что такое Dokku и зачем он вам — это минималистичная PaaS-платформа (Platform as a Service), которая превращает ваш сервер в собственный «мини-Heroku». Вы просто делаете git push, а Dokku сам собирает Docker-образ, запускает контейнер, настраивает Nginx и SSL. Идеально для разворачивания веб-приложений на одном сервере без лишней головной боли.
⚠️ Важное предупреждение: Dokku — это полноценная платформа, которая устанавливает Docker, настраивает Nginx, создаёт своего пользователя dokku и управляет сетевыми портами. Лучше всего выделять под него отдельный сервер (VPS). На уже работающем веб-сервере установка может конфликтовать с существующими сайтами в Nginx.
Предварительные требования
Прежде чем начать, убедитесь, что ваша система готова:
⚠️ ВАЖНО: Проверьте права sudo перед установкой
Если вы не уверены, есть ли у вашего пользователя права администратора, выполните в терминале:
sudo whoami
Что делает:
sudo— выполняет команду от имени суперпользователяwhoami— показывает имя текущего пользователя
Зачем: Проверяет, может ли ваш пользователь выполнять команды с правами root.
✅ Если выводит root — всё в порядке, можете продолжать.
❌ Если выводит is not in the sudoers file — сначала пройдите наше руководство по настройке sudo.
Технические требования:
| Требование | Рекомендация | Почему это важно |
|---|---|---|
| ОС | Debian 13, 12 или 11 | Dokku публикует пакеты только для этих версий |
| Архитектура | amd64 или arm64 | Пакеты собираются только для этих архитектур |
| Оперативная память | Не менее 1 ГБ | Сборка Docker-образов требует ресурсов |
| Домен | Wildcard DNS (*.apps.example.com) | Для автоматической маршрутизации приложений |
| Порты | 22, 80, 443 открыты | SSH для git push, HTTP/HTTPS для приложений |
💡 Если нет домена: Для тестирования можно использовать sslip.io — бесплатный сервис, который превращает IP-адрес в домен. Например, 203.0.113.10.sslip.io автоматически указывает на сервер с IP 203.0.113.10.
Выбор метода установки Dokku
Dokku можно установить двумя способами. Выберите тот, который подходит вашему сценарию:
| Метод | Что делает | Когда использовать | Особенности |
|---|---|---|---|
| Официальный bootstrap-скрипт | Сам устанавливает Docker, Nginx и Dokku | Новый сервер, первая установка | Самый простой метод, всё «под ключ» |
| Ручная установка через APT | Только Dokku, Docker уже должен быть | Docker уже установлен отдельно | Для продвинутых пользователей и автоматизации |
⚠️ Используйте только один метод на одном сервере! Bootstrap-скрипт создаёт файлы в /etc/apt/sources.list.d/dokku.list, ручной метод — /etc/apt/sources.list.d/dokku.sources. Если оставить оба, будут конфликты.
Подготовка сервера к установке Dokku
Независимо от выбранного метода, начните с общей подготовки.
Шаг 1: Обновление системы
sudo apt update
sudo apt upgrade -y
Что делает:
apt update— обновляет список пакетовapt upgrade -y— обновляет все установленные пакеты до последних версий
Зачем: Всегда начинайте установку с обновлённой системы — это избегает конфликтов версий.
Шаг 2: Проверка версии Debian и архитектуры
. /etc/os-release
printf '%s %s\n' "$PRETTY_NAME" "$VERSION_CODENAME"
dpkg --print-architecture
Что делает: Показывает точное название и кодовое имя вашей версии Debian, а также архитектуру процессора.
Поддерживаемые значения:
- Кодовые имена:
trixie(Debian 13),bookworm(Debian 12),bullseye(Debian 11) - Архитектуры:
amd64(обычные ПК и серверы),arm64(Raspberry Pi, некоторые VPS)
Шаг 3: Установка FQDN (полного доменного имени)
sudo hostnamectl set-hostname apps.example.com
Что делает: Устанавливает полное доменное имя сервера.
Зачем: Dokku требует корректного hostname для работы маршрутизации.
Проверка:
hostname -f
Ожидаемый вывод: apps.example.com (или ваш домен).
Метод 1: Установка Dokku через официальный bootstrap-скрипт (рекомендуемый)
Этот метод подходит для 90% пользователей — всё, что нужно, одна команда установит Docker, Nginx и Dokku.
Шаг 1: Установка вспомогательных утилит
sudo apt install -y ca-certificates curl jq
Что делает:
ca-certificates— сертификаты для HTTPScurl— загрузка файлов из интернетаjq— парсинг JSON в командной строке (нужен для работы с API GitHub)
Шаг 2: Определение последней версии Dokku
DOKKU_VERSION="$(curl -fsSL https://api.github.com/repos/dokku/dokku/releases/latest | jq -r '.tag_name')"
Что делает: Обращается к API GitHub, находит последний релиз Dokku и сохраняет его номер (например, v0.38.5).
Что делает jq -r '.tag_name': Извлекает из JSON-ответа поле tag_name и убирает кавычки.
Шаг 3: Скачивание bootstrap-скрипта
case "$DOKKU_VERSION" in
v[0-9]*)
curl -fsSLo bootstrap.sh "https://dokku.com/install/${DOKKU_VERSION}/bootstrap.sh"
;;
*)
printf 'Could not resolve the latest Dokku release tag.\n' >&2
false
;;
esac
Что делает: Проверяет, что версия начинается с v и цифры, затем скачивает соответствующий скрипт установки.
Шаг 4: (Опционально) Проверка существующего Docker
Если Docker уже установлен (например, вы ставили его отдельно), проверьте его версию и плагины:
if command -v docker >/dev/null 2>&1; then
docker --version
docker buildx version
docker compose version
fi
Что ищем: Все три команды должны вывести версии. Если какой-то команды нет — Docker установлен не полностью.
Шаг 5: Просмотр скрипта перед запуском (рекомендуется)
less bootstrap.sh
Зачем: Всегда полезно посмотреть, что будет выполняться с правами root. Нажмите q для выхода.
Шаг 6: Запуск установки
sudo DOKKU_TAG="$DOKKU_VERSION" bash bootstrap.sh
Что делает: Запускает скрипт установки с правами суперпользователя.
Скрипт сделает:
- Установит Docker Engine, Buildx и Compose (если их нет)
- Добавит APT-репозиторий Dokku
- Установит пакет
dokku - Установит зависимости для плагинов
Ожидаемый вывод: Много строк, в конце должно быть сообщение об успешной установке.
⚠️ Важно для существующих веб-серверов: Установщик может удалить существующие виртуальные хосты из директории Nginx sites-enabled. Если у вас уже есть сайты на этом сервере — сделайте резервную копию перед установкой!
Метод 2: Ручная установка Dokku через APT (для продвинутых)
Используйте этот метод, если Docker уже установлен из официального репозитория Docker, а не через bootstrap-скрипт Dokku.
Шаг 1: Проверка Docker
docker --version
docker buildx version
docker compose version
Требование: Все три команды должны работать. Если нет — сначала установите Docker по нашей инструкции.
Шаг 2: Установка инструментов
sudo apt update
sudo apt install -y ca-certificates curl gpg
Шаг 3: Добавление GPG-ключа Dokku
curl -fsSLo dokku.asc https://packagecloud.io/dokku/dokku/gpgkey
gpg --quiet --show-keys --with-fingerprint dokku.asc
Что делаем: Скачиваем ключ подписи и смотрим его отпечаток.
Ожидаемый отпечаток:
pub rsa4096 2018-10-08 [SCEA]
0027 A6FC E4DE B304 104D 2D13 F1FF 6851 288B 3315
uid https://packagecloud.io/dokku/dokku (https://packagecloud.io/docs#gpg_signing) <support@packagecloud.io>
sudo install -m 0644 dokku.asc /usr/share/keyrings/dokku-archive-keyring.asc
rm -f dokku.asc
Что делает: Устанавливает ключ в стандартную директорию с правильными правами и удаляет временный файл.
Шаг 4: Создание APT-источника в формате DEB822
. /etc/os-release
codename="${VERSION_CODENAME:-}"
arch="$(dpkg --print-architecture)"
case "${codename}:${arch}" in
trixie:amd64|trixie:arm64|bookworm:amd64|bookworm:arm64|bullseye:amd64|bullseye:arm64)
printf '%s\n' \
'Types: deb' \
'URIs: https://packagecloud.io/dokku/dokku/debian/' \
"Suites: ${codename}" \
'Components: main' \
"Architectures: ${arch}" \
'Signed-By: /usr/share/keyrings/dokku-archive-keyring.asc' \
| sudo tee /etc/apt/sources.list.d/dokku.sources > /dev/null
;;
*)
printf 'Dokku packages are not available for %s on %s.\n' "$codename" "$arch" >&2
exit 1
;;
esac
Что делает: Проверяет, что ваша система поддерживается, и создаёт современный DEB822-файл источника.
Шаг 5: Обновление APT и установка Dokku
sudo apt update
apt-cache policy dokku
Что ищем в выводе: Строку с https://packagecloud.io/dokku/dokku/debian и вашим кодовым именем Debian.
sudo debconf-set-selections <<'EOF'
dokku dokku/vhost_enable boolean true
dokku dokku/hostname string apps.example.com
dokku dokku/nginx_enable boolean true
EOF
Что делает: Предварительно отвечает на вопросы установщика (использовать ли виртуальные хосты, какой домен, включать ли Nginx).
sudo apt install -y dokku
sudo dokku plugin:install-dependencies --core
Что делает: Устанавливает Dokku и зависимости для плагинов.
Проверка установки Dokku
После установки любым методом выполните проверки:
dokku version
Что делает: Показывает установленную версию Dokku.
Ожидаемый вывод: 0.38.5 или новее.
dokku plugin:list
Что делает: Показывает список установленных плагинов.
Ожидаемый вывод: Список из 10+ плагинов (docker-options, git, letsencrypt, nginx-vhosts и т.д.).
docker --version
docker compose version
Ожидаемый вывод: Версии Docker и Compose.
sudo systemctl is-active nginx
Ожидаемый вывод: active
Настройка Dokku после установки
Dokku установлен, но чтобы начать деплоить приложения, нужно выполнить несколько шагов.
Настройка 1: Добавление SSH-ключа для деплоя
Dokku принимает git push через SSH-пользователя dokku. Добавьте ваш публичный ключ:
sudo dokku ssh-keys:add admin < ~/.ssh/id_rsa.pub
Что делает:
ssh-keys:add— команда Dokku для добавления ключейadmin— имя ключа (может быть любым)< ~/.ssh/id_rsa.pub— читает ваш публичный ключ
Если ключа нет: Создайте его командой ssh-keygen -t rsa -b 4096.
Проверка:
dokku ssh-keys:list
Настройка 2: Установка глобального домена
dokku domains:set-global apps.example.com
Что делает: Устанавливает базовый домен для всех приложений. Приложение myapp получит адрес myapp.apps.example.com.
Для тестирования без домена:
dokku domains:set-global 203.0.113.10.sslip.io
Где 203.0.113.10 — ваш публичный IP-адрес.
Проверка:
dokku domains:report --global
Настройка 3: Открытие портов в файерволе (если включён)
Проверьте статус UFW:
sudo ufw status verbose
Если статус active, откройте необходимые порты:
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw reload
Зачем: Dokku использует порт 22 для git push, порты 80 и 443 для веб-трафика.
Деплой первого приложения на Dokku
Шаг 1: Создание приложения на сервере
dokku apps:create sample-app
dokku domains:set sample-app sample-app.apps.example.com
Что делает: Создаёт приложение и назначает ему домен.
Проверка:
dokku apps:list
Шаг 2: Настройка Git-удалённого репозитория на вашем компьютере
На вашем локальном компьютере (не на сервере), в директории с кодом приложения:
git remote add dokku dokku@apps.example.com:sample-app
Что делает: Добавляет удалённый репозиторий Dokku в ваш локальный Git.
Шаг 3: Пуш кода в Dokku
git push dokku main:master
Что делает: Отправляет код приложения в Dokku.
Что происходит после пуша:
- Dokku определяет тип приложения (Node.js, Python, Ruby и т.д.)
- Запускает сборку Docker-образа через buildpack
- Запускает контейнер
- Настраивает Nginx для маршрутизации
- Возвращает URL развёрнутого приложения
Ожидаемый вывод: В конце появится строка с URL: http://sample-app.apps.example.com.
Шаг 4: Проверка статуса и логов
dokku ps:report sample-app
Что делает: Показывает подробную информацию о процессе приложения (статус, PID, используемый порт).
dokku logs sample-app --tail
Что делает: Показывает логи приложения в реальном времени. Нажмите Ctrl+C для выхода.
Управление Dokku на Debian
Dokku — это не один процесс-демон, а набор команд, которые управляют Docker и Nginx.
| Команда | Что делает |
|---|---|
dokku apps:list | Список всех приложений |
dokku apps:create APP | Создать новое приложение |
dokku apps:destroy APP | Удалить приложение |
dokku domains:report APP | Показать домены приложения |
dokku ps:report APP | Показать статус процесса |
dokku ps:restart APP | Перезапустить приложение |
dokku ps:stop APP | Остановить приложение |
dokku logs APP --tail | Показать логи |
dokku plugin:list | Список плагинов |
sudo systemctl status docker | Статус Docker |
sudo systemctl status nginx | Статус Nginx |
Обновление Dokku
Dokku обновляется через APT, но из-за особенностей пакетной структуры команда немного нестандартная:
sudo apt-get update
sudo apt-get --no-install-recommends install dokku herokuish sshcommand plugn gliderlabs-sigil dokku-update dokku-event-listener
Что делает: Обновляет Dokku и все его компоненты без установки лишних зависимостей.
После обновления (если обновлялся Herokuish):
dokku ps:stop --all
sudo apt-get update
sudo apt-get --no-install-recommends install dokku herokuish sshcommand plugn gliderlabs-sigil dokku-update dokku-event-listener
dokku ps:rebuild --all
Зачем: Остановка и пересборка гарантирует, что контейнеры используют новые версии образов и buildpack’ов.
Полное удаление Dokku
⚠️ Внимание: Все операции ниже безвозвратно удаляют приложения, базы данных и все данные Dokku. Сделайте резервные копии перед удалением!
Шаг 1: Остановка приложений и очистка
dokku ps:stop --all
dokku cleanup
Что делает: Останавливает все приложения и удаляет неиспользуемые Docker-образы.
Шаг 2: Удаление пакетов
sudo apt-get purge -y dokku herokuish
sudo apt-get autoremove -y
Что делает: Удаляет пакеты Dokku и Herokuish, а также неиспользуемые зависимости.
Шаг 3: Удаление файлов репозиториев
sudo rm -f /etc/apt/sources.list.d/dokku.list
sudo rm -f /etc/apt/sources.list.d/dokku.sources
sudo rm -f /etc/apt/trusted.gpg.d/dokku.asc
sudo rm -f /usr/share/keyrings/dokku-archive-keyring.asc
sudo apt update
Шаг 4: Удаление данных Dokku
Проверьте, что будет удалено:
sudo ls -ld /home/dokku /var/lib/dokku /var/log/dokku
Удаление:
sudo rm -rf /home/dokku /var/lib/dokku /var/log/dokku
Решение типичных проблем
8.1 Ошибка: Unsupported Linux distribution при запуске bootstrap.sh
Симптом: Скрипт установки завершается с ошибкой о неподдерживаемом дистрибутиве.
Причина: Скрипт проверяет файл /etc/os-release, и ваша система не определяется как Debian 11, 12 или 13.
Пошаговое решение:
Шаг 1: Проверьте, что говорит система:
cat /etc/os-release
Что ищем: Строку ID=debian и VERSION_CODENAME (должен быть bullseye, bookworm или trixie).
Шаг 2: Если вы используете производный дистрибутив (Ubuntu, Linux Mint), официальный скрипт может не работать. Используйте ручной метод установки через APT.
8.2 Ошибка: apt-cache policy dokku не показывает пакет
Симптом: После добавления репозитория команда apt-cache policy dokku не показывает кандидата.
Причина: Источник не добавился или архитектура/кодовое имя не поддерживаются.
Пошаговое решение:
Шаг 1: Проверьте файл источника:
cat /etc/apt/sources.list.d/dokku.sources
Шаг 2: Проверьте поддержку вашей архитектуры:
dpkg --print-architecture
Поддерживаются: amd64 и arm64.
Шаг 3: Обновите APT вручную и посмотрите ошибки:
sudo apt update
8.3 Ошибка: Permission denied (publickey) при git push
Симптом: При попытке сделать git push dokku main:master появляется ошибка Permission denied (publickey).
Причина: Ваш публичный SSH-ключ не добавлен в Dokku.
Пошаговое решение:
Шаг 1: Проверьте список ключей на сервере:
dokku ssh-keys:list
Шаг 2: Добавьте ключ (на сервере):
sudo dokku ssh-keys:add admin < ~/.ssh/id_rsa.pub
Шаг 3: С локальной машины проверьте подключение:
ssh dokku@apps.example.com
Ожидаемый вывод: Должно быть приветствие Dokku, а затем закрытие соединения.
8.4 Ошибка: Приложение не отвечает по домену (502 Bad Gateway)
Симптом: При открытии браузера по адресу приложения — ошибка 502.
Причина: Контейнер приложения не запустился или упал.
Пошаговое решение:
Шаг 1: Проверьте статус приложения:
dokku ps:report sample-app
Что ищем: Строку Status: running или Status: exited.
Шаг 2: Посмотрите логи:
dokku logs sample-app --tail
Что ищем: Ошибки приложения — неправильный Procfile, приложение слушает не тот порт, не установлены зависимости.
Шаг 3: Проверьте, что Nginx работает и маршрутизирует трафик:
sudo systemctl status nginx
curl -I http://sample-app.apps.example.com
Шаг 4: Если приложение упало, перезапустите и смотрите логи:
dokku ps:restart sample-app
dokku logs sample-app --tail
8.5 Ошибка: Порт 80 уже используется (Nginx не стартует)
Симптом: После установки Nginx не запускается или Dokku не может настроить виртуальные хосты.
Причина: Другой веб-сервер (Apache, старый Nginx) уже слушает порт 80.
Пошаговое решение:
Шаг 1: Узнайте, какой процесс занимает порт 80:
sudo ss -ltnp | grep ':80 '
Шаг 2: Если это Apache:
sudo systemctl stop apache2
sudo systemctl disable apache2
Шаг 3: Если это другой Nginx:
sudo systemctl stop nginx
Шаг 4: Запустите Nginx Dokku:
sudo systemctl start nginx
8.6 Ошибка: Недостаточно памяти для сборки
Симптом: При git push процесс сборки прерывается с ошибкой «Cannot allocate memory» или «Killed».
Причина: На сервере меньше 1 ГБ ОЗУ, и процесс сборки Docker-образа убивает OOM Killer.
Пошаговое решение:
Шаг 1: Проверьте доступную память:
free -h
Шаг 2: Временно добавьте swap (если нет или мало):
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Шаг 3: Сделайте swap постоянным (добавьте в /etc/fstab):
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
Шаг 4: Попробуйте деплой снова.
Чек-лист: что проверить после установки
- [ ]
sudo whoamiвыводитroot - [ ]
dokku versionпоказывает версию (например,0.38.5) - [ ]
dokku plugin:listпоказывает список плагинов - [ ]
docker --versionиdocker compose versionработают - [ ]
sudo systemctl is-active nginxпоказываетactive - [ ] SSH-ключ добавлен:
dokku ssh-keys:list - [ ] Глобальный домен установлен:
dokku domains:report --global - [ ] Порт 80 открыт (если используется UFW):
sudo ufw status - [ ] Можно создать тестовое приложение:
dokku apps:create test - [ ]
git pushработает (даже если приложение падает, пуш должен приниматься)
Заключение
Dokku успешно установлен на Debian. Теперь у вас есть собственная PaaS-платформа, на которую можно деплоить приложения одной командой git push.
Что дальше:
- Настройте SSL через Let’s Encrypt для своих приложений (плагин
dokku letsencrypt) - Установите Fail2Ban для защиты SSH
- Изучите официальную документацию Dokku
💡 Важно: Dokku предназначен для одного сервера и небольших проектов. Для высоконагруженных систем лучше рассмотреть Kubernetes или другие оркестраторы. Но для личных проектов, стартапов или CI/CD — Dokku идеален.