📊 Дашборд

Что происходит прямо сейчас

💾 Бэкап базы

Делается сам ночью в 3:00 и уходит на Яндекс.Диск. Кнопка — когда собираешься менять что-то массово.

🤖 Боты и тестеры

Кто когда ходил, что нашёл и на чём упал

Расписание

Боты ходят сами. Кнопки — когда не хочется ждать.

БотЧто делаетКак часто
📰 Сборщик новостей обходит ленты, отсеивает дубли по заголовку раз в час
📤 Публикатор берёт из очереди то, у чего подошло время раз в 10 минут
🛡 Модератор слушает комментарии, чистит спам постоянно
🖼 Оптимизатор картинок забирает обложки с чужих серверов и сжимает через 5 мин после сбора сам
⚖️ Фильтр правовых ограничений помечает запрещённые организации, иноагентов, темы 18+ по кнопке на странице темы
🔥 AI-рерайт пересказывает новости по-русски своими словами по кнопке на странице темы
🅥 Картинки в ВК заливает обложки заранее, чтобы пост не ушёл голым раз в 30 минут сам
🅩 Дзен выкладывает по одной из того, что уже вышло в ВК каждый час в :17 сам
💾 Бэкап дамп базы и копия на Яндекс.Диск ночью в 3:00

🧪 Состояние лент

Списки RSS устаревают, а часть изданий закрывается от серверных запросов. Полная проверка запускается из консоли: node tools/check-feeds.js — она ходит с этого сервера, только так узнаешь правду.

🔥 Переписывание через ИИ

Ключ тот же, что у основного проекта — PROXYAPI_KEY. Запускается со страницы сообщества: отмечаешь статьи в архиве и жмёшь.

📜 Журнал

Сообщество

+ Добавить сообщество

Тема — само сообщество. Площадки — его витрины: группа ВК, канал Дзен

1. Тема

Заводится один раз. К ней цепляются площадки и ленты новостей.
После создания появится строкой в меню слева.

2. Площадка

У одной темы их может быть несколько: группа ВК и канал Дзен. Заводятся по очереди, обе появятся блоками на странице сообщества.
Если ввести id уже заведённой площадки — форма обновит её, а не создаст вторую.

60 мин — 24 поста в сутки

Ключи ВК сюда не вводятся: они лежат на сервере, в .env. Через форму ключ шёл бы браузером и оседал в истории, а это доступ к группе целиком.

3. Ленты новостей

Если тема не указана, лента считается общей для всех.

🗄️ База данных

Прямой доступ к базе — как SQL Editor в дев-панели

Таблицы

Кликни по названию — подставится запрос к ней.

Запрос

Перед массовым UPDATE сначала сделай SELECT с тем же условием и посмотри, сколько строк затронется. Это правило из основного проекта — там запрос однажды задел 4387 строк вместо шести.

🔧 Настройки

Что задано в окружении и как работает сервер

🧹 Лишние картинки

Ищет картинки, на которые никто не ссылается: новость удалили, а обложка осталась. Файлы моложе трёх суток не трогает. Удалённое уходит в data/_trash_images — можно вернуть.

📖 Справка

Как всё устроено и где что искать

Как идёт материал

1. Раз в час боты обходят ленты и складывают найденное в новости. Дубли отсеиваются по отпечатку заголовка — одна и та же новость приходит из нескольких изданий.
2. Ты открываешь страницу группы, выбираешь новость и ставишь пост в очередь.
3. Раз в 10 минут публикатор отправляет то, у чего подошло время.
4. Модератор параллельно слушает комментарии и чистит спам.

Ключи ВК

Ключи лежат на сервере, в файле .env. В панель они не выносятся: через форму ключ шёл бы браузером и оседал в истории, а это доступ к группе целиком.

VK_TOKEN — ключ сообщества, публикация текста и работа модератора. Группа → Управление → Работа с API → Ключи доступа. Права: управление сообществом, стена, фотографии, сообщения.
VK_USER_TOKEN — пользовательский, только для картинок. Ключа сообщества для них не хватает, ВК отвечает ошибкой 27. Берётся через Standalone-приложение с правами photos, wall, groups, offline.

Пока все группы ведёшь ты, ключ общий. Появится группа с другим администратором — у площадки есть свои поля, заполняются в разделе БД:
UPDATE channels SET access_token = '…' WHERE id = 3;

🎬 Трейлеры: как это работает

Как забирается. У каждого канала YouTube есть своя лента: youtube.com/feeds/videos.xml?channel_id=UC… Добавляется как обычный источник, кнопкой «🎬 Добавить каналы трейлеров» или вручную. Из ленты берём заголовок, описание, обложку и ссылку на ролик.

Что сохраняется. Только ссылка. Файл видео к себе не качаем: это чужие права, и у оригинала свой счётчик просмотров — студии выкладывают трейлеры именно ради него. Места на диске тоже не тратим.

Как выкладывается. Ссылкой в тексте — ВК разворачивает её карточкой с обложкой и кнопкой воспроизведения.

Почему не проигрывателем. Пробовали через video.save: ВК заводит «внешнее видео» и пытается забрать ролик к себе. Для трейлеров студий это не работает — Netflix и прочие не отдают, и запись висит в «обрабатывается» часами. Ссылка надёжнее: выглядит скромнее, зато работает всегда и сразу.

Если однажды понадобится вернуть прежний способ — переменная VK_VIDEO_SAVE=1 в .env.

Команда деплоя

cd /var/www/contentbot git pull origin main pm2 restart contentbot contentbot-moderator pm2 save

Основной проект при этом не трогается — другой сервер, другая база, другой репозиторий.