Вступ
В попередній частині я купив сервер, створив телеграм бота та успішно задеплоїв його на віддаленій машині. Але, кому потрібен бот, який не вміє працювати з даними? Тому поділюсь, як я розширив бота і конфігурацію додавши PostgreSQL.
Залежності
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.3</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.4.0-b180725.0427</version>
</dependency>
Оскільки в нас з’явився Data JPA, нам необхідно вказати інформацію про базу, щоб за допомогою Spring Boot автоконфігурації підняти DataSource бін.
application.properties
spring.datasource.url=${SPRING_DATASOURCE_URL}
spring.datasource.username=${SPRING_DATASOURCE_USERNAME}
spring.datasource.password=${SPRING_DATASOURCE_PASSWORD}
spring.jpa.hibernate.ddl-auto=create-drop
Ми уникнемо хардкод скориставшись системними змінними для підтягування url, імені користувача та паролю. Це дозволить нам легко змінювати ці параметри, коли це необхідно.
docker-compose.yml
Тепер перейдемо до docker-compose.yml. Він дозволяє згрупувати наші контейнери разом і налаштувати їх взаємодію через простий у використанні файл конфігурації. Ми можемо вказати всі наші сервіси, їх залежності та параметри, щоб швидко та легко запускати наш додаток з усіма його компонентами.
version: '3.8'
services:
app:
build: .
image: overpathz/rendertestbot
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/testrenderdb
SPRING_DATASOURCE_USERNAME: ${DB_USER}
SPRING_DATASOURCE_PASSWORD: ${DB_PASS}
SPRING_REDIS_HOST: redis
SPRING_REDIS_PORT: 6379
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN}
depends_on:
- db
- redis
ports:
- "8080:8080"
db:
image: postgres:13.1-alpine
environment:
POSTGRES_DB: testrenderdb
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
volumes:
- ./init-db/:/docker-entrypoint-initdb.d/
redis:
image: redis
volumes:
postgres_data:
SPRING_DATASOURCE_USERNAME: ${DB_USER}
Тут ми визначає змінну середовища в рамках контейнера SPRING_DATASOURCE_USERNAME, значення якої буде взято з іншого джерела, в нашому випадку, це створений .env файл в корені нашого проекту, який автоматично зчитається при піднятті контейнерів під час docker-compose up.
PostgreSQL
db:
image: postgres:13.1-alpine
environment:
POSTGRES_DB: testrenderdb
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
volumes:
- ./init-db/:/docker-entrypoint-initdb.d/
docker-entrypoint-initdb.d
- це каталог, який використовується в Docker для ініціалізації бази даних під час першого запуску контейнера. В цьому каталозі можна розмістити SQL-скрипти або інші файли, які мають бути виконані або оброблені при створенні бази даних в Docker-контейнері.
Створивши додатковий каталог init-db, в якому я додав потрібний скрипт, буде створена ще одна база для мого проекту.
DO
$$
BEGIN
IF NOT EXISTS(SELECT 1 FROM pg_database WHERE datname = 'testrenderdb') THEN
CREATE DATABASE testrenderdb;
END IF;
END
$$;
Оновлення .yml для GitHub Actions
Оскільки змін там достатньо, я залишу лінку на файл. Виділю лише степи і поясню що там і для чого.
https://github.com/overpathz/render-boot-bot/blob/main/.github/workflows/docker-image.yml
- name: Build and Push Docker Compose Services
Тут я роблю билд образу мого застосунку (на основі Dockerfile) та пушу його у мій DockerHub.
- name: Create .env file in project
Ось тут, використовуючи секретні змінні на рівні GitHub Actions, я створюю .env файл у корені мого проекту через доступ по ssh.
name: Deploy to server
І тут, я стягую тепер мій образ з докер репозиторію і запускаю його
docker-compose -f docker-compose.yml up -d
Redis
Додатково я ще додав редіс, бо він потрібен буде мені для дечого при розробці. Але, на ньому акцентувати увагу я не буду.