Самые выгодные курсы обмена валют

Build-in-public #2: ежедневный cron-агент — что под капотом и что ломалось за 28 дней

Дневник

TL;DR: Каждое утро в 06:53 UTC cron запускает Claude Code, который читает covered-topics.log, ротирует рубрику A→B→C→D→E, пишет черновик, генерит обложку через kie.ai Nano Banana Pro и заливает результат в WordPress со статусом draft. За 28 дней с момента первой статьи про эту автоматизацию (C5, 27 июня) — 26 успешных запусков, 1 провал из-за окружения (17 июля), 1 ручной retry (18 июля) и 0 публикаций без моей кнопки в админке. Это самая честная статья рубрики «Дневник», потому что её пишет именно тот агент, о котором она рассказывает.

Ключевые факты

Факт Значение Источник
Расписание cron-задачи 06:53 UTC ежедневно (09:53 МСК) Локальный cron.log, строка run started 2026-07-21T06:53:01Z
Успешных запусков с 27.06.2026 (C5) 26 из 28 (≈93%) cron.log, раздел run exited status=0
Провалов окружения 2 — оба 17–18 июля 2026, оба из-за root + --dangerously-skip-permissions cron.log, run started 2026-07-18T00:12:26Z
Стоимость одной обложки kie.ai Nano Banana Pro (1K/2K) ~18 кредитов ≈ $0.09 kie.ai/nano-banana-pro
Стоимость обложки 4K ~24 кредита ≈ $0.12 kie.ai/nano-banana-pro
Фоллбэк для обложки Pollinations.ai — бесплатно, без API-ключа и регистрации pollinations.ai (Берлин, open-source)
Аутентификация в WordPress Application Password — 24-символьный токен, HTTP Basic Auth attowp.com, гайд 2026
Ротация рубрик A → B → C → D → E по кругу, с под-ротацией внутри B (3 формата) Локальный covered-topics.log, 27 строк с 24.06.2026
Опубликованных постов без моего участия 0 (всегда status=draft) WordPress REST API: Create a Post

Архитектура: что вообще происходит в 06:53 UTC

Я не люблю слово «архитектура» — звучит как будто я писал диссертацию. На деле это 5 шагов, которые выполняет один Bash-вызов claude с текстом daily-article-prompt.md:

  1. Прочитать covered-topics.log. Это плоский текст, по одной строке на статью: 2026-07-20 | D | Мой AI-стек для проектов в 2026. Из последней строки агент понимает, какая рубрика была вчера, и выбирает следующую по кругу. Никакой SQLite, никаких YAML — обычный cat.
  2. WebSearch для всего, что может устареть. Курсы, ставки, цены, даты FOMC, имена моделей. Если тема про «как ставить стоп-лосс» — WebSearch не нужен; если про «сколько стоит Nano Banana Pro» — обязателен. Это самая дорогая часть по времени (обычно 3–5 поисковых вызовов).
  3. Написать HTML по фиксированной структуре. TL;DR, таблица фактов с источниками, 1–2 содержательных раздела, FAQ из минимум 3 вопросов, итог, подпись с датой. Структура задана в промпте, агенту нельзя «забыть» про featured_media или проставить status: "publish" вместо draft.
  4. Сгенерировать обложку. Сначала промпт на английском под рубрику (крипто/форекс/бизнес/AI — четыре шаблона), затем POST /jobs/createTask на api.kie.ai, опрос /jobs/recordInfo до 18 раз по 10 секунд. Если Nano Banana Pro вернул state=fail или пустой resultUrls — фоллбэк на image.pollinations.ai/prompt/{закодированный промпт}?width=1200&height=630. Дальше add-watermark.py накладывает полупрозрачный «denisvk.ru» в левый нижний угол.
  5. Создать черновик в WordPress. Сначала POST /wp-json/wp/v2/media с бинарём cover.jpg (получаем media id), затем POST /wp-json/wp/v2/posts с status: "draft", featured_media, categories: [73] (для E) и meta-полями Rank Math. В конце — дописать строку в covered-topics.log и напечатать summary в stdout.

Что вынес из C5 и изменил за месяц

В C5 я писал, что автоматизация — это «раз и забыл». Неправда. За 28 дней я трижды правил промпт:

  • Запретил две «куда вложить N» подряд в рубрике B. После B14/B16/B17 читатели справедливо писали, что рубрика превратилась в калькулятор. Теперь под-ротация: (1) куда вложить N, (2) оффлайн-бизнес/услуги/франшиза, (3) онлайн-бизнес/AI-агентство/цифровые продукты. B18 (18.07) — уже AI-агентство, не «куда вложить».
  • Запретил агенту писать чувствительные темы в режиме «куда идти». Темы про AML, обход санкций, биржи без KYC сначала получались как инструкции, а не как risk-разбор. Теперь формулировка явно задаётся в промпте: «если тема может читаться как гайд по обходу — переформулируй в честный факт-сводку про риски». A3 и A5 (май–июнь) уже переписаны в таком стиле.
  • Добавил fallback на Pollinations. За 28 дней Nano Banana Pro упал один раз (state=fail на 1-й попытке), и агент потратил бы лишние 90 секунд на ретраи без картинки. Теперь if state == "fail": break — сразу переход на Pollinations.

Что ломалось за 28 дней — три честных бага

Build-in-public без списка багов — это маркетинг. Вот что реально сломалось:

Баг №1. 17 июля, 06:53 UTC — exit status 1

Cron запустился, но сразу упал. В логе видно: --dangerously-skip-permissions cannot be used with root/sudo privileges for security reasons. Cron на сервере работает от имени denisvk-bot, но в этот день что-то в PATH затянуло root-окружение (видимо, обновился shell-профиль). Агент не успел даже прочитать covered-topics.log — упал на старте.

Баг №2. 18 июля, 00:12 UTC — мой ручной retry, тоже exit 1

Я увидел, что вчерашнего поста нет, зашёл по SSH, дёрнул скрипт руками. Получил ту же ошибку — потому что я тоже был под root в той сессии. Claude Code отказался работать и напечатал предупреждение в stderr.

Баг №3. 18 июля, 00:13 UTC — третий запуск, exit 0

Сменил PATH на чистый /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin, без /root/.local/bin и без /root/.vscode-server. Запустил ещё раз — всё прошло за 4 минуты. Пост про COT-отчёты CFTC ушёл в draft с ID 842.

Из этого я вынес: агент не должен сам себе чинить окружение. Если PATH/UID поломались — это уже не блог упал, это сервер. Дальше таких историй не было, но я на всякий случай добавил в скрипт проверку id -u в самом начале: если не 0 — падать сразу с понятной ошибкой, а не пытаться «как-нибудь».

Что ещё ломалось, но без последствий

  • kie.ai вернул state=fail на первой попытке для обложки A12 (funding rates, 13 июля). Фоллбэк Pollinations отработал, картинка уехала в пост. Стоимость: +12 секунд.
  • Watermark-скрипт один раз положил cover.jpg в неправильную кодировку PIL — потому что входной JPEG был CMYK. После этого в add-watermark.py стоит image.convert("RGB") до открытия.
  • WebSearch дважды возвращал ссылку с 503. Не баг агента, но факт: я не полагаюсь на один источник для цифр в таблице — всегда минимум два.

Что сознательно не автоматизировано

Самое полезное в build-in-public — это список того, что ты не отдал машине. У меня он короткий, но жёсткий:

  • Публикация. Агент никогда не ставит status: "publish". В промпте это прописано отдельной строкой: «НИКОГДА не публикуй пост (только draft)». Это не про контроль качества — это про то, что у каждой статьи есть контекст, который я хочу проверить руками. Например, для A3/A5 (чувствительные темы) я могу переформулировать конкретный абзац, прежде чем он уйдёт в индекс.
  • Telegram. У меня в .env лежит YANDEX_OAUTH_TOKEN, и теоретически можно было бы после draft сделать вторую кнопку «запостить в канал». Я этого не делаю: во-первых, анонс должен отличаться от заголовка (иначе зачем канал, если есть RSS); во-вторых, цена ошибки в Telegram выше — там нет «отменить публикацию через час».
  • Темы про Pillar B с реальным тестом денег. В плане рубрики есть пункт «Denis вкладывает деньги в идею подписчика и пишет дневник теста». Агент это пропускает — потому что это требует реальной идеи от реального подписчика и реально потраченных денег, иначе получится фейк. Я делаю это руками, когда есть конкретный запрос.
  • Список тем на следующую неделю. Агент не выбирает, о чём писать — он ротирует A→B→C→D→E. Какие именно подтемы внутри рубрики — решаю я, иначе через месяц блог превратится в «ещё один день, ещё один план EUR/USD».

Частые вопросы (FAQ)

Сколько стоит один черновик?

Примерно $0.09 за обложку (Nano Banana Pro 1K) + копейки за WebSearch через Anthropic API. На 26 запусках за месяц — около $2.5 в сумме за картинки. Claude Code сам по себе у меня на подписке, отдельной метрики на «блог» я не выделяю. Pollinations-фоллбэк бесплатный — реально сработал один раз.

Что будет, если kie.ai упадёт на сутки?

Агент сгенерирует обложку через Pollinations и поставит в конце статьи явную пометку «cover via pollinations fallback». Качество у Pollinations ниже (часто упрощённые композиции, меньше контроля над стилем), но пост не пропадёт. За 28 дней ни одного полного отказа kie.ai — только одна неудачная попытка из восьми в одном запуске.

Почему draft, а не publish сразу?

Потому что у статьи в блоге есть последствия, которых нет у текста в /tmp. Во-первых, Rank Math пересчитывает SEO-оценку при публикации, и я иногда правлю focus_keyword до того, как она туда попадёт. Во-вторых, рубрика D («Мои проекты») про честный build-in-public — там я иногда дописываю абзац после первого прочтения. В-третьих, темы про крипту и KYC требуют второго взгляда на формулировки.

Можно ли отдать агенту выбор времени публикации?

Технически — да, через wp-cron или отдельный cron на стороне сервера. Я этого не делаю, потому что публикация привязана к моему дню: утром я пишу черновик, в течение дня правлю, вечером публикую. Если агент будет публиковать сам — он заберёт у меня ту единственную точку, где я обязан прочитать то, что он написал.

Не устаревает ли тема «автоматизация блога» каждый месяц?

Устаревает инструментарий, не принцип. C5 была про первый конвейер, эта статья — про работу с ним после месяца эксплуатации. Через полгода, думаю, напишу #3 — про то, как начал автоматизировать второй блог (англоязычный дневник трейдера) и какие куски конвейера пришлось переписать. А сами «cron + Claude Code + REST API» — это инфраструктура 2020-х, она не устареет ещё лет пять.

Итог

Build-in-public — это не «я автоматизировал всё, что можно». Это «я автоматизировал то, что не страшно сломать, и оставил руками то, где цена ошибки выше цены рутины». За 28 дней граница между этими двумя зонами прояснилась окончательно: агенту — черновик и обложка, мне — публикация, Telegram и любые темы, где нужна не скорость, а подпись. Дальше план простой — когда появится английский двойник блога, я просто скопирую конвейер и буду крутить его параллельно, не трогая код, потому что он уже проверен 26 успешными запусками и двумя честными багами.


Автор: Denis | Дата: 2026-07-21 | Обновлено: 2026-07-21
Denis — трейдер с 10+ летним опытом на форексе и крипторынках

Поделиться с друзьями
DenisVK
Оцените автора
( Пока оценок нет )
DenisVK
Добавить комментарий

Самые выгодные курсы обмена валют