Развертывание (Deploy) веб-приложения java на виртуальном сервере VPS
Мы используем cookie-файлы, чтобы получить статистику, которая помогает нам улучшить сервис для Вас с целью персонализации сервисов и предложений. Вы можете прочитать подробнее о cookie-файлах или изменить настройки браузера. Продолжая пользоваться сайтом без изменения настроек, вы даёте согласие на использование ваших cookie-файлов.
speech bubble

Развертывание (Deploy) веб-приложения java на виртуальном сервере VPS

Развертывание (Deploy) веб-приложения java на виртуальном сервере VPS

Гайд больше предназначен для людей, которые только начинают гуглить по всему интернету, как же им выставить своё веб-приложение в интернет, либо столкнулись с трудностями, которые произошли со мной. Ушло не мало времени, чтобы собрать по всему интернету крупицы необходимых настроек для первого запуска. Здесь не будет подробного объяснения тех или иных моментов в виде скриншотов. Считаю, в конкретном случае, они не столь необходимы. Будут показаны некоторые подводные камни, на которые ушло прилично времени. Для людей с базой mysql, сборщиком gradle, помочь, увы, ничем не смогу, возможно, вы найдёте ответы в данной статье, интерпритируя на свой проект.

Вполне возможно, есть недочёты и моменты, которые необходимо исправить, буду рад услышать и скорректировать статью.

Если вы пришли в поисках ответа на вопрос "А можно ли приложение java развернуть на виртуальном хостинге, а не на виртуальном сервере", то ответ - нельзя.

Настраиваться будет следующее: web-сайт, написанный на java с помощью фреймворка Sping boot в ОС Windows 10 + postgresql + apache + maven + git bash + виртуальный сервер VPS на ubuntu + nginx + настройка купленного сертификата SSL + панель управления Vesta на виртуальном сервере. 

 

 

Хотелось бы сделать небольшую ремарку. Тестовое приложение были сделано на java 14, но в property файла pom.xml было указано 1.8. Добавлю, что будьте внимательны при выборе языка java, ибо можете получить сообщение о том, что 10, 12,14,15 java недоступна для скачивания на ubuntu. Придётся самим выкручиваться (Возможно переписывать своё приложение, например под Amazon Correctto, который распространяется бесплатно). Сам склоняюсь в эту сторону. 

Использованные версии для деплоя:

  • java 14, в настройках pom.xml указал 1.8
  • java в ubuntu 1.8
  • windows 10
  • ubuntu 18.04
  • spring boot 2.4.3
  • postgresql 10.18
  • maven 3.8.1 в Windows

Про покупку домена в данной статье рассказываться не будет. 

 

Выбор хостинга для виртуального сервера VPS/VDS

В данном направлении выбирайте сами, зависит от ваших потребностей и цены у разных хостингов. Если у вас один сайт или вы только учитесь, сами понимаете, что нет смысла покупать. Ходят в интернете статьи о том, что Amazon предоставляет на год бесплатные виртуальные сервера, но не могу ничего сказать по этому поводу, так как не проверял.

Если думаете покупать, то можете перейти по моей ссылке на один из таких хостингов, fastvps дадут хорошую скидку при первом заказе, либо не торопитесь, чуть ниже описан другой провайдер. Предоставят вместо Vesta другую панель под названием FastPanel. Данная панель только набирает обороты, сыровата, но техподдержка у fastvps очень хорошая, и помогут подобрать тариф, и в некоторых случаях, помогут даже настроить вам сервер(с тем же nginx помогут) и, даже, в редких случаях(если попадётся вопрос под их компетенцией), сам сайт развернуть. Сразу обрежу, что не стоит пробовать ставить FastPanel на провайдеров хостинга, которая она не поддерживает, не сможете настроить, а если и можете, то вы тот человек, который никогда не прочтёт подобную статью.  

 

Выбор продавца и покупка SSL сертификата для домена

В нынешнее время без SSL сертификата лучше и не стоит задумываться о серьёзных проектах и приложениях. Сразу оговорюсь, сначала, настройте сервер, так как сертификат выдаётся только после подтверждения, что домен ваш. А для этого необходимо настроить минимум почтовый адрес. Проштудировав интернет, могу с уверенностью посоветовать покупать у 1cloud, а по данной ссылке вас ждут приятные бонусы. Сам покупаю сертификаты именно у них. Хорошие, не кусающиеся цены на SSL сертификаты, отличная техподдержка, которая спрашивает о том, что им улучшить, помогут настроить сертификаты. Оставили в предложениях заявку на гайд по установке их сертификатов на Vesta панель. Далее вы поймёте, какие трудности могут случиться. Они так же предоставляют услуги покупки виртуального сервера VPS/VDS, частных облаков и многое другое. На мой взгляд, сервера дороговаты, но если хотите мощную техническую поддержку, то вам именно туда. 

 

Установка, настройка vesta.conf и первое подключение к серверу VPS/VDS

После покупок, установок системы ubuntu 18.04, подключаемся к серверу первый раз через ssh. Некоторые провайдеры предоставляют консольную панель на сайте для подключения. Конечно, ваше право чем пользоваться, но мне она не понравилась, постоянно глючит, да и подключиться хоть раз нам придётся из windows, так как будет скрипт для копирования и развертывания приложения на сервер. Замечу, вместе с ubuntu провайдер мне поставил Vesta. Как устанавливать отдельно Vesta в данной статье я не буду. Если есть проверенный гайд, то напишите о нём, обязательно добавлю в статью.

Для подключения использовался putty. Очень удобен и прост. Скачивается с официального сайта putty, в данной статье подробно рассказывается как подключиться к VPS через putty. Для тех, кто в первый раз, обращаю внимание, что при вводе пароля, ничего отображаться не будет, курсор будет на месте, но при этом пароль вводится.

Подключаемся к пользователю root для установки и настройки необходимого ПО. У вас примерно будет отображаться следующее при входе:

root@5-117-11-00

IP адрес после @ указан вымышленный.

Вводим следующие команды, для обновления пакетов и установки wget:

sudo apt update
sudo apt-get install wget

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

Настроим сразу конфигурацию vesta панели. Для этого введите следующую команду:

sudo nano /usr/local/vesta/conf/vesta.conf

nano - это текстовый редактор, наподобие vi. Мне nano больше нравится, он более лоялен к пользователю. 

Если у вас не установлен nano, то можете установить его следующей командой:

sudo apt-get install nano

В случае, если не получается с nano, то для запуска vi используется следующая команда:

sudo vi /usr/local/vesta/conf/vesta.conf

Но с обращением с ним - вы сами по себе.

После открытия файла, добавляем в конец строку FILEMANAGER_KEY = 'ILOVEREO'. Открывает FileManager(Файловый менеджер) в web панеле Vesta. Неизвестно по какой причине, после каких-то cron у меня, значение ILOVEREO сбрасывается в пустую строку. Не пугайтесь, если файловый менеджер пропадает, откройте заново файл и вставьте ILOVEREO.

DB_SYSTEM меняем на DB_SYSTEM=‘mysql,pgsql’. Откроет выбор в меню для базы данных postgreSQL.

Обязательно перезайдите в web версии Vesta-панель (Сделать logout из аккаунта).

 

Установка базы данных postgreSQL в ubuntu и Vesta panel

После первоочередных действий, приступаем к установке базы данных на ubuntu. Никаких сложностей встречено не было, всё делается по гайдам из интернета. Единственное, что есть подвох в одном моменте с паролем для пользователя в БД postgres.

Первым шагом устанавливаем postgreSQL. Если вам требуется определенная версия, то необходимо найти в интернете. Я ставил автоматическую скачку, так как для моих нужд хватает и 10й версии:

sudo apt-get install postgresql postgresql-contrib phppgadmin

Cкачиваем конфигурационные файлы HBA для vesta:

wget http://c.vestacp.com/0.9.8/ubuntu/pg_hba.conf -O /etc/postgresql/*/main/pg_hba.conf

Перезагружаем процесс postgresql:

service postgresql restart

либо через 

systemctl restart postgresql

Переходим под пользователя postgres

su – postgres

Теперь есть несколько путей установки пароля для postgres, какой сработает (а именно, не всегда устанавливается по какой то причине), такой и необходимо использовать.

1 способ(В случае чего, вас спасёт комбинация клавиш CTRL + C):

psql -c “ALTER USER postgres WITH PASSWORD ‘pgp4sw0rd'”

2 способ (Вводим пароль pgp4sw0rd):

\password postgres

Хочу заметить, что пароль вводите именно pgp4sw0rd. Поставив  свой пароль, можете получить следующую ошибку - "postgresql error connection localhost failed" при дальнейшем добавлении базы в Vesta panel. Вы можете в дальнейшем попытаться сами его изменить, уже после развертывания вашего приложения.

В зависимости от способа, выходим обратно в пользователя root (полезные команды ctrl+x, ctrl+c, exit). Помните, всегда есть возможность переподключиться к серверу.

Регистрируем postgresql в Vesta:

v-add-database-host pgsql localhost postgres pgp4sw0rd

Именно в данном месте, либо в веб Vesta панели может появиться ошибка "postgresql error connection localhost failed". В моём случае, были проблемы с паролем. Дальше мы настроим нового пользователя через панель для БД.

Скачиваем настройки для phppgadmin:

wget http://c.vestacp.com/0.9.8/ubuntu/pga.conf -O /etc/phppgadmin/config.inc.php
wget http://c.vestacp.com/0.9.8/ubuntu/apache2-pga.conf -O /etc/apache2/conf.d/phppgadmin

Делаем рестарт apache2, vesta, nginx:

service apache2 restart
service vesta restart
service nginx restart

 

Установка java 1.8 на ubuntu 18.04

Java необходима для запуска нашего проекта в формате jar. Вы можете сделать самозапускающееся приложение, дав права chmod на запуск и настроив. В данном случае, мы не будем испытывать судьбу, так как напишем скрипт для автоматического развертывания.

Для установки выполните следующие команды:

sudo apt update
sudo apt install openjdk-8-jdk

Для проверки версии введите:

java -version

Должен получиться примерно следующий результат:

openjdk version "1.8.0_292"
OpenJDK Runtime Environment (build 1.8.0_292-8u292-b10-0ubuntu1~18.04-b10)
OpenJDK 64-Bit Server VM (build 25.292-b10, mixed mode)

В случае проблем, всегда можно воспользоваться командами для удаления java 1.8 с ubuntu:

sudo apt-get remove --auto-remove openjdk
sudo apt-get autoremove openjdk-8-jre
sudo apt-get autoremove openjdk-8-jdk
sudo apt-get purge openjdk

 

Настройка mail, user, domain, dns, postgresql, ssl в web Vesta панели

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

Создание нового пользователя

Зайдите на web адрес панели и залогиньтесь под учетной записью администратора. Здесь нам потребуется только создать нового пользователя. Он создаётся для обеспечение безопасности ваших приложений и сайтов. Создается на вкладке "USER".

Обратите внимание, поле [username] очень важно. Будет создан новый пользователь на сервере. Забегая вперёд, именно у него мы будем хранить наше приложение, например /home/myuser/web/mydomain.ru

Заходим в панель под новым пользователем и приступаем к настройкам.

Добавление web сайта

Перед тем, как начнем Нажмите на вкладку "Web" и кликните на "Add web domain". 

Введите название купленного домена (без http, например mydomain.ru). Остальное оставьте по умолчанию, если у вас нет сертификата SSL. В случае его наличия, переходите к пункту настройки SSL и можете сразу его настроить.

Создание почтового ящика

Нажмите на вкладку "Mail" и создайте новый почтовый ящик. Учтите, создайте сразу ящик с именем admin, либо administrator. Это поможет приобрести SSL сертификат, так как ссылка на подтверждение владения доменом приходит именно на эти адреса.

Создание новой базы postgresql

Нажмите на вкладку "DB" и на кнопку "Add database". 

Обратите внимание, что Vesta создаёт название базы и имя пользователя с префиксом имени пользователя текущего аккаунта. Если вас не устраивает данный вариант (то есть в коде java поменять две строчки), то всегда можете добавить вручную базу данных из ubuntu. 

Повторюсь, если получили ошибку "postgresql error connection localhost failed", то вернитесь к разделу настройки postgresql в ubuntu. 

После создания базы данных вы можете зайти через phppgadmin, настроенный ранее.

Настройка DNS

Первоочередно, сервера DNS вам необходимо настроить самостоятельно в панели своего хостинг провайдера (Гайды по настройкам у них есть). Единственное, что можем настроить, это сервера ns1 и ns2. 

Нажмите в правом верхнем углу на имя пользователя. 

В поле "Default Name Servers" введите два сервера(Вместо yourdomain.ru должен быть ваш купленный домен):

ns1.yourdomain.ru
ns2.yourdomain.ru

Перейдите на вкладку "DNS" и нажмите "Edit". В поле "SOA" введите(Вместо yourdomain.ru должен быть ваш купленный домен):

ns1.yourdomain.ru

Теперь можете двигаться по ссылке и покупать SSL сертификат.  Региструйтесь и следуйте подсказкам. Единственное, в поле верификации домена поставьте email.

Настройка SSL на сайте

Зайдите на вкладку "Web" и для редактирования нажмите "Edit" вашего сайта.

Включите поддержку SSL support. 

Будьте внимательны, открываются дополнительные поля, которые обязательны к заполнению. И неверное заполнение не даст добавить ваш SSL сертификат на сайт:

SSL Home
SSL Certificate / Generate CSR
SSL Key
SSL Certificate Authority / Intermediate (optional) 

Обращаю внимание, что я буду приводить примеры сертификатов именно с сайта 1cloud. У других названия файлов могут отличаться. После покупки вам отправят архив с файлами сертификатов, но мы пойдём немного другим путём для лучшего понимания. В вашем личном кабинете на 1cloud откройте сертификат. Вы увидите следующее:

В статус-баре "Скачать" вы можете увидеть форматы необходимых нам файлов. Вставьте текст из скаченных сертификатов в те поля, которые указаны ниже(Чтобы получить текст из них, откройте сертификат с помощью текстового редактора):

SSL Home - значение public_shtml
SSL Certificate / Generate CSR - yourdomain_key.key
SSL Key - yourdomain.crt
SSL Certificate Authority / Intermediate (optional) - yourdomain_ca.crt

Где yourdomain - имя вашего домена. Файл pfx тоже можете сразу скачать, он понадобиться для настройки SSL в приложении java.

На скриншоте примерный результат:

 

Нажимаете "Save" и сертификат должен успешно добавиться к сайту.

Можете столкнуться с ошибкой "SSL intermediate chain is not valid". Это означает, что вы неправильно вставили в SSL Certificate Authority / Intermediate (optional) данные. Произойдёт это в том случае, если политика Vesta панели изменится, либо политика хостинга, где покупали сертификат. На момент написания статьи, данной ошибки не появляется, найдено опытным путём.

 

Настройка nginx

Данный раздел понадобится тем, кто запускает своё приложение на порту, отличными от 8080. А я вам советую, на первое время поменять порт вашего приложения в application.properties, например на server.port=8099. Так как порт 80 по умолчанию занят nginx, либо apache. 

Существуют способы редиректа через htaccess.

В случае, если у вас только apache, то необходимо найти гайд для перенаправления портов. 

Подключаемся заново по shh к нашему серверу по root.

Для начала проверим папку с файлами, они должны существовать(Не забудьте поменять название YOURUSER на вашего пользователя, у которого вы создали сайт в Vesta panel):

ls -l /home/YOURUSER/conf/web/

У вас должен быть примерно такой список файлов(Вместо yourdomain будет имя вашего домена, без www и http):

ssl.yourdomain.ca
ssl.yourdomain.crt
ssl.yourdomain.key
ssl.yourdomain.pem
yourdomain.apache2.conf
yourdomain.apache2.ssl.conf
yourdomain.nginx.conf
yourdomain.nginx.ssl.conf

 Необходимо добавить редирект с http на https. Открываем файл nginx.conf(Не забудьте поменять YOURUSER на вашего пользователя и YOURDOMAIN на ваш домен без www и http, например mysite.ru):

sudo nano /home/YOURUSER/conf/web/YOURDOMAIN.nginx.conf

В конец файла, перед закрывающейся скобкой, вставьте редирект(Не забудьте поменять YOURDOMAIN на ваш домен без www, например mysite.ru):

return 301 https://YOURDOMAIN$request_uri;

Сделаем перенаправление портов в файле nginx.ssl.conf(Не забудьте поменять YOURUSER на вашего пользователя и YOURDOMAIN на ваш домен без www и http, например mysite.ru):

sudo nano /home/YOURUSER/conf/web/YOURDOMAIN.nginx.ssl.conf

В файле меняем в location /, в поле proxy_pass порт на тот, на котором будет запускаться java приложение, например 8099(IP адрес не меняем. В примере он указан вымышленный):

location / {
        proxy_pass      https://5.11.00.00:8099;

Аналогично меняем в location @fallback proxy_pass порт 

   location @fallback {
        proxy_pass      https://5.11.00.00:8099;
    }

Сохраняемся и выходим.

Перезапускаем процессы apache2, vesta, nginx:

service apache2 restart
service vesta restart
service nginx restart

Если возникнут трудности с редиректом, в некоторых случаях добавление в файл nginx.conf помогает следующий код(Вставляем перед закрывающейся скобкой):

if ( $scheme = "http" ) {
 rewrite ^/(.*)$ https://$host/$1 permanent;
}

 

Подготовка приложения Java для копирования и развертывания на виртуальном сервере VPS/VDS

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

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

Переходим к настройкам проекта:

Закачайте файл pfx, который вы скачали с сайта, где получали сертификат, в папку, например scr -> main -> resources. Он потребуется для работы приложения по https.

Добавьте в файл application.properties следующие строки:

server.port=8099 # Порт, на котором будет запущено приложение
server.ssl.key-store-type=PKCS12 # Метод шифрования
server.ssl.key-store=classpath:namefile.pfx # Путь к файлу pfx, где namefile, имя вашего домена(Лучше не менять имя файла)
server.ssl.key-store-password=MyPassword # Пароль у файлу pfx указан на сайте, где вам выдавали сертификат ssl
server.ssl.enabled=true # Включаем ssl
trust.store=classpath:namefile.pfx # Путь к файлу pfx, где namefile, имя вашего домена(Лучше не менять имя файла)
trust.store.password=MyPassword # Пароль у файлу pfx указан на сайте, где вам выдавали сертификат ssl
#log4j должен исправлять ошибки String //. 
log4j.rootLogger=INFO
log4j.logger.org.hibernate.type.descriptor.sql=TRACE
trust.store исправляет в проекте некоторые проблемы с сертификацией.

Переходим в файл pom.xml и добавляем следующие зависимости:

Если у вас не формируется файл jar в папке target, например, то добавьте 1.0-SNAPSHOT, чтобы получилось следующее:

Перейдите в класс WebSecurityConfig и добавьте следующие строки:

 @Value("${trust.store}")
    private Resource trustStore;

 @Value("${trust.store.password}")
    private String trustStorePassword;


 @Bean
    public RestTemplate restTemplateWithTrustStore(RestTemplateBuilder builder) throws IOException, CertificateException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        SSLContext sslContext = new SSLContextBuilder()
                .loadTrustMaterial(trustStore.getURL(), trustStorePassword.toCharArray())
                .build();
        SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext);

        HttpClient httpClient = HttpClients.custom()
                .setSSLSocketFactory(socketFactory)
                .build();

        return builder
                .requestFactory(() -> new HttpComponentsClientHttpRequestFactory(httpClient))
                .build();
    }

В некоторых случаях, исправляет проблемы с определением сертификации у приложения. На этом подготовка java приложения для развертывания на сервере закончена. 

 

Развертывание (deploy) приложения Java на виртуальном сервере VPS/VDS

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

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

Создайте файл deploy.sh в папке scripts(создайте, если не существует) в указанном месте:

Добавьте следующий код в файл deploy.sh:

#!/usr/bin/env bash

mvn clean package

echo 'Copy files...'

scp PATHTOTARGET/target/NAMEFILE.jar \
    root@IP:/home/USER/web/DOMAIN/public_shtml

echo 'Restart server...'

ssh -t root@IP << EOF
pgrep java | xargs kill -9
nohup java -jar /home/USER/web/DOMAIN/public_shtml/NAMEFILE.jar > /home/USER/web/DOMAIN/log.txt &
EOF

echo 'Bye'

PATHTOTARGET - подставьте путь до вашей папки target в проекте, не забывайте, что путь надо указывать не С:\.., а /c/myfolder/итакдалее

NAMEFILE.jar - имя вашего jar файла, созданного SNAPSHOT

IP - ip адрес вашего сервера

USER - имя пользователя, которого вы создавали

DOMAIN - имя домена

Вы можете посмотреть путь до папки public_shtml в файловом менеджере панели Vesta. 

Внимание! Логи запуска, работы веб-приложения, spring будут хранится здесь /home/USER/web/ DOMAIN/log.txt. В случае каких-то ошибок, вы всегда можете открыть файл, либо через файловый менеджер, либо командой sudo nano /home/USER/web/ DOMAIN/log.txt

nohup обязательная команда, иначе ваше приложение не поднимется, если сервер упадёт.

Осталось самая малость, а именно запустить скрипт.

Откройте git bash, установленный ранее.

Перейдите в папку с вашим приложением(Заметьте, чтобы в Windows ходить по дискам, используйте команду cd /d/ например)

Введите следующую команду:

./scripts/deploy.sh

Должна начаться запаковка сборщиком maven. Никаких ошибок при сборке быть не должно.

Скрипт попросит два раза ввести пароль от root. В первый раз для копирования, второй раз для развертывания.

После этого, можете открывать web приложение. 

Повторюсь, в случае проблем или проверки запуска, логи пишутся  /home /USER /web /DOMAIN /log.txt, путь можете настроить сами.

 

Полезные дополнения и решения проблем с сайтом

  1. После развертывания сайта на виртуальном сервере, к нему доступен вход по IP. 

Данная проблема возникает, если неправильно выставлены настройки apache2 и nginx. В данном случае, поисковики будут индексировать сайты и по IP адресу, что нас не устраивает.

Для начала сделаем redirect в файле apache2 с http до https. Откройте файл apache2 (Не забудьте поменять USER на вашего пользователя и YOURDOMAIN на ваш домен без www и http, например mysite.ru)

nano /home/USER/conf/web/YOURDOMAIN.apache2.conf

Добавляем строчку в файл после ServerName(Не забудьте поменять YOURDOMAIN на ваш домен без www, например mysite.ru):

Redirect / https://YOURDOMAIN

Естественное, сохраняем файл.

Откройте файл nginx (Не забудьте поменять USER на вашего пользователя и YOURDOMAIN на ваш домен без www и http, например mysite.ru):

nano /home/YOURUSER/conf/web/YOURDOMAIN.nginx.ssl.conf

И добавьте следующие строки перед include (Не забудьте поменять YOURDOMAIN на ваш домен):

if ($host !~* ^(YOURDOMAIN|www.YOURDOMAIN)$ ) {
    return https://YOURDOMAIN$request_uri;
}

Данная возвращает наш домен, если пользователь попытается ввести нечто другое, отличное от нашего домена.

Сохраняем файл и перезагружаем сервисы:

service nginx restart
service apache2 restart

 

Для комментирования необходимо авторизоваться