Введение: почему 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