VPS для Java и Spring Boot: jar, systemd, память JVM
Spring Boot собирается в исполняемый fat-jar со встроенным Tomcat — деплой сводится к запуску одного файла. Разберём установку JDK, запуск под systemd, настройку памяти JVM и проксирование через nginx.
Содержание
Особенности Java на VPS
['Главное, что нужно учитывать при деплое Java, — потребление памяти. JVM резервирует heap и метапространство, и на сервере с 1 ГБ RAM Spring Boot может стартовать впритык. Для комфортной работы обычно берут от 2 ГБ.', 'Зато Spring Boot предельно упрощает деплой: fat-jar включает встроенный веб-сервер и все зависимости. Не нужно ставить и настраивать отдельный Tomcat — достаточно JRE и одной команды java -jar.', '- Fat-jar — всё в одном файле, включая сервер.
- Требователен к RAM — планируйте heap заранее.
- Стабильность — проверенная временем экосистема и зрелые инструменты мониторинга.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для JavaУстановка JDK
['Для запуска достаточно JRE, но чаще ставят полный JDK. Возьмём OpenJDK 21 LTS из репозиториев.', 'sudo apt update && sudo apt install -y openjdk-21-jre-headless nginx\njava -version', 'Проверьте версию: команда java -version должна показать 21. Заведём пользователя и каталог для приложения:', 'sudo useradd -r -s /usr/sbin/nologin springapp\nsudo mkdir -p /opt/springapp\nsudo chown springapp:springapp /opt/springapp']
Сборка и копирование jar
['Собираем локально через Maven или Gradle. Результат — исполняемый jar в target или build/libs.', './mvnw clean package -DskipTests\n# или\n./gradlew bootJar', 'scp target/app-0.0.1-SNAPSHOT.jar springapp@SERVER_IP:/opt/springapp/app.jar', 'Профиль production удобно вынести в отдельный application-prod.yml и активировать его переменной окружения. Так вы не смешиваете настройки БД и логирования боевого контура с локальной разработкой.', 'SPRING_PROFILES_ACTIVE=prod java -jar app.jar']
systemd и память JVM
['Ключевой момент — явно ограничить heap флагами -Xms и -Xmx, иначе JVM может забрать до четверти RAM и упереться в лимит. Для сервера с 2 ГБ разумно выделить около 1 ГБ под heap.', '[Unit]\nDescription=Spring Boot app\nAfter=network.target\n\n[Service]\nUser=springapp\nWorkingDirectory=/opt/springapp\nExecStart=/usr/bin/java -Xms256m -Xmx1024m -jar /opt/springapp/app.jar\nSuccessExitStatus=143\nRestart=always\nRestartSec=5\nEnvironment=SERVER_PORT=8080\n\n[Install]\nWantedBy=multi-user.target', 'sudo systemctl daemon-reload\nsudo systemctl enable --now springapp\njournalctl -u springapp -f', 'Флаг SuccessExitStatus=143 нужен, чтобы systemd не считал корректную остановку по SIGTERM ошибкой. Начиная с Java 10+ JVM умеет читать лимиты контейнера и cgroup, но на голом VPS полагаться на автоопределение не стоит — явные -Xms и -Xmx дают предсказуемое поведение.', 'Полезно сразу включить дамп кучи при переполнении памяти: тогда после OOM у вас останется файл для анализа, а не только строчка в логе. Добавьте в ExecStart флаги -XX:+HeapDumpOnOutOfMemoryError и укажите каталог для дампов.', '-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/springapp/dumps/']
nginx и HTTPS
['Приложение слушает 8080 на localhost, nginx отдаёт наружу 80/443 и терминирует TLS.', 'server {\n listen 80;\n server_name example.com;\n location / {\n proxy_pass http://127.0.0.1:8080;\n proxy_set_header Host $host;\n proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n proxy_set_header X-Forwarded-Proto $scheme;\n }\n}', 'sudo nginx -t && sudo systemctl reload nginx\nsudo certbot --nginx -d example.com']
Выбор конфигурации и ошибки
['Java-приложения выигрывают от быстрой памяти и диска: старт JVM и работа GC ощутимо приятнее на NVMe. AMD EPYC + NVMe у MAATRIX дают запас по CPU и I/O, а от $8/мес можно взять тариф под тестовый контур и вырасти под прод. Локации UK/США и оплата из России (карта РФ, СБП, крипта, MAAT) снимают барьеры с зарубежным сервером.', '- Нет -Xmx — JVM берёт слишком много RAM и падает по OOM.
- 1 ГБ на прод — Spring Boot стартует на грани, берите от 2 ГБ.
- Забыли SuccessExitStatus=143 — systemd логирует ложные ошибки при рестарте.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK и США. Оплата картой РФ и по СБП.
Арендовать VPS для JavaЧастые вопросы
Сколько памяти выделить JVM?
Ориентируйтесь на 50-60% доступной RAM под -Xmx, оставив запас системе и nginx. На 2 ГБ сервере разумно -Xmx1024m.
Нужен ли отдельный Tomcat?
Нет. Spring Boot включает встроенный сервер в fat-jar. Внешний Tomcat нужен только для классического war-деплоя.
Как ускорить старт Spring Boot?
Отключите ненужные автоконфигурации, используйте lazy initialization и рассмотрите GraalVM native image для критичных к времени старта сервисов.