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

Отримати VPS arrow_forward
eco Початковий Туторіал

Розгортання Dokku

calendar_month Jul 09, 2026 schedule 22 хв. читання visibility 30 переглядів
Развёртывание 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 Резервне копіювання розпочато: $DATE ---" >> "$LOG_FILE"

# 1. Резервне копіювання конфігурації Dokku
echo "Резервне копіювання конфігурації Dokku..." >> "$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 успішне." >> "$LOG_FILE"
else
    echo "Резервне копіювання конфігурації Dokku не вдалося!" >> "$LOG_FILE"
fi

# 2. Резервне копіювання всіх застосунків Dokku
echo "Резервне копіювання застосунків та баз даних Dokku..." >> "$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 "  Сховище для $APP_NAME резервно скопійовано." >> "$LOG_FILE"
    else
        echo "  Резервне копіювання сховища для $APP_NAME не вдалося або сховище не налаштовано." >> "$LOG_FILE"
    fi

    # Резервне копіювання баз даних, прив'язаних до застосунку
    # PostgreSQL
    if dokku postgres:linked "$APP_NAME" &>/dev/null; then
        DB_NAME=$(dokku postgres:linked "$APP_NAME" | head -n 1)
        echo "  Резервне копіювання бази даних PostgreSQL $DB_NAME для $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 $DB_NAME для $APP_NAME резервно скопійована." >> "$LOG_FILE"
        else
            echo "  Резервне копіювання бази даних PostgreSQL $DB_NAME не вдалося!" >> "$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 "  Резервне копіювання бази даних MySQL $DB_NAME для $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 $DB_NAME для $APP_NAME резервно скопійована." >> "$LOG_FILE"
        else
            echo "  Резервне копіювання бази даних MySQL $DB_NAME не вдалося!" >> "$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 "  Резервне копіювання екземпляра Redis $REDIS_NAME для $APP_NAME..." >> "$LOG_FILE"
        # Для Redis зазвичай рекомендується робити знімок через команду SAVE або копіювати файл RDB
        # Цей приклад просто демонструє, що можна щось зробити.
        # Реальне резервне копіювання Redis вимагає складнішої логіки (наприклад, копіювання файлу RDB з контейнера)
        echo "  (Резервне копіювання Redis вимагає прямого доступу до контейнера або команди SAVE)" >> "$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 "Очищення старих резервних копій (старших за 7 днів)..." >> "$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 "Старі резервні копії очищено." >> "$LOG_FILE"

echo "--- Dokku Резервне копіювання завершено: $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 на предмет нових версій та рекомендацій щодо оновлення.

Вирішення проблем + 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.