Запуск 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, но как её исправить не знаю.
Заранее извиняюсь за кривое написание вопроса.