# Архитектура системы
Документ описывает внутреннюю архитектуру и принципы работы Telegram Video Download Bot.
## Общая архитектура
Система состоит из микросервисной архитектуры с раздельными сервисами для каждого источника видео:
1. **Основной бот** (`bot.py`) — Telegram бот, обрабатывающий запросы пользователей
2. **YouTube Downloader Service** (`youtube-downloader/`) — порт 5557
3. **Instagram Downloader Service** (`instagram-downloader/`) — порт 5556
4. **VK Downloader Service** (`vk-downloader/`) — порт 5555
5. **Yapfiles Downloader Service** (`yapfiles-downloader/`) — порт 5558
6. **TikTok Downloader Service** (`tiktok-downloader/`) — порт 5559
```
┌─────────────────┐
│ Telegram User │
└────────┬────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ Основной бот (bot.py) │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Message Handler │ │
│ │ - URL extraction │ │
│ │ - Source detection (YouTube/Instagram/TikTok/VK/ │ │
│ │ Yapfiles) │ │
│ │ - Localization (ru/en) │ │
│ └────────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ HTTP API Clients (httpx) │ │
│ │ - YouTube, Instagram, TikTok, VK, Yapfiles │ │
│ └────────────────────────────────────────────────────┘ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ SQLite Database (data/bot.db) │ │
│ │ - users (chat_id, username, locale, ...) │ │
│ │ - stats (total_downloads) │ │
│ └────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
│ HTTP POST /download/stream
▼
┌────────┬────────┬────────┬────────┬────────┐
│YouTube │Instagram│ TikTok │ VK │Yapfiles│
│ :5557 │ :5556 │ :5559 │ :5555 │ :5558 │
│ │ │ │ │ │
│yt-dlp │yt-dlp │yt-dlp │yt-dlp │requests│
│ │+cookies│ │ │+parsing│
└────────┴────────┴────────┴────────┴────────┘
```
## Компоненты системы
### 1. Основной бот (bot.py)
**Технологии:**
- `python-telegram-bot` — асинхронный фреймворк для Telegram Bot API
- `httpx` — асинхронный HTTP клиент
- `sqlite3` — база данных
**Ключевые функции:**
#### Локализация
```python
TEXTS = {
'ru': { 'start': '...', 'support': '...', ... },
'en': { 'start': '...', 'support': '...', ... }
}
def get_locale_from_language_code(language_code: str) -> str:
# 'ru*' → 'ru', иначе → 'en'
```
#### Определение источника
```python
def detect_video_source(url: str) -> str:
# youtube.com, youtu.be → 'youtube'
# instagram.com → 'instagram'
# tiktok.com → 'tiktok'
# vk.com, vkontakte.ru → 'vk'
# yapfiles.ru → 'yapfiles'
# иначе → 'unknown'
```
#### Команды
- `/start` — приветствие с локализацией
- `/stat` — статистика бота
- `/support` — информация о боте и контакт автора
### 2. Сервисы загрузчиков
Все сервисы имеют единый API:
| Endpoint | Метод | Описание |
|----------|-------|----------|
| `/health` | GET | Проверка работоспособности |
| `/download/stream` | POST | Скачивание видео |
**Request:**
```json
{"url": "https://..."}
```
**Response:** Бинарные данные видео или JSON с ошибкой.
#### YouTube Downloader (порт 5557)
- Использует `yt-dlp` с настройками для YouTube
- Поддержка shorts, плейлистов
#### Instagram Downloader (порт 5556)
- Использует `yt-dlp` с cookies
- Требует `instagram_cookies.txt`
#### TikTok Downloader (порт 5559)
- Использует `yt-dlp`
- Поддержка коротких и полных ссылок
#### VK Downloader (порт 5555)
- Использует `yt-dlp` с русскими заголовками
- Не требует VPN в РФ
#### Yapfiles Downloader (порт 5558)
- Парсит HTML страницу
- Извлекает прямую ссылку на видео
- Использует `requests` + `BeautifulSoup`
### 3. База данных
**Схема:**
```sql
CREATE TABLE users (
chat_id INTEGER PRIMARY KEY,
username TEXT,
first_name TEXT,
first_seen TEXT NOT NULL,
last_seen TEXT NOT NULL,
locale TEXT DEFAULT 'en' -- ru/en
);
CREATE TABLE stats (
id INTEGER PRIMARY KEY CHECK (id = 1),
total_downloads INTEGER DEFAULT 0
);
```
**Миграция:** При запуске бот автоматически добавляет колонку `locale` если её нет (для совместимости со старой базой).
### 4. Скрипт рассылки (broadcast.py)
Консольная утилита для отправки сообщений всем пользователям:
```bash
./broadcast.py -y "Текст сообщения"
./broadcast.py -y --html "Жирный текст"
./broadcast.py -y --file message.txt
./broadcast.py --list # показать пользователей
```
Автоматически читает `.env` для получения токена бота.
## Docker архитектура
### Порты
| Сервис | Внешний порт | Внутренний порт |
|--------|--------------|-----------------|
| VK | 5555 | 5000 |
| Instagram | 5556 | 5000 |
| YouTube | 5557 | 5000 |
| Yapfiles | 5558 | 5000 |
| TikTok | 5559 | 5000 |
### Volumes
**Основной бот:**
- `./video:/app/video` — скачанные видео
- `./data:/app/data` — база данных
**Сервисы загрузчиков:**
- `./downloads:/app/downloads` — временные файлы
- (Instagram) `./instagram_cookies.txt:/app/instagram_cookies.txt:ro`
## Потоки данных
```
User → Telegram → Bot
↓
detect_video_source(url)
↓
download_{source}_video()
↓
HTTP POST → Service → yt-dlp/parser
↓
binary video data
↓
save to video/ → send to User
↓
increment_downloads()
```
## Развертывание
### Вариант 1: Все на одном хосте
```bash
# Запуск всех сервисов
for dir in youtube instagram vk yapfiles tiktok; do
cd ${dir}-downloader && docker compose up -d && cd ..
done
docker compose up -d
```
### Вариант 2: Раздельное развертывание
**Хост 1 (с VPN для YouTube/Instagram/TikTok):**
- Основной бот
- YouTube, Instagram, TikTok сервисы
**Хост 2 (без VPN):**
- VK, Yapfiles сервисы
В `.env` на хосте 1:
```env
VK_DOWNLOADER_URL=http://:5555
YAPFILES_DOWNLOADER_URL=http://:5558
```
## Безопасность
- Токен бота в `.env` (не коммитится)
- Cookies Instagram в отдельном файле (не коммитится)
- Сервисы доступны только по указанным URL
- Можно добавить API key между сервисами
## Мониторинг
- Все сервисы логируют в stdout
- Health check: `GET /health` на каждом сервисе
- Логи Docker: `docker compose logs -f`
## Будущие улучшения
1. **Аутентификация между сервисами** — API key/JWT
2. **Очередь задач** — Celery для фоновой обработки
3. **Prometheus метрики** — мониторинг производительности
4. **Кеширование** — Redis для частых запросов
5. **Поддержка новых источников** — Twitter, Facebook, etc.