2025-12-10 16:22:18 +03:00
# Архитектура системы
Документ описывает внутреннюю архитектуру и принципы работы Telegram Video Download Bot.
## Общая архитектура
2025-12-11 01:07:04 +03:00
Система состоит из микросервисной архитектуры с раздельными сервисами для каждого источника видео:
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
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
2025-12-10 16:22:18 +03:00
```
┌─────────────────┐
│ Telegram User │
└────────┬────────┘
│
▼
2025-12-12 12:39:11 +03:00
┌─────────────────────────────────────────────────────────┐
│ Основной бот (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│
└────────┴────────┴────────┴────────┴────────┘
2025-12-10 16:22:18 +03:00
```
## Компоненты системы
### 1. Основной бот (bot.py)
2025-12-11 01:07:04 +03:00
**Технологии:**
2025-12-12 12:39:11 +03:00
- `python-telegram-bot` — асинхронный фреймворк для Telegram Bot API
- `httpx` — асинхронный HTTP клиент
- `sqlite3` — база данных
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
**Ключевые функции:**
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
#### Локализация
```python
TEXTS = {
'ru': { 'start': '...', 'support': '...', ... },
'en': { 'start': '...', 'support': '...', ... }
}
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
def get_locale_from_language_code(language_code: str) -> str:
# 'ru*' → 'ru', иначе → 'en'
```
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
#### Определение источника
```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'
```
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
#### Команды
- `/start` — приветствие с локализацией
- `/stat` — статистика бота
- `/support` — информация о боте и контакт автора
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
### 2. Сервисы загрузчиков
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
В с е сервисы имеют единый API:
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
| Endpoint | Метод | Описание |
|----------|-------|----------|
| `/health` | GET | Проверка работоспособности |
| `/download/stream` | POST | Скачивание видео |
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
**Request:**
```json
{"url": "https://..."}
2025-12-10 16:22:18 +03:00
```
2025-12-12 12:39:11 +03:00
**Response:** Бинарные данные видео или JSON с ошибкой.
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
#### YouTube Downloader (порт 5557)
- Использует `yt-dlp` с настройками для YouTube
- Поддержка shorts, плейлистов
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
#### Instagram Downloader (порт 5556)
- Использует `yt-dlp` с cookies
- Требует `instagram_cookies.txt`
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
#### TikTok Downloader (порт 5559)
- Использует `yt-dlp`
- Поддержка коротких и полных ссылок
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
#### VK Downloader (порт 5555)
- Использует `yt-dlp` с русскими заголовками
- Н е требует VPN в РФ
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
#### Yapfiles Downloader (порт 5558)
- Парсит HTML страницу
- Извлекает прямую ссылку на видео
- Использует `requests` + `BeautifulSoup`
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
### 3. База данных
2025-12-10 16:22:18 +03:00
**Схема:**
```sql
CREATE TABLE users (
chat_id INTEGER PRIMARY KEY,
username TEXT,
first_name TEXT,
first_seen TEXT NOT NULL,
2025-12-12 12:39:11 +03:00
last_seen TEXT NOT NULL,
locale TEXT DEFAULT 'en' -- ru/en
2025-12-10 16:22:18 +03:00
);
CREATE TABLE stats (
id INTEGER PRIMARY KEY CHECK (id = 1),
total_downloads INTEGER DEFAULT 0
);
```
2025-12-12 12:39:11 +03:00
**Миграция:** При запуске бот автоматически добавляет колонку `locale` если её нет (для совместимости с о старой базой).
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
### 4. Скрипт рассылки (broadcast.py)
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
Консольная утилита для отправки сообщений всем пользователям:
2025-12-11 01:07:04 +03:00
```bash
2025-12-12 12:39:11 +03:00
./broadcast.py -y "Текст сообщения"
./broadcast.py -y --html "< b > Жирный< / b > текст"
./broadcast.py -y --file message.txt
./broadcast.py --list # показать пользователей
2025-12-11 01:07:04 +03:00
```
2025-12-12 12:39:11 +03:00
Автоматически читает `.env` для получения токена бота.
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
## Docker архитектура
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
### Порты
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
| Сервис | Внешний порт | Внутренний порт |
|--------|--------------|-----------------|
| VK | 5555 | 5000 |
| Instagram | 5556 | 5000 |
| YouTube | 5557 | 5000 |
| Yapfiles | 5558 | 5000 |
| TikTok | 5559 | 5000 |
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
### Volumes
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
**Основной бот:**
- `./video:/app/video` — скачанные видео
- `./data:/app/data` — база данных
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
**Сервисы загрузчиков:**
2025-12-11 01:07:04 +03:00
- `./downloads:/app/downloads` — временные файлы
2026-06-30 22:16:40 +00:00
- (YouTube) `./youtube_cookies.txt:/app/youtube_cookies.txt`
- (Instagram) `./instagram_cookies.txt:/app/instagram_cookies.txt`
Cookies монтируются с хоста (не read-only — внешний крон на отдельной машине обновляет файл по `scp` ), а не запекаются в образ — это позволяет обновлять их без пересборки/передеплоя сервиса.
2025-12-11 01:07:04 +03:00
2025-12-12 12:39:11 +03:00
## Потоки данных
2025-12-11 01:07:04 +03:00
```
2025-12-12 12:39:11 +03:00
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()
2025-12-11 01:07:04 +03:00
```
2025-12-10 16:22:18 +03:00
## Развертывание
2026-06-30 22:16:40 +00:00
### Текущая схема: единый docker-compose + CI/CD
В с е 7 сервисов собираются и запускаются одним `docker-compose.yml` из корня репозитория (build-контексты на подпапки, единый `docker compose up -d --build` ). Прод деплоится автоматически Forgejo Actions (`.forgejo/workflows/deploy.yml` ) при пуше в `main` :
2025-12-11 01:07:04 +03:00
2025-12-10 16:22:18 +03:00
```
2026-06-30 22:16:40 +00:00
push в main → сборка всех 7 образов → push в Gitea registry
→ docker save | ssh | docker load на прод-хост
(registry недоступен напрямую с внешнего VPS)
→ docker compose up -d --remove-orphans на проде
```
Н а проде используется `docker-compose.prod.yml` (только `image:` , без `build:` ).
2025-12-10 16:22:18 +03:00
2026-06-30 22:16:40 +00:00
### Гипотетический вариант: раздельное развёртывание
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
**Хост 1 (с VPN для YouTube/Instagram/TikTok):**
2025-12-10 16:22:18 +03:00
- Основной бот
2025-12-12 12:39:11 +03:00
- YouTube, Instagram, TikTok сервисы
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
**Хост 2 (без VPN):**
- VK, Yapfiles сервисы
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
В `.env` на хосте 1:
```env
VK_DOWNLOADER_URL=http://< host2_ip > :5555
YAPFILES_DOWNLOADER_URL=http://< host2_ip > :5558
```
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
## Безопасность
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
- Токен бота в `.env` (не коммитится)
2026-06-30 22:16:40 +00:00
- Cookies YouTube/Instagram закоммичены в репозиторий как fallback внутри образа; актуальные версии приходят на хост кроном и монтируются поверх (см. `README.md#cookies-на-проде` )
2025-12-12 12:39:11 +03:00
- Сервисы доступны только по указанным URL
- Можно добавить API key между сервисами
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
## Мониторинг
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
- В с е сервисы логируют в stdout
- Health check: `GET /health` на каждом сервисе
- Логи Docker: `docker compose logs -f`
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
## Будущие улучшения
2025-12-10 16:22:18 +03:00
2025-12-12 12:39:11 +03:00
1. **Аутентификация между сервисами** — API key/JWT
2. **Очередь задач** — Celery для фоновой обработки
3. **Prometheus метрики** — мониторинг производительности
4. **Кеширование** — Redis для частых запросов
5. **Поддержка новых источников** — Twitter, Facebook, etc.