104 lines
4.8 KiB
Markdown
104 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 БД
|