В моей последней статье я рассказал о » публикация серверных приложений Kotlin, созданных с Ktor на Heroku «. Мне очень нравится Хероку В качестве места для размещения моих приложений Kotlin, потому что время от настройки моего приложения до наличия его для общественности очень короткое — я могу с уверенностью получить свои прототипы приложений В облаке менее чем за 10 минут , и даже если мне нужна база данных или интеграция с какой -либо другой службой, это может быть разразиться за несколько минут .
Но есть и ситуации, когда я хочу Собственный среда развертывания Для моих веб-приложений Kotlin (в основном ktor )-например, когда я развертываю приложение, которое работает в моей домашней сети, или когда я хочу поддерживать приложение без постоянного платы за всегда на Heroku экземпляры. Но даже в этих ситуациях я не хочу отказываться от всех Удобство, к которому я привык При использовании Heroku.
Введите Докку , который объединяет Лучший из обоих миров Анкет С слоганом «Самая маленькая реализация PAAS, которую вы когда -либо видели» Это платформа с открытым исходным кодом в качестве услуги (PAAS), основанная на Docker, которая позволяет подталкивать приложения к производству через GIT. Его можно легко установить на машину Linux, работающую в вашем доме или арендован у хостингового провайдера.
И самое приятное: во многих отношениях она на самом деле совместима с конфигурацией, которую мы будем использовать для развертывания нашего приложения в Heroku, и, как правило, обеспечивает аналогичный опыт разработчика — даже до уровня BuildPacks , которые автоматизируют большинство частей процесса развертывания для нас!
Однако, поскольку мы сами контролируем фактическую целевую платформу, есть некоторые ключевые различия.
В этом посте я хочу пройти через как развернуть образец Приложение Kotlin (который использует ktor ) для Установка Докку Анкет Особенно в первой части вы увидите много параллелей с моей предыдущей статьей, поскольку конфигурация очень похожа. Однако, когда мы пробираемся к фактическому развертыванию, вы заметите множество различий, которые побудили меня написать отдельную статью для Докку.
Предварительные условия
Для этого прохождения, я предполагаю, что у вас уже есть установка Dokku — либо на виртуальной машине, на сервере, который вы арендовали с помощью какого -то поставщика, либо на машине в вашей домашней сети. Если это не так, вы можете просто следовать инструкциям по установке в превосходном Страница документации Анкет Пока у вас есть сервер, управляющий Debian или Ubuntu, ничто не стоит на пути вращения вашего собственного экземпляра Dokku с помощью одной команды Bootstrap.
Из коробки Dokku уже поставляется с большим количеством абстракций и инструментов, что делает развертывание приложений на бриз — понятие Приложения (контейнер через docker , отсюда и имя) и развертывания , Например. Он заботится о вашей HTTP-маршрутизации (например, в качестве поддоменов, в зависимости от ваших настроек virtualhost ) с автоматически управляемыми nginx
экземпляр, и может быть расширен через плагины Чтобы настроить базы данных и другие службы прямо на вашей локальной машине.
Прежде чем перейти к следующему разделу, также убедитесь, что ваша местная машина SSH -ключ авторизован С вашей установкой Dokku — это делается либо во время первой настройки, либо с Добавление вашего ключа вручную Анкет
Для разработки фактического приложения KTOR вы должны иметь последнюю версию INTELLIJ IDEA Анкет
С этими вещами мы можем прямо в реальном процессе!
Создание нашего приложения KTOR
Ради простоты, мы можем использовать то же простое простое приложение «Привет, мир», показанное в учебном пособии для KTOR по Heroku, так что я собираюсь сохранить этот раздел. (Если у вас уже есть проект KTOR, который вы хотите развернуть, вы можете перейти к следующему разделу напрямую.)
Мы можем легко создать новый проект KTOR либо через онлайн -генератор, доступный по адресу https://start.ktor.io/ , или используйте Плагин Idea Ktor Intellij (оба из которых разоблачают одинаковые параметры конфигурации). Я использую плагин KTOR (который можно получить через файл | новый… | Проект после установки). Здесь мы включим опцию «Gradle Kotlin DSL» для проекта и добавляем функцию «Маршрутизация»:
Мы вводим желаемое название проекта и идентификатор артефакта на страницах, которые следуют в мастере. После того, как Градл импортировал, у нас есть готовый минимальный проект «Hello World». Как обычно, мы можем запустить его локально, ориентируясь в Application.kt
Файл в нашем исходном каталоге и нажимает кнопку «Запустить» в желобе рядом с основной функцией.
С минимальной настройкой локальной приложения мы можем перейти к интересной части — Настройка приложения приложения Kotlin для запуска на Dokku !
Настройка нашего приложения KTOR для развертывания Dokku
Dokku (и Gradle Buildpack, с которой он отправляется) требует, чтобы наше заявление выполнило три критерия (те же требования, что и для Heroku):
- Наше приложение должно Уважайте
Порт
переменная среды : Докку назначает наше приложение порт на что выслушать входящие запросы, и Доккуnginx
-На основе прокси -сервера приносит HTTP -трафик в нашу приложение в этом порту. Как указано в документации, этот порт Обычно5000
— Но это не гарантировано, поэтому важно вместо этого полагаемся на переменную среды. - Наше приложение должно предоставить
Стадия
задача : Докку использует эту задачу через Heroku’s Gradle BuildPack Чтобы превратить нашу программу в исполняемый файл при развертывании. - Наше приложение должно предоставить
Procfile
: Этот файл определяет команды (ы), которые будут выполнены при запуске приложения (подробнее по этой теме Здесь ) — Поэтому нам нужно указать на это на исполняемый файл, который был сгенерирован во время развертывания.
Давайте кратко рассмотрим то, что нам нужно сделать, чтобы заполнить каждый из трех критериев.
Переменная среды порта
Поскольку мастер KTOR поставляется с умной конфигурацией по умолчанию, нам на самом деле не нужно вносить здесь какие -либо изменения — наше приложение уже настроено для уважения переменной среды порта. Мы можем увидеть это в Application.conf
Файл в каталог ресурсов нашего проекта. Это Hocon Файл устанавливает порт по умолчанию нашего приложения на 8080, опционально переоценивая его содержимым Порт
переменная среды, когда она присутствует:
ktor { deployment { port = 8080 port = ${?PORT} } application { modules = [ io.sebi.ApplicationKt.module ] } }
Это именно то, что мы хотим: при разработке локально наше приложение всегда назначается один и тот же порт, 8080
и при развертывании в Докку, настройки, продиктованные окружающей средой, уважаются.
Задача сцены Gradle
Докку использует Хероку Механизм BuildPack Чтобы превратить исходный код нашего проекта в исполняемый файл во время развертывания, который можно запустить при запуске приложения. Для приложений Gradle, BuildPack Ищет Стадия
задача создать исполняемые артефакты. Градл плагин приложения , который включен по умолчанию, если вы создали свое приложение через мастер KTOR, уже поставляется с задачей, называемой InstallDist
что делает именно это. Мы можем просто создать псевдоним для него под названием сцена
. Если вы выбрали DSL Gradle Kotlin, как было предложено ранее в учебном пособии, вы можете просто использовать этот фрагмент для создания задачи, которая не выполняет ничего, кроме выполнения InstallDist
:
tasks.create("stage") { dependsOn("installDist") }
Прокляция
Procfiles Скажите Докку, какой двоичный или скрипт должен быть выполнен, когда наше приложение запускается платформой. Мы хотим указать этот файл на вывод, сгенерированный Стадия
Задача с предыдущего шага. Procfile вызывается только после того, как Стадия
Задача уже завершила создание нашего приложения, а также сценарий запуска в Build/Install/ProjectName/Bin/ProjectName
был создан. Мы указываем Докку на этот сценарий, чтобы запустить наше приложение. В корне нашего проекта давайте создадим файл с именем Procfile
и добавить в него следующий контент (с ProjectName
заменить название нашего проекта):
web: ./build/install/projectName/bin/projectName
С этим мы подготовили нашу заявку на развертывание на Докку! На данный момент эти инструкции были очень похожи на приложение, нацеленное на Heroku (всегда замечательно не учитывать одно и то же дважды!) -Но это также тот момент, когда конфигурации начнут становаться более специфичными для Докку.
На самом деле развертывание нашего приложения
Настройка локального репозитория GIT
Чтобы получить наш исходный код в наш экземпляр Dokku, мы проталкиваем его через GIT — для этого нам нужен локальный репозиторий и GIT Remote, который находится на нашем сервере Dokku, и это связано с «приложением» (набор конфигураций Dokku Относительно нашего проекта) мы хотим развернуть.
Для этого нам необходимо создать локальный репозиторий для нашего проекта, который может быть сделан непосредственно из INTELLIJ IDEA с Command VCS | Включить интеграцию управления версиями ….
Далее нам нужно совершить наш проект на местном уровне. В Intellij Idea перейдите в окно инструмента «Commit» с левой стороны и совершайте все незавершенные файлы. (Не беспокойтесь о вручную, исключая /Build
или /идея
Папки-Волшебник проекта KTOR уже автоматически сгенерировал .gitignore
файл для нас, который заботится о них.)
Создание приложения Dokku и развертывания! 🚀
Принимая во внимание, что Heroku поставляется с причудливым инструментом для создания приложения через локальную командную строку через Heroku Cli Делать то же самое на Докку немного более вовлечено, но все равно может быть сделано в жаркую минуту. Докки Докку (хе) содержит обширную информацию об общем процессе. Для нас это сводится к следующему.
Мы устанавливаем связь с нашим хозяином Докку через SSH, заменив my.dokku.host
с соответствующими значениями:
ssh root@my.dokku.host
На хосте Dokku мы создаем новое приложение для нашего приложения KTOR:
root@my.dokku.host:~# dokku apps:create myprojectname ----------> Creating myprojectname...
Это устанавливает набор конфигураций для нашего приложения на сервере, а также устанавливает репозиторий GIT на нашем сервере Dokku.
Как только процесс создания завершится, пришло время вернуться к нашему локальному применению и подключить этот новый пульт GIT. Каждый раз, когда мы хотим развернуть новую версию нашего приложения, мы просто подтолкнем к этому удаленному, Dokku вызовет нашу BuildPack и начнет наше приложение.
Есть два простых способа добавить нашего хоста Dokku в качестве удаленного GIT для нашего местного репозитория: через командную строку и через пользовательский интерфейс IntelliJ Idea.
Чтобы добавить удаленное через клиент командной строки GIT, мы выполняем следующую команду в корне нашего локального проекта, заменив my.dokku.host
и myProjectName
Для соответствующих значений:
git remote add dokku dokku@my.dokku.host:myprojectname
Это добавляет пульт под названием Докку
который указывает на репозиторий GIT на my.dokku.host
называется myProjectName
который связан с приложением Dokku и конфигурацией того же имени.
Мы также можем использовать пользовательский интерфейс IntelliJ Idea, чтобы сделать то же самое. Чтобы добавить пульт, мы перемещаемся в VCS | Управление пультами….
Это открывает новое окно, которое позволяет нам, как следует из названия, управлять нашими пультами GIT. Нажав кнопку «+», мы определяем новый пульт и заполняем необходимую информацию — мы называем удаленное Докку
и установить свой URL на dokku@my.dokku.host: myProjectName
, заменить хост и название проекта:
Точно так же мы готовы к отъезду! Мы запускаем развертывание нашего приложения в наш экземпляр Dokku, выдвинув коммит, который мы сделали в предыдущем разделе к Докку
Git remote мы только что представили. Мы можем сделать это через INTELLIJ IDEA через VCS | Git | Толкнуть…, или через git push
на терминале.
Мы подтверждаем толчок, и теперь просто нужно подождать, пока наше приложение не прибудет в наш экземпляр Dokku! Этот толчок займет больше времени, чем вы могли бы привыкнуть, потому что Докку строит наше приложение сразу же, когда мы его толкаем (и даже отвергает толчок, если приложение не удается построить!). Если вы заинтересованы в том, чтобы следить за прогрессом, вы можете открыть окно инструмента «git» в нижней части идеи Intellij, чтобы увидеть, что происходит на заднем плане. Если все пошло по плану, вы увидите подтверждающее сообщение в журналах:
remote: BUILD SUCCESSFUL in 1m 29s remote: 6 actionable tasks: 6 executed remote: -----> Discovering process types remote: Procfile declares types -> web remote: -----> Releasing myprojectname... remote: -----> Deploying myprojectname... remote: -----> App Procfile file found remote: -----> DOKKU_SCALE file exists remote: =====> Processing deployment checks remote: No CHECKS file found. Simple container checks will be performed. remote: -----> Attempting pre-flight checks (web.1) remote: Waiting for 10 seconds ... remote: Default container check successful! remote: -----> Running post-deploy remote: -----> Creating new app virtual host file... remote: -----> Configuring myprojectname.my.dokku.host...(using built-in template) remote: -----> Creating http nginx.conf remote: Reloading nginx remote: -----> Renaming containers remote: Renaming container (7405ef19e607) vibrant_curran to myprojectname.web.1 remote: -----> Checking for postdeploy task remote: No postdeploy task found, skipping remote: =====> Application deployed: remote: http://myprojectname.my.dokku.host
Давайте перейдем к ссылке нашего проекта, который мы можем увидеть в последней строке, и соблюдаем наше приложение, работая на нашем экземпляре Dokku! Точно так же вы можете отпраздновать развертывание вашего приложения в сети!
Что дальше?
Как вы, возможно, заметили, наше приложение доступно на нашем хосте Dokku сейчас, но только незашифрованным образом (обратите внимание на отсутствие https
в адресной строке). К счастью, мы живем в эпоху LetsEncrypt Предлагая бесплатные сертификаты TLS, и Dokku позволяет легко включить автоматический сертификат и настройку для нашего приложения через Dokku-lletsencrypt плагин. Я настоятельно рекомендую настроить этот плагин, чтобы люди, использующие наше приложение, могли получить надежно зашифрованное веб-трафик. После установки (см. Установка и Начальная настройка инструкции ), мы можем включить интеграцию letsEncrypt для нашего приложения с помощью одной команды:
root@my.dokku.host:~# dokku letsencrypt myprojectname
Как и другие удобные платформы в качестве услуги, Докку предоставляет тонну плагины что позволяет вам оснастить ваше приложение с помощью самостоятельных баз данных, магазинов клавиш, индексов поиска и многого другого. Исследуйте страницу плагинов в документации Dokku и посмотрите, какие плагины доступны. С всего лишь несколькими командами оболочки вы можете включить все из них для вашего приложения KTOR и использовать их непосредственно из кода Kotlin. А поскольку вы размещаете свой собственный экземпляр Dokku, вам не будет выставлено счет по количеству строк в вашей базе данных или сколько мегабайт хранения объектов использует ваше приложение.
Как правило, мы видели, как настроить простой рабочий процесс для публикации новых изменений нашего приложения Kotlin на нашем сервере Dokku: внесите изменение, совершите изменение, подтолкните изменение в Докку Мастер
— И через минуту или две наши изменения будут видны при посещении URL нашего приложения на нашем хосте Dokku.
Спасибо за чтение! 🤗
Мне очень нравится использовать Dokku для развертывания моих боковых проектов в Интернет, потому что для меня лично это наносит идеальный баланс между удобством (Мне не нужно тратить слишком много времени на ops часть DevOps) и контроль (Я все еще могу владеть инфраструктурой, и мне легко предоставить новые услуги по адресу без дополнительных затрат , даже когда я их интенсивно использую).
Надеюсь, вы нашли этот учебник полезным. Если у вас есть какие -либо вопросы или идеи о том, что охватить дальше, пожалуйста, дайте мне знать, и Свяжитесь здесь или на Twitter !
Оригинал: «https://dev.to/kotlin/deploying-server-side-kotlin-ktor-applications-on-dokku-1iee»