Some checks failed
Backend CI / test (push) Waiting to run
Backend CI / build (push) Blocked by required conditions
Deploy Mnemo Cards / Deploy Backend (push) Waiting to run
Deploy Mnemo Cards / Deploy Web App (push) Blocked by required conditions
Deploy Mnemo Cards / Final Verification (push) Blocked by required conditions
Deploy Telegram Bot / Deploy Telegram Bot (push) Has been cancelled
This will show the exact reason for token verification failure
103 lines
4.8 KiB
Markdown
103 lines
4.8 KiB
Markdown
# Миграция Telegram бота с Isar DB на Backend API
|
||
|
||
## Обзор
|
||
|
||
Telegram бот был мигрирован с прямого доступа к Isar базе данных на использование Backend API через HTTP запросы. Это обеспечивает:
|
||
- Централизованное управление данными
|
||
- Упрощение развертывания (не нужна локальная БД)
|
||
- Единую точку доступа к данным
|
||
|
||
## Изменения
|
||
|
||
### Бэкенд
|
||
|
||
1. **Middleware для API ключа** (`telegram_bot_auth_middleware.dart`)
|
||
- Проверяет заголовок `X-API-Key`
|
||
- Использует переменную окружения `TELEGRAM_BOT_API_KEY`
|
||
|
||
2. **API эндпоинты для бота** (`telegram_bot_api_v2.dart`)
|
||
- `GET /api/v2/telegram-bot/random-card` - получить случайную карточку
|
||
- `POST /api/v2/telegram-bot/share/check-limit` - проверить лимит шаринга
|
||
- `POST /api/v2/telegram-bot/share/record` - записать факт шаринга
|
||
- `GET /api/v2/telegram-bot/users/info` - информация о пользователях
|
||
- `GET /api/v2/telegram-bot/words` - список всех слов
|
||
|
||
### Телеграм бот
|
||
|
||
1. **HTTP клиент** (`backend_client.dart`)
|
||
- Заменяет `DBManager`
|
||
- Поддерживает retry логику с экспоненциальной задержкой
|
||
- Использует API ключ для аутентификации
|
||
|
||
2. **Удалены зависимости**
|
||
- Удалена зависимость `isar` из `pubspec.yaml`
|
||
- Удалена зависимость `args` из `pubspec.yaml` (CLI аргументы больше не используются)
|
||
- Удален файл `db_manager.dart`
|
||
- Удалена опция `--isar` из конфигурации
|
||
|
||
3. **Конфигурация через переменные окружения**
|
||
- CLI аргументы заменены на переменные окружения
|
||
- Все настройки теперь читаются из `Platform.environment`
|
||
- Добавлена переменная `TELEGRAM_BOT_TOKEN` для токена бота
|
||
|
||
## Настройка
|
||
|
||
### Переменные окружения
|
||
|
||
**Бэкенд:**
|
||
```bash
|
||
TELEGRAM_BOT_API_KEY=your-secret-api-key-here
|
||
```
|
||
|
||
**Бот (все обязательны):**
|
||
```bash
|
||
TELEGRAM_BOT_TOKEN=your-telegram-bot-token # Токен бота от BotFather
|
||
TELEGRAM_BOT_API_KEY=your-secret-api-key-here # Должен совпадать с бэкендом
|
||
BACKEND_URL=https://api.mnemo-cards.online # Опционально, по умолчанию используется значение по умолчанию
|
||
BOT_SHARE_DAILY_LIMIT=1 # Опционально, по умолчанию 1
|
||
```
|
||
|
||
**Примечание:** Бот теперь использует только переменные окружения. CLI аргументы больше не поддерживаются.
|
||
|
||
### Docker
|
||
|
||
В `Dockerfile` бота определены переменные окружения:
|
||
```dockerfile
|
||
ENV BACKEND_URL=https://api.mnemo-cards.online \
|
||
BOT_SHARE_DAILY_LIMIT=1 \
|
||
TELEGRAM_BOT_API_KEY= \
|
||
TELEGRAM_BOT_TOKEN=
|
||
```
|
||
|
||
Установите значения при запуске контейнера:
|
||
```bash
|
||
docker run \
|
||
-e TELEGRAM_BOT_TOKEN=your-bot-token \
|
||
-e TELEGRAM_BOT_API_KEY=your-api-key \
|
||
...
|
||
```
|
||
|
||
## Использование
|
||
|
||
Бот работает так же, как и раньше, но теперь все операции выполняются через API:
|
||
|
||
- `/start`, `/login`, `/code` - генерация кодов авторизации
|
||
- `/share` - шаринг карточек с проверкой лимитов
|
||
- `/info`, `/user`, `/words` - административные команды
|
||
|
||
Все данные теперь хранятся и обрабатываются на бэкенде.
|
||
|
||
## Безопасность
|
||
|
||
- API ключ передается через заголовок `X-API-Key`
|
||
- Ключ должен быть достаточно длинным и случайным
|
||
- Рекомендуется использовать переменные окружения, а не хардкодить ключ
|
||
- API ключ должен совпадать в бэкенде и боте
|
||
|
||
## Откат
|
||
|
||
Если нужно вернуться к использованию Isar:
|
||
1. Восстановите файл `db_manager.dart` из git истории
|
||
2. Верните зависимость `isar` в `pubspec.yaml`
|
||
3. Замените `BackendClient` на `DBManager` в `main.dart`
|
||
4. Обновите конфигурацию для использования пути к Isar БД
|