Deploy
September 6, 2024

Dokploy - самый удобный вариант деплоя проектов

Cодержание

1. Dokploy

Краткий обзор вариантов развертывания

2. Установка

3. Обзор настроек Dokploy

Привязка домена в Dokploy

Привязка Github в Dokploy

Добавление SSH ключей

Добавление уведомлений

4. Развертывание проектов

Развертывание статичного сайта

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

Развертывание сервиса из Docker-образа

Развертывание сервиса из compose.yml файла

Развертывание БД

5. Настройка сервиса

Привязка домена к сервису

Настройка авто-развертывания

Объединяем сервис

6. Заключение

1. Dokploy

Dokploy - это как заявляет сам автор стабильное и простое в использовании решение для развертывания, предназначенное для упрощения процесса управления приложениями. Оно позиционируется как бесплатная самостоятельная альтернатива таким платформам, как Heroku, Vercel и Netlify, использующей надежность Docker и гибкость Traefik.

Dokploy позволяет очень удобно деплоить ваши проекты без траты времени на настройку VPS. Есть возможность хранить одновременно несколько проектов на одном VPS. Так же просто и быстро реализовывать авто-деплой приложения на VPS. Упрощает администрирование хостинга. Повышает удобство мониторинга нагрузки как на весь хостинг, на каждый проект и на каждый сервис. Так что единственное, что вам нужно будет сделать в терминале, это установить сам Dokploy.

Подробнее о проекте вы можете почитать на сайте или в документации

Краткий обзор вариантов развертывания

Dokploy предоставляет следующие варианты для добавления сервисов в проекте:

  • Application - базовый вариант развертывания с гибкими настройками
    • Есть различные источники кода, такие как:
      • Github - позволяет прямо в Dokploy выбирать репозитории для развертывания см. Привязка Github в Dokploy. Привязка Github в Dokploy.
      • Docker - позволяет развертывать сервис из Docker-образа см. Развертывание сервиса из Docker-образа.
      • Git - позволяет развертывать сервис указав ссылку на репозиторий.
      • Drop - позволяет развертывать сервис вручную загрузив исходный код архивом.
    • И типы сборки сервиса:
      • Dockerfile - использованием Dockerfile для сборки см. Развертывание сервиса из Dockerfile.
      • Nixpacks - автоматически собирает окружение приложения на основе его структуры и зависимостей.
      • Heroku Buildpacks - предоставляет автоматическую настройку окружения и зависимостей приложения.
      • Paketo Buildpacks - предназначен для создания OCI (Open Container Initiative) образов, оптимизированных для контейнеризированных приложений.
      • Static - используется для развертывания статических сайтов.
  • Database - в пару кликов позволяет поднять базу данных.
  • Compose - позволяет развертывать сервисы из compose.yml файлов.
  • Template - содержит список шаблон с открытым исходным кодом для развертывания в своем проекте см. весь список шаблонов.

2. Установка

Установка происходит одной командой которая указана сразу на главной странице.

 curl -sSL https://dokploy.com/install.sh | sh

Так же есть возможность ручной установки с кастомной настройкой. Ссылка на раздел в документации.

Мы вводим её и ожидаем некоторое время. После установки в терминале будет выведена ссылка на создание пользователя, формата:

http://<IP-вашего-VPS>:3000

Затем переходим по ссылке и вводим запрашиваемые данные. После чего мы попадаем на dashboard.

3. Обзор настроек Dokploy

Dokploy позволяет удобно настраивать VPS под ваши нужды, не заставляя вас на долго увязнуть в терминале. Он позволяет в несколько кликов привязать домен к VPS и получить бесплатны SSL. Так же позволяет легко привязать свой Github для доступа к репозиториям. Давайте рассмотрим некоторые из возможных настроек Dokploy.

Привязка домена в Dokploy

  1. Настраиваем DNS например на Cloudflare. Добавляя вот такую запись.
    • Указав dashboard в поле name. Мы делаем запись в DNS которая будет направлять запросы с указанием домен dashboard.test.com на IP который вы указали в соответствующем поле.
    • Если вы не знаете свой IP вы можете узнать его если перейдете в dashboard в раздел Settings, откроете раздел Server и спуститесь в конце страницы.
  2. Далее мы добавляем домен в самом Dokploy. Для этого заходим в Settings->Server. И добавляем наши данные:

Теперь ваш домен привязан и выдан SSL сертификат с помощью Letsencrypt. Dokploy dashboard будет доступен по указанному под-домену. А основной домен можно легко привязать к вашему проекту.

Привязка Github в Dokploy

Привязка Github позволяет:

  • Деплоить проект из непубличного репозитория.
  • Удобно выбирать репозитории для деплоя сразу при создании сервиса.

Для этого просто переходим в Settings->Server.


Добавление SSH ключей

Добавление SSH ключей это альтернатива прошлому пункту с привязкой GH. Их различие в том, что добавление ключа позволяет просто клонировать приватные репозитории по ссылке. Публичные репозитории можно клонировать и без него.

Для добавления SSH ключа нам нужно:

  1. Перейти в Settings->SSH Keys.
  2. Генерируем ключ в Dokploy или вручную и добавляем его.
  3. Затем Public Key добавляем в профиле GH. Перейдя в Настройки профиля -> пункт SSH and GPG keys.


Добавление уведомлений

Уведомления это очень удобная функция в Dokploy для автоматическое отслеживание состояния развертывания проекта. Самое удобное, что уже реализована интеграция с различными платформами для получения уведомлений. Можно выбрать триггеры после которых вы хотите получать уведомления например: при развертывании, при сбое сборки и тд.

Список интегрированных платформ для получения уведомлений:

Для того чтобы настроить эту функцию, нам нужно

  1. Перейти в Settings -> Notification.
  2. Выбрать платформу на которую вы хотите получать уведомления.
  3. Заполнить запрашиваемые данные для вашей платформы и выбрать триггеры.

Список возможных триггеров:

4. Развертывание проектов

Деплой так же как и настройка не требует особых усилий. Сейчас мы разберем возможности Dokploy в развертывании проектов. Посмотрим как развертывать статичные сайты, как подминать базы данных и тому подобное.

Развертывание статичного сайта

Структура проекта для примера:
> shrek-website/ 
> 	│ 
> 	├── index.html 
> 	├── characters.html 
> 	├── gallery.html 
> 	├── styles.css 
> 	└── images/ 
> 		 ├── shrek.jpg 
> 		 ├── donkey.jpg 
> 		 ├── fiona.jpg 
> 		 └── dragon.jpg

Первый наш пример будет описывать развертывание самого простого статичного сайта.

  1. Мы создаем новый проект нажав на кнопку Create Projec
  2. Далее переходим в проект и нажимаем кнопку Create Service и выбираем пункт Application в выпадающем меню.
  3. Выбираем удобный вам источник кода. Если у вас публичный репозиторий то просто укажите ссылку на него. А если он приватный то вам пригодится настройка привязки Github или добавление SSH ключей из прошлого раздела.
    • Если вы привязали GH то просто выберете репозиторий из списка
    • Если вы добавляли SSH ключ то вставьте SSH ссылку типа git@github.com:username/repositories_name.git которую можно скопировать на станице репозитория и выберите SSH ключ.
  4. В поле Branch выберите с какой ветки вы хотите брать код. А поле Build Path оставьте не тронутым если у вас файл index.html расположен там же как в примере в корне репозитория.
  5. Теперь выбираем тип сборки. В этом примере будем использовать тип Static, но так же можно использовать Nixpacks
  6. Сохраняем всё и нажимаем кнопку Deploy и ждём пока в разделе Deployments не появится записи с статусом Done

Информацию о настройке сервисов смотрите в разделе 5. Настройка сервисов , там вы узнаете как привязать домен или настроить авто-развертывания.

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

В данном примере мы рассмотрим как деплоить сервис из написанного нами Dockerfile. Например проект из прошлого примера развился до нового уровня и для сайта потребовалось написать back-end.

Структура проекта теперь выглядит так:
> shrek-website/ 
> 	│ 
> 	├── front-end 
> 	│ 	├── index.html 
> 	│ 	├── characters.html 
> 	│ 	├── gallery.html 
> 	│ 	├── styles.css 
> 	│ 	├──Dockerfile
> 	│ 	└── images/ 
> 	│       ├── shrek.jpg 
> 	│       ├── donkey.jpg 
> 	│       ├── fiona.jpg 
> 	│       └── dragon.jpg
> 	│ 
> 	├── back-end
> 	│ 	├── main.py
> 	│ 	├── requirements.txt
> 	│ 	└── Dockerfile
> 	│ 
> 	└── docker-compose.yml

Если front-end мы можем и не трогать, просто изменив `Build Path` в настройках сервиса c / на /front-end и всё. То back-end нам нужно развертывать из Dockerfile где прописана инструкция сборки образа. Для этого мы:

  1. Создаем новый сервис в приложении.
  2. Так же выбираем Applicationиз выпадающего меню.
  3. Выбираем из списка или указываем ссылку на репозиторий.
  4. В Build Path указываем путь к папке в которой лежит Dockerfile. Для проекта из примере это будет /back-end
  5. В Build Typeвыбираем Dockerfile.
  6. В поле Docker File вводим путь ./Dockerfile
  7. Поле Docker Context Path или оставляем пустым или вводим путь к папке с Dockerfile.
  8. Сохраняем настройки и развертываем.

Информацию о настройке сервисов смотрите в разделе 5. Настройка сервисов , там вы узнаете о настройках авто-развертывания.

Развертывание сервиса из Docker-образа

Так же мы можем собирать образы нашего проекта локально, затем отправлять их на Docker Hub и потом деплоить. Этот вариант может быть удобнее так как в этом случае развертывание занимает меньше времени в сравнение с развертыванием из Dockerfile. Всё потому, что мы проводим процесс сборки образа локально, при деплое нам остается всего лишь запустить его. Вот как это происходит:

  1. Локально собираем образ нашего проекта и отправляем его на Docker Hub:
    1. Собираем образ командой: docker build -t image-name:tag .
      • Указываем . в конце команды если запускаем её из директории в которой хранится Dockerfile. Если нет то переходим в нужную директорию или прописываем путь к ней.
    2. Создаем тег для образа командой:
      • docker tag image-name:tag myusername/image-name:tag
    3. Отправляем образ на Docker Hub командой:
      • docker push myusername/image-name:tag
  2. Создаем новый сервис в приложении.
  3. Так же выбираем Application из выпадающего меню.
  4. В поле Docker Image указываем образ в таком формате:
    • myusername/image-name:tag
  5. Затем указываем данные от Docker Hub.
  6. В разделе Build Typeвы можете выбрать любой вариант.
    • Если Dockerfile в поле Docker File вводим ./Dockerfile, а Docker Context Path оставляете пустым.
    • Если Nixpacks можем указать / или .

Информацию о настройке сервисов смотрите в разделе 5. Настройка сервисов , там вы узнаете о настройках авто-развертывания.

Развертывание сервиса из compose.yml файла

Так же есть возможность развертывать сервисы используя `compose`. Это позволяет более гибко настраивать конфигурацию контейнера в compose.yml файлах. Например у вас одна конфигурация под продакшен, другая под тестирования и ещё одна под разработку. Для того чтобы развернуть сервис нужно:

  1. Создаем новый сервис в приложении.
  2. И тут уже выбираем не Application, а Compose из выпадающего меню.
  3. В разделе выбора источника кода, можно как выбрать из списка или указать ссылку на репозиторий, так и вставить в ручную нужную конфигурацию выбрав Raw.
  4. Если вы не используете уже готовый Docker-образ, то выбираем ветку и указываем путь к .yml.

При использовании compose сервис не сможет обращаться к другим сервисам в проекте, например к БД по Internal Host см. Развертывание БД. Для этого нам нужно добавить dokploy-network в конфигурации контейнера см. Раздел 5. Настройка сервисов - Объединяем сервисы.

Развертывание БД

Одно из самых удобных в Dokploy это поднятие базы данных. Это делается в пару кликов:

  1. Создаем новый сервис в приложении.
  2. И тут выбираем Database из выпадающего меню.
  3. Выбираем нужную БД.
  4. Заполняем обязательные поля. В поле Docker image мы можем указать определенную версию образа БД.

После создания база данных будет доступна только внутри проекта из сервисов обращаясь к ней с помощью её Internal Connection URL. Если вам нужно получать к ней внешний доступ , то просто укажите External Port и появится External Host URL по которой вы сможете получить к ней доступ. Так же смотрите Раздел 5. Настройка сервисов - Объединяем сервисы.

5. Настройка сервиса

Привязка домена к сервису

Плюсов использования Dokploy является не только возможность быстро и легко привязывать домены и выдавать на них SSL, а так же генерировать бесплатные домены с помощью Traefik. Для того чтобы привязать или сгенерировать домен для сервиса, нам нужно:

  1. Открыть нужный нам сервис, перейти в раздел Domains
  2. Нажать кнопку Add Domain
  3. Затем или ввести свой домен в поле Host или нажать на кнопку генерации домена.
  4. В поле Path мы вводи путь, например если мы хотим чтобы сервис отвечал по запросу на shrek.com/api
  5. Указываем порт который слушает сервис
  6. И если нам нужен HTTPS включаем его и выбираем или Letsencrypt(выдает бесплатные сертификаты) или добавленный вручную сертификат.

Подождите некоторое время после добавления домена и/или сертификата, применение изменений может занять некоторое время.

Настройка авто-развертывания

Так же очень удобная вещь которая так же настраивается в пару кликов. Авто развертывание можно настроить с такими платформами как GitHub, GitLab, Bitbucket, Gitea, DockerHub. Давайте рассмотрим парочку из них.

GitHub

  1. Перейти в нужный сервис, в раздел Deployments
  2. Скопировать Webhook URL
  3. Зайти в Github. Репозиторий -> Settings -> Webhooks и нажать кнопку Add webhook
  4. В поле Payload URL вводим Webhook URL
  5. Значение в поле Content type меняем на application/json
  6. Можете оставить обновление сервиса после push ивента или выбрать нужные вам триггеры

DockerHub

Авто-развертывание после обновления образа можно настроить только с собственным образом

  1. Перейти в нужный сервис, в раздел Deployments
  2. Скопировать Webhook URL
  3. Перейти на страницу образа на Docker Hub нажать кнопку Manage Repository
  4. Перейти в раздел Webhooks
  5. Указать Webhook URL в поле Webhook URL

Теперь, после обновления кода в репозитории или обновления образа, сервис также будет обновляться. Единственный минус заключается в том, что если вы обновили код, не относящийся к коду сервиса, он всё равно будет обновлён.

Объединяем сервис

В случаях, когда служба развернута из файла compose.yml, она находится в своей собственной сети и не видит другие службы. Однако Dokploy позволяет решить эту проблему, используя dokploy-network. Для этого нам нужно добавить использование networks в конфигурацию сервиса следующим образом:

networks:
  dokploy-network:
    external: true

6. Заключение

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