feat: photo-search, system settings, ROADMAP

- PhotoSearchModal: Yandex photo-search с профилями доменов
- SystemSettings: управление app_settings (admin-only, /system)
- ROADMAP.md: актуальный план фич P1-P10
- Header, ChannelView, session: поддержка is_admin
This commit is contained in:
Nik (Claude)
2026-06-07 14:04:14 +03:00
parent 76eb519018
commit 2e550d2993
14 changed files with 931 additions and 38 deletions
+158
View File
@@ -0,0 +1,158 @@
# ZeroPost — Roadmap (план фич)
Живой документ. Обновлять по мере выполнения.
Последнее обновление: 2026-06-01
---
## Контекст / архитектура
- **zeropost.ru** (web) — блог + админка. PM2 `zeropost-web` (pm_id=5, порт 3042), `/var/www/zeropost-web`.
- **app.zeropost.ru** (tool) — SaaS для управления каналами TG/VK/MAX. PM2 `zeropost-tool` (pm_id=4, порт 3041), `/var/www/zeropost-tool`.
- **engine** — общий движок API + LLM-pipeline. PM2 `zeropost-engine` (pm_id=3, порт 3030), `/var/www/zeropost-engine`.
- БД: PostgreSQL, db=`zeropost`.
- Cron: `*/10 * * * * zeropost-autogen.sh`, `* * * * * zeropost-publish-scheduled.sh` (обе очереди).
- Internal secret: `zeropost_internal_2026`. TG-прокси: CF Worker в `app_settings.TELEGRAM_API_BASE`.
---
## ✅ DONE
### Photo-search (Yandex)
- `user_posts.image_credit` (JSONB), `users.is_admin` (BOOLEAN).
- Engine: proxy `/api/photo-search/*`. Tool: `/system` (admin-only), `PhotoSearchModal`.
- Web: категория `photo_search` скрыта из blog-админки.
### Auto-publish статей блога → каналы
- `channels.auto_publish_{enabled,categories,delay_min,template,with_cover,button_text,image_source}`.
- Engine: `articleAutoPublish.js`, `scheduledPostsRunner.js`, `/api/scheduled-posts/*`.
- Хук в `PATCH/POST articles` при `draft→published`. Typeahead `/api/articles/admin/search`.
- Cron обновлён — дёргает обе очереди (`user_posts` + `scheduled_posts`).
- Web: `ArticlePicker`, `AutoPublishTab`, 4 вкладки в `ChannelEditor`.
### Журнальная главная страница zeropost.ru
- Engine: `/api/articles/home` (hero / byCategory / popular / recent).
- Web: `CategoryRow`, `PopularBlock`, `RecentBlock` (группировка Сегодня/Вчера/Эта неделя).
- `ArticleCard` с 3 размерами (hero/regular/compact) + цветной category badge без дублей.
- Header упрощён (2 пункта desktop + расширенное мобильное меню).
### Персонаж Зеро
- 15 поз: `avatar, coding, tools, lock, gears, eureka, confused, facepalm, victory, tired, reading, magnifier, chart, meditate, present``/var/www/zeropost-uploads/zero-{name}.webp`.
- `src/services/zeroCharacter.js` — выбор позы по тексту/категории статьи (эмоциональные триггеры + категорийные).
- `channels.auto_publish_image_source = 'alternating'` — чётные посты = AI-обложка, нечётные = Зеро.
- `scheduledPostsRunner` — multipart upload (не URL) чтобы CF Worker не падал.
### Промпт Зеро
- `src/services/promptBuilder.js` — секция `author_persona` в `buildArticleSystemPrompt`.
- `src/services/articles.js``blogChannel.author_persona` (голос, правила, запрещённые фразы).
- Статьи теперь пишутся от первого лица с личными историями.
### TG-канал @zeropostru — запуск
- Welcome-пост от Зеро с аватаром + кнопкой (msg_id=13, закреплён).
- 4 статьи опубликованы (по одной на каждую категорию), режим alternating.
### zeropost.ru — страница Зеро + TG-продвижение
- `/about/zero` — страница с описанием персонажа + галерея 8 поз.
- Footer — TG-банер с аватаром Зеро на каждой странице.
- Конец каждой статьи — блок «Понравилась заметка? → В канал».
- `/about` — ссылка «Познакомьтесь с Зеро».
---
## 🚀 ПЛАН: что делать дальше
### СЕЙЧАС (не отложить)
**A. Revoke бота** — токен @zeropostru_bot засветился в этом чате. Зайди в @BotFather → /mybots → выбери бота → API Token → Revoke. Потом обнови в `/admin/channels/1` → Настройки → Bot Token.
**B. Статья на Habr** — главный бесплатный способ получить первые 200-500 живых читателей. Тема: «Я сделал блог, который ведёт ИИ с персонажем-маскотом. Как работает pipeline». Напишу черновик — дай команду.
---
### app.zeropost.ru — приоритетный порядок
#### P1. Календарь публикаций (1–2 дня)
Самый частый запрос у SMM-инструментов. Без него непонятно «что когда выходит».
- Страница `/calendar` — визуальная сетка (неделя + месяц).
- Данные: `user_posts.scheduled_at` + `publish_slots` канала.
- Карточки по цветам: draft=серый, scheduled=синий, published=зелёный, failed=красный.
- Drag & drop между датами → PATCH `scheduled_at`.
- Фильтр по каналу.
#### P2. Превью под платформу (0.5–1 день)
Сейчас пишешь пост и не знаешь как он будет выглядеть.
- Компонент `PostPreview` в `ChannelView` справа от textarea.
- Рендерит Markdown как TG: **жирный**, _курсив_, обрезка caption 1024, превью ссылки.
- Переключатель TG / VK / MAX — разные ограничения форматирования.
#### P3. Шаблоны постов (0.5 дня)
Ускоряет создание поста в 3 раза.
- 7 кнопок-пресетов: Новость, Анонс, Кейс, Лонгрид, Подборка, Опрос-разбор, Личное мнение.
- Каждый — готовая структура поста + hint для AI.
- В `ChannelView` рядом с кнопкой «Идеи тем».
#### P4. Аналитика постов (2–3 дня)
Без метрик невозможно понять что заходит.
- Таблица `post_metrics(user_post_id, captured_at, views, forwards, reactions JSONB)`.
- Воркер раз в 15 мин: пуллит views через TG embed для постов < 7 дней.
- В `ChannelView` у каждого поста — строчка «👁 N ↗ N ❤️ N».
- График: «лучший день/час для публикации» по медиане views.
#### P5. URL → черновик (1–2 дня)
Killer feature которой нет у конкурентов в таком качестве.
- Вставил ссылку → AI читает статью/YouTube/TG-пост → пишет пост в стиле канала.
- `POST /api/generate/from-url`. Для статей: cheerio + og-meta. Для YouTube: yt-dlp транскрипт.
#### P6. Комментарии + AI-ответы (4–7 дней)
Большая фича, отдельный спринт.
- TG webhook → unified inbox.
- Классификатор haiku: вопрос/спам/похвала/троллинг.
- Предложенный AI-ответ с кнопкой «отправить».
#### P7–P10. Опросы, хештеги, best-time, URL-shortener
По 0.5–1 дню каждое, делаем после P1–P5.
---
### zeropost.ru — мелкий должок
| Задача | Срочность |
|---|---|
| Revoke бота @zeropostru_bot | 🔴 СЕЙЧАС |
| Статья на Habr про ZeroPost | 🟠 На этой неделе |
| Кнопка «Бэкфилл статей» в AutoPublishTab | 🟡 Низкая |
| История публикаций канала | 🟡 Низкая |
| Балансы внешних сервисов в /system | 🟡 Низкая |
---
### zeropost.ru — рост аудитории (без бюджета)
| Действие | Ожидаемый результат | Когда |
|---|---|---|
| Habr: «Как я сделал AI-блог с маскотом» | 200–500 переходов | На этой неделе |
| vc.ru: то же самое | 100–300 переходов | На этой неделе |
| 5 комментариев в AI-чатах TG | 20–50 подписчиков | Постоянно |
| Взаимный пиар с 3 каналами (tgstat.ru) | 50150 подписчиков | 1–2 недели |
| Reddit r/artificial | 50200 переходов | На этой неделе |
| SEO (органика) | Долгосрочно | Само, 2–3 мес |
---
## Технический долг
- ENGINE_URL default в `lib/engine.js` tool'а = 3040, должен быть 3030.
- `per_day` в `autogen_settings` не используется в логике (только `run_hour:run_minute`).
- TOPIC_BANK заканчивается — нужен AI-генератор новых тем.
- VK: публикация без фото (нужен 2-step `photos.getWallUploadServer`).
- MAX: заглушка `throw new Error('не реализована')`.
---
## Не делаем
- Холст / визуальный редактор.
- Stories / Reels.
- Команда / роли (до 5+ клиентов).
- White Label.
- Парсинг конкурентов через MTProto.