Как я могу настроить Nginx и бота на aiogram 3?

Здравствуйте! 

Я впервые на Хабре и занимаюсь созданием ботов на Python с использованием aiogram 3. Я уже написал своего первого бота с несколькими кнопками, административной панелью и Redis-сервером. Теперь хочу подключить его к вебхуку. 

Я приобрёл VPS на Timeweb и домен, который, по словам Blackbox, необходим для этого проекта. Я искал руководства и видеоуроки, но нашёл мало информации, и она оказалась довольно разрозненной. Я столкнулся с проблемами при использовании как nginx, так и fastapi с ngrok. Я понял, что ngrok позволяет сделать локальный сервер публичным, но возникают сомнения, требуется ли мне действительно домен. 

Я постарался настроить nginx и сертифицировал его с помощью certbot, изменил конфигурацию по совету Blackbox и адаптировал свой main.py, однако постоянно сталкиваюсь с одной и той же ошибкой. Я даже удалил VPS и создал новый, привязал к нему домен, но по-прежнему не могу найти решение. 

Помогите мне, пожалуйста! Мне нужна подробная инструкция о том, как правильно настроить main.py (выполняемый файл бота) и как настроить свой домен, используя nginx. Я уже потратил по 4-6 часов в день на это, но не нашёл ответов. 

Заранее благодарен за любую помощь! 

Кратко: 
Мне нужна очень подробная инструкция по настройке nginx и скрипта aiogram 3.x для вебхуков на VPS.
  • 14 февраля 2025 г. 15:54
Ответы на вопрос 1
Здравствуйте!

Я рад помочь вам с настройкой вебхуков для вашего бота на aiogram 3.x с использованием Nginx. Давайте пройдемся по шагам, которые вам нужно выполнить.

### Шаг 1: Подготовка окружения

1. **Установите необходимые пакеты на вашем VPS**:
   ```bash
   sudo apt update
   sudo apt install python3 python3-pip python3-venv nginx certbot python3-certbot-nginx
   ```

2. **Создайте виртуальное окружение для вашего бота**:
   ```bash
   mkdir ~/my_bot
   cd ~/my_bot
   python3 -m venv venv
   source venv/bin/activate
   ```

3. **Установите необходимые библиотеки**:
   ```bash
   pip install aiogram[fastapi] uvicorn
   ```

### Шаг 2: Создание скрипта бота

Создайте файл `main.py` и добавьте следующий код:

```python
from aiogram import Bot, Dispatcher, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from fastapi import FastAPI, Request

API_TOKEN = 'YOUR_API_TOKEN'
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)

app = FastAPI()

@app.on_event("startup")
async def startup():
    await bot.delete_webhook()
    await bot.set_webhook('https://your-domain.com/webhook')

@app.post('/webhook')
async def webhook(request: Request):
    update = types.Update(**await request.json())
    await dp.process_update(update)
    return {'status': 'ok'}

@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
    await message.reply("Привет! Я ваш бот!")

if __name__ == '__main__':
    import uvicorn
    uvicorn.run(app, host='0.0.0.0', port=8000)
```

Замените `YOUR_API_TOKEN` на ваш токен бота, а `https://your-domain.com` на ваш домен.

### Шаг 3: Настройка Nginx

Создайте конфигурационный файл для вашего приложения Nginx:

```bash
sudo nano /etc/nginx/sites-available/my_bot
```

Добавьте туда следующее:

```nginx
server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://localhost:8000;
        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;
    }

    location /webhook {
        proxy_pass http://localhost:8000/webhook;
    }
}
```

Замените `your-domain.com` на ваш настоящий домен.

Теперь активируйте новую конфигурацию:

```bash
sudo ln -s /etc/nginx/sites-available/my_bot /etc/nginx/sites-enabled/
```

Проверьте конфигурацию Nginx на наличие ошибок:

```bash
sudo nginx -t
```

Если ошибок нет, перезагрузите Nginx:

```bash
sudo systemctl restart nginx
```

### Шаг 4: Получение SSL-сертификата

Запустите Certbot для автоматической установки SSL-сертификатов:

```bash
sudo certbot --nginx -d your-domain.com
```

Следуйте инструкциям на экране.

### Шаг 5: Запуск бота

Теперь вы можете запустить бота:

```bash
uvicorn main:app --host 0.0.0.0 --port 8000
```

Чтобы бот работал постоянно в фоновом режиме, вы можете использовать такие утилиты, как `screen` или `tmux`, или настроить systemd-сервис.

### Шаг 6: Настройка systemd (по желанию)

Если вы хотите, чтобы бот автоматически запускался при загрузке системы, создайте файл сервиса:

```bash
sudo nano /etc/systemd/system/my_bot.service
```

Добавьте туда следующее:

```ini
[Unit]
Description=My Bot
After=network.target

[Service]
User=your_user
WorkingDirectory=/home/your_user/my_bot
Environment="PATH=/home/your_user/my_bot/venv/bin"
ExecStart=/home/your_user/my_bot/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000

[Install]
WantedBy=multi-user.target
```

Замените `your_user` на
Похожие вопросы