Деплой Kotlin приложения на VPS: пошагово от А до Я
Вы написали крутое приложение на Kotlin (Ktor, Spring Boot или просто консольный сервис), и теперь его нужно запустить на реальном сервере. В этой статье мы разберем полный цикл деплоя Kotlin-приложения на VPS: от покупки сервера и настройки SSH до запуска через systemd и подключения домена с HTTPS. Все примеры — рабочие, проверенные на Ubuntu 22.04.
1. Подготовка VPS и подключение
Первым делом арендуйте VPS (например, у Timeweb, Selectel или DigitalOcean). Минимальные требования: 1 vCPU, 1 GB RAM, 20 GB SSD. Операционная система — Ubuntu 22.04 LTS.
После получения IP-адреса и root-пароля подключаемся по SSH:
ssh root@your_server_ip
Сразу обновляем систему и создаём непривилегированного пользователя (работать под root — плохая практика):
apt update && apt upgrade -y
adduser kotlinuser
usermod -aG sudo kotlinuser
su - kotlinuser
Настройте SSH-ключи для удобного и безопасного входа:
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-copy-id kotlinuser@your_server_ip
Теперь отключите парольный вход в /etc/ssh/sshd_config (строка PasswordAuthentication no) и перезапустите SSH: sudo systemctl restart sshd.
2. Установка Java (JRE/JDK) и сборка приложения
Kotlin-приложения работают на JVM. Установите OpenJDK 17 или 21 (рекомендуется для современных проектов):
sudo apt install openjdk-17-jdk -y
java -version
Теперь на вашем локальном компьютере (где ведётся разработка) соберите приложение в JAR-файл. Для Gradle (Ktor или Spring Boot):
./gradlew clean build
Готовый JAR-файл будет лежать в build/libs/. Например, myapp-1.0.0.jar. Загрузите его на сервер:
scp build/libs/myapp-1.0.0.jar kotlinuser@your_server_ip:~/app/
Создайте на сервере структуру папок:
mkdir -p ~/app/logs ~/app/config
Поместите конфигурационные файлы (application.conf, application.yml) в ~/app/config/. Проверьте, что приложение стартует вручную:
cd ~/app
java -jar myapp-1.0.0.jar --spring.config.location=file:./config/
Если всё работает — переходим к автоматическому запуску.
3. Настройка systemd для автозапуска
Чтобы приложение автоматически стартовало после перезагрузки сервера и не падало при ошибках, создадим systemd-сервис.
Создайте файл /etc/systemd/system/kotlin-app.service:
sudo nano /etc/systemd/system/kotlin-app.service
Вставьте следующее содержимое (замените пути на свои):
[Unit]
Description=Kotlin Application Service
After=network.target
[Service]
Type=simple
User=kotlinuser
WorkingDirectory=/home/kotlinuser/app
ExecStart=/usr/bin/java -jar /home/kotlinuser/app/myapp-1.0.0.jar --spring.config.location=file:/home/kotlinuser/app/config/
Restart=on-failure
RestartSec=10
StandardOutput=append:/home/kotlinuser/app/logs/app.log
StandardError=append:/home/kotlinuser/app/logs/error.log
[Install]
WantedBy=multi-user.target
Объяснение ключевых параметров:
- User — от кого запускать (не root);
- ExecStart — полная команда запуска с указанием конфига;
- Restart=on-failure — автоматический перезапуск при падении;
- StandardOutput/Error — логирование в файлы.
Активируем сервис:
sudo systemctl daemon-reload
sudo systemctl enable kotlin-app.service
sudo systemctl start kotlin-app.service
Проверяем статус:
sudo systemctl status kotlin-app.service
Если всё зелёное — ваше Kotlin-приложение работает как демон.
4. Настройка Nginx и SSL (HTTPS)
По умолчанию приложение слушает порт 8080 (или 8443). Чтобы открыть его по домену с HTTPS, установите Nginx и Certbot.
Установка Nginx:
sudo apt install nginx -y
Создайте конфигурацию для вашего домена (например, api.example.com):
sudo nano /etc/nginx/sites-available/kotlin-app
Вставьте:
server {
listen 80;
server_name api.example.com;
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/kotlin-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Теперь установите SSL-сертификат через Certbot (Let's Encrypt):
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d api.example.com
Certbot автоматически подправит конфигурацию Nginx и настроит автообновление сертификатов. После этого ваш домен будет доступен по HTTPS.
5. Мониторинг и обновление приложения
Для проверки логов в реальном времени используйте:
sudo journalctl -u kotlin-app.service -f
tail -f ~/app/logs/app.log
Когда выходит новая версия приложения, процесс обновления выглядит