Не хотите читать всё это?
Просто скиньте в любой ИИ-чат (Claude, ChatGPT и т.д.) ссылку на https://pastukhov.com/agents/news/install.md или на https://pastukhov.com/llms.txt и попросите сгенерировать конфигурационные файлы и команды. Он прочитает документацию, задаст несколько вопросов о вашей настройке и выдаст готовую конфигурацию. Экономьте время — пусть модель читает за вас.
Вы также можете связаться со мной через Telegram — я всегда рад помочь. И это не просто вежливость — мне действительно нравится общаться с единомышленниками, особенно если вы так же увлечены программированием, как и я.
«Новостной агент» — это новостной отдел на вашем сервере: продукт ходит по вашим источникам, собирает материалы, объединяет повторы одной новости, обрабатывает их ИИ и присылает вам только то, что вы сами назвали важным. Разворачивается он одним контейнером Docker, а отдельная база данных не обязательна: по умолчанию внутри уже есть встроенная. Рядом по желанию ставится ваш Pastukhov Agent — тогда новостями можно управлять словами в чате, а без него всё, кроме чата, работает как обычно.
Что понадобится
- Сервер или компьютер с Docker — подойдёт Windows, Linux или macOS, а для постоянной работы достаточно недорогого сервера.
- Один свободный порт для интерфейса (в примерах ниже — 3980). Отдельная база данных не нужна: если не указывать строку подключения, продукт заведёт встроенную базу сам.
- По желанию — адрес и ключ вашего Pastukhov Agent. Без них работает всё, кроме чата с ИИ-агентом внутри продукта.
- Ключ управления для агента (
NEWSAGENT_MANAGEMENT_KEY) — если вы хотите, чтобы ваш ИИ-агент менял настройки сам, а не вы вручную на диске. Пока ключ не задан, изменения запрещены, а наблюдение в интерфейсе работает.
Установка через Docker Compose
Создайте файл compose.yml с таким содержимым. Здесь одна служба: база данных ей не нужна, поэтому весь продукт умещается в один контейнер.
services:
newsagent-ru:
image: maxpastukhov/news-agent:min-latest
container_name: newsagent-ru
ports:
- "3980:80"
volumes:
- newsagent-data-ru:/apps/news
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://+:80
- NEWSAGENT_BRAND=pastukhov
- NEWSAGENT_DATA=/apps/news
# NEWSAGENT_BASE_PATH=/news # serve from a first-level subfolder (see ../subfolder-hosting.md)
restart: unless-stopped
sysctls:
fs.inotify.max_user_watches: "524288"
fs.inotify.max_user_instances: "512"
volumes:
newsagent-data-ru:
Разберём построчно, что здесь написано и зачем:
image— русская сборка продукта с русским интерфейсом и названием «Новостной агент».ports— адрес, по которому откроется интерфейс:3980снаружи,80внутри контейнера. Число снаружи можно взять любое свободное.volumes— постоянная папка/apps/news. В ней живут база, архив собранных страниц и опубликованные материалы, поэтому без неё все данные исчезнут при пересоздании контейнера.NEWSAGENT_BRAND— выбор бренда:pastukhovвключает русское название и русский язык по умолчанию.NEWSAGENT_DATA— та самая постоянная папка внутри контейнера, куда продукт складывает всё своё: она же подключена томом выше.restart— перезапуск после перезагрузки сервера, чтобы слежение за новостями не останавливалось.sysctls— две настройки ядра Linux, увеличивающие лимит наблюдения за файлами: без них продукт не сможет следить за изменениями в настройках и архиве на больших объёмах.
Затем запустите:
docker compose up -d
Интерфейс появится на порту 3980: http://<адрес-сервера>:3980.
Запуск одной командой
Если файл с настройками заводить не хочется, всё то же самое делается одной командой docker run:
docker run -d \
--name newsagent-ru \
-p 3980:80 \
-v newsagent-data-ru:/apps/news \
-e ASPNETCORE_ENVIRONMENT=Production \
-e ASPNETCORE_URLS=http://+:80 \
-e NEWSAGENT_BRAND=pastukhov \
-e NEWSAGENT_DATA=/apps/news \
--sysctl fs.inotify.max_user_watches=524288 \
--sysctl fs.inotify.max_user_instances=512 \
--restart unless-stopped \
maxpastukhov/news-agent:min-latest
Остальные переменные удобно передать файлом через флаг --env-file .env — так их проще менять, не переписывая длинную команду.
Переменные окружения
Настройки задаются переменными окружения — их прописывают один раз в compose.yml и меняют без правки кода. Почти все имена начинаются с NEWSAGENT_; для чата с агентом имена, наоборот, привычные — без приставки.
| Переменная | Что делает |
NEWSAGENT_DB | выбор базы данных. Не указана — продукт работает на встроенной базе SQLite; указана строка подключения — работает на PostgreSQL |
NEWSAGENT_DATA | папка постоянных данных: база, архив, опубликованное, копии настроек, ключи входа. По умолчанию /apps/news |
NEWSAGENT_BRAND | pastukhov — русское название продукта и русский язык интерфейса по умолчанию |
NEWSAGENT_BASE_PATH | размещение в подпапке сайта, например /news; не задано — работа в корне домена |
NEWSAGENT_MANAGEMENT_KEY | хеш ключа, которым ваш ИИ-агент управляет продуктом по API (это адреса управления, к которым обращается агент). Хранится в виде необратимой суммы SHA-256; без неё изменения запрещены, а наблюдение работает |
NEWSAGENT_NEWS_CONFIG | другая папка настроек. По умолчанию /project/apps/news — она лежит рядом с проектом и попадает под контроль версий |
NEWSAGENT_SSL | выпуск сертификата HTTPS для прямого адреса вида news.ваш-домен. Если перед продуктом стоит ваш прокси, эту переменную включать не нужно |
AGENT_API_URL, AGENT_API_KEY | адрес и ключ вашего Pastukhov Agent: с ними появляется чат с ИИ-агентом внутри продукта. Не заданы — чат скрыт, всё остальное работает |
Где хранятся данные
Всё собранное и настроенное лежит на вашем сервере, никуда наружу не уходит. В постоянной папке /apps/news:
data.db— база: материалы, события, публикации, журналы отправок;archive/— архив сырых страниц: каждая скачанная страница сохранена целиком, поэтому всегда видно, откуда взялся факт;published/— опубликованные материалы и ленты для читателей;config-backup/— копии настроек, снятые перед каждой правкой через агента;auth/— ключи входа: ими подписываются сессии, поэтому после переноса папки старые входы продолжают действовать.
Настройки — это отдельная папка /project/apps/news с текстовыми файлами по разделам: настройки, источники, мониторы, правила, оповещения, каналы, дайджесты, публикация. Она подключена отдельным томом и заполняется готовыми примерами при первом запуске, а перенос на другой сервер — это просто копирование папки.
Два честных предупреждения. Первое: если не подключить постоянные тома, при пересоздании контейнера исчезнут база, архив и опубликованное, а вход придётся выполнять заново. Второе: копии настроек содержат настоящие пароли и токены, а не замаскированные, поэтому продукт намеренно не показывает папку config-backup/ через свой файловый менеджер.
Первый вход
Откройте интерфейс в браузере и зарегистрируйтесь: первый зарегистрировавшийся становится администратором, после чего свободная регистрация закрывается — посторонний в вашу установку уже не попадёт. Сессия входа живёт 90 дней, так что каждый день логиниться не придётся. Если продукт стоит за единым входом вашей организации (когда логин проверяет внешняя система), пользователи создаются автоматически при первом обращении.
Размещение в подпапке сайта
Продукт можно повесить не на корень домена, а на подпапку — например, https://ваш-сайт/news. Есть два способа, и они не смешиваются.
- Просто указать папку. Задайте
NEWSAGENT_BASE_PATH=/news— продукт сам отрежет приставку и перенаправит старые адреса в новый вид. Служебные адреса проверки домена (/.well-known/) при этом остаются в корне. - Отдать папку вашему прокси. В этом случае в контейнере ничего менять не нужно: прокси сообщает продукту приставку заголовком
X-Forwarded-Prefix. Так удобнее, когда у вас уже настроен nginx или похожий сервер.
Во втором случае не забудьте про живые обновления: они идут по отдельному соединению, которому нужны заголовки перехода на WebSocket, иначе обновления незаметно превратятся в редкие опросы.
# переход на WebSocket (в общем разделе http {})
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl;
server_name host.tld;
location /news/ {
proxy_pass http://newsagent:80/; # слэш на конце отрезает приставку подпапки
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Prefix /news;
proxy_set_header X-Forwarded-Proto $scheme; # по нему строятся ссылки в лентах и оповещениях
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade; # живые обновления (SignalR)
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_buffering off;
}
}
Есть ещё одна деталь, о которой стоит знать заранее: ссылки внутри оповещений, сводок и лент продукт собирает из своего публичного адреса. Если он работает в фоне (ночью, без открытого браузера), адрес нужно задать в настройках вручную — переменной settings.defaults.publicUrl, вместе с приставкой подпапки. Иначе ссылки в письмах и вебхуках будут вести на сайт продукта, а не на ваш сервер. Оба способа подробно описаны в файле install/subfolder-hosting.md рядом с продуктом.
Установка через Pastukhov MultiAgent
Если у вас несколько серверов, удобнее ставить продукт из Pastukhov MultiAgent: он сам поднимает контейнер, выдаёт постоянный адрес и HTTPS, подключает базу. «Новостной агент» есть в каталоге продуктов (порт 6090), используются переменные NEWSAGENT_SSL, NEWSAGENT_DB, NEWSAGENT_BASE_URL и NEWSAGENT_API_KEY, а связанный Pastukhov Agent подключается к чату — он же и будет вести ваши новости. Подробнее о самом MultiAgent — на странице MultiAgent.
Лицензия и обновления
Пробный период — 30 дней бесплатно, без ограничений внутри. Цены те же, что у соседних продуктов: персональная —
Дальше стоит заглянуть в Начало работы — там коротко о том, как продукт устроен и с чего начать.