# Как мы собрали автономный Telegram-канал об ИИ на VPS с 1 ГБ RAM

> AI Release · @ai_release1 · https://ai-release.net/guides/kak-my-sobrali-telegram-kanal-ob-ii.html

Каждый час в канал [@ai_release1](https://t.me/ai_release1) уходит свежая новость об ИИ, раз в сутки — дайджест, каждые 8 часов — видео, плюс ежедневный совет по [Windows](https://ai-release.net/guides/windows-i-ii.html) и еженедельная «связка» тем. Всё это живёт на одном недорогом VPS с 1 ГБ оперативной памяти, без участия человека и без ПК. За месяц накопилось ~450 постов и 716 подписчиков. В этой статье — как устроен пайплайн, на какие грабли мы наступали и как экономим токены.

## Задача и ограничения

Изначальная идея была простой: не читать новости об ИИ вручную, а получать их в Telegram в сжатом и проверенном виде. Но быстро выяснилось, что «просто RSS + пересказ» не работает:

- новости дублируются из десятка источников;
- [LLM](https://ai-release.net/guides/sravnenie-ii-assistentov.html) охотно додумывает причины, цифры и выводы, которых в источнике нет;
- генерация картинок упирается в платные API и лимиты;
- на VPS с 1 ГБ нельзя держать [локальную модель](https://ai-release.net/guides/kak-zapustit-ii-model-lokalno-na-svoem-kompyutere-gayd.html);
- без внешних ссылок и SEO сайт-зеркало не индексируется.

Поэтому стек получился «тонкий, но злой»: Python-скрипты по расписанию systemd, внешние LLM-API, лёгкий метапоиск и статический сайт-зеркало.

## Бюджет

Проект сознательно уложен в минимальную сумму:

| Статья расходов | Стоимость |
|---|---|
| VPS (1 ГБ RAM) | ~5 $/мес |
| Подписка OpenCode Zen GO (LLM-API) | 10 $/мес |
| Домен ai-release.net | 22 $/год (~1.8 $/мес) |
| Telegram Premium | 25 $/год (~2 $/мес) |
| **Итого** | **~18.8 $/мес** |

Дороже всего — LLM-подписка, но она покрывает и новости, и чат-бота, и редактуру. Генерация обложек не стоит ничего — собираем их из открытых источников (см. ниже).

## Архитектура

Всё держится на systemd-таймерах и нескольких Python-скриптах:

```
ai-release-hourly.timer   -> hourly.py   (*:15)               1 новость в час
ai-release-video.timer    -> video.py    (0:30, 8:30, 16:30)  1 видео раз в 8 ч
ai-release-daily.timer    -> daily.py    (15:00 UTC / 18:00 МСК) дайджест дня
ai-release-stats.timer    -> stats.py    (18:00 UTC)           статистика
ai-release-chat.service   -> chat.py     (daemon)              ИИ-ответы в личке
ai-release-web.service    -> site.py / web.py / guides.py      веб-зеркало
```

Расписание задаётся через `OnCalendar`, например для часового таймера:

```ini
[Timer]
OnCalendar=*-*-* *:15:00
Persistent=true
```

Никакого брокера очередей и «оркестратора» — только таймеры. Для проекта такого размера это правильный выбор: каждый запуск — отдельный процесс, который падает и не роняет остальное.

Публикация — напрямую через Telegram Bot API. Источники новостей: RSS-агрегаторы (Хабр, Ars Technica, TechCrunch, VentureBeat, The Register, The Decoder и др.), первоисточники (блог OpenAI, Google Research, ArXiv API, Hugging Face Daily Papers, [GitHub Trending](https://ai-release.net/guides/ii-dlya-koda.html), Hacker News через Algolia API) и авторские блоги (Simon Willison, Karpathy, Sebastian Raschka, Nathan Lambert). Запасной поиск — локальный SearXNG в Docker.

## Отбор новостей и дедупликация

Первая версия публиковала всё подряд и превращалась в ленту дублей. Теперь есть три уровня фильтрации:

1. **Рейтинг.** Каждой новости считается скор из свежести, веса источника и качества заголовка. Первоисточники и авторы весят больше агрегаторов, свежее — важнее старого.
2. **Хэш заголовка.** Перед сравнением заголовок нормализуется: срезаются суффиксы изданий (`— TechCrunch`, `| WindowsLatest`), лидирующие `BREAKING:`/`СРОЧНО:`, хвосты вида `report says`, унифицируются кавычки и тире. Затем — хэш и проверка по SQLite:

```python
def normalize_title(t: str) -> str:
    t = re.sub(r"\s*[-—|]\s*(TechCrunch|Engadget|The Verge|WindowsLatest).*$", "", t, flags=re.I)
    t = re.sub(r"^(BREAKING|СРОЧНО|EXCLUSIVE)\s*:?\s*", "", t, flags=re.I)
    t = t.replace("«", '"').replace("»", '"').strip()
    return t.lower()
```

3. **Смысловой дедуп через LLM.** Даже с нормализацией два источника могут рассказать об одном событии разными словами. Поэтому кандидат дополнительно сравнивается с текстами последних постов канала, и если это «то же событие» — отбрасывается.

Отдельно стоит фильтр SEO-мусора: домены не из белого списка пропускаются только при конкретном сигнале (название модели, компании или события), а широкие «ии/ai/нейросеть» — нет. Плюс чёрный список промо-маркеров («журнал о», «свежий выпуск», «подпишись»).

## Редактура: чтобы LLM не выдумывала

Это оказалось самой важной частью. Раньше [саммари](https://ai-release.net/guides/nejroseti-dlya-teksta.html) иногда подавало чужой вывод как факт и додумывало причины. Мы ужесточили промпт: излагать **только** то, что есть в заголовке и описании; не выдумывать причины, цифры и последствия; сохранять атрибуцию («по данным исследования», «считают журналисты»), если вывод принадлежит источнику. Плюс снизили `temperature` с 0.8 до 0.5.

Пример из практики: пост про Windows 10 подал мнение издания как факт и придумал причины. Пришлось ввести отдельное фактическое правило — «поддержка Windows 10 прекращена 14.10.2025, бесплатных обновлений безопасности нет» — чтобы редактор добавлял контекст безопасности, когда новость советует оставаться на старой ОС.

## Экономия токенов и роутинг моделей

LLM — самая дорогая часть пайплайна, поэтому мы:

- **Роутим между моделями.** Основная — `DeepSeek V4 Flash` через OpenAI-совместимый API (в рамках подписки OpenCode Zen GO), резервная — `GLM-5.3-Flash` на том же эндпоинте. Если первая недоступна или вернула пустой ответ, пост не теряется, а уходит через вторую. Подробнее о моделях — в [обзоре нейросетей](https://ai-release.net/guides/luchshie-nejroseti-i-modeli-2026.html).
- **Кэшируем одинаковые вопросы.** В [чат-боте](https://ai-release.net/guides/ii-agenty-dlya-avtomatizacii.html) ответы на повторяющиеся вопросы берутся из кэша (`sha1` от нормализованного вопроса, TTL 30 дней). Новостные вопросы не кэшируются — контекст меняется.
- **Считаем расход.** Функция вызова LLM возвращает `usage`, и по дням копится статистика prompt/completion/токенов — чтобы видеть, куда уходит бюджет.
- **Используем prompt caching.** В запрос передаётся стабильный идентификатор сессии (заголовок `x-opencode-session`), чтобы провайдер переиспользовал системную часть промпта и не пересчитывал её каждый раз.

Для длинных саммари батч формируется одним запросом с запасом по `max_tokens` — иначе модель тратит токены на reasoning и обрывает ответ.

## Обложки без генерации

Генерация картинок упёрлась в платную модель и лимиты. Поэтому обложка собирается «бесплатно», в несколько шагов:

1. `og:image` статьи-источника;
2. стоковая картинка по теме через метапоиск (allowlist: Unsplash, Pexels, Pixabay, Wikimedia, Flickr, pinimg);
3. тематическая аниме/манга-иллюстрация;
4. заранее заготовленный фолбэк-набор.

Картинки дополнительно проверяются HEAD-запросом. Если Telegram не может забрать изображение по URL (HTTP 400), пост не теряется — подставляется другая обложка и публикация повторяется.

## Устойчивость к сбоям

Сеть и внешние API падают регулярно. Что сделано:

- **Ретраи** на сетевых операциях (`BrokenPipeError`, `ConnectionError`, `TimeoutError`) с backoff.
- **Отложенная очередь.** Выбранная новость записывается в буфер перед отправкой. Если отправка упала, следующий запуск сначала попробует её дослать — новость не пропадает.
- **Фолбэки озвучки** в видео: если TTS не отработал, собирается версия без звука с титрами.

## Веб-зеркало и SEO для ИИ-краулеров

У каждого поста есть страница на статическом сайте-зеркале `ai-release.net` (RU + EN), плюс sitemap с `hreflang`, `robots.txt` и мгновенная индексация через **IndexNow** (Bing + Yandex) при каждой публикации. Аналитика — Google Analytics 4 и Yandex.Metrika.

Отдельная тема — **AI SEO**, чтобы нейросети и ИИ-агрегаторы сами подхватывали контент:

- `feed.xml` (Atom) с последними постами;
- `llms.txt` и `llms-full.txt` по стандарту llmstxt.org — описатель сайта и полный текст постов для LLM-краулеров;
- markdown-версии статей (`.md`) — их тянут RAG-краулеры вроде Perplexity;
- обогащённый JSON-LD (NewsArticle + description/dateModified/keywords).

`robots.txt` открыт всем ИИ-ботам (GPTBot, PerplexityBot, ClaudeBot, Google-Extended). За месяц это дало заметную долю трафика от LLM-краулеров.

## Безопасность ИИ-чата

Бот отвечает подписчикам в личке через ту же LLM. Публичный чат — это недоверенный ввод, поэтому защита строится в три слоя:

- **Промпт-страж.** Основной промпт явно запрещает выполнять инструкции из текста пользователя, которые пытаются изменить поведение бота, «вытащить» системный промпт, токены или внутренние данные. Такие просьбы игнорируются, и бот возвращается к теме ИИ. Как защищать агентов от [prompt injection](https://ai-release.net/guides/bezopasnost-ii-agentov-kak-zaschitit-dannye-i-izbezhat.html), мы разбирали отдельно.
- **Rate-limit.** 20 сообщений / 10 минут на пользователя — защита от перебора и выкачивания промпта.
- **Изоляция секретов.** Все ключи — только в `.env` с правами `600`, никаких токенов в аргументах команд. Чат-процесс не имеет доступа к файлам публикации, только к API-ключу LLM.

Плюс история диалогов ограничена по длине, чтобы контекст не разрастался и не тянул за собой утечки.

## Что получилось

- ~450 постов, 716 подписчиков, 36 вечнозелёных гайдов на сайте.
- Один VPS с 1 ГБ RAM, без локальных моделей и тяжёлых контейнеров.
- ~18.8 $/мес суммарных расходов.
- Реальный RSS-трафик и переходы из поиска и соцсетей.
- Все секреты — в одном `.env` с правами `600`.

## Выводы

1. Для «умной» ленты не нужен свой сервер с GPU — достаточно хорошо спроектированного пайплайна и внешних LLM.
2. Дедупликация и борьба с галлюцинациями важнее, чем качество модели.
3. Экономия токенов — это в первую очередь кэш и роутинг, а не «более дешёвая модель».
4. Для индексации в эпоху LLM нужен отдельный слой: `llms.txt`, markdown-версии и открытые краулеры.

---

Новости об ИИ каждый час и разборы — в канале [@ai_release1](https://t.me/ai_release1), архив постов и [гайды](https://ai-release.net/guides/) — на сайте [ai-release.net](https://ai-release.net).

💬 **Вопросы и обсуждение — в комментариях ниже.**
