Как поставить webhook на бота aiogram?
Я арендовал сервер, потом запустил бота на long polling - все работает Теперь пытаюсь настроить его на вебхук
Я создал сертификат следующими командами, на линукс сервере:
sudo apt-get install openssl
openssl genrsa -out webhook_pkey.pem 2048
openssl req -new -x509 -days 3650 -key webhook_pkey.pem -out webhook_cert.pem
Теперь пытаюсь переделать код на webhook Как я могу это сделать (для примера буду использовать простого эхо-бота)
from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
import os
# import config
# from config import TOKEN
TOKEN = ":AAHfg0gfUdMYFmeHoWp,h,kegGtQKhLVtmQ"
WEBHOOK_HOST = '81.nnn.1nnn6.23b'
WEBHOOK_PORT = 443 # 443, 80, 88 или 8443 (порт должен быть открыт!)
WEBHOOK_LISTEN = '0.0.0.0' # На некоторых серверах придется указывать такой же IP, что и выше
WEBHOOK_SSL_CERT = '/root/tet/webhook_cert.pem' # Путь к сертификату
WEBHOOK_SSL_PRIV = '/root/tet/webhook_pkey.pem' # Путь к приватному ключу
WEBHOOK_URL_BASE = "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/%s/" % (TOKEN)
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)
async def on_startup(dp):
await bot.set_webhook(WEBHOOK_URL_BASE)
async def on_shutdown(dp):
await bot.delete_webhook()
@dp.message_handler(commands=['start'])
async def process_start_command(message: types.Message):
await message.reply("Привет!\nНапиши мне что-нибудь!")
@dp.message_handler(commands=['help'])
async def process_help_command(message: types.Message):
await message.reply("Напиши мне что-нибудь, и я отпрпавлю этот текст тебе в ответ!")
@dp.message_handler()
async def echo_message(msg: types.Message):
await bot.send_message(msg.from_user.id, msg.text)
executor.start_webhook(
dispatcher=dp,
webhook_path="",
on_startup=on_startup,
on_shutdown=on_shutdown,
skip_updates=True,
host=WEBHOOK_LISTEN,
port=443)
этот код взят из туториала по хероку. Как переделать его под свой сервак?
Ответы (1 шт):
Вот может это поможет, понять: https://www.youtube.com/watch?v=Gw-cVvsaOGE А так смысл, такой. Сначала надо сделать запуск бота как сервис через systemd например. создать файл например aiogram_bot.service, такого содержания:
[Unit]
Description=My Aiogram bot service
After=multi-user.target
[Service]
User=root
Group=root
Type=simple
Restart=always
ExecStart=/usr/bin/python3 /var/www/html/aio/serv_aio.py
[Install]
WantedBy=multi-user.target
Сделать запуск его автоматом после перезагрузки:
sudo systemctl daemon-reload
sudo systemctl enable aiogram_bot.service
Запустить сервис бота:
sudo systemctl start aiogram_bot.service
Проверить статус:
sudo systemctl status
Дальше настроить NGINX на переадресацию на этот сервис. Создать файл в /etc/nginx/sites-available/ по названию вашего домена например "you_site" и поместить туда примерную конфигурацию:
server {
# SSL configuration
#
listen 443 ssl you_site;
listen [::]:443 ssl you_site;
server_name you_site;
location /aio { # Path по которому будет идти переадресация, ваш WEBHOOK_URL
proxy_pass http://localhost:3001; # здесь как раз укажем где работает запущенный сервис бота
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
}
....
}
Перезапустить Nginx:
sudo service nginx restart
или так
sudo systemctl restart nginx
Конфигурация файла если взять отсюда: https://docs.aiogram.dev/en/latest/examples/webhook_example.html будет примерно такая:
WEBHOOK_HOST = 'you_site'
WEBHOOK_PATH = '/aio'
WEBAPP_HOST = 'localhost' # or ip
WEBAPP_PORT = 3001
...
Написал на скорую руку, могут быть ошибки, главное думаю Вас направить в нужном направлении.)
