Введение
Привет, Хабр! В своей первой статье я бы хотел поделиться опытом в развертывании Spring Boot приложения. Но для начала небольшое отступление, которое должно ответить на вопросы зачем и почему.
Недавно я столкнулся с задачей разработать Telegram бота. Казалось бы, что тут сложного? Ну раз надо, то разрабатывай, где тут могут быть сложности? Но вот беда, ранее я не сталкивался с задачей развертывания проекта, тем более было много вопросов касаемо получения SSL сертификата так как Telegram API работает только с HTTPS протоколом. Увы после долгих поисков я так и не нашел статьи, которая ответила бы на все вопросы, поэтому процесс деплоя затянулся из-за того, что пришлось собирать весь материал по кусочкам. Теперь, когда у меня получилось разобраться с этой проблемой, я бы хотел вам рассказать как это сделать, чтобы сэкономить вам время и бонусом 2000 рублей за SSL сертификат)
Репозиторий с финальным проектом вы можете найти здесь — тык. Для удобства сделал 3 ветки, о смысле которых вы поймете после прочтения)
И так, начнем!
Подготовим сервер
Для своих тестов я использовал самый простой облачный сервер на Ubuntu от Timeweb.
Первое, что нам потребуется сделать — это подготовить сервер, а именно:
Создать нового пользователя с привилегией администратора
Установить Docker и Docker Compose
Установить git и авторизоваться
Если будет интересно могу позже написать отдельную статью как подготовить сервер
Клонируем приложение
Для тестов я сделал простое Spring Boot приложение и чтобы было интересней использовал не H2, а PostgreSQL + Flyway.
mkdir spring-boot-deploy-with-nginx-example
cd spring-boot-deploy-with-nginx-example/
git clone git@github.com:Mark1708/simple-spring-boot-app.git test-deploy
В этом проекте вы можете найти заготовленный Dockerfile. Совершенно простой без multistage, но нам этого и не надо для простого тестового проекта.
FROM maven:3.6.3-jdk-11 AS builder
COPY ./ ./
RUN mvn clean package -DskipTests
FROM openjdk:11.0.7-jdk-slim
COPY --from=builder /target/simple-spring-boot-app-0.0.1-SNAPSHOT.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
Настроим веб сервер
Использовать будем Nginx, поэтому настроим минимальную конфигурацию и двинем дальше.
Для начала создадим директорию: mkdir -p nginx/conf.d
Затем откроем файл через vim: vim nginx/conf.d/app.conf
Никогда не думал, что vim может понравиться, однако пока занимался деплоем проекта моё мнение поменялось
Полезные команды которые пригодились:
-
:set paste
для копирования без авто отступов-
:set number
для нумерации строк
И напишем серверный блок:
server {
listen 80;
listen [::]:80;
charset utf-8;
access_log off;
root /var/www/html;
server_name domen.ru www.domen.ru;
location / {
proxy_pass http://simple-spring-boot-app:8080;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /static {
access_log off;
expires 30d;
alias /simple-spring-boot-app/static;
}
location ~ /.well-known/acme-challenge {
allow all;
root /var/www/html;
}
}
И да, не забываем заменить
domen.ru
на ваш настоящий домен, либо можете его приобрести и не париться