bolt Valebyte VPS от $4/мес — NVMe, запуск за 60 секунд.

Получить VPS arrow_forward
eco Начальный Туториал

Развёртывание Dokku на VPS: Heroku-подобная PaaS для быстрого деплоя приложений

calendar_month Jul 09, 2026 schedule 22 мин. чтения visibility 18 просмотров
Развёртывание Dokku на VPS: Heroku-подобная PaaS для быстрого деплоя приложений
info

Нужен сервер для этого гайда? Мы предлагаем выделенные серверы и VPS в 50+ странах с мгновенной настройкой.

Нужен сервер для этого гайда?

Разверните VPS или выделенный сервер за минуты.

Развёртывание Dokku на VPS: Heroku-подобная PaaS для быстрого деплоя приложений

TL;DR

В этом подробном руководстве мы настроим Dokku на вашем виртуальном частном сервере (VPS), превратив его в мощную Heroku-подобную платформу как услугу (PaaS). Dokku позволяет разработчикам легко развертывать, масштабировать и управлять приложениями с помощью простой команды git push, используя Docker-контейнеры. Вы получите полный контроль над своей инфраструктурой, экономию средств по сравнению с облачными PaaS и возможность быстро запускать проекты.

  • Установка Dokku: Превращаем чистый VPS в полноценную PaaS с поддержкой Docker.
  • Автоматический деплой: Разворачивайте приложения, просто отправляя код в Git-репозиторий на вашем сервере.
  • Управление приложениями: Легко добавляйте базы данных, кэши, настраивайте переменные окружения и SSL-сертификаты.
  • Полный контроль: Вы владеете всей инфраструктурой, данными и конфигурациями, избегая привязки к конкретному облачному провайдеру.
  • Экономия ресурсов: Оптимальное использование ресурсов вашего VPS для нескольких приложений.
  • Актуальность: Все шаги и версии ПО актуальны для 2026 года, обеспечивая долгосрочную применимость.

Что мы настраиваем и зачем

Схема: Что мы настраиваем и зачем
Схема: Что мы настраиваем и зачем

В этом руководстве мы будем настраивать Dokku — легкую PaaS (Platform as a Service), которая позволяет вам запускать и управлять приложениями на вашем собственном сервере, используя преимущества Docker. Dokku часто называют "Heroku для VPS", поскольку он предоставляет аналогичный опыт развертывания: вы просто отправляете свой код в Git-репозиторий на сервере, а Dokku автоматически собирает его в Docker-образ, запускает и управляет им.

В итоге вы получите полностью функциональную платформу для деплоя веб-приложений на различных языках программирования (Node.js, Python, Ruby, Go, PHP и другие) с минимальными усилиями. Это идеальное решение для разработчиков, стартапов и небольших команд, которым нужна простота Heroku, но при этом полный контроль над инфраструктурой и более низкие затраты.

Почему Dokku?

  • Простота деплоя: Развертывание приложений сводится к команде git push.
  • Эффективность ресурсов: Dokku работает на одном сервере, что делает его экономичным решением.
  • Гибкость: Поддержка множества языков и фреймворков благодаря Buildpacks и Dockerfiles.
  • Расширяемость: Богатая экосистема плагинов для баз данных (PostgreSQL, MySQL, Redis), брокеров сообщений и других сервисов.
  • Контроль: Вы сохраняете полный контроль над своим сервером, данными и конфигурациями, в отличие от полностью управляемых облачных PaaS.

Альтернативы: Cloud-managed vs. Self-hosted

Существует несколько подходов к развертыванию приложений:

  • Cloud-managed PaaS (например, Heroku, Render, Netlify):
    • Плюсы: Максимальная простота, отсутствие необходимости управлять инфраструктурой, автоматическое масштабирование.
    • Минусы: Высокая стоимость, меньший контроль, привязка к провайдеру, ограниченные возможности кастомизации.
  • Self-hosted PaaS (например, Dokku, CapRover, Coolify):
    • Плюсы: Значительная экономия средств, полный контроль над сервером и данными, гибкость в выборе конфигурации, возможность установки на любой VPS.
    • Минусы: Требует начальной настройки и минимального обслуживания сервера, масштабирование может быть сложнее, чем в cloud-managed решениях.
  • Самостоятельное развертывание на VPS (без PaaS):
    • Плюсы: Максимальный контроль и гибкость, подходит для очень специфических задач.
    • Минусы: Наиболее трудоемкий процесс, требует глубоких знаний системного администрирования, ручное управление каждым компонентом (веб-сервер, база данных, CI/CD).

Dokku занимает золотую середину, предоставляя простоту PaaS с контролем и экономией self-hosted решения. Это идеальный выбор для тех, кто хочет быстро деплоить приложения, не погружаясь в сложности Kubernetes или ручного управления Docker-контейнерами.

Какой VPS-конфиг нужен под эту задачу

Схема: Какой VPS-конфиг нужен под эту задачу
Схема: Какой VPS-конфиг нужен под эту задачу

Выбор подходящего VPS-конфига для Dokku зависит от количества и типа приложений, которые вы планируете развертывать. Dokku сам по себе достаточно легковесен, но каждое развернутое приложение и его сопутствующие сервисы (базы данных, кэши) потребляют ресурсы.

Минимальные требования (для 1-2 небольших приложений, без тяжелых БД):

  • CPU: 2 vCPU
  • RAM: 4 ГБ
  • Диск: 80 ГБ SSD (для системы, Dokku и нескольких приложений)
  • Сеть: 1 Гбит/с порт, неограниченный трафик или большой лимит (например, 1 ТБ/мес)

Рекомендуемый конфиг (для 3-5 средних приложений, с несколькими БД):

  • CPU: 4 vCPU
  • RAM: 8 ГБ
  • Диск: 160 ГБ NVMe SSD (для лучшей производительности дисковых операций)
  • Сеть: 1 Гбит/с порт, неограниченный трафик

Для комфортной работы с несколькими приложениями и базами данных, можно рассмотреть VPS с 4 vCPU, 8 ГБ ОЗУ и 160 ГБ SSD. Это обеспечит достаточный запас производительности для большинства задач разработки и небольших продакшн-проектов.

Когда нужен dedicated, а не VPS

Dedicated-сервер стоит рассматривать, если:

  • Высокая нагрузка: Ваши приложения ожидают тысячи одновременных пользователей или требуют значительных вычислительных ресурсов.
  • Большой объем данных: Вам необходимо хранить сотни гигабайт или терабайты данных, что может быть дорого или неэффективно на VPS.
  • Специфические требования к производительности: Нужен прямой доступ к "железу" для максимальной производительности дисков, сети или CPU, что VPS не всегда может гарантировать из-за виртуализации.
  • Требования к безопасности и соответствию: Некоторые нормативы могут требовать физической изоляции сервера.
  • Масштабирование: Если вы планируете развернуть более 10-15 средних приложений или несколько очень крупных, один dedicated-сервер может быть более экономичным и производительным решением, чем несколько мощных VPS. В этом случае, возможно, понадобится подходящий dedicated-сервер.

Для большинства задач, связанных с Dokku, мощный VPS будет более чем достаточен, предлагая отличный баланс между производительностью и стоимостью.

Локация: на что влияет

Выбор локации VPS имеет несколько ключевых аспектов:

  • Задержка (Latency): Размещайте сервер как можно ближе к вашей основной аудитории или к пользователям, чтобы минимизировать задержки при доступе к приложению.
  • Законодательство: Если ваше приложение работает с чувствительными данными, важно учитывать законы о защите данных (например, GDPR в Европе) той страны, где физически расположен сервер.
  • Цена: Стоимость VPS может незначительно отличаться в разных регионах.
  • Доступность: Некоторые провайдеры предлагают более широкий спектр услуг или более стабильную инфраструктуру в определенных дата-центрах.

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

Подготовка сервера

Схема: Подготовка сервера
Схема: Подготовка сервера

Перед установкой Dokku необходимо выполнить базовую настройку и усиление безопасности вашего VPS. Мы будем использовать Ubuntu Server 24.04 LTS (Noble Numbat) как наиболее актуальную и стабильную версию для 2026 года.

1. Подключение к серверу

Подключитесь к вашему VPS по SSH, используя учетные данные, предоставленные провайдером. Обычно это пользователь root и пароль, или SSH-ключ.


ssh root@ВАШ_IP_АДРЕС_VPS

Замените ВАШ_IP_АДРЕС_VPS на реальный IP-адрес вашего сервера.

2. Обновление системы

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


sudo apt update && sudo apt upgrade -y

Обновляет список доступных пакетов и устанавливает все обновления без запроса подтверждения.

3. Создание нового пользователя с правами sudo

Работа под пользователем root не рекомендуется для повседневных задач из соображений безопасности. Создайте нового пользователя и предоставьте ему права sudo.


adduser dokkuadmin

Создает нового пользователя dokkuadmin и запрашивает пароль и дополнительную информацию.


usermod -aG sudo dokkuadmin

Добавляет пользователя dokkuadmin в группу sudo, давая ему возможность выполнять команды с правами суперпользователя.

4. Настройка SSH-ключей для нового пользователя

Рекомендуется использовать SSH-ключи для аутентификации вместо паролей. Это значительно повышает безопасность.

На вашей локальной машине, если у вас еще нет пары SSH-ключей, сгенерируйте их:


ssh-keygen -t rsa -b 4096 -C "[email protected]"

Затем скопируйте публичный ключ на сервер для нового пользователя:


ssh-copy-id dokkuadmin@ВАШ_IP_АДРЕС_VPS

Эта команда добавит ваш публичный ключ в файл ~/.ssh/authorized_keys на сервере. После этого вы сможете войти как dokkuadmin без пароля.

Теперь выйдите из сессии root и войдите как dokkuadmin:


exit
ssh dokkuadmin@ВАШ_IP_АДРЕС_VPS

5. Усиление безопасности SSH

Отредактируйте файл конфигурации SSH-сервера, чтобы отключить вход для root и аутентификацию по паролю (если вы уверены, что SSH-ключи работают).


sudo nano /etc/ssh/sshd_config

Найдите и измените (или добавьте) следующие строки:


PermitRootLogin no
PasswordAuthentication no

Сохраните изменения (Ctrl+O, Enter) и выйдите (Ctrl+X). Затем перезапустите SSH-сервис:


sudo systemctl restart ssh

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

6. Настройка брандмауэра (UFW)

UFW (Uncomplicated Firewall) — это удобный интерфейс для управления iptables. Настройте его, чтобы разрешить только необходимые порты.


sudo apt install ufw -y

Устанавливает утилиту UFW.


sudo ufw allow OpenSSH

Разрешает входящие соединения на порт SSH (по умолчанию 22).


sudo ufw allow http

Разрешает входящие соединения на порт HTTP (80).


sudo ufw allow https

Разрешает входящие соединения на порт HTTPS (443).


sudo ufw enable

Включает брандмауэр. Подтвердите действие, нажав y.


sudo ufw status

Проверяет статус брандмауэра и список разрешенных правил.

7. Установка Fail2ban

Fail2ban помогает защититься от атак перебора паролей, блокируя IP-адреса, с которых происходят многочисленные неудачные попытки входа.


sudo apt install fail2ban -y

Устанавливает Fail2ban.

Fail2ban по умолчанию настроен для защиты SSH. Дополнительную настройку можно выполнить, скопировав файл конфигурации по умолчанию:


sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Теперь вы можете редактировать /etc/fail2ban/jail.local для изменения параметров, таких как время бана или количество попыток.


sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Включает автозапуск Fail2ban при загрузке и запускает его.

8. Настройка имени хоста (Hostname)

Установите понятное имя хоста для вашего сервера. Это поможет в идентификации.


sudo hostnamectl set-hostname dokku-server

Устанавливает имя хоста dokku-server.


echo "127.0.0.1 dokku-server" | sudo tee -a /etc/hosts

Добавляет запись в файл /etc/hosts для корректного разрешения нового имени хоста.

Теперь ваш VPS готов к установке Dokku.

Установка ПО Dokku

Схема: Установка ПО Dokku
Схема: Установка ПО Dokku

После подготовки сервера можно приступать к установке Dokku. Мы будем использовать официальный репозиторий Dokku, что гарантирует получение актуальных и стабильных версий.

1. Добавление репозитория Dokku

Для начала, установите необходимые утилиты для работы с репозиториями и добавьте GPG-ключ Dokku.


# Устанавливаем необходимые пакеты для работы с HTTPS-репозиториями
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

Устанавливает утилиты для работы с защищенными репозиториями и определения версии дистрибутива.


# Добавляем GPG-ключ Dokku
curl -fsSL https://packagecloud.io/dokku/dokku/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/dokku-archive-keyring.gpg

Загружает публичный GPG-ключ Dokku и сохраняет его для проверки подлинности пакетов.


# Добавляем репозиторий Dokku в список источников
echo "deb [signed-by=/usr/share/keyrings/dokku-archive-keyring.gpg] https://packagecloud.io/dokku/dokku/ubuntu/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/dokku.list

Добавляет официальный репозиторий Dokku для Ubuntu 24.04 LTS (Noble Numbat) в список источников пакетов.


# Обновляем список пакетов после добавления нового репозитория
sudo apt update

Обновляет кэш пакетов, чтобы система знала о новых пакетах из репозитория Dokku.

2. Установка Dokku

Теперь, когда репозиторий добавлен, можно установить Dokku. На момент 2026 года, Dokku будет версии 0.30.x или новее.


# Устанавливаем Dokku. Это также установит Docker и все необходимые зависимости.
sudo apt install dokku -y

Устанавливает Dokku и все его зависимости, включая Docker Engine, который является основой работы Dokku.

3. Начальная настройка Dokku (через веб-интерфейс)

После установки Dokku требует первоначальной настройки. Это можно сделать через веб-ининтерфейс, который доступен сразу после установки.

Откройте в браузере http://ВАШ_IP_АДРЕС_VPS. Вы увидите страницу настройки Dokku.

На этой странице вам нужно будет:

  • Public Key: Вставьте ваш публичный SSH-ключ, который вы использовали для входа на сервер (cat ~/.ssh/id_rsa.pub на вашей локальной машине). Это позволит вам деплоить приложения через Git.
  • Hostname: Введите доменное имя, которое вы хотите использовать для Dokku (например, dokku.yourdomain.com). Убедитесь, что вы настроили DNS-запись (A-запись или CNAME) для этого домена, указывающую на IP-адрес вашего VPS.
  • Use Virtual Host Naming: Оставьте эту опцию включенной. Она позволяет Dokku автоматически маршрутизировать запросы к вашим приложениям на основе доменного имени.

Нажмите "Finish Setup". После этого Dokku будет готов к работе.

4. Проверка установки Dokku (через SSH)

Вы можете проверить, что Dokku установлен и работает корректно, выполнив команду:


dokku version

Вывод должен показать текущую версию Dokku, например: dokku version 0.30.x.

Также проверьте статус Dokku и Docker:


sudo systemctl status dokku
sudo systemctl status docker

Оба сервиса должны быть в состоянии active (running).

5. Добавление вашего SSH-ключа в Dokku (если не сделали через веб-интерфейс)

Если вы пропустили шаг добавления SSH-ключа в веб-интерфейсе, вы можете сделать это вручную:


# На вашей локальной машине:
cat ~/.ssh/id_rsa.pub

Скопируйте вывод этой команды.


# На сервере Dokku (через SSH):
dokku ssh-keys:add my_local_key "ssh-rsa AAAAB3NzaC..."

Замените my_local_key на любое имя для вашего ключа и "ssh-rsa AAAAB3NzaC..." на скопированный вами публичный ключ.

Теперь Dokku полностью установлен и готов к развертыванию ваших первых приложений.

Конфигурация и деплой приложений

Схема: Конфигурация и деплой приложений
Схема: Конфигурация и деплой приложений

После установки Dokku, следующим шагом будет развертывание вашего первого приложения и его настройка. Dokku делает этот процесс максимально простым, используя концепцию Git-деплоя.

1. Создание нового приложения

Перед тем как деплоить код, нужно создать "слот" для вашего приложения в Dokku.


dokku apps:create my-web-app

Создает новое приложение под именем my-web-app. Это имя будет использоваться в дальнейших командах.

2. Настройка DNS для приложения

Если вы хотите, чтобы ваше приложение было доступно по собственному доменному имени (например, app.yourdomain.com), вам нужно настроить DNS-запись. В панели управления вашего доменного регистратора создайте A-запись (или CNAME, если вы используете поддомен Dokku), указывающую на IP-адрес вашего VPS.

Затем сообщите Dokku о домене вашего приложения:


dokku domains:add my-web-app app.yourdomain.com

Добавляет домен app.yourdomain.com к приложению my-web-app. Теперь Dokku будет маршрутизировать трафик для этого домена к вашему приложению.

3. Деплой приложения

Процесс деплоя в Dokku очень похож на Heroku. Вы добавляете удаленный Git-репозиторий и отправляете в него свой код.

На вашей локальной машине, в директории вашего проекта:


# Инициализируйте Git-репозиторий, если его еще нет
git init

# Добавьте удаленный репозиторий Dokku
git remote add dokku dokku@ВАШ_IP_АДРЕС_ИЛИ_ДОМЕН_DOKKU:my-web-app

# Отправьте ваш код в Dokku
git push dokku master

Команда git push dokku master отправит ваш код на сервер Dokku. Dokku автоматически определит тип вашего приложения (Node.js, Python, PHP и т.д.) с помощью Buildpacks, соберет Docker-образ, запустит его и сделает доступным.

4. Управление переменными окружения

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


dokku config:set my-web-app MY_API_KEY="your_secret_api_key_here" DATABASE_URL="postgres://user:pass@host:port/db"

Устанавливает переменные окружения для приложения my-web-app. Эти переменные будут доступны вашему приложению во время выполнения.


dokku config:unset my-web-app MY_API_KEY

Удаляет переменную окружения.


dokku config:get my-web-app MY_API_KEY

Получает значение конкретной переменной (если это не секретная переменная, которая скрыта по умолчанию).


dokku config my-web-app

Просмотр всех переменных окружения для приложения.

5. Установка и подключение баз данных (Плагины Dokku)

Dokku поддерживает множество плагинов для различных сервисов, включая базы данных. Например, для PostgreSQL:


# Устанавливаем плагин PostgreSQL
sudo dokku plugin:install https://github.com/dokku/dokku-postgres.git postgres

Устанавливает плагин Dokku для управления базами данных PostgreSQL.


# Создаем новую базу данных
dokku postgres:create my-web-app-db

Создает экземпляр базы данных PostgreSQL под именем my-web-app-db.


# Привязываем базу данных к приложению
dokku postgres:link my-web-app-db my-web-app

Привязывает базу данных к приложению my-web-app. Это автоматически устанавливает переменную окружения DATABASE_URL в приложении, содержащую данные для подключения.

Аналогично можно установить плагины для MySQL, Redis, MongoDB и других сервисов.

6. Настройка TLS/HTTPS с Let's Encrypt

Для обеспечения безопасности и доверия к вашему приложению крайне важно использовать HTTPS. Dokku имеет отличную интеграцию с Let's Encrypt для автоматического получения и обновления SSL-сертификатов.


# Устанавливаем плагин Let's Encrypt
sudo dokku plugin:install https://github.com/dokku/dokku-letsencrypt.git letsencrypt

Устанавливает плагин Dokku для работы с сертификатами Let's Encrypt.


# Устанавливаем email для уведомлений Let's Encrypt
dokku letsencrypt:set my-web-app email [email protected]

Указывает ваш email-адрес, который Let's Encrypt будет использовать для важных уведомлений о сертификате.


# Включаем Let's Encrypt для приложения
dokku letsencrypt:enable my-web-app

Запрашивает и устанавливает SSL-сертификат для my-web-app. Убедитесь, что DNS-запись для app.yourdomain.com уже указывает на ваш VPS, иначе запрос сертификата не пройдет.

Dokku автоматически настроит Nginx (или Caddy, если вы используете соответствующий плагин) для использования сертификата и перенаправления HTTP на HTTPS.

7. Проверка работоспособности приложения

После деплоя и настройки, убедитесь, что ваше приложение работает корректно.


dokku apps:report my-web-app

Показывает подробный отчет о статусе приложения, его URL, домены, используемые порты и т.д.


dokku logs my-web-app --tail 100

Просмотр последних 100 строк логов приложения. Это крайне полезно для отладки.


curl -I https://app.yourdomain.com

Выполняет HTTP HEAD-запрос к вашему приложению, чтобы проверить его доступность и статус ответа (например, HTTP/1.1 200 OK).


ping app.yourdomain.com

Проверяет сетевую доступность домена вашего приложения.

Вы также можете установить пользовательские health-checks для Dokku, чтобы он более интеллектуально определял работоспособность приложения после деплоя:


dokku ps:set my-web-app deploy-wait-period 30
dokku ps:set my-web-app deploy-wait-healthcheck /health

Эти команды устанавливают период ожидания в 30 секунд после запуска нового контейнера и указывают URL /health для проверки работоспособности. Если приложение не ответит на этот URL в течение 30 секунд, деплой будет считаться неудачным.

Бэкапы и обслуживание

Схема: Бэкапы и обслуживание
Схема: Бэкапы и обслуживание

Даже с Dokku, бэкапы и регулярное обслуживание являются критически важными для обеспечения надежности и безопасности ваших приложений. Это ваша ответственность как владельца self-hosted PaaS.

1. Что бэкапить

Для Dokku-инсталляции необходимо бэкапить несколько категорий данных:

  • Конфигурация Dokku: Файлы конфигурации Dokku, SSH-ключи, информация о приложениях и плагинах. Обычно находится в /etc/dokku и /home/dokku.
  • Данные приложений: Если ваше приложение использует постоянные тома (volumes) для хранения файлов (например, загруженные пользователями изображения), их нужно бэкапить. Dokku монтирует тома в /var/lib/dokku/data/APP_NAME.
  • Базы данных: Данные всех привязанных баз данных (PostgreSQL, MySQL, Redis и т.д.). Плагины Dokku предоставляют удобные команды для экспорта.

2. Простой скрипт автобэкапа

Создадим простой скрипт, который будет архивировать ключевые данные и базы данных. Для хранения можно использовать локальную директорию с последующей синхронизацией во внешнее хранилище.

Создайте файл /usr/local/bin/dokku-backup.sh:


#!/bin/bash

# Каталог для временного хранения бэкапов
BACKUP_BASE_DIR="/mnt/backups/dokku"
DATE=$(date +%Y%m%d%H%M%S)
LOG_FILE="/var/log/dokku_backup.log"

# Создаем директорию для бэкапов, если ее нет
mkdir -p "$BACKUP_BASE_DIR"

echo "--- Dokku Backup Started: $DATE ---" >> "$LOG_FILE"

# 1. Бэкап конфигурации Dokku
echo "Backing up Dokku configuration..." >> "$LOG_FILE"
sudo tar -czf "$BACKUP_BASE_DIR/dokku_config_$DATE.tar.gz" /etc/dokku /home/dokku 2>> "$LOG_FILE"
if [ $? -eq 0 ]; then
    echo "Dokku config backup successful." >> "$LOG_FILE"
else
    echo "Dokku config backup failed!" >> "$LOG_FILE"
fi

# 2. Бэкап всех приложений Dokku
echo "Backing up Dokku applications and databases..." >> "$LOG_FILE"
dokku apps:list --quiet | while read APP_NAME; do
    if [ -z "$APP_NAME" ]; then
        continue
    fi
    echo "  Processing app: $APP_NAME" >> "$LOG_FILE"

    # Бэкап постоянных томов приложения (если есть)
    dokku storage:export "$APP_NAME" > "$BACKUP_BASE_DIR/${APP_NAME}_storage_${DATE}.tar" 2>> "$LOG_FILE"
    if [ $? -eq 0 ]; then
        echo "  Storage for $APP_NAME backed up." >> "$LOG_FILE"
    else
        echo "  Storage backup for $APP_NAME failed or no storage configured." >> "$LOG_FILE"
    fi

    # Бэкап баз данных, привязанных к приложению
    # PostgreSQL
    if dokku postgres:linked "$APP_NAME" &>/dev/null; then
        DB_NAME=$(dokku postgres:linked "$APP_NAME" | head -n 1)
        echo "  Backing up PostgreSQL database $DB_NAME for $APP_NAME..." >> "$LOG_FILE"
        dokku postgres:export "$DB_NAME" > "$BACKUP_BASE_DIR/${APP_NAME}_${DB_NAME}_${DATE}.sql" 2>> "$LOG_FILE"
        if [ $? -eq 0 ]; then
            echo "  PostgreSQL database $DB_NAME for $APP_NAME backed up." >> "$LOG_FILE"
        else
            echo "  PostgreSQL database $DB_NAME backup failed!" >> "$LOG_FILE"
        fi
    fi
    # MySQL
    if dokku mysql:linked "$APP_NAME" &>/dev/null; then
        DB_NAME=$(dokku mysql:linked "$APP_NAME" | head -n 1)
        echo "  Backing up MySQL database $DB_NAME for $APP_NAME..." >> "$LOG_FILE"
        dokku mysql:export "$DB_NAME" > "$BACKUP_BASE_DIR/${APP_NAME}_${DB_NAME}_${DATE}.sql" 2>> "$LOG_FILE"
        if [ $? -eq 0 ]; then
            echo "  MySQL database $DB_NAME for $APP_NAME backed up." >> "$LOG_FILE"
        else
            echo "  MySQL database $DB_NAME backup failed!" >> "$LOG_FILE"
        fi
    fi
    # Redis (может быть экспортирован как RDB-файл или через AOF)
    if dokku redis:linked "$APP_NAME" &>/dev/null; then
        REDIS_NAME=$(dokku redis:linked "$APP_NAME" | head -n 1)
        echo "  Backing up Redis instance $REDIS_NAME for $APP_NAME..." >> "$LOG_FILE"
        # Для Redis обычно рекомендуется делать snapshot через SAVE команду или копировать RDB файл
        # Этот пример просто демонстрирует, что можно что-то сделать.
        # Реальный бэкап Redis требует более сложной логики (например, копирование RDB файла из контейнера)
        echo "  (Redis backup requires direct access to container or SAVE command)" >> "$LOG_FILE"
        # Пример: dokku redis:cli $REDIS_NAME SAVE
        # Затем скопировать файл .rdb из /var/lib/dokku/services/redis/$REDIS_NAME/data/dump.rdb
    fi

done >> "$LOG_FILE" 2>&1

# 3. Очистка старых бэкапов (например, храним бэкапы за последние 7 дней)
echo "Cleaning old backups (older than 7 days)..." >> "$LOG_FILE"
find "$BACKUP_BASE_DIR" -type f -name ".tar.gz" -mtime +7 -delete 2>> "$LOG_FILE"
find "$BACKUP_BASE_DIR" -type f -name ".tar" -mtime +7 -delete 2>> "$LOG_FILE"
find "$BACKUP_BASE_DIR" -type f -name ".sql" -mtime +7 -delete 2>> "$LOG_FILE"
echo "Old backups cleaned." >> "$LOG_FILE"

echo "--- Dokku Backup Finished: $DATE ---" >> "$LOG_FILE"

Сделайте скрипт исполняемым:


sudo chmod +x /usr/local/bin/dokku-backup.sh

3. Куда складывать бэкапы

Хранить бэкапы на том же сервере, что и оригинальные данные, крайне рискованно. В случае выхода из строя диска или компрометации сервера, вы потеряете и данные, и бэкапы.

Рекомендуемые варианты хранения бэкапов:

  • Внешнее S3-совместимое хранилище объектов: Например, AWS S3, DigitalOcean Spaces, Backblaze B2, MinIO. Используйте утилиты типа s3cmd, rclone или aws cli для синхронизации бэкапов из /mnt/backups/dokku.
  • Отдельный VPS: Недорогой VPS в другом дата-центре, куда можно копировать бэкапы по rsync или scp.
  • Сетевое хранилище (NAS): Если у вас есть собственное сетевое хранилище, можно монтировать его по NFS или SMB.

Пример синхронизации с S3 с помощью rclone (после его установки и настройки):


# Добавьте эту строку в конец скрипта dokku-backup.sh
rclone sync /mnt/backups/dokku remote_s3_bucket:dokku-backups --log-file="$LOG_FILE" --log-level INFO

Замените remote_s3_bucket:dokku-backups на настроенное вами имя удаленного хранилища и путь.

4. Автоматизация бэкапов с помощью Cron

Настройте Cron для ежедневного или еженедельного выполнения скрипта бэкапа.


sudo crontab -e

Добавьте следующую строку, чтобы запускать скрипт ежедневно в 3:00 ночи:


0 3    /usr/local/bin/dokku-backup.sh >> /var/log/dokku_backup.log 2>&1

Эта запись будет запускать скрипт каждый день в 3 часа ночи и записывать весь вывод в /var/log/dokku_backup.log.

5. Обновления: Rolling vs. Maintenance Window

  • Обновления ОС и Dokku:
    • Rolling updates: Для минорных обновлений Dokku и пакетов ОС (sudo apt update && sudo apt upgrade -y) можно выполнять их регулярно, возможно, раз в неделю или две. Dokku обычно хорошо справляется с обновлениями без остановки приложений, но всегда есть небольшой риск.
    • Maintenance window: Для мажорных обновлений Dokku или ОС (например, переход с Ubuntu 24.04 на 26.04) настоятельно рекомендуется планировать окно обслуживания. Остановите приложения, сделайте полный бэкап, выполните обновление, проверьте работоспособность. Это минимизирует риски простоя.
  • Обновления приложений:
    • Обновления ваших собственных приложений происходят через git push dokku master. Dokku выполняет "rolling deployment" по умолчанию: новый контейнер запускается, и только после его успешного запуска трафик переключается на него. Старый контейнер удаляется. Это минимизирует время простоя.

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

Troubleshooting + FAQ

Даже при такой удобной платформе как Dokku, иногда возникают проблемы. Ниже приведены типичные вопросы и способы их решения.

Приложение не запускается после деплоя (Deploy failed)

Что проверить: В первую очередь, посмотрите логи деплоя и выполнения приложения. Dokku выводит их в консоль во время git push. Если вы пропустили их, используйте команду dokku logs my-app --tail 100.

Как фиксить: Ищите ошибки, связанные с отсутствующими зависимостями, некорректными командами запуска (например, в Procfile), ошибками в коде или проблемами с переменными окружения. Убедитесь, что ваш Procfile корректен, и все необходимые порты (например, PORT для веб-сервера) настроены правильно и приложение слушает на них. Проверьте, что все необходимые Buildpacks были применены.

Не могу подключиться по SSH к Dokku или деплоить приложения

Что проверить:

  1. Проверьте ваш SSH-ключ: cat ~/.ssh/id_rsa.pub на локальной машине и dokku ssh-keys на сервере. Убедитесь, что публичный ключ добавлен в Dokku.
  2. Проверьте настройки SSH-сервера: sudo nano /etc/ssh/sshd_config. Убедитесь, что PasswordAuthentication no не блокирует вас, если вы не используете ключи, и что PermitRootLogin no не мешает, если вы пытаетесь войти как root.
  3. Проверьте брандмауэр (UFW): sudo ufw status. Убедитесь, что порт 22 (SSH) разрешен.
  4. Убедитесь, что пользователь Dokku (обычно dokku) имеет корректные права.

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

Не работает HTTPS или Let's Encrypt не выдает сертификат

Что проверить:

  1. DNS-записи: Убедитесь, что доменное имя вашего приложения (например, app.yourdomain.com) корректно указывает на IP-адрес вашего Dokku-сервера. Используйте dig app.yourdomain.com.
  2. Брандмауэр: Убедитесь, что порты 80 (HTTP) и 443 (HTTPS) разрешены в UFW (sudo ufw status).
  3. Email для Let's Encrypt: Убедитесь, что вы указали корректный email-адрес с помощью dokku letsencrypt:set my-app email [email protected].
  4. Лимиты Let's Encrypt: Проверьте, не превысили ли вы лимиты запросов на сертификаты.
  5. Логи Let's Encrypt: dokku logs --app my-app --ps letsencrypt или dokku letsencrypt:list my-app для получения статуса.

Как фиксить: Исправьте DNS-записи, откройте порты в брандмауэре, убедитесь в корректности email. Если лимиты превышены, придется подождать или использовать другой домен.

Приложение работает медленно или потребляет слишком много ресурсов

Что проверить:

  1. Логи приложения: dokku logs my-app могут показать ошибки, утечки памяти или неэффективные запросы к БД.
  2. Мониторинг сервера: Используйте htop, free -h, iotop для проверки использования CPU, RAM, диска и сети.
  3. Масштабирование: Возможно, требуется увеличить количество процессов вашего приложения: dokku ps:scale my-app web=2.
  4. Ресурсы БД: Проверьте, не является ли база данных узким местом.

Как фиксить: Оптимизируйте код приложения, запросы к базе данных. Увеличьте ресурсы VPS или рассмотрите масштабирование приложения (горизонтальное или вертикальное). Проверьте конфигурацию Dokku на предмет ограничений ресурсов для контейнеров.

Какой VPS-конфиг минимально подойдёт?

Для запуска Dokku и 1-2 небольших приложений, таких как простой блог или REST API, вам потребуется минимум 2 vCPU, 4 ГБ ОЗУ и 80 ГБ SSD. Этого будет достаточно для базовых задач и изучения платформы. Однако, если вы планируете развертывать несколько приложений, использовать базы данных, кэши или ожидаете умеренную нагрузку, рекомендуется выбрать конфигурацию с 4 vCPU, 8 ГБ ОЗУ и 160 ГБ NVMe SSD для лучшей производительности и стабильности.

Что выбрать — VPS или dedicated для этой задачи?

Для большинства сценариев использования Dokku (разработка, небольшие продакшн-проекты, SaaS для небольших команд) VPS является оптимальным выбором. Он предлагает отличный баланс между стоимостью, гибкостью и производительностью. Dedicated-сервер следует рассматривать только в случаях очень высокой нагрузки, критически важных приложений с жесткими требованиями к производительности и изоляции, большого объема хранимых данных или строгих требований к соответствию нормативным актам, которые требуют физической изоляции оборудования. Если вы только начинаете, всегда выбирайте VPS.

Как добавить домен к приложению?

Для добавления доменного имени к вашему приложению Dokku сначала убедитесь, что вы настроили соответствующую DNS A-запись у вашего регистратора доменов, указывающую на IP-адрес вашего VPS. Затем используйте команду dokku domains:add my-app yourdomain.com, заменив my-app на имя вашего приложения и yourdomain.com на желаемый домен. После этого Dokku автоматически настроит маршрутизацию трафика.

Выводы и следующие шаги

Схема: Выводы и следующие шаги
Схема: Выводы и следующие шаги

Поздравляем! Вы успешно развернули Dokku на вашем VPS, превратив его в мощную и гибкую PaaS. Теперь вы можете наслаждаться простотой развертывания приложений с помощью Git, сохраняя при этом полный контроль над вашей инфраструктурой и значительно экономя на облачных сервисах. Dokku предоставляет разработчикам свободу сосредоточиться на коде, а не на сложной настройке серверов.

Куда двигаться дальше?

  • Исследование плагинов Dokku: Изучите богатую экосистему плагинов Dokku для добавления Redis, MongoDB, RabbitMQ и других сервисов к вашим приложениям. Это значительно расширит функциональность вашей PaaS.
  • Интеграция с CI/CD: Автоматизируйте процесс деплоя с помощью инструментов непрерывной интеграции и доставки, таких как GitHub Actions, GitLab CI/CD или Jenkins. Настройте их так, чтобы каждый успешный коммит в master ветку автоматически запускал git push dokku master.
  • Мониторинг и логирование: Внедрите решения для мониторинга производительности сервера и приложений (например, Prometheus + Grafana) и централизованного логирования (ELK Stack или Graylog), чтобы иметь полную картину состояния вашей инфраструктуры.

Поделиться этой записью:

развёртывание dokku на vps: heroku-подобная paas для быстрого деплоя приложений
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.