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

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

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

Начать курс

Введение: почему VPS — идеальный выбор для Java приложений

Деплой Java-приложения на виртуальный частный сервер (VPS) — это золотой стандарт для разработчиков, которые хотят получить полный контроль над средой выполнения. В отличие от shared-хостинга, VPS предоставляет выделенные ресурсы (CPU, RAM, диск), позволяет настраивать Java Virtual Machine (JVM), устанавливать любые библиотеки и конфигурировать сервер под конкретные нужды проекта.

В этой статье мы разберем полный цикл деплоя: от подготовки VPS и установки JDK до запуска приложения в production-режиме с использованием systemd. Все шаги сопровождаются примерами кода и командами для Linux (Ubuntu 22.04 LTS).

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

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

После покупки VPS вы получите IP-адрес и root-пароль. Подключитесь через SSH:

ssh root@ваш_IP_сервера

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

adduser deployer
usermod -aG sudo deployer

1.2. Установка Java (JDK 17 LTS)

Для современных Java-приложений лучше всего подходит OpenJDK 17. Выполните:

sudo apt update
sudo apt install openjdk-17-jdk -y

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

java -version
# Вывод: openjdk version "17.0.10" 2024-01-16 LTS

1.3. Установка Git и Maven/Gradle

Для сборки проекта из репозитория:

sudo apt install git maven -y
# Или для Gradle:
# sudo apt install gradle -y

2. Сборка и подготовка приложения

2.1. Клонирование репозитория

Предположим, ваше Spring Boot приложение находится на GitHub:

cd /opt
sudo git clone https://github.com/ваш_аккаунт/my-java-app.git
cd my-java-app

2.2. Сборка JAR-файла

Для Maven:

mvn clean package -DskipTests

В результате в target/ появится файл my-app-0.0.1-SNAPSHOT.jar. Убедитесь, что он запускается:

java -jar target/my-app-0.0.1-SNAPSHOT.jar --server.port=8080

Проверьте работу: откройте в браузере http://ваш_IP:8080.

2.3. Оптимизация JAR для production

Добавьте в application.properties параметры для production:

server.port=8080
spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=app_user
spring.datasource.password=secure_password
spring.jpa.hibernate.ddl-auto=validate

Никогда не храните реальные пароли в коде — используйте переменные окружения или Vault.

3. Настройка базы данных и окружения

3.1. Установка PostgreSQL

sudo apt install postgresql postgresql-contrib -y
sudo systemctl start postgresql
sudo systemctl enable postgresql

Создайте базу и пользователя:

sudo -u postgres psql
CREATE DATABASE mydb;
CREATE USER app_user WITH PASSWORD 'secure_password';
GRANT ALL PRIVILEGES ON DATABASE mydb TO app_user;
\q

3.2. Настройка переменных окружения

Создайте файл /etc/environment.d/java-app.conf:

DB_URL=jdbc:postgresql://localhost:5432/mydb
DB_USER=app_user
DB_PASSWORD=secure_password
JAVA_OPTS="-Xms256m -Xmx512m"

Перезагрузите окружение:

source /etc/environment.d/java-app.conf

4. Запуск приложения как systemd-сервиса

4.1. Создание unit-файла

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

[Unit]
Description=Java Spring Boot Application
After=network.target postgresql.service

[Service]
User=deployer
WorkingDirectory=/opt/my-java-app
ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/my-java-app/target/my-app-0.0.1-SNAPSHOT.jar
SuccessExitStatus=143
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

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

sudo systemctl daemon-reload
sudo systemctl enable java-app
sudo systemctl start java-app
sudo systemctl status java-app

Логи можно смотреть через:

sudo journalctl -u java-app -f

5. Настройка обратного прокси (Nginx)

Чтобы приложение было доступно по стандартному 80 порту и через домен, установите Nginx:

sudo apt install nginx -y

Создайте конфигурацию /etc/nginx/sites-available/myapp:

server {
    listen 80;
    server_name mydomain.ru www.mydomain.ru;

    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;
    }
}

Активируйте сайт и проверьте:

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

Заключение

Мы прошли полный путь от чистой VPS до работающего Java-приложения с базой данных, systemd-сервисом и обратным прокси. Теперь ваше приложение готово к реальной нагрузке. Дополнительно рекомендую:

  • Настроить SSL-сертификат через Certbot (Let's Encrypt).
  • Настроить мониторинг (Prometheus + Grafana).
  • Внедрить CI/CD (GitHub Actions

Блоги

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