Как упростить себе жизнь с помощью 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 использует две знакомые практически каждому разработчику технологии:
- Git - для доставки кода на сервер. Чтобы развернуть новую версию проекта достаточно сделать
git push
на адрес сервера с Dokku. - 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
Развертывание сервиса
Создание и развертывание сервиса фактически состоит из четырех этапов:
- Конфигурация проекта
- Доставка исходного кода
- Сборка сервиса
- Запуск сервиса
Предлагаю для тестирования использовать небольшую 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 и как его настраивать можно в официальной документации.
Всего хорошего!