Как упростить себе жизнь с помощью Dokku

Разбираем почему Dokku - это хорошо

При работе над небольшими личными проектами я часто сталкивался с дилеммой: "как мне разворачивать это приложение?"

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

  • ручной деплой - когда мы заходим на сервер через SSH, скачиваем код нашего сервиса (например с git) и запускаем
  • GitHub / GitLab Workflows - наверно самый распространенный способ настройки автоматического CI/CD

Лично мне, с одной стороны, не всегда хочется тратить время на настройку CI/CD небольших проектов, так как на это может уйти больше времени чем на саму разработку. С другой, "ручной деплой" - это одна из самых нелюбимых частей работы над личными проектами и хочется чтобы все происходило "само" 🪄

Отличным вариантом "по середине" как раз таки и является Dokku, он довольно просто настраивается, не требует запуска всяких раннеров (как GitHub / GitLab) под каждый проект (на GitHub, например, нельзя настроить использование одного раннера на несколько личных репозиториев, такая функция доступна для репоизиториев организации) и практически отвязывает ваc от использования самих GitHub / GitLab.

Что такое Dokku?

Если вы когда-нибудь слышали про Heroku или даже пользовались им, то с Dokku вы, можно сказать, уже знакомы.

Dokku - это так называемый self-hosted PaaS, если проще - платформа для запуска и управления сервисами, которую вы можете развернуть своем личном сервере.

Под капотом Dokku использует две знакомые практически каждому разработчику технологии:

  1. Git - для доставки кода на сервер. Чтобы развернуть новую версию проекта достаточно сделать git push на адрес сервера с Dokku.
  2. Docker - для сборки и запуска сервисов

Мини гайд по началу работы с Dokku

Далее приведу небольшие инструкции, которые помогут начать работать с Dokku и развернуть свой первый проект.

В качестве демонстрационного проекта будем использовать одну HTML страницу, которую будет раздавать простой HTTP-сервер.

Установка Dokku

На сайте Dokku приводятся следующие инструкции по установке:

# download the installation script
wget -NP . https://dokku.com/bootstrap.sh

# run the installer
sudo DOKKU_TAG=v0.34.8 bash bootstrap.sh

# Configure your server domain
dokku domains:set-global dokku.me

# and your ssh key to the dokku user
PUBLIC_KEY="your-public-key-contents-here"

echo "$PUBLIC_KEY" | dokku ssh-keys:add admin

Генерация ssh-ключа

Так как Dokku использует git для доставки кода, желательно настроить использование ssh-ключей:

# генерируем ключ
ssh-keygen -t ed25519 -C "dokku"

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

echo '<публичный ключ>' | sudo dokku ssh-keys:add admin

Развертывание сервиса

Создание и развертывание сервиса фактически состоит из четырех этапов:

  1. Конфигурация проекта
  2. Доставка исходного кода
  3. Сборка сервиса
  4. Запуск сервиса

Предлагаю для тестирования использовать небольшую HTML страничку. Создадим файл index.html со следующим содержанием:

<html>
    <body>
        <h1>Hello World</h1>
    </body>
</html>

Конфигурация проекта

Давайте создадим в Dokku приложение с названием hello-world:

dokku apps:create hello-world

В папке проекта нам необходимо создать файл Procfile - в нем будет описано какой командой запускать наш проект:

Procfile
web: python -m http.server

Эта команда запустит простой HTTP сервер. Если ее выполнить и перейти на http://127.0.0.1:8000/ - то мы увидим нашу index.html страницу.

Последнее что нам понадобится - это создать Dockerfile, в котором мы опишем как собирать наш проект:

Procfile
FROM python:3.12-slim
WORKDIR /app

COPY ./index.html ./index.html

Доставка исходного кода сервиса

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

Для начала нужно добавить сервер Dokku как еще один remote в наш git репозиторий:

git remote add dokku ssh://dokku@{ip адрес сервера с dokku}:{порт}/hello-world

Это команда добавляет в наш репозиторий новый remote с названием dokku, с помощью которого мы сможем разворачивать приложение hello-world.

Развернуть новую версию приложения теперь можно простой командой:

git push dokku main

После успешного деплоя первой версии остается последний вопрос: "Как получить доступ к приложению?"

Для этого нам необходимо указать Dokku, какой внешний порт сервера пробросить на внутренний порт приложения:

dokku ports:add hello-world http:8001:8000

Эту команду можно расшифровать так: "Сделай так, чтобы зайдя на порт 8001 я видел то, что показывает приложение hello-world на порту 8000".

Проверим:

$ curl 127.0.0.1:8001
<html></html>
    <body>
        <h1>Hello World</h1>
    </body>
</html>

Видим нашу index.html страницу. Все сработало!

Подробнее ознакомиться с тем как работает Dokku и как его настраивать можно в официальной документации.

Всего хорошего!