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

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

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

Начать курс

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

Разработка Java-приложения — это только половина дела. Вторая, не менее важная часть — это его развертывание (деплой) на production-сервере. В этом руководстве мы пройдем полный цикл деплоя Java (Spring Boot) приложения на виртуальный выделенный сервер (VPS) с операционной системой Ubuntu 22.04. Вы узнаете, как настроить сервер, собрать проект, запустить его как системный сервис и обеспечить безопасный доступ через веб-сервер.

1. Подготовка VPS и установка необходимого ПО

Первый шаг — подключение к вашему VPS через SSH и установка Java Runtime Environment (JRE) и Git.

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

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

Обновление пакетов и установка Java (OpenJDK 17)

Для Spring Boot 3.x рекомендуется Java 17. Установим OpenJDK.

apt update && apt upgrade -y
apt install openjdk-17-jdk git -y
java -version

Вы должны увидеть информацию о версии Java 17.

Установка Nginx (для reverse proxy)

apt install nginx -y
systemctl start nginx
systemctl enable nginx

2. Сборка Java-приложения (Maven/Gradle)

На вашей локальной машине (или непосредственно на сервере, если вы клонируете репозиторий) необходимо собрать JAR-файл. Рассмотрим оба варианта.

Вариант A: Локальная сборка и копирование на сервер

Предположим, у вас есть Spring Boot проект с Maven.

# На локальной машине
mvn clean package -DskipTests
# Файл появится в target/my-app-0.0.1-SNAPSHOT.jar

Затем копируем его на сервер через SCP:

scp target/my-app-0.0.1-SNAPSHOT.jar root@ваш-ip:/opt/myapp/

Вариант B: Сборка прямо на сервере

Клонируем репозиторий и собираем проект:

cd /opt
git clone https://github.com/ваш-username/ваш-репозиторий.git myapp
cd myapp
./mvnw clean package -DskipTests
# Или, если Maven установлен глобально:
mvn clean package -DskipTests

3. Настройка продакшн-конфигурации и создание systemd-сервиса

Чтобы приложение автоматически запускалось при старте системы и перезапускалось в случае сбоя, создадим systemd unit-файл.

Создание скрипта запуска

Создайте директорию для приложения (если еще не создали):

mkdir -p /opt/myapp
# Переместите JAR-файл в эту директорию, если он еще не там

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

Создайте файл /etc/systemd/system/myapp.service:

nano /etc/systemd/system/myapp.service

Вставьте следующее содержимое (замените пути и параметры под ваш проект):

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

[Service]
User=root
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/java -Xms256m -Xmx512m -jar /opt/myapp/my-app-0.0.1-SNAPSHOT.jar --server.port=8080
SuccessExitStatus=143
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Пояснение параметров:

  • -Xms256m -Xmx512m — начальный и максимальный размер кучи Java.
  • --server.port=8080 — порт, на котором будет работать приложение.
  • Restart=always — автоматический перезапуск при падении.

Запуск и проверка сервиса

systemctl daemon-reload
systemctl start myapp
systemctl status myapp
systemctl enable myapp  # Автозапуск при загрузке

Проверьте, что приложение отвечает локально:

curl http://localhost:8080/actuator/health

Вы должны получить JSON-ответ со статусом UP.

4. Настройка Reverse Proxy через Nginx

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

Создание конфигурации Nginx

Удалите дефолтный конфиг и создайте новый:

rm /etc/nginx/sites-enabled/default
nano /etc/nginx/sites-available/myapp

Вставьте следующий код:

server {
    listen 80;
    server_name ваш-домен-или-IP;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Активация конфигурации

ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t  # Проверка синтаксиса
systemctl restart nginx

Теперь ваше приложение должно быть доступно по адресу http://ваш-ip без указания порта.

5. Настройка HTTPS (SSL-сертификат) через Let's Encrypt

Обязательный шаг для продакшна — шифрование трафика. Используем Certbot.

apt install certbot python3-certbot-nginx -y
certbot --nginx -d ваш-домен.ru

Следуйте инструкциям на экране. Certbot автоматически обновит конфигурацию Nginx и настроит автоматическое продление сертификата.

6. Мониторинг и управление логами

Для отслеживания работы приложения используйте стандартные инструменты Linux.

Просмотр логов

Блоги

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