Рефакторинг: микросервисная архитектура

- Разделение на микросервисы: youtube-downloader, instagram-downloader, vk-downloader
- Основной бот в корне проекта, работает через HTTP API с сервисами
- Каждый сервис запускается отдельно в своей папке
- Видео сохраняются в папке video/ и не удаляются
- Обновлена документация и архитектура
- Скрипты для Instagram cookies перенесены в instagram-downloader/
This commit is contained in:
vrubelroman 2025-12-11 01:07:04 +03:00
parent 8024eea868
commit 436e0cd541
41 changed files with 1348 additions and 693 deletions

259
README.md
View file

@ -1,14 +1,26 @@
# Telegram Video Download Bot
Telegram бот для скачивания видео с YouTube, Instagram и VK. Поддерживает раздельное развертывание сервисов для работы с VPN и без VPN.
Telegram бот для скачивания видео с YouTube, Instagram и VK. Микросервисная архитектура с раздельными сервисами для каждого источника.
## Архитектура
Проект разделен на микросервисы:
- **Основной бот** (в корне проекта) - Telegram бот, обрабатывает сообщения и оркестрирует запросы к сервисам
- **youtube-downloader** - сервис для скачивания с YouTube (порт 5557)
- **instagram-downloader** - сервис для скачивания с Instagram (порт 5556)
- **vk-downloader** - сервис для скачивания с VK (порт 5555)
Каждый сервис работает в отдельном Docker контейнере и может быть развернут независимо.
## Возможности
- 📹 Скачивание видео с YouTube
- 📸 Скачивание видео с Instagram (требуются cookies)
- 🎬 Скачивание видео с VK (через отдельный микросервис)
- 🎬 Скачивание видео с VK
- 📊 Статистика скачанных видео и пользователей
- 🔄 Автоматическое сохранение статистики в базу данных
- 👥 Работа в группах с автоматическим обнаружением ссылок
## Требования
@ -27,7 +39,7 @@ cd videoDownloadBot
### 2. Настройка переменных окружения
Скопируйте `.env.example` в `.env` и заполните:
Скопируйте `.env.example` в `.env` в корне проекта и заполните:
```bash
cp .env.example .env
@ -39,56 +51,119 @@ nano .env # или используйте любой редактор
```env
TELEGRAM_BOT_TOKEN=your_telegram_bot_token_here
TELEGRAM_BOT_USERNAME=your_bot_username
VK_DOWNLOADER_URL=http://localhost:5555
# Downloader Services URLs
# Для локальной разработки через docker-compose используются внутренние имена сервисов
YOUTUBE_DOWNLOADER_URL=http://youtube-downloader:5000
INSTAGRAM_DOWNLOADER_URL=http://instagram-downloader:5000
VK_DOWNLOADER_URL=http://vk-downloader:5000
```
- **TELEGRAM_BOT_TOKEN** — токен бота от @BotFather
- **TELEGRAM_BOT_USERNAME** — username бота (без @), используется в подписи видео
- **VK_DOWNLOADER_URL** — URL VK сервиса (для локальной разработки: `http://localhost:5555`, для продакшена: `http://<ip>:5555`)
- **YOUTUBE_DOWNLOADER_URL** — URL YouTube сервиса (для docker-compose: `http://youtube-downloader:5000`, для продакшена: `http://<ip>:5557`)
- **INSTAGRAM_DOWNLOADER_URL** — URL Instagram сервиса (для docker-compose: `http://instagram-downloader:5000`, для продакшена: `http://<ip>:5556`)
- **VK_DOWNLOADER_URL** — URL VK сервиса (для docker-compose: `http://vk-downloader:5000`, для продакшена: `http://<ip>:5555`)
### 3. Настройка Instagram (опционально)
Если планируете скачивать видео с Instagram:
1. Экспортируйте cookies из браузера (см. `INSTAGRAM_COOKIES_INSTRUCTIONS.md`)
2. Сохраните файл как `instagram_cookies.txt` в корне проекта
1. Экспортируйте cookies из браузера (см. `instagram-downloader/INSTAGRAM_COOKIES_INSTRUCTIONS.md`)
2. Сохраните файл как `instagram_cookies.txt` в папке `instagram-downloader/`
3. Формат: Netscape cookies file
**Автоматическое обновление cookies:**
- Бот автоматически проверяет срок действия cookies каждые 24 часа
- Если cookies истекают через 3 дня (настраивается через `INSTAGRAM_AUTO_UPDATE_DAYS`), бот попытается автоматически обновить их из браузера
- Поддерживаются браузеры: Chrome, Firefox, Edge, Opera (по приоритету)
- Для автоматического обновления браузер должен быть установлен и доступен
**Примечание:** Без cookies Instagram может блокировать запросы. При первом запуске или если автоматическое обновление не сработало, обновите cookies вручную.
### 4. Запуск основного бота
**Быстрое получение cookies через скрипт:**
```bash
cd instagram-downloader
./get_instagram_cookies.sh
```
Или обновление существующих cookies:
```bash
cd instagram-downloader
./update_instagram_cookies.sh
```
**Примечание:** Без cookies Instagram может блокировать запросы. При первом запуске обновите cookies вручную.
### 4. Запуск сервисов
**Важно:** Каждый сервис запускается отдельно на своем хосте (или на одном хосте, но отдельными командами).
#### Запуск основного бота
```bash
# Из корня проекта
docker compose up -d
```
Бот запустится и будет готов к работе!
Это запустит только основной Telegram бот.
#### Запуск сервисов загрузчиков
Каждый сервис запускается отдельно в своей папке:
Проверить статус:
```bash
# Запуск YouTube сервиса (порт 5557)
cd youtube-downloader
docker compose up -d
# Запуск Instagram сервиса (порт 5556)
cd ../instagram-downloader
docker compose up -d
# Запуск VK сервиса (порт 5555)
cd ../vk-downloader
docker compose up -d
```
**Порядок запуска:** Сначала запустите сервисы загрузчиков, затем основной бот.
#### Раздельное развертывание на разных хостах (рекомендуется для продакшена)
**Хост 1 (с VPN для YouTube/Instagram):**
- YouTube сервис (порт 5557)
- Instagram сервис (порт 5556)
- Основной бот
**Хост 2 (без VPN для VK):**
- VK сервис (порт 5555)
В `.env` файле в корне проекта на хосте 1 укажите IP адреса сервисов:
```env
YOUTUBE_DOWNLOADER_URL=http://localhost:5557
INSTAGRAM_DOWNLOADER_URL=http://localhost:5556
VK_DOWNLOADER_URL=http://<ip_хоста_2>:5555
```
### 5. Проверка статуса
Проверить статус сервисов:
```bash
# Основной бот (из корня проекта)
docker compose ps
docker compose logs -f bot
# Сервисы загрузчиков (из соответствующих папок)
cd youtube-downloader && docker compose ps
cd ../instagram-downloader && docker compose ps
cd ../vk-downloader && docker compose ps
```
### 5. Запуск VK сервиса (опционально)
VK сервис можно запустить на том же хосте или на отдельном хосте без VPN:
Просмотр логов:
```bash
cd vk-downloader
docker compose up -d
```
# Основной бот (из корня проекта)
docker compose logs -f bot
Для работы на отдельном хосте:
1. Скопируйте папку `vk-downloader` на целевой хост
2. Запустите: `docker compose up -d`
3. Обновите `VK_DOWNLOADER_URL` в `.env` основного бота: `http://<ip_хоста>:5555`
# Сервисы загрузчиков (из соответствующих папок)
cd youtube-downloader && docker compose logs -f
cd ../instagram-downloader && docker compose logs -f
cd ../vk-downloader && docker compose logs -f
```
## Использование
@ -97,6 +172,10 @@ docker compose up -d
3. Отправьте ссылку на видео (YouTube, Instagram или VK)
4. Дождитесь скачивания и получите файл
### Работа в группах
Добавьте бота в группу и дайте ему права администратора (нужно право на удаление сообщений). После этого бот будет автоматически находить ссылки на видео в сообщениях участников, скачивать их и отправлять прямо в группу, заменяя исходное сообщение со ссылкой.
### Команды
- `/start` — начало работы с ботом
@ -106,50 +185,82 @@ docker compose up -d
```
videoDownloadBot/
├── bot.py # Основной код бота
├── requirements.txt # Python зависимости
├── Dockerfile # Образ для основного бота
├── docker-compose.yml # Конфигурация основного бота
├── .env.example # Пример конфигурации
├── instagram_cookies.txt # Cookies для Instagram (создать вручную)
├── data/ # База данных SQLite (создается автоматически)
├── video/ # Временные файлы видео (создается автоматически)
└── vk-downloader/ # Микросервис для VK
├── app.py # Flask API сервис
├── Dockerfile # Образ для VK сервиса
└── docker-compose.yml # Конфигурация VK сервиса
├── bot.py # Код основного Telegram бота
├── requirements.txt # Python зависимости бота
├── Dockerfile # Образ для бота
├── docker-compose.yml # Оркестратор всех сервисов
├── .env.example # Пример конфигурации
├── youtube-downloader/ # Сервис для YouTube
│ ├── app.py # Flask API сервис
│ ├── requirements.txt # Python зависимости
│ ├── Dockerfile # Образ для YouTube сервиса
│ └── docker-compose.yml # Конфигурация YouTube сервиса
├── instagram-downloader/ # Сервис для Instagram
│ ├── app.py # Flask API сервис
│ ├── requirements.txt # Python зависимости
│ ├── Dockerfile # Образ для Instagram сервиса
│ ├── docker-compose.yml # Конфигурация Instagram сервиса
│ ├── instagram_cookies.txt # Cookies для Instagram (создать вручную)
│ ├── get_instagram_cookies.sh # Скрипт для получения cookies
│ ├── update_instagram_cookies.sh # Скрипт для обновления cookies
│ ├── INSTAGRAM_COOKIES_INSTRUCTIONS.md # Инструкции по cookies
│ └── README.md # Документация сервиса
├── vk-downloader/ # Сервис для VK
│ ├── app.py # Flask API сервис
│ ├── requirements.txt # Python зависимости
│ ├── Dockerfile # Образ для VK сервиса
│ └── docker-compose.yml # Конфигурация VK сервиса
└── README.md # Этот файл
```
## Порты сервисов
- **Основной бот**: не требует внешних портов (работает через Telegram API)
- **YouTube Downloader**: порт 5557
- **Instagram Downloader**: порт 5556
- **VK Downloader**: порт 5555
## API Endpoints
Все сервисы загрузчиков предоставляют одинаковый API:
- `GET /health` - проверка здоровья сервиса
- `POST /download/stream` - скачивание видео (возвращает бинарные данные)
Пример запроса:
```json
POST /download/stream
Content-Type: application/json
{
"url": "https://youtube.com/watch?v=..."
}
```
## Обновление
```bash
git pull
docker compose build
docker compose up -d
```
## Логи
# Пересобрать и перезапустить основной бот (из корня проекта)
docker compose build && docker compose up -d
Просмотр логов основного бота:
```bash
docker compose logs -f bot
```
Просмотр логов VK сервиса:
```bash
cd vk-downloader
docker compose logs -f
# Пересобрать и перезапустить каждый сервис загрузчика отдельно
cd youtube-downloader && docker compose build && docker compose up -d
cd ../instagram-downloader && docker compose build && docker compose up -d
cd ../vk-downloader && docker compose build && docker compose up -d
```
## Остановка
```bash
# Основной бот
# Остановить основной бот (из корня проекта)
docker compose down
# VK сервис
cd vk-downloader
docker compose down
# Остановить каждый сервис загрузчика отдельно
cd youtube-downloader && docker compose down
cd ../instagram-downloader && docker compose down
cd ../vk-downloader && docker compose down
```
## Развертывание на продакшене
@ -157,41 +268,41 @@ docker compose down
### Вариант 1: Все на одном хосте (с VPN)
1. Настройте VPN для доступа к YouTube и Instagram
2. Запустите основной бот и VK сервис на одном хосте
3. В `.env` укажите: `VK_DOWNLOADER_URL=http://localhost:5555`
2. Запустите каждый сервис отдельно в своей папке
3. В `.env` в корне проекта укажите: `http://localhost:5557`, `http://localhost:5556`, `http://localhost:5555`
### Вариант 2: Раздельное развертывание (рекомендуется)
**Хост 1 (с VPN):**
- Основной бот (YouTube, Instagram)
- В `.env`: `VK_DOWNLOADER_URL=http://<ip_хоста_2>:5555`
- Основной бот
- YouTube сервис
- Instagram сервис
- В `.env` в корне: `YOUTUBE_DOWNLOADER_URL=http://localhost:5557`, `INSTAGRAM_DOWNLOADER_URL=http://localhost:5556`, `VK_DOWNLOADER_URL=http://<ip_хоста_2>:5555`
**Хост 2 (без VPN):**
- VK сервис (`vk-downloader/`)
- В `.env` основного бота: IP этого хоста
- VK сервис
- В `.env` corebot на хосте 1: IP этого хоста
**Преимущества:**
- VK работает быстрее без VPN
- Меньше нагрузка на VPN канал
- Возможность масштабирования VK сервиса отдельно
- Возможность масштабирования сервисов отдельно
## Troubleshooting
### Бот не отвечает
- Проверьте логи: `docker compose logs bot`
- Убедитесь, что токен правильный в `.env`
- Проверьте, что все сервисы запущены и доступны
### Instagram не работает
- Проверьте наличие `instagram_cookies.txt`
- Обновите cookies (они могут истечь)
### VK не работает
- Проверьте, что VK сервис запущен: `cd vk-downloader && docker compose ps`
- Проверьте URL в `.env`: `VK_DOWNLOADER_URL`
- Проверьте доступность порта 5555
### YouTube/Instagram/VK не работает
- Проверьте, что соответствующий сервис запущен: `docker compose ps`
- Проверьте URL в `.env` corebot
- Проверьте логи сервиса: `docker compose logs -f`
- Для Instagram: проверьте наличие и валидность `instagram-downloader/instagram_cookies.txt`
### База данных не сохраняется
- Проверьте права на папку `data/`
- Проверьте права на папку `data/` в корне проекта
- Убедитесь, что volume смонтирован в `docker-compose.yml`
## Лицензия