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

Так у меня и родилась идея сделать одну полную инструкцию (прежде всего для себя), где в одном месте будет описан процесс деплоя. Если Вы читаете эту статью, значит мне удалось решить проблему «первой публикации приложения на сервер». К Вашему вниманию любимая рубрика «инструкция для чайников – как самостоятельно сделать свой первый деплой».

Дисклеймер:

Я классический вкатун с полного нуля; Java первый и на момент написания статьи единственный язык программирования, который я знаю; это моя первая статья; в этой статье нет рекламы; я не проходил платных курсов; у меня нет регулярного ментора.

Конец дисклеймера.

Шаг 0 – Java приложение

Этот шаг я добавляю скорее для еще одного дисклеймера – эта статья подразумевает, что у вас уже есть работающее Java приложение, которое может запустится и получить HTTP запрос из браузера. О том как сделать такое приложение, есть очень много статей и видео, оставлю выбор материала на ваш вкус.

Шаг первый – аренда сервера

Для каждого из нас, самым первым сервером становится localhost. Когда приложение запускается на компьютере, localhost указывает на местоположение этого приложения на том же компьютере. По сути, это специальное имя, которое используется для доступа к устройству, на котором запущено приложение, через сетевые запросы. Это позволяет приложению взаимодействовать с другими компонентами программы без необходимости использовать внешнюю сеть. Другими словами, доступ к Вашему приложению будет ограничен только локальной сетью, но как получить доступ через Интернет?

Для этого необходим «Белый IP адрес» — это уникальный идентификатор, присваиваемый устройству или сети, подключенной к Интернету. В отличие от частных IP-адресов, которые используются в локальных сетях, белый IP-адрес обеспечивает уникальность и доступность устройства или сервера в глобальной сети. В «обычных домашних» условиях мы пользуемся «Серыми IP адресами», потому что «белых» ограниченное количество. Поэтому у нас есть, по сути, два варианта – покупка у своего интернет провайдера «белого» адреса и самостоятельная настройка сервера, либо приобретение готового серверного решения. Как Вы понимаете, я выбрал второй вариант.

Сайтов и сервисов для аренды виртуального сервера бесчисленное множество, выбирайте на вкус и цвет. Мой выбор остановился на FirstVDS, где я по цене чашки кофе арендовал сервер на месяц, с предустановленной ОС Debian 10, т.к. именно ее посоветовали в одном из чатов (еще раз повторюсь это не реклама, Вы можете выбрать любой другой).

Шаг второй – подключение к серверу

Программа PuTTY

После получения доступа к желаемому серверу, необходимо воспользоваться программой PuTTY – это универсальное приложение для подключения к серверу, которое состоит из одного запускаемого файла и не требует установки. Для входа на сервер достаточно ввести в Host Name адрес вашего сервера и нажать Open.

Программа PuTTY
Программа PuTTY

В моем сценарии использования в PuTTY достаточно нажать только одну кнопку, тьфу-тьфу тут проблем у меня не возникло.

Далее, в появившейся командной строке, введите имя пользователя, под которым будет выполнен вход на сервер. Для первого подключения к серверу или подключения в режиме администратора используется логин root, пароль тот, который Вы указали при регистрации сервера.

Программа FileZilla

Также для работы с сервером, а точнее с файлами, нужна еще одна программа – FileZilla - инструмент для управления файлами по протоколам FTP, SFTP и FTPS на удаленных серверах.

Вам может быть и смешно, но при первом знакомстве с FileZilla у меня возникли некоторые сложности, поэтому опишу ее немного подробнее.

Первое подключение к серверу через программу FileZilla
Первое подключение к серверу через программу FileZilla

Для входа нам нужно ввести данные:

  1. Хост - IP адрес сервера

  2. Имя пользователя – root (если вы его еще не поменяли)

  3. Пароль - тот, который вы указали при регистрации сервера

  4. Порт - обычно 22, порт на котором работает SSH.

В программе у есть четыре основных рабочих зоны, давайте назову их как-нибудь оригинально, например «левая» и «правая»:

· «Левая» зона – это отображение файловой структуры вашего компьютера. Под цифрой «1» — это проводник вашего ПК; под цифрой «2» - отображение содержимого выбранной папки

· «Правая» зона – тоже самое, что и «левая», только для удаленного сервера. Под цифрой «3» — это проводник сервера; под цифрой «4» - отображение содержимого выбранной папки

Рабочие зоны программы FileZilla
Рабочие зоны программы FileZilla

Как Вы уже догадались, именно через эти окна мы будем передавать файл нашего приложения на сервер, подробнее в следующих шагах. Обмен файлами происходит интуитивно понятным методом – перетягиванием мыши, ну и Ctrl+C и Ctrl+V тоже работают.

Шаг третий – подготовка сервера к работе

OpenJDK

Конкретно в моем случае приложение написано на Java 17 (версию приложения можно посмотреть в файле pom.xml в теге «java.version»). Конечно же версия OpenJDK, которая установлена на сервере, должна соответствовать версии вашего приложения.

Чтобы проверить версию Java на сервере введем команду java -version в командной строке сервера (это та, что открывается через PuTTY). В моем случае на сервере была установлена 11 версия и для обновления я воспользовался вот этой инструкцией. Не вижу смысла дублировать инструкцию, так как их написано множество и я воспользовался именно этой. Главное понять последовательность действий: обновить систему -> скачать нужную версию Java -> разархивировать в нужную папку -> указать для JAVA_HOME новый адрес Java.

После установки нужной версии Java (для проверки введем команду java -version) фактически Ваше приложение уже может быть запущено и доступно по ссылке на сервер. Ура! Хотя погодите, чего-то не хватает… мы еще не поговорили про работу с базой данных, ведь скорее всего она у Вас еще не работает! Ведь приложение работает в облаке, а файл с БД у вас на ПК…

Шаг четвертый – настройка базы данных PostgreSQL

Настройка PostgreSQL на удаленный сервер довольной большая задача, которая содержит много дополнительных шагов и нюансов. Поэтому лучше посоветую отдельную большую и самое главное подробную статью, по установке и настройке PostgreSQL 12 на Debian 10.

Инструкция очень подробная, поэтому я столкнулся только с одной проблемой на шаге «импортировать ключ подписи репозитория», указанная команда никак не хотела работать. Решение, которое мне помогло, на сервер нужно поставить дополнительную утилиту для шифрования и подписи данных - gnupg.

После завершения всех шагов текстовой инструкции – переходим к видео-инструкции от этого же автора, ведь PostgreSQL имеет крайне удобный графический инструмент для администрирования и управления базами данных – pgAdmin.

Видео-инструкция, существенно короче по шагам, но по ней у меня начались проблемы в самом начале… Я не смог создать резервную копию своей базы, т.к. при нажатии «Резервная копия» выдавало ошибку.

Указанную ошибку можно решить так - Откройте pgAdmin и найдите раздел «Настройки». В настройках программы найдите раздел «Пути программ», где можно указать путь к утилите для создания резервных копий баз данных. Обычно эта утилита находится в каталоге, где установлен PostgreSQL, например, C:\Program Files\PostgreSQL\13\bin\pg_dump.exe для Windows или /usr/bin/pg_dump для Linux.

После решение этой проблемы и выполнения всех инструкций из видео – поздравляю! Теперь БД доступна для приложения, размещенного на сервере. Файл application.properties остается таким же, только нужно поменять название БД (если Вы его меняли, когда создали резервную копию) и поменять логин/пароль на те, что были указаны при установке PostgreSQL на сервер.

Обращаю внимание, что установленная таким образом БД будет работать только на сервере, если Вы будете запускать приложение на локальном ПК с настройками к базе на сервере, то работать не будет. Если честно, я до конца так и не понял это баг или фитча…, напишите пожалуйста об этом в комментариях.

Шаг пятый – запуск приложения

Итак, мы добрались до финала! Осталось только собрать приложение и перенести его на сервер. Сборка Java приложения происходит через процесс компиляции в WAR (Web Application Archive) файл представляет собой архив, содержащий все необходимые компоненты веб-приложения. Если Вы используете Maven, то достаточно запустить команду из раздела lifecycle -> package, после успешной компиляции war файл будет находится в папке target, которая находится в папке Вашего проекта.

Открываем FileZilla и переносим war файл на сервер. В папке root я создал папку myapp, куда и скопировал мое приложение. Опять же не знаю, насколько именно такое решение корректное, напишите в комментариях, для меня как новичка главное, что работает.

Запустить приложение через командную строку (напоминаю, что командная строка сервера Вам доступна через PuTTY) достаточно просто – java -jar my_app.war. Перед тем как запускать приложение убедитесь, что Вы внутри нужной папки!

У такого простого способа есть нюанс, приложение будет работать пока работает сессия доступа к сервису, т.е. когда вы закроете PuTTY, то работа приложения остановится.

В процессе решения вопроса, нашел гениальный выход, всего лишь нужно запустить приложение в фоне! Для того чтобы это сделать нужно ввести вот эту команду – nohup java -jar my_app.war > /dev/null 2>&1 &

Поздравляю, Вы сделали свой первый деплой и ваше приложение доступно 24/7 в сети!

В конце хочу еще оставить несколько послесловий.

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

Да, статья получилась не универсальная и заточена под конкретный стек: Java, Debian, PostgreSQL и пр. При этом я считаю, что важно один раз увидеть полную картину того, что нужно сделать, а какие технологии будут внутри уже не так важно. Пройдя один раз этот путь, второй раз будет существенно легче.

Мое Java приложение, с которым я прошел данную инструкцию, написано на Spring Boot, а это значит, что в нем уже встроен сервер Tomcat, именно поэтому для доступа достаточно просто запустить war файл. Если у Вас приложение не на Spring Boot, тогда Вам нужно воспользоваться вот этой инструкцией для установки Tomcat на удаленном сервере. После завершения всех шагов инструкции, необходимо war файл Вашего приложения положить в папку webapps Tomcat. После этого доступ к приложению будет http://хост_сервера:8080/my_app. Где my_app это название war файла, запускать приложение через командную строку не нужно.

Если статья окажется полезная и интересная, то планирую выпустить статьи в аналогичном формате «инструкция для/от чайника», о том, как я буду разворачивать приложение через Docker и делать pipeline через Jenkins.

P.S.(финальный) если Вам нравятся фото котов (настоящих, матерых, уличных), а также показались занятными наблюдения, статьи, книги и пр., на которые обращает внимание любопытный Java новичок, то переходите в мой Telegram-канал - https://t.me/cod_cat, для меня это будет лучшей оценкой этой статьи!

Настоящие, матерые, уличные коты. За фотосессию всегда получают вкусняшку :-)
Настоящие, матерые, уличные коты. За фотосессию всегда получают вкусняшку :-)

Комментарии (26)


  1. valera5505
    25.12.2023 06:47

    После получения доступа к желаемому серверу, необходимо воспользоваться программой PuTTY

    Почему необходимо? OpenSSH-клиент встроен в Windows уже 6 лет как, начиная с 1709.


    1. GenesizAnt Автор
      25.12.2023 06:47

      Да, не совсем верно выразился, про стандартную программу не знал, обязательно попробую


  1. hardtop
    25.12.2023 06:47

    Зачем писать о том, в чём слабо разбираешься - вообще не понятно.


    1. AlexXYZ
      25.12.2023 06:47

      По моему писать так норм, только это больше годится для личных заметок, а не как статья на Хабре.


      1. GenesizAnt Автор
        25.12.2023 06:47

        Так и есть, изначально это и были заметки. Решил, что если бы у меня была подобная статья в начале пути, то это значительно ускорило бы процесс изучения. Возможно кому-то поможет.


        1. AlexXYZ
          25.12.2023 06:47

          Поможет вряд ли. Очень много вопросов к контексту, который вы выбрали. Например, хорошо бы было привести пример листинга самого простого web-приложения без всяких "новомодных" фреймворков в нагрузку, чтобы читатель мог видеть пример, для которого пишется статья.

          Или, например, предложение:

          Для каждого из нас, самым первым сервером становится localhost. 

          Правда? Мне кажется, что писать в технической статье такую длинную фразу чтобы упомянуть localhost - это много. И писать много и читать долго и смысла в ней почти нет.

          Писать надо короче: "Установить tomcat можно на локальный компьютер, а можно и на удалённый. Я выбрал FirstVDS". Это смысл всей части с названием "Шаг первый – аренда сервера", который у вас занимает три абзаца. Многовато.

          В общем так с остальным тоже.


        1. AlexXYZ
          25.12.2023 06:47

          Простите, я не хотел, чтобы у вас сложилось впечатление, что я выразил недовольство, которое у меня не спрашивали. Я сам уже 15 лет веду свой рабочий "дневник". Чего там только нет. Но самая главная ценность - это огромное количество скриншотов с комментариями. Бывает, всплывает тема многолетней давности. Приятно прочитать самый концентрат и просто повторить. Как буд-то вчера писал. Естественно, там нет таких фраз - "выбрать сторонний сервис", если речь не о рекламе.

          Просто хотел посоветовать не разбавлять водой технический текст. Вам же самому и проще будет в будущем читать.


    1. GenesizAnt Автор
      25.12.2023 06:47

      Так если не писать, то никогда не разберешься! Я же как то должен узнать, куда двигаться дальше


      1. Vitimbo
        25.12.2023 06:47

        Чтобы начать в чем-то разбираться это надо изучить. Или спросить совета у более опытного павиана. Но никак не писать очередную инструкцию от джуна.

        Материалами для новичков и так завален хабр. Статьи как что-то куда-то деплоить уже есть, и от более опытных людей.


  1. ivankudryavtsev
    25.12.2023 06:47

    docker login

    docker compose up


    1. GenesizAnt Автор
      25.12.2023 06:47

      Спасибо, попробуем разобраться))


  1. SilverRid
    25.12.2023 06:47

    Посмотрите в сторону Tmux (терминальный мультиплексор) , так же можно запускать приложение как сервис

    https://unetway.com/blog/kak-sozdat-sluzbu-systemd-v-linux

    https://tech-geek.ru/linux-service-creation/

    https://habr.com/ru/articles/327630/

    как писали выше, рассмотрите контейнер Docker как для приложения так и для postgresql, хотя для первого и единственного приложения в VDS можно и без него обойтись.

    Изучайте, дополняйте статью и успехов вам в начинании.


    1. GenesizAnt Автор
      25.12.2023 06:47

      Большое спасибо за развернутый комментарий, обязательно изучу и обновлю статью!


  1. Dmitry2019
    25.12.2023 06:47

    А ещё можно добавить systemd сервис и тогда, при рестарте системы, не придётся руками поднимать приложение


    1. GenesizAnt Автор
      25.12.2023 06:47

      Спасибо за наводку, действительно руками это делать довольно долго каждый раз


  1. mr-garrick
    25.12.2023 06:47

    Вот так и превращаются порядочные сайты в помойку, в обычную жёлтую прессу. У статьи вместо тэгов #PostgreSQL и #Java должен быть тэг #Вредные_советы и #Лажа.


    1. GenesizAnt Автор
      25.12.2023 06:47

      А можно подробнее, почему эти советы вредные? На какие грабли наступать не надо и какие шаги нужно делать по-другому?    


  1. sshikov
    25.12.2023 06:47

    Дисклеймер:

    Я классический вкатун с полного нуля; Java первый и на момент написания статьи единственный язык программирования, который я знаю; это моя первая статья; в этой статье нет рекламы; я не проходил платных курсов; у меня нет регулярного ментора.

    Конец дисклеймера.

    Хм. Простите, а кого это вот все волнует? Ну то что рекламы нет - и на том спасибо конечно. но по-хорошему, в такой ситуации следовало бы поступить примерно так: открыть Хабр, и в поиске попробовать найти статьи на похожую тему. Я более чем уверен, что их тут было в достатке, потому что вы не первый, кому надо свое приложение куда-то установить. Если владеете языками - то повторить в интернете. Если нет - начать изучение английского ASAP :)

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


    1. GenesizAnt Автор
      25.12.2023 06:47

      Согласен с тем, что вероятно недостаточно провел поиск информации. Решил написать статью именно, потому что не нашел альтернативы в русском сегменте. Да, есть статьи, которые частично решают вопрос, при этом, не закрывая полный процесс установки (да, возможно плохо искал). Изначально понимал, что не смогу написать глубокую и развернутую статью, но и не написав ее, я не смог бы получить советы, которые дали в комментариях. Учту Ваши предложения в написании следующей статьи, уверен она будет лучше


      1. sshikov
        25.12.2023 06:47

        Ну если вы реально что-то нашли, стоило бы сослаться, и описать, чем ваше решение лучше. Потому что скажем шаги типа копирования на сервер (по разным протоколам) - они совершенно штатные, и есть везде. Ну т.е. грубо говоря - берете maven, и находите плагин, берете gradle - тоже самое. Ну т.е. оно еще и в процесс сборки интегрируется как правило.


        1. GenesizAnt Автор
          25.12.2023 06:47

          Да, спасибо, об этом еще не подумал. Понимаю, что в идеале деплой должен осуществляться одной кнопкой. Возможно в этом плане поторопился со статьей


          1. Filex
            25.12.2023 06:47

            Вы молодец, что написали. Первый блин комом, но начало положено. Желаю успехов в улучшении деплоя вашего кода.


  1. ana_meow
    25.12.2023 06:47

    OpenSSH-клиент встроен в Windows уже 6 лет как, начиная с 1709.


  1. imotorin
    25.12.2023 06:47

    пойду расскажу парням что

    TomCat, WebSphere, WebLogic

    уже никому не нужны

    nohup java -jar и в продакшн


  1. Pardus_cx
    25.12.2023 06:47

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

    И как формат саморазвития, когда есть просьба отревьюить свой путь, статья отлично подходит. Это тоже инструмент поиска ответов и советов.

    Спасибо. Было интересно ознакомиться, даже зная следующие витки развития деплоймента)


  1. Trase1
    25.12.2023 06:47

    Спасибо за статью. Мне, как коллеге по вкатунству, было полезно познакомиться с полноценным, конкретным и рабочим кейсом деплоя.

    Недовольных статьёй решительно не понимаю. Метод не рабочий? Отнюдь. Не рассказывает ничего нового и полезного? Для тех, кто все уже знает и умеет, может быть и не рассказывает. А мне было интересно.

    Любая информация может кому-то оказаться полезной и интересной. Демотивировать авторов, произведения которых, не были полезны лично вам.. Ну, такое. Токсичненько. Есть, что сказать по существу? Скажите, поправьте, помогите. Нет? Ну зачем тогда тратить свое время на статью и комментарии под ней?