Раздел помощи SpaceWeb

Как выполнить деплой Java-приложения: подробная инструкция

03 окт, 2024

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

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

Что такое деплой

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

Деплой обычно состоит из нескольких этапов:

  1. Подготовка окружения. К ней относится настройка всех необходимых зависимостей, библиотек, баз данных и серверного ПО, чтобы приложение могло корректно функционировать. В случае Java-приложений устанавливается JVM (Java Virtual Machine), веб-сервер, база данных и другие компоненты.
  2. Сборка приложения. На этом этапе исходный код компилируется и упаковывается в формат, готовый для развертывания. Для Java-приложений это обычно файл с расширением .jar или .war.
  3. Загрузка на сервер. После подготовки окружения и сборки приложение необходимо перенести на целевую машину – сервер, где оно будет работать. Это может быть локальный сервер, облачная платформа (например, AWS или Google Cloud) или контейнеризированное окружение (например, Docker или Kubernetes).
  4. Настройка и запуск. Завершающий этап – настройка конфигурационных файлов приложения, например, баз данных или параметров сети, и его запуск. Обычно на этом этапе проводятся тестирования, чтобы убедиться в корректной работе всех функций.

Деплой может выполняться вручную или с использованием специальных инструментов для автоматизации процесса: например, Jenkins, Ansible или GitLab CI/CD. Автоматизация позволяет избежать ошибок и сократить время на развертывание приложения.

Инсталлируем Vesta Control Panel

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

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

Для начала настройки панели управления VestaCP нам потребуется подключиться к серверу по протоколу SSH. Вы можете сделать это через утилиту Putty, которая поддерживает шифрование для безопасности соединения. 

Итак, подключитесь к серверу под пользователем с правами root. После подключения, вы увидите на экране примерно следующее:

root@1.123.45.67

Знак «@» отделяет имя пользователя от IP-адреса хоста, к которому вы подключились. В нашем примере это «1.123.45.67», но у вас будет указан ваш реальный IP-адрес сервера.

Теперь обновите систему и установите необходимые пакеты:

sudo apt update
sudo apt-get install wget

После этого перейдите к настройке конфигурации VestaCP. Откройте файл конфигурации, прописав:

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

Если редактор nano еще не установлен, добавьте его с помощью команды:

sudo apt-get install nano

Если вам больше подходит редактор vi, вы можете использовать его для редактирования файла:

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

Добавьте строку в самый конец открывшегося файла конфигурации:

FILEMANAGER_KEY = 'ILOVEREO'

Также замените значение параметра DB_SYSTEM на:

DB_SYSTEM='mysql,pgsql'

После того как все изменения будут внесены, сохраните файл и перезапустите веб-интерфейс VestaCP. Выйдите из аккаунта и снова войдите, чтобы обновления вступили в силу.

Инсталлируем БД PostgreSQL в Ubuntu

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

sudo apt-get install postgresql postgresql-contrib phppgadmin

После успешной установки нужно скачать и настроить конфигурационные файлы для интеграции с панелью управления 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 так же можно выполнить двумя способами:

psql -c "ALTER USER postgres WITH PASSWORD 'pgp4sw0rd'"

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

\password postgres

При вводе команды вам будет предложено задать новый пароль. После этого можно вернуться к пользователю root. 

Чтобы зарегистрировать PostgreSQL в панели Vesta, используйте следующую команду:

v-add-database-host pgsql localhost postgres pgp4sw0rd

Теперь необходимо настроить 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

И перезапустите веб-модули для применения изменений:

service apache2 restart
service vesta restart
service nginx restart

Инсталлируем Java на Ubuntu

Чтобы запустить тестовый проект, собранный в JAR-файл, на вашем сервере или компьютере, необходимо установить Java. В этом случае подойдет OpenJDK – свободная реализация платформы Java. 

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

sudo apt update
sudo apt install openjdk-11-jdk

Убедитесь, что Java установлена корректно, и проверьте ее версию:

java -version

На экране вы увидите информацию о версии Java, которая должна выглядеть примерно так:

openjdk version "11.0.11" 2021-04-20
OpenJDK Runtime Environment (build 11.0.11+9-Ubuntu-0ubuntu2.18.04)
OpenJDK 64-Bit Server VM (build 11.0.11+9-Ubuntu-0ubuntu2.18.04, mixed mode)

Если по какой-то причине вы установили неправильную версию Java или требуется ее замена, не переживайте – ее легко можно удалить:

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

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

Настроим Nginx

Если вы планируете запускать свои программы через нестандартные порты, вместо стандартного 8080, этот шаг для вас. В нашем примере мы изменим порт в файле application.properties, установив значение server.port=8099. Это позволит программе работать на порту 8099. Порт 80 обычно занят веб-серверами Nginx или Apache, но при желании можно настроить переадресацию с помощью файла .htaccess.

Сначала подключитесь к удаленному серверу через SSH, используя учетную запись root. Далее проверьте, существует ли каталог ранее созданного пользователя:

ls -l /home/USERNAME/conf/web/

Вывод системы будет выглядеть примерно так:

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

Если у вас установлен SSL-сертификат, необходимо настроить перенаправление с HTTP на HTTPS. Для этого откройте конфигурационный файл Nginx:

sudo nano /home/USERNAME/conf/web/DOMAIN.nginx.conf

Где «USERNAME» – имя пользователя, а «DOMAIN» – доменное имя. 

В самом конце файла, перед закрывающей скобкой, добавьте строку для перенаправления на HTTPS:

return 301 https://DOMAIN$request_uri;

Теперь нужно настроить перенаправление портов. Для этого откройте файл конфигурации для SSL:

sudo nano /home/USERNAME/conf/web/DOMAIN.nginx.ssl.conf

В блоке location / в поле proxy_pass укажите порт 8099, как в примере ниже:

location / {
        proxy_pass      https://1.23.45.67:8099;
}

Те же изменения нужно внести в блок location @fallback:

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

Внеся все изменения, сохраните файл и выйдите из него. Чтобы новые настройки вступили в силу, перезапустите веб-серверы и процессы:

service apache2 restart
service vesta restart
service nginx restart

Теперь Nginx настроен, и ваш сервис должен работать через новый порт с поддержкой HTTPS.

Подготовим приложение Java для развертывания

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

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

  1. Скачайте последнюю версию Git с официального сайта и запустите установку. На каждом шаге жмите Next, пока не завершите процесс. 
  2. Установка Maven аналогична установке Git. Скачайте его с официального сайта и следуйте инструкциям установщика.
  3. Скачайте файл сертификата (pfx) с сайта, где вы получили SSL-сертификат, и поместите его в каталог проекта. Например, вы можете добавить его в папку src > main > resources. Этот файл необходим для корректной работы приложения через HTTPS.
  4. Добавьте параметры в файл 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, указанный на сайте, где вы получили сертификат
server.ssl.enabled=true # Включаем SSL
trust.store=classpath:namefile.pfx # Путь к файлу pfx
trust.store.password=MyPassword # Пароль к файлу pfx
log4j.rootLogger=INFO
log4j.logger.org.hibernate.type.descriptor.sql=TRACE

Параметры trust.store помогут решить возможные проблемы с сертификацией.

  1. Откройте файл pom.xml и внесите следующие зависимости:
<dependency>
    <groupID>javax.xml.bind</groupID>
    <artifactID>jaxb-api</artifactID>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupID>com.sun.xml.bind</groupID>
    <artifactID>jaxb-core</artifactID>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupID>org.apache.httpcomponents</groupID>
    <artifactID>httpclient</artifactID>
</dependency>

  1. Откройте файл класса WebSecurityConfig и добавьте следующий код для работы с SSL:
@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-приложение будет готово к развертыванию, и вы сможете запустить его с настройками для работы через HTTPS.

Деплой приложения Java

Теперь приступаем к самому интересному – развертыванию Java-приложения на сервере. Начнем с создания скрипта, который автоматизирует процесс сборки и деплоя. 

Для этого создайте файл deploy.sh и добавьте в него следующие строки:

#!/usr/bin/env bash
mvn clean package
echo 'Copy files...'
scp PATH/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'

Разберем используемые переменные:

  • «PATH» – путь к каталогу, где находится ваш проект.
  • «NAMEFILE.jar» – имя JAR-файла с вашим приложением.
  • «IP» – IP-адрес вашего сервера, на который будет загружено приложение.
  • «USER» – имя пользователя, который создан для работы с сервером.
  • «DOMAIN» – доменное имя вашего сайта.

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

Чтобы запустить скрипт, откройте ранее установленный Git Bash или любую другую командную оболочку. Перейдите в каталог, где находится ваше приложение, и выполните команду:

./scripts/deploy.sh

Что произойдет далее:

  1. Скрипт выполнит команду mvn clean package, которая соберет проект с использованием Maven.
  2. После успешной сборки файл с приложением будет скопирован на сервер по указанному пути.
  3. Скрипт автоматически перезапустит сервер, завершив текущий процесс Java и запустив новое приложение через команду nohup java -jar.

В процессе выполнения скрипта система несколько раз запросит у вас пароль для доступа к серверу через SSH и для выполнения операций копирования и перезапуска. 

Если все действия выполнены правильно и ошибок не возникло, ваше приложение будет развернуто, и вы сможете открыть его в браузере. Теперь ваше Java-приложение работает на сервере и готово к использованию!