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

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

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

  • Як насправді працює @Async у Spring і коли його використання створює більше проблем, ніж вирішує

    Розбираємо небезпеки анотації @Async у Spring — як вона працює за кулісами, чому втрачається контекст логування, підводні камені з транзакціями та self-invocation

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

    Java
  • RFC 7807. Що це і для чого він потрібен бекенд розробникам

    Як стандарт RFC 7807 змінює підхід до обробки помилок у Java розробці. У статті: що це таке, як працює формат "Problem Details", приклади використання та готовий код для інтеграції у Spring Boot

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

    Java
  • Java. jOOQ

    Довгочит буде про jOOQ — бібліотеку, яка зручно поєднує світ Java і SQL. Якщо ви працюєте з базами даних у Java, то, скоріш за все, зустрічались з такими дилемами:

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

    Java

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

  • 💰 Яка вартість багів Notcoin? Завершальна стадія майнінгу $NOT

    Нове завдання Telegram Premium на деякий час став безлімітним, тобто за кожне наступне проходження юзери отримували по 3M монет. І так знову, і знову, і знову. Деякі користувачі навіть уперше купили преміум-підписку спеціально для того, щоб використовувати вразливість.

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

    Криптовалюта
  • Топ 5 Telegram-тапалок, на які варто звернути увагу

    Після нещодавньої роздачі великого дропу від Notcoin, світ Telegram захопили різноманітні міні-ігри та застосунки, відомі як тапалки. У цій статті ми зібрали п’ять найцікавіших тапалок, на які варто звернути увагу.

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

    Криптовалюта
  • Чи потрібно втекти з Telegram? Думки про телеґу, ч.1

    Чому телеґраму — ні? 1) етичність 2) небезпека умовної анонімности 3) кібербезпека (чи радше кібернебезпека російського програмного забезпечення). Про мене, навіть одного із цих пунктів досить, щоб відмовитися від телеґраму. Та поговоримо про все потроху.

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

    Telegram

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

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

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

  • 💰 Яка вартість багів Notcoin? Завершальна стадія майнінгу $NOT

    Нове завдання Telegram Premium на деякий час став безлімітним, тобто за кожне наступне проходження юзери отримували по 3M монет. І так знову, і знову, і знову. Деякі користувачі навіть уперше купили преміум-підписку спеціально для того, щоб використовувати вразливість.

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

    Криптовалюта
  • Топ 5 Telegram-тапалок, на які варто звернути увагу

    Після нещодавньої роздачі великого дропу від Notcoin, світ Telegram захопили різноманітні міні-ігри та застосунки, відомі як тапалки. У цій статті ми зібрали п’ять найцікавіших тапалок, на які варто звернути увагу.

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

    Криптовалюта
  • Чи потрібно втекти з Telegram? Думки про телеґу, ч.1

    Чому телеґраму — ні? 1) етичність 2) небезпека умовної анонімности 3) кібербезпека (чи радше кібернебезпека російського програмного забезпечення). Про мене, навіть одного із цих пунктів досить, щоб відмовитися від телеґраму. Та поговоримо про все потроху.

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

    Telegram