Перейти к содержимому

Деплой и Webhook

Окно терминала
# Установка секретов (однократно)
echo "YOUR_BOT_TOKEN" | npx wrangler secret put BOT_TOKEN
echo "YOUR_RANDOM_SECRET" | npx wrangler secret put WEBHOOK_TOKEN
# Деплой
npx wrangler deploy

Создайте .github/workflows/deploy.yml:

name: Deploy Bot
on:
workflow_dispatch:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: cloudflare/wrangler-action@v3
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}

Секреты BOT_TOKEN и WEBHOOK_TOKEN задаются через wrangler secret put (они хранятся в Cloudflare, а не в GitHub).

После деплоя установите webhook через Telegram API:

Окно терминала
curl "https://api.telegram.org/botYOUR_BOT_TOKEN/setWebhook" \
-d "url=https://your-bot.your-subdomain.workers.dev" \
-d "secret_token=YOUR_RANDOM_SECRET"

Создайте src/reset_hooks.py:

import asyncio
from edgebot.utils.http import fetch
from edgebot import to_js_object
async def setup():
token = "YOUR_BOT_TOKEN"
url = "https://your-bot.your-subdomain.workers.dev"
secret = "YOUR_RANDOM_SECRET"
resp = await fetch(
f"https://api.telegram.org/bot{token}/setWebhook",
to_js_object({
"method": "POST",
"headers": {"Content-Type": "application/json"},
"body": f'{{"url":"{url}","secret_token":"{secret}"}}',
}),
)
print(await resp.json())

В точке входа проверяйте X-Telegram-Bot-Api-Secret-Token:

class Default(WorkerEntrypoint):
async def fetch(self, request):
secret = request.headers.get("X-Telegram-Bot-Api-Secret-Token")
if not secret or secret != self.env.WEBHOOK_TOKEN:
return Response('{"error":"unauthorized"}', status=401)
update = await request.json()
await self.bot.process_update(update)
return Response('{"ok":true}')

Для привязки собственного домена добавьте в wrangler.toml:

routes = [
{ pattern = "bot.example.com", custom_domain = true }
]
Окно терминала
# Запуск dev-сервера
npx wrangler dev
# Просмотр логов в реальном времени
npx wrangler tail my-bot --format=pretty