Задача - заставить телеграмм бота, написанного на aiogram (python), работать на Webhook. Вроде все сделал, но бот не работает. Расскажу по порядку, чтобы было прощу понять где я ошибся или что-то пропустил:
Для начала арендовал VDS на Ubuntu 20.04 (
предположим его IP-адрес 50.60.70.80) и арендовал доменное имя (
предположим имя domain123.ru), связав его с IP-адресом VDS.
Далее по ssh подключился к VDS. Нижеуказанной командой установил nginx:
sudo apt install nginx
Далее включил встроенный firewall:
sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Далее открыл порты 80, 443 для Nginx и порт 3001:
sudo ufw allow 'Nginx Full'
sudo ufw allow 3001
sudo ufw allow 3001/tcp
Проверил работает ли nginx:
systemctl status nginx
В ответ получил, что статус Active (running).
Далее установил сертификат при помощи certbot (
он же letsencrypt) по этой
инструкции. Все прошло успешно и были созданы файлы с сертификатом и приватным ключом в директориях:
/etc/letsencrypt/live/domain123.ru/fullchain.pem
/etc/letsencrypt/live/domain123.ru/privkey.pem
Проверил, работает ли сервер, пройдя по всем возможным ссылкам:
1)
http:// 50.60.70.80
2)
https://50.60.70.80
3)
http:// domain123.ru
4)
https://domain123.ru
При каждом переходе выдавалась стартовая страница Nginx, что, как я понимаю, говорит о том, что сервер работает:
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
В файл конфигурации Nginx (
nginx.conf) добавил следующее (
не особо понимая что это, нагуглил на просторах интернета):
server {
listen 80;
listen 443 ssl;
server_name domain123.ru www.domain123.ru;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/domain123.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain123.ru/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3001;
proxy_redirect off;
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-Host $server_name;
}
}
Далее в директории root создал python-файл echobot.py запускающий эхо-бота согласно документации библиотеки aiogram. Вот его содержимое:
from aiogram import Bot, types
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.dispatcher import Dispatcher
from aiogram.dispatcher.webhook import SendMessage
from aiogram.utils.executor import start_webhook
# webhook settings
WEBHOOK_HOST = 'https://domain123.ru' # доменное имя, которое я арендовал и привязал к серверу
WEBHOOK_PATH = '/this_path_not_exist/123' # уникальный выдуманный несуществующий путь
WEBHOOK_URL = f"{WEBHOOK_HOST}{WEBHOOK_PATH}"
# webserver settings
WEBAPP_HOST = 'localhost' # or ip
WEBAPP_PORT = 3001
API_TOKEN = '1231231231:AAFWEZRSdfsaSDFHABSshb123123'
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
dp.middleware.setup(LoggingMiddleware())
@dp.message_handler()
async def echo(message: types.Message):
await message.answer(text=message.text)
async def on_startup(dp):
print('БОТ ЗАПУЩЕН!')
await bot.set_webhook(WEBHOOK_URL)
async def on_shutdown(dp):
await bot.delete_webhook()
if __name__ == '__main__':
start_webhook(
dispatcher=dp,
webhook_path=WEBHOOK_PATH,
on_startup=on_startup,
on_shutdown=on_shutdown,
skip_updates=True,
host=WEBAPP_HOST,
port=WEBAPP_PORT,
)
Далее перехожу в директорию, где лежит файл с ботом и запускаю его командой:
python3 echobot.py
Бот запускается и в терминал выдается следующая информация:
Updates were skipped successfully
БОТ ЗАПУЩЕН!
======== Running on http://localhost:3001 ========
Однако при отправке сообщения в бота он никак не реагирует - бот просто не видит апдейты, и соответственно никак не реагирует.
Что я сделал не так? Может где-то ошибся или пропустил важный шаг? Помогите плиз, уже прогуглил все что можно...