Введение
Разработка 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