← Все гайды AI Release
EN Подписаться на @ai_release1

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

Обновлено: 03.10.2026 · AI Release · @ai_release1
Как мы собрали автономный Telegram-канал об ИИ на VPS с 1 ГБ RAM

Каждый час в канал @ai_release1 уходит свежая новость об ИИ, раз в сутки — дайджест, каждые 8 часов — видео, плюс ежедневный совет по Windows и еженедельная «связка» тем. Всё это живёт на одном недорогом VPS с 1 ГБ оперативной памяти, без участия человека и без ПК. За месяц накопилось ~450 постов и 716 подписчиков. В этой статье — как устроен пайплайн, на какие грабли мы наступали и как экономим токены.

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

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

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

Бюджет

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

Статья расходовСтоимость
VPS (1 ГБ RAM)~5 $/мес
Подписка OpenCode Zen GO (LLM-API)10 $/мес
Домен ai-release.net22 $/год (~1.8 $/мес)
Telegram Premium25 $/год (~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`, например для часового таймера:

[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, Hacker News через Algolia API) и авторские блоги (Simon Willison, Karpathy, Sebastian Raschka, Nathan Lambert). Запасной поиск — локальный SearXNG в Docker.

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

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

1. **Рейтинг.** Каждой новости считается скор из свежести, веса источника и качества заголовка. Первоисточники и авторы весят больше агрегаторов, свежее — важнее старого.

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

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 не выдумывала

Это оказалось самой важной частью. Раньше саммари иногда подавало чужой вывод как факт и додумывало причины. Мы ужесточили промпт: излагать **только** то, что есть в заголовке и описании; не выдумывать причины, цифры и последствия; сохранять атрибуцию («по данным исследования», «считают журналисты»), если вывод принадлежит источнику. Плюс снизили `temperature` с 0.8 до 0.5.

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

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

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

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

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

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

1. `og:image` статьи-источника;

2. стоковая картинка по теме через метапоиск (allowlist: Unsplash, Pexels, Pixabay, Wikimedia, Flickr, pinimg);

3. тематическая аниме/манга-иллюстрация;

4. заранее заготовленный фолбэк-набор.

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

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

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

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

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

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

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

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

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

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

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

Выводы

1. Для «умной» ленты не нужен свой сервер с GPU — достаточно хорошо спроектированного пайплайна и внешних LLM.

2. Дедупликация и борьба с галлюцинациями важнее, чем качество модели.

3. Экономия токенов — это в первую очередь кэш и роутинг, а не «более дешёвая модель».

4. Для индексации в эпоху LLM нужен отдельный слой: `llms.txt`, markdown-версии и открытые краулеры.

---

Новости об ИИ каждый час и разборы — в канале @ai_release1, архив постов и гайды — на сайте ai-release.net.

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