Деплой Java приложения на VPS: пошаговое руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение

Разработка Java-приложения — это только половина дела. Вторая, не менее важная часть — это грамотный деплой на production-сервер. Многие разработчики сталкиваются с трудностями при переносе приложения с локальной машины на VPS: настройка окружения, сборка, запуск в фоне, обеспечение безопасности. В этой статье мы разберем полный процесс деплоя Java-приложения на VPS (Virtual Private Server) — от покупки сервера до настройки HTTPS. Все шаги будут сопровождаться примерами кода и конфигураций.

Мы будем использовать Ubuntu 22.04 LTS в качестве операционной системы VPS, а в качестве примера Java-приложения — простое Spring Boot REST-приложение, упакованное в JAR-файл. Если вы используете другой фреймворк (Jakarta EE, Micronaut, Quarkus), общие принципы останутся теми же.

1. Подготовка VPS и установка Java

1.1. Подключение к серверу

После покупки VPS вы получите IP-адрес, имя пользователя (обычно root) и пароль или SSH-ключ. Подключитесь к серверу через терминал:

ssh root@ваш-ip-сервера

Если вы используете SSH-ключ, укажите путь к нему:

ssh -i /path/to/private_key root@ваш-ip-сервера

1.2. Обновление системы и установка Java

Первым делом обновим пакетный менеджер и установим Java Development Kit (JDK). Для большинства современных Java-приложений достаточно OpenJDK 17 или 21:

apt update && apt upgrade -y
apt install openjdk-17-jdk -y

Проверьте установку:

java -version

Вы должны увидеть что-то вроде:

openjdk version "17.0.10" 2024-01-16 LTS
OpenJDK Runtime Environment (build 17.0.10+7-Ubuntu-122.04.1)
OpenJDK 64-Bit Server VM (build 17.0.10+7-Ubuntu-122.04.1, mixed mode, sharing)

1.3. Настройка переменных окружения (опционально)

Если ваше приложение требует специфических переменных (например, JAVA_HOME), добавьте их в файл ~/.bashrc или /etc/environment:

echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> ~/.bashrc
source ~/.bashrc

2. Сборка и загрузка приложения на сервер

2.1. Сборка JAR/WAR на локальной машине

Предположим, у вас есть Maven-проект. Выполните сборку:

mvn clean package -DskipTests

В результате в папке target/ появится файл myapp-0.0.1-SNAPSHOT.jar (или .war для веб-приложений).

2.2. Загрузка JAR-файла на VPS

Используйте scp для копирования файла на сервер:

scp target/myapp-0.0.1-SNAPSHOT.jar root@ваш-ip-сервера:/opt/myapp/

Создайте на сервере директорию для приложения, если её нет:

mkdir -p /opt/myapp

2.3. Проверка структуры на сервере

После загрузки проверьте, что файл на месте:

ls -la /opt/myapp/

Вы должны увидеть myapp-0.0.1-SNAPSHOT.jar.

3. Настройка запуска приложения (systemd + Nginx)

3.1. Запуск JAR-файла вручную (тестовый)

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

java -jar /opt/myapp/myapp-0.0.1-SNAPSHOT.jar --server.port=8080

Если приложение запустилось без ошибок, переходим к созданию systemd-сервиса.

3.2. Создание systemd-сервиса

Systemd позволяет запускать Java-приложение как демон (в фоне) и автоматически перезапускать его при падении или перезагрузке сервера.

Создайте файл сервиса:

nano /etc/systemd/system/myapp.service

Вставьте следующую конфигурацию:

[Unit]
Description=My Java Application
After=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -jar /opt/myapp/myapp-0.0.1-SNAPSHOT.jar --server.port=8080
Restart=on-failure
RestartSec=10
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Пояснения:

  • WorkingDirectory — рабочая папка приложения.
  • ExecStart — полный путь к Java и JAR-файлу.
  • Restart=on-failure — автоматический перезапуск при ошибке.
  • RestartSec=10 — задержка перед перезапуском (10 секунд).

Сохраните файл и выполните команды:

systemctl daemon-reload
systemctl enable myapp.service
systemctl start myapp.service

Проверьте статус:

systemctl status myapp.service

Если всё хорошо, вы увидите active (running).

3.3. Настройка Nginx как reverse proxy

Nginx будет принимать запросы на порту 80 (HTTP) и перенаправлять их на ваше Java-приложение (порт 8080). Это удобно для дальнейшей настройки SSL, балансировки и статики.

Установите Nginx:

apt install nginx -y

Создайте конфигурационный файл для вашего домена (или IP):

nano /etc/nginx/sites-available/myapp

Блоги

Рекомендаций по книгам