# RedAirsoft VK to Telegram & MAX Messenger Poster Автоматизированный Docker-сервис для периодического парсинга новых постов из сообщества ВКонтакте (**Red Airsoft | Страйкбол**) и их одновременной публикации в **Telegram** и мессенджер **МАКС** (MAX Messenger) с отчётами администраторам. --- ## 📌 Инфраструктура и Деплой | Параметр | Значение | |---|---| | **Хост Proxmox** | `192.168.1.222` (root SSH через ключ `~/.ssh/id_ed25519_proxmox`) | | **LXC Контейнер** | **CT 107** (`redairsoft-poster`, IP: `192.168.1.106`, Debian 12) | | **Ресурсы LXC** | 2 vCPU, 1.5 GB RAM, 512 MB Swap, 16 GB Disk, `onboot=1` | | **Gitea Репозиторий** | `http://192.168.1.135:3000/exostring/redairsoft_vk_gt_max_sender` | | **Gitea SSH Remote** | `ssh://git@192.168.1.135:2222/exostring/redairsoft_vk_gt_max_sender.git` | | **Путь проекта на LXC 107** | `/opt/redairsoft_poster/` | | **Имя Docker контейнера** | `redairsoft-vk-poster` | | **Локальный Telegram Bot API** | Встроен в контейнер (`http://127.0.0.1:8081`), поддерживает загрузку видео до 2 ГБ | | **База данных** | SQLite `/opt/redairsoft_poster/data/poster.db` (персистентный том Docker `./data`) | --- ## 🚀 Управление проектом (Команды из консоли / PowerShell) Все команды выполняются через Proxmox хост: ```bash # 1. Посмотреть статус и логи бота: ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- docker logs --tail 50 redairsoft-vk-poster' # 2. Логи в реальном времени (follow): ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- docker logs -f redairsoft-vk-poster' # 3. Запустить проект: ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- bash -c "cd /opt/redairsoft_poster && docker-compose up -d"' # 4. Остановить проект: ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- bash -c "cd /opt/redairsoft_poster && docker-compose stop"' # 5. Обновить из Gitea и пересобрать: ssh -i ~/.ssh/id_ed25519_proxmox root@192.168.1.222 'pct exec 107 -- bash -c "cd /opt/redairsoft_poster && git pull origin main && docker-compose build && docker-compose up -d"' ``` --- ## ⚙️ Как работает сервис 1. **Опрос стены ВКонтакте**: - Каждые 15 минут делает запрос к методу `wall.get` для группы `public36860851` (`owner_id: -36860851`). - Фильтрует посты автора (без репостов и рекламы сторонних сообществ). 2. **Защита от спама и режим запуска (`BOOTSTRAP_MODE`)**: - Установлен режим `BOOTSTRAP_MODE=skip_existing`. - При первом запуске или перезапуске сервис запоминает текущие посты стены и **ничего не публикует**, пока в ВК не выйдет новый пост. 3. **Загрузка медиа и поддержка длинных видео**: - Картинки скачиваются в максимальном разрешении. - Видео загружается через `yt-dlp` в качестве до 720p (длительностью до 2 часов и размером до 2000 МБ). - Встроенный в контейнер локальный `telegram-bot-api` загружает тяжелые видеофайлы напрямую в Telegram без ограничений облачного API (20-50 МБ). 4. **Форматирование текста**: - Ссылки ВКонтакте вида `[club123|Название]` и `[id123|Имя]` преобразуются в корректные кликабельные HTML-ссылки. - Первый абзац / заголовок выделяется жирным шрифтом `...`. - Удаляются разделительные полосы (`━━━`, `───`) и лишние переносы строк. 5. **Публикация в мессенджер МАКС**: - Загрузка медиа в МАКС через `/uploads?type=photo` и `/uploads?type=video`. - Поллинг готовности видео (`/videos/{token}`) перед публикацией сообщения. 6. **Отчёты администраторам**: - После успешной публикации или при ошибке бот отправляет отчёт со ссылками на оригинальный пост в ВК, Telegram и МАКС в личные сообщения администраторам (`TG_ADMIN_IDS`). 7. **Очистка диска и кэша**: - Временные файлы удаляются сразу после публикации. - Фоновый воркер `cleaner.py` каждые 15 минут удаляет старые файлы из `/tmp/poster_cache`, гарантируя защиту активных скачиваний через реестр локов. --- ## 🔑 Конфигурация (`.env`) | Переменная | Описание | |---|---| | `VK_ACCESS_TOKEN` | Сервисный токен приложения ВК (`d0a64...`) | | `VK_SOURCE` | `public36860851` | | `TG_BOT_TOKEN` | Токен Telegram бота (от `@BotFather`) | | `TG_CHAT_ID` | ID канала Telegram (например `-1001303630155`) | | `TG_MEDIA_CHANNEL_ID` | Скрытый канал-хранилище (опционально) | | `TG_ADMIN_IDS` | Telegram ID админов через запятую (например `442509142`) | | `LOCAL_BOT_API_URL` | `http://127.0.0.1:8081` (встроен в контейнер) | | `MAX_BOT_TOKEN` | Токен бота в мессенджере МАКС | | `MAX_CHAT_ID` | ID чата в МАКС | | `BOOTSTRAP_MODE` | `skip_existing` | | `CHECK_INTERVAL_MINUTES` | `15` | | `VIDEO_MAX_DURATION_SEC` | `7200` (2 часа) | | `VIDEO_MAX_SIZE_MB_LOCAL` | `2000` (2 ГБ) | --- ## 📁 Структура исходного кода ``` ├── src/ │ ├── config.py # Настройки Pydantic Settings │ ├── database.py # Хранилище SQLite (посты, статусы, даты) │ ├── vk_client.py # Клиент VK API (wall.get, извлечение медиа) │ ├── media_processor.py # Загрузка фото/видео (yt-dlp, aiohttp) │ ├── text_formatter.py # Конвертер ссылок ВК, очистка текста, HTML │ ├── tg_poster.py # Отправка в Telegram (Rich Message + Local API) │ ├── max_poster.py # Отправка в MAX Messenger (Uploads + Polling) │ ├── cleaner.py # Фоновая очистка временных файлов │ ├── admin_notifier.py # Отправка отчётов администраторам │ └── main.py # Точка входа и главный цикл опроса ├── Dockerfile # Multi-stage образ: aiogram/telegram-bot-api + python:3.12-slim + ffmpeg ├── docker-compose.yml # Конфигурация запуска сервиса ├── docker-entrypoint.sh # Автозапуск локального Telegram Bot API + постера ├── requirements.txt # Python зависимости (aiogram, yt-dlp, loguru, aiohttp, pydantic) └── .env # Переменные окружения ```