Запуск Nginx\ Телеграмм бот

введите сюда описание изображенияТак выглядит кусок описания того, как должен работать телеграмм бот:

1)Пользователь через приложение Telegram отправляет сообщение (любое) на сервера Telegram;

2)Компонент Telegram Client обращается к серверам Telegram и получает список всех новых сообщений;

3)Компонент Telegram Client достаёт из списка новых сообщений наше (предполагается, что оно первое в списке) затем обрабатываются остальные;

4)Компонент Telegram Client проверяет сообщение пользователя на предусмотренное в боте.

5)Если мы не предусмотрели ответ на такое сообщение, то отвечаем: Нет такой команды;

6)Если обработчик для сообщения пользователя найден, то Telegram Client перенаправляет запрос компоненту Bot Logic (перед ним сидит компонент Nginx);

7)Nginx перенаправляет запрос одной из рабочих копий компонента Bot Logic;

run.py:
import asyncio
import logging
from aiogram import Bot, Dispatcher
from aiogram.fsm.storage.redis import RedisStorage
import redis.asyncio as aioredis

from config import TOKEN, REDIS_HOST, REDIS_PORT, REDIS_DB
from app.handlers import router
from aiogram.types import Message
from typing import Any, Dict, Callable, Awaitable

class RedisMiddleware:
def __init__(self, redis: aioredis.Redis):
    self.redis = redis
async def __call__(self, handler: Callable[[Message, Dict[str, Any]], Awaitable[Any]], 
event: Message, data: Dict[str, Any]) -> Any:
    data["redis"] = self.redis
    return await handler(event, data)

async def main():
    redis = await aioredis.from_url(f'redis://{REDIS_HOST}:{REDIS_PORT}/{REDIS_DB}')
    bot = Bot(token=TOKEN)
    dp = Dispatcher(storage=RedisStorage(redis))
    dp.include_router(router)
    router.message.middleware(RedisMiddleware(redis))

await dp.start_polling(bot)

if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print('Остановка')

handlers.py:

from aiogram import F, Router
from aiogram.filters import CommandStart, Command
from aiogram.types import Message
from redis.asyncio import Redis
from typing import Any

router = Router()

@router.message(CommandStart())
async def cmd_start(message: Message):
await message.answer('Старт')

@router.message()
async def _(message: Message, redis: Redis):
   value = await redis.get("TEST")
   if value:
      value_str = value.decode("utf-8")
      await message.answer(value_str)
   else:
      await message.answer('Ключ не найден')

И тут возникают проблемы, а точнее на 6-7 пунктах. Nginx в моём случаи должен работать только как балансировщик нагрузки и вот такую конфигурацию я написал:

upstream bot_servers {
    server 127.0.0.1:8080;
}

server {
    listen 80;
    server_name мой публичный ip;

location / {
    proxy_pass http://bot_servers;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    }
}

Но насколько я понимаю это неправильно, ибо даже с выключенным сервером Nginx бот всё равно работает и отвечает на сообщения(хотя не должен). И я не знаю всё ли я правильно сделал. Мне кажется у меня кривая конфигурация Nginx, но как её исправить не знаю.

Заранее извиняюсь за кривое написание вопроса.


Ответы (0 шт):