Телеграм бот. PostgreSQL, docker-compose, .env, DockerHub. Част. 2

Вступ

В попередній частині я купив сервер, створив телеграм бота та успішно задеплоїв його на віддаленій машині. Але, кому потрібен бот, який не вміє працювати з даними? Тому поділюсь, як я розширив бота і конфігурацію додавши 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

Додатково я ще додав редіс, бо він потрібен буде мені для дечого при розробці. Але, на ньому акцентувати увагу я не буду.

Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Oleksandr Klymenko
Oleksandr Klymenko@overpathz

Java Software Engineer

2.9KПрочитань
1Автори
53Читачі
На Друкарні з 19 квітня

Більше від автора

  • Java. Повний огляд мережевих моделей. Socket API, forking, non-blocking sockets, event-driven API

    Хоча сокет - це один файловий дескриптор, він є двонаправленим каналом комунікації, який використовується для одночасного відправлення і отримання даних. Операційна система та мережеві протоколи забезпечують управління потоками даних, що дозволяє коректно розрізняти дані

    Теми цього довгочиту:

    Java
  • Java. WebSocket. Spring WebSocket

    Сервер в свою чергу повертає відповідь із 101 статус кодом — що так, давай змінимо протокол між тобою і мною. Тепер будемо використовувати вебсокети. Потім, після з’єднання, я розсилаю всім клієнтам інфомацію про нового користуча (і собі також, не робив додаткових перевірок).

    Теми цього довгочиту:

    Java
  • Телеграм бот. Нотатки. Стаді плани. Архітектура. Вебсокети. Част. 3

    Продовження розробки телеграм бота з попередніх частин. Там ми мінімально налаштовували середовище, а зараз детальніше про саму ідею.

    Теми цього довгочиту:

    Java

Вам також сподобається

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Вам також сподобається