Как запустить через docker-compose телеграмм бота на aiogram+PostgreSQL?

Для запуска телеграмм-бота на основе aiogram с использованием Docker и PostgreSQL можно использовать следующие шаги:

Шаг 1: Установка Docker и docker-compose
Сначала вам нужно установить Docker и docker-compose на вашу машину. Инструкции по установке вы можете найти на официальном сайте Docker.

Шаг 2: Настройка Docker-контейнера с PostgreSQL
Создайте файл docker-compose.yml и добавьте следующий код:

version: "3"
services:
  db:
    image: postgres:latest
    container_name: postgresql
    environment:
      POSTGRES_USER: your_username # замените на имя пользователя базы данных
      POSTGRES_PASSWORD: your_password # замените на пароль базы данных
      POSTGRES_DB: your_database # замените на имя базы данных
    ports:
      - "5432:5432"
    volumes:
      - ./data:/var/lib/postgresql/data

Шаг 3: Установка зависимостей и создание бота
Создайте файл requirements.txt и добавьте следующие зависимости:

aiogram==2.15
asyncpg==0.24.0

Установите зависимости, выполните следующую команду в терминале:

pip install -r requirements.txt

Создайте файл main.py и добавьте следующий код, чтобы создать экземпляр телеграмм-бота с подключением к базе данных PostgreSQL:

import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters import Command, Text
from aiogram.dispatcher.middlewares import BaseMiddleware
import asyncpg

# Здесь вам нужно заменить значения на ваши собственные
POSTGRES_HOST = 'localhost'
POSTGRES_USER = 'your_username'
POSTGRES_PASSWORD = 'your_password'
POSTGRES_DB = 'your_database'

# Инициализация бота и диспетчера
bot = Bot(token="YOUR_BOT_TOKEN")
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


# Подключение к базе данных
async def connect_to_db():
    conn = await asyncpg.connect(
        host=POSTGRES_HOST,
        user=POSTGRES_USER,
        password=POSTGRES_PASSWORD,
        database=POSTGRES_DB
    )
    await conn.set_type_codec(
        'jsonb',
        encoder=lambda v: json.dumps(v, default=str),
        decoder=json.loads,
        schema='pg_catalog'
    )
    return conn


# Middleware для подключения к базе данных
class DatabaseMiddleware(BaseMiddleware):
    async def on_pre_process_message(self, message: types.Message, data: dict) -> None:
        data['db'] = await connect_to_db()

    async def on_post_process_message(self, message: types.Message, data: dict) -> None:
        await data['db'].close()


dp.middleware.setup(DatabaseMiddleware())


# Обработчик команды /start
@dp.message_handler(Command("start"))
async def cmd_start(message: types.Message, state: FSMContext):
    # Ваш код обработки команды
    pass


# Главная функция
async def main():
    await dp.start_polling()


if __name__ == '__main__':
    asyncio.run(main())

Шаг 4: Запуск контейнера с PostgreSQL и бота через docker-compose
Выполните следующую команду в терминале, чтобы запустить контейнер с PostgreSQL и бота:

docker-compose up

Теперь телеграмм-бот должен быть запущен и готов к работе с базой данных PostgreSQL.

Важно: не забудьте выполнить необходимые настройки в файле main.py, указав свои значения для переменных POSTGRES_HOST, POSTGRES_USER, POSTGRES_PASSWORD и POSTGRES_DB. Также замените YOUR_BOT_TOKEN на токен вашего бота Telegram.