Развертывание Spring Boot приложения с помощью Nginx, Let's Encrypt и Docker Compose

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Введение

Привет, Хабр! В своей первой статье я бы хотел поделиться опытом в развертывании Spring Boot приложения. Но для начала небольшое отступление, которое должно ответить на вопросы зачем и почему.

Недавно я столкнулся с задачей разработать Telegram бота. Казалось бы, что тут сложного? Ну раз надо, то разрабатывай, где тут могут быть сложности? Но вот беда, ранее я не сталкивался с задачей развертывания проекта, тем более было много вопросов касаемо получения SSL сертификата так как Telegram API работает только с HTTPS протоколом. Увы после долгих поисков я так и не нашел статьи, которая ответила бы на все вопросы, поэтому процесс деплоя затянулся из-за того, что пришлось собирать весь материал по кусочкам. Теперь, когда у меня получилось разобраться с этой проблемой, я бы хотел вам рассказать как это сделать, чтобы сэкономить вам время и бонусом 2000 рублей за SSL сертификат)

Репозиторий с финальным проектом вы можете найти здесь — тык. Для удобства сделал 3 ветки, о смысле которых вы поймете после прочтения)

И так, начнем!

Подготовим сервер

Для своих тестов я использовал самый простой облачный сервер на Ubuntu от Timeweb.

Первое, что нам потребуется сделать — это подготовить сервер, а именно:

  1. Создать нового пользователя с привилегией администратора

  2. Установить Docker и Docker Compose

  3. Установить 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 на ваш настоящий домен, либо можете его приобрести и не париться

Источник: https://habr.com/ru/post/687210/


Интересные статьи

Интересные статьи

Функции приложения, которые должны выполняться с определенной периодичностью или по расписанию, не выглядят на первый взгляд чем-то сложным. Однако при реализации можно столкнуться с рядом проблем. Гр...
Описывается, как можно инициировать автообновление клиентов Spring Cloud Config Server без использования Spirng Cloud Bus или какой-либо иной вспомогательной технологии в качестве посредника
Фаззинг - это такое тестирование, в котором не надо придумывать тесткейсы, потому что умная машина (или настойчивый алгоритм перебора) делает это за вас.Но с фаззингом есть одна неприятность - не...
Предисловие В данной статье я расскажу о конфигурации для вашей сервисов с помощью связки Vault (KV и пока только первой версии, т.е. без версионирования секретов) и Pydantic (Settings...
Несколько дней назад, я решил провести реверс-инжиниринг прошивки своего роутера используя binwalk. Я купил себе TP-Link Archer C7 home router. Не самый лучший роутер, но для моих нужд вполне ...