Телеграм бот. 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

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

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

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

  • Pizza Ton

    📣 Створіть свою персоналізовану піцу NFT у всесвіті PizzaTon!

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

    Telegram
  • Порівняння рішень на Java, Kotlin та Scala

    Давайте розглянемо, як задачу https://leetcode.com/problems/relative-ranks/solutions/6326961/sorting-mapping-approach можна вирішити трьома мовами програмування — Java, Kotlin та Scala.

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

    Java
  • 📺Notcoin анонсував запуск токена до кінця квітня і поділився деталями лістингу

    Команда Notcoin оголосила, що запуск токена NOT відбудеться до кінця квітня. Спочатку запланований на 20 квітня, запуск було перенесено для забезпечення безперебійної роботи системи при одночасному запиті мільйонів гравців. Лістинг відбудеться на біржі OKX. TON. Telegram. BTC.

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

    Криптовалюта

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

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

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

  • Pizza Ton

    📣 Створіть свою персоналізовану піцу NFT у всесвіті PizzaTon!

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

    Telegram
  • Порівняння рішень на Java, Kotlin та Scala

    Давайте розглянемо, як задачу https://leetcode.com/problems/relative-ranks/solutions/6326961/sorting-mapping-approach можна вирішити трьома мовами програмування — Java, Kotlin та Scala.

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

    Java
  • 📺Notcoin анонсував запуск токена до кінця квітня і поділився деталями лістингу

    Команда Notcoin оголосила, що запуск токена NOT відбудеться до кінця квітня. Спочатку запланований на 20 квітня, запуск було перенесено для забезпечення безперебійної роботи системи при одночасному запиті мільйонів гравців. Лістинг відбудеться на біржі OKX. TON. Telegram. BTC.

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

    Криптовалюта