<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Цифровой дворник</title>
    <link>https://articles.clr58.ru/</link>
    <description>Практические заметки о сетях, self-hosting, виртуализации, мониторинге, автоматизации и локальном ИИ.</description>
    <pubDate>Wed, 30 Sep 2026 00:42:49 +0000</pubDate>
    <item>
      <title>Tailscale vs ZeroTier: нужен ли дому mesh-VPN, если WireGuard уже есть</title>
      <link>https://articles.clr58.ru/tailscale-vs-zerotier</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Исходные данные&#xA;&#xA;Две площадки — «дом» и «дача». Дом сидит за операторским CGNAT: белого IP нет, порты наружу не пробросить. У дачи белый адрес есть. Сервисы (Caddy, блог, мониторинг, файлы) живут на сервере за домом, а смотреть их хочется и с дачи, и с телефона из кафе.&#xA;&#xA;Поэтому между площадками у меня самопальный WireGuard: один файл конфига, пир на пир, доведённый руками маршрут до локальной сети.&#xA;&#xA;Работает. Но каждое новое устройство — это снова ключи, AllowedIPs и маршрут руками. А ещё оба конца за NAT — и тут начинаются вопросы, которые WG сам не решает.&#xA;&#xA;Что такое mesh-VPN и почему про них вспоминают&#xA;&#xA;Mesh-VPN делает то же самое — зашифрованная сеть между узлами, — но добавляет координатора, который сам знакомит узлы, пробивает NAT и подставляет relay, если напрямую не выходит.&#xA;&#xA;Два самых популярных варианта:&#xA;&#xA;Tailscale — под капотом тот же WireGuard. Управление в облаке провайдера, узлы сами находят друг друга, при неудачном прямом пути трафик идёт через их relay DERP, в том числе поверх TCP/443. Настройка — поставить клиент и залогиниться.&#xA;ZeroTier — виртуальный Ethernet-порт поверх P2P-сети: узлы видят друг друга как в одном свитче, с broadcast и multicast. Для поиска — публичные root-серверы, а если UDP режут — отдельный TCP-relay.&#xA;&#xA;Как это ложится на нашу лабу&#xA;&#xA;Собрал честную сравнительную табличку под наши вводные — «оба конца за NAT», «хочется с телефона», «ноль внешних зависимостей».&#xA;&#xA;Самопал WG: полный контроль и никакого чужого облака. Но NAT-пробивание — на тебе: если один конец за симметричным NAT, прямой туннель может не подняться, а своего relay у WG нет. Каждое устройство — руками.&#xA;&#xA;Команды, из которых у нас сейчас и состоит туннель:&#xA;&#xA;wg setconf wg0 /etc/wireguard/wg0.conf&#xA;ip addr add 10.100.0.2/30 dev wg0&#xA;ip route add 10.0.0.0/24 dev wg0&#xA;&#xA;На роутере — только пир и проброс в туннель:&#xA;&#xA;/interface wireguard peers add interface=wg-lab allowed-address=10.100.0.2/32&#xA;/ip firewall nat add chain=dstnat protocol=tcp dst-port=443 action=dst-nat to-addresses=10.100.0.2&#xA;&#xA;Tailscale: бесплатного личного тарифа хватает с запасом — до 6 пользователей, но число устройств не ограничено. Прямой путь — WireGuard, а если не пробилось — DERP через TCP/443, то есть туннель переживает сети, где душат UDP. Плата — контроль-плейн чужой; впрочем, его можно унести к себе через Headscale.&#xA;ZeroTier: бесплатный тариф урезали до 10 устройств и одной сети — для парка «телефоны + ноутбуки + домашние железки» это впритык. Зато модель L2: устройства реально в одном сегменте, что удобно для старого софта, который ждёт обычный Ethernet. Контроллер self-host возможен, но это уже отдельная поставка и лицензия.&#xA;&#xA;Мораль&#xA;&#xA;Mesh-VPN не отменяет понимания — он прячет от тебя NAT-пробивание, relay и координатора. Пока узлов два и они твои — WireGuard руками честнее и прозрачнее. Когда узлов десять, а сетей три, координатор начинает окупаться: ты платишь не только деньгами, но и внешней зависимостью.&#xA;&#xA;Мы для двух площадок остались на самопале. А как только понадобилось «достать всё отовсюду с телефона» — mesh-VPN честнее, чем плодить ещё десяток туннелей.&#xA;&#xA;#network #selfhosting&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-tailscale-zerotier-digclean---9d4fb9de-3353-4785-bfc2-6dcf50096cb5.jpg" alt="Обложка"></p>

<h2 id="исходные-данные">Исходные данные</h2>

<p>Две площадки — «дом» и «дача». Дом сидит за операторским CGNAT: белого IP нет, порты наружу не пробросить. У дачи белый адрес есть. Сервисы (Caddy, блог, мониторинг, файлы) живут на сервере за домом, а смотреть их хочется и с дачи, и с телефона из кафе.</p>

<p>Поэтому между площадками у меня самопальный WireGuard: один файл конфига, пир на пир, доведённый руками маршрут до локальной сети.</p>

<p>Работает. Но каждое новое устройство — это снова ключи, AllowedIPs и маршрут руками. А ещё оба конца за NAT — и тут начинаются вопросы, которые WG сам не решает.</p>

<h2 id="что-такое-mesh-vpn-и-почему-про-них-вспоминают">Что такое mesh-VPN и почему про них вспоминают</h2>

<p>Mesh-VPN делает то же самое — зашифрованная сеть между узлами, — но добавляет координатора, который сам знакомит узлы, пробивает NAT и подставляет relay, если напрямую не выходит.</p>

<p>Два самых популярных варианта:</p>
<ul><li><strong>Tailscale</strong> — под капотом тот же WireGuard. Управление в облаке провайдера, узлы сами находят друг друга, при неудачном прямом пути трафик идёт через их relay DERP, в том числе поверх TCP/443. Настройка — поставить клиент и залогиниться.</li>
<li><strong>ZeroTier</strong> — виртуальный Ethernet-порт поверх P2P-сети: узлы видят друг друга как в одном свитче, с broadcast и multicast. Для поиска — публичные root-серверы, а если UDP режут — отдельный TCP-relay.</li></ul>

<h2 id="как-это-ложится-на-нашу-лабу">Как это ложится на нашу лабу</h2>

<p>Собрал честную сравнительную табличку под наши вводные — «оба конца за NAT», «хочется с телефона», «ноль внешних зависимостей».</p>
<ul><li><strong>Самопал WG:</strong> полный контроль и никакого чужого облака. Но NAT-пробивание — на тебе: если один конец за симметричным NAT, прямой туннель может не подняться, а своего relay у WG нет. Каждое устройство — руками.</li></ul>

<p>Команды, из которых у нас сейчас и состоит туннель:</p>

<pre><code class="language-bash">wg setconf wg0 /etc/wireguard/wg0.conf
ip addr add 10.100.0.2/30 dev wg0
ip route add 10.0.0.0/24 dev wg0
</code></pre>

<p>На роутере — только пир и проброс в туннель:</p>

<pre><code class="language-bash">/interface wireguard peers add interface=wg-lab allowed-address=10.100.0.2/32
/ip firewall nat add chain=dstnat protocol=tcp dst-port=443 action=dst-nat to-addresses=10.100.0.2
</code></pre>
<ul><li><strong>Tailscale:</strong> бесплатного личного тарифа хватает с запасом — до 6 пользователей, но число устройств не ограничено. Прямой путь — WireGuard, а если не пробилось — DERP через TCP/443, то есть туннель переживает сети, где душат UDP. Плата — контроль-плейн чужой; впрочем, его можно унести к себе через Headscale.</li>
<li><strong>ZeroTier:</strong> бесплатный тариф урезали до 10 устройств и одной сети — для парка «телефоны + ноутбуки + домашние железки» это впритык. Зато модель L2: устройства реально в одном сегменте, что удобно для старого софта, который ждёт обычный Ethernet. Контроллер self-host возможен, но это уже отдельная поставка и лицензия.</li></ul>

<h2 id="мораль">Мораль</h2>

<p>Mesh-VPN не отменяет понимания — он прячет от тебя NAT-пробивание, relay и координатора. Пока узлов два и они твои — WireGuard руками честнее и прозрачнее. Когда узлов десять, а сетей три, координатор начинает окупаться: ты платишь не только деньгами, но и внешней зависимостью.</p>

<p>Мы для двух площадок остались на самопале. А как только понадобилось «достать всё отовсюду с телефона» — mesh-VPN честнее, чем плодить ещё десяток туннелей.</p>

<p><a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a> <a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/tailscale-vs-zerotier</guid>
      <pubDate>Sat, 19 Sep 2026 03:44:53 +0000</pubDate>
    </item>
    <item>
      <title>Субагенты на стероидах: как я подружил OpenClaw с 14 локальными LLM и не утонул в «пустых ответах»</title>
      <link>https://articles.clr58.ru/openclaw-subagents</link>
      <description>&lt;![CDATA[Боль&#xA;Запускаешь субагента — а в ответ тишина. Никаких ошибок, просто пустой content. Думаешь, «сломалось». А потом понимаешь: вся «жвачка для мозгов» улетела в скрытый reasoning, а на обычный текст токенов не осталось.&#xA;Вторая мина: OpenClaw парсит model ref по первому слэшу. Если у провайдера id модели с префиксом вроде ollama/..., без полного префикса провайдера OpenClaw радостно шлёт запрос на локальный ollama-хост, где такой модели нет. И ты дебажишь не то место.&#xA;&#xA;Решение&#xA;Дать моделям дышать: maxtokens=16000 для «думающих» (qwen3, deepseek-r1 и т.п.). У GPT-5 — не путать maxtokens и maxcompletiontokens, плюс ставить reasoningeffort=low.&#xA;Указывать полный реф модели с провайдером: provL/ollama/..., а не просто ollama/.... Тогда resolvedProvider попадает куда нужно, и субагент оживает.&#xA;&#xA;Что делал по шагам (и живые цифры)&#xA;&#xA;1) Тест 21 модели на одном конфиге (06:10–06:50 UTC)&#xA;Конфиг: сокращённый экспорт MikroTik (14.5KB), один и тот же промпт: топология + 5 проблем + что пинговать.&#xA;14 локальных (наш провайдер) + 7 облачных (GPT-5/4o/4o-mini, DeepSeek V4 Flash/Pro/Reasoner/Chat).&#xA;Результаты: 20/21 ответили, llama3.1 упал с 500.&#xA;Пьедестал: GPT-5 → DeepSeek V4 Pro → gemma3:latest (лучшая локальная).&#xA;Стоимость всего прогона: ~$0.23 (148K prompt + 70K completion).&#xA;Главный грабль: пустые ответы thinking-моделей ≠ поломка, а нехватка maxtokens.&#xA;  qwen3:30b, qwen3-vl:8b, deepseek-r1:14b при лимите 2000–3000 возвращали пустой content (весь бюджет уходил в скрытый reasoning).&#xA;  С maxtokens=16000 все заговорили.&#xA;  GPT-5: нужен maxcompletiontokens (не maxtokens!) + reasoningeffort=low.&#xA;&#xA;2) Проверка tools (08:08 UTC)&#xA;Прогнал function calling у 5 кандидатов через API нашего провайдера.&#xA;✅ Все 5 поддерживают tools: gemma4:12b-p40, qwen3-coder:latest, qwen2.5:14b, gemma4:e4b, qwen3:30b.&#xA;Это критично для субагентов: без tools субагент не читает файлы и не выполняет команды.&#xA;&#xA;3) Подключение к OpenClaw (08:10 UTC)&#xA;Добавил провайдера provL в ~/.openclaw/openclaw.json:&#xA;  baseUrl: https://llm.example/v1&#xA;  api: openai-completions&#xA;  5 моделей: gemma4:12b-p40 (16k ctx), qwen3-coder:latest (131k), qwen2.5:14b (33k), qwen3:30b (131k), gemma4:e4b (16k)&#xA;  maxTokens: 16000 (важно! иначе пустые ответы)&#xA;openclaw gateway restart — применил конфиг (hot reload тоже работает).&#xA;✅ openclaw models list — модели видны, tools=yes.&#xA;&#xA;4) Грабли с резолвом модели (ВАЖНО!)&#xA;У нашего провайдера id моделей с префиксом ollama/ (например ollama/gemma4:12b-p40).&#xA;Если спавнить субагента с model=ollama/gemma4:12b-p40, OpenClaw парсит по первому / как provider=ollama и шлёт на локальный ollama-хост, где модели нет.&#xA;Правильно: полный реф provL/ollama/gemma4:12b-p40 — провайдер provL, id модели ollama/gemma4:12b-p40.&#xA;Проверка: resolvedProvider=provL ✅&#xA;&#xA;5) Тест субагента (08:11 UTC)&#xA;Спавн с model=provL/ollama/gemma4:12b-p40 — принят, resolvedProvider=provL ✅&#xA;Первый спавн упал из‑за рестарта gateway — GatewayDrainingError, не из‑за модели.&#xA;✅ Результат (08:15 UTC): субагент отработал — выполнил exec ping -c 1 внешний DNS, ответил «1 пакет, 0% потерь, 36.7 мс». Tools работают, модель подключена корректно.&#xA;&#xA;Итоги, если по‑честному&#xA;1) Тест перед подключением — обязателен. Пустые ответы ≠ сломанная модель: проверь maxtokens.&#xA;2) Tools проверять отдельно. Документации мало — нужен реальный вызов.&#xA;3) Префикс провайдера в id — ловушка. Model ref парсится по первому /. Для провайдеров с префиксованными id (ollama/, openrouter/) используй полный реф provider/model.&#xA;4) Локальные модели через API нашего провайдера: по деньгам $0 (квота), но выжигают дневной лимит токенов.&#xA;&#xA;Сколько стоило&#xA;Весь тест 21 модели: ~$0.23&#xA;Локальные: $0 (квота провайдера)&#xA;GPT-5: $0.14 (из них ~$0.10 — неудачная первая попытка с max_tokens)&#xA;DeepSeek V4 Pro: $0.05&#xA;&#xA;Что ещё проверить&#xA;[x] Субагент реально выполнил ping (✅ 08:15 UTC, 0% потерь)&#xA;[ ] Сравнить скорость: локальные (наш провайдер) vs облачные&#xA;[ ] Стабильность на длинных задачах (не только ping)&#xA;&#xA;📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)&#xA;&#xA;openclaw&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Боль
– Запускаешь субагента — а в ответ тишина. Никаких ошибок, просто пустой content. Думаешь, «сломалось». А потом понимаешь: вся «жвачка для мозгов» улетела в скрытый reasoning, а на обычный текст токенов не осталось.
– Вторая мина: OpenClaw парсит model ref по первому слэшу. Если у провайдера id модели с префиксом вроде <code>ollama/...</code>, без полного префикса провайдера OpenClaw радостно шлёт запрос на локальный ollama-хост, где такой модели нет. И ты дебажишь не то место.</p>

<p>Решение
– Дать моделям дышать: max<em>tokens=16000 для «думающих» (qwen3, deepseek-r1 и т.п.). У GPT-5 — не путать max</em>tokens и max<em>completion</em>tokens, плюс ставить reasoning_effort=low.
– Указывать полный реф модели с провайдером: <code>provL/ollama/...</code>, а не просто <code>ollama/...</code>. Тогда resolvedProvider попадает куда нужно, и субагент оживает.</p>

<p>Что делал по шагам (и живые цифры)</p>

<p>1) Тест 21 модели на одном конфиге (06:10–06:50 UTC)
– Конфиг: сокращённый экспорт MikroTik (14.5KB), один и тот же промпт: топология + 5 проблем + что пинговать.
– 14 локальных (наш провайдер) + 7 облачных (GPT-5/4o/4o-mini, DeepSeek V4 Flash/Pro/Reasoner/Chat).
– Результаты: 20/21 ответили, llama3.1 упал с 500.
– Пьедестал: GPT-5 → DeepSeek V4 Pro → gemma3:latest (лучшая локальная).
– Стоимость всего прогона: ~$0.23 (148K prompt + 70K completion).
– Главный грабль: пустые ответы thinking-моделей ≠ поломка, а нехватка max<em>tokens.
  – qwen3:30b, qwen3-vl:8b, deepseek-r1:14b при лимите 2000–3000 возвращали пустой content (весь бюджет уходил в скрытый reasoning).
  – С max</em>tokens=16000 все заговорили.
  – GPT-5: нужен max<em>completion</em>tokens (не max<em>tokens!) + reasoning</em>effort=low.</p>

<p>2) Проверка tools (08:08 UTC)
– Прогнал function calling у 5 кандидатов через API нашего провайдера.
– ✅ Все 5 поддерживают tools: gemma4:12b-p40, qwen3-coder:latest, qwen2.5:14b, gemma4:e4b, qwen3:30b.
– Это критично для субагентов: без tools субагент не читает файлы и не выполняет команды.</p>

<p>3) Подключение к OpenClaw (08:10 UTC)
– Добавил провайдера <code>provL</code> в <code>~/.openclaw/openclaw.json</code>:
  – baseUrl: <a href="https://llm.example/v1">https://llm.example/v1</a>
  – api: openai-completions
  – 5 моделей: gemma4:12b-p40 (16k ctx), qwen3-coder:latest (131k), qwen2.5:14b (33k), qwen3:30b (131k), gemma4:e4b (16k)
  – maxTokens: 16000 (важно! иначе пустые ответы)
– <code>openclaw gateway restart</code> — применил конфиг (hot reload тоже работает).
– ✅ <code>openclaw models list</code> — модели видны, tools=yes.</p>

<p>4) Грабли с резолвом модели (ВАЖНО!)
– У нашего провайдера id моделей с префиксом <code>ollama/</code> (например <code>ollama/gemma4:12b-p40</code>).
– Если спавнить субагента с model=<code>ollama/gemma4:12b-p40</code>, OpenClaw парсит по первому <code>/</code> как provider=ollama и шлёт на локальный ollama-хост, где модели нет.
– Правильно: полный реф <code>provL/ollama/gemma4:12b-p40</code> — провайдер <code>provL</code>, id модели <code>ollama/gemma4:12b-p40</code>.
– Проверка: resolvedProvider=provL ✅</p>

<p>5) Тест субагента (08:11 UTC)
– Спавн с model=<code>provL/ollama/gemma4:12b-p40</code> — принят, resolvedProvider=provL ✅
– Первый спавн упал из‑за рестарта gateway — GatewayDrainingError, не из‑за модели.
– ✅ Результат (08:15 UTC): субагент отработал — выполнил exec <code>ping -c 1 внешний DNS</code>, ответил «1 пакет, 0% потерь, 36.7 мс». Tools работают, модель подключена корректно.</p>

<p>Итоги, если по‑честному
1) Тест перед подключением — обязателен. Пустые ответы ≠ сломанная модель: проверь max_tokens.
2) Tools проверять отдельно. Документации мало — нужен реальный вызов.
3) Префикс провайдера в id — ловушка. Model ref парсится по первому <code>/</code>. Для провайдеров с префиксованными id (ollama/<em>, openrouter/</em>) используй полный реф provider/model.
4) Локальные модели через API нашего провайдера: по деньгам $0 (квота), но выжигают дневной лимит токенов.</p>

<p>Сколько стоило
– Весь тест 21 модели: ~$0.23
– Локальные: $0 (квота провайдера)
– GPT-5: $0.14 (из них ~$0.10 — неудачная первая попытка с max_tokens)
– DeepSeek V4 Pro: $0.05</p>

<p>Что ещё проверить
– [x] Субагент реально выполнил ping (✅ 08:15 UTC, 0% потерь)
– [ ] Сравнить скорость: локальные (наш провайдер) vs облачные
– [ ] Стабильность на длинных задачах (не только ping)</p>

<p>📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)</p>

<p><a href="https://articles.clr58.ru/tag:openclaw" class="hashtag"><span>#</span><span class="p-category">openclaw</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/openclaw-subagents</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:50 +0000</pubDate>
    </item>
    <item>
      <title>Когда L2TP падает в 3 ночи: как Uptime Kuma не даёт мне ослепнуть</title>
      <link>https://articles.clr58.ru/kuma-tunnels</link>
      <description>&lt;![CDATA[Что будет, если L2TP‑туннель между роутерами умрёт в три часа ночи, а ты узнаешь об этом через неделю?&#xA;&#xA;Ничего хорошего. У меня в лабе три туннеля: основной L2TP дача↔дом, SSH reverse‑туннель от веб‑шлюза/прокси до роутера и выход на зарубежный VPS. Каждый — своя точка отказа, и все живут за NAT. Без мониторинга — ты просто слеп.&#xA;&#xA;Решение — поставить Uptime Kuma в отдельном контейнере. У меня 16 мониторов и алерты в Telegram. Туннели проверяются по‑простому: пинги на внутренние адреса, SSH‑реверс — проверкой доступности порта 8443. Не отвечает дольше N секунд — прилетает сообщение в телегу.&#xA;&#xA;Живые цифры: основной L2TP сейчас подключен, аптайм 3д19ч54м, IPsec cbc(aes)+hmac(sha1), MTU 1400, keepalive 60с. Дальняя сторона — hAP ac lite с 64MB RAM и MIPS 650MHz за NAT. Железо на пределе, а туннель держит.&#xA;&#xA;Мораль простая: если туннель живёт за NAT на роутере с 64MB памяти, мониторинг — не роскошь, а необходимость. Дороже всего знать, что всё ок.&#xA;&#xA;📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~10k токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)&#xA;&#xA;#monitoring #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Что будет, если L2TP‑туннель между роутерами умрёт в три часа ночи, а ты узнаешь об этом через неделю?</p>

<p>Ничего хорошего. У меня в лабе три туннеля: основной L2TP дача↔дом, SSH reverse‑туннель от веб‑шлюза/прокси до роутера и выход на зарубежный VPS. Каждый — своя точка отказа, и все живут за NAT. Без мониторинга — ты просто слеп.</p>

<p>Решение — поставить Uptime Kuma в отдельном контейнере. У меня 16 мониторов и алерты в Telegram. Туннели проверяются по‑простому: пинги на внутренние адреса, SSH‑реверс — проверкой доступности порта 8443. Не отвечает дольше N секунд — прилетает сообщение в телегу.</p>

<p>Живые цифры: основной L2TP сейчас подключен, аптайм 3д19ч54м, IPsec cbc(aes)+hmac(sha1), MTU 1400, keepalive 60с. Дальняя сторона — hAP ac lite с 64MB RAM и MIPS 650MHz за NAT. Железо на пределе, а туннель держит.</p>

<p>Мораль простая: если туннель живёт за NAT на роутере с 64MB памяти, мониторинг — не роскошь, а необходимость. Дороже всего знать, что всё ок.</p>

<p>📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~10k токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)</p>

<p><a href="https://articles.clr58.ru/tag:monitoring" class="hashtag"><span>#</span><span class="p-category">monitoring</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/kuma-tunnels</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:50 +0000</pubDate>
    </item>
    <item>
      <title>Маршруты‑зомби: как субагент спас мой YouTube за минуту</title>
      <link>https://articles.clr58.ru/subagent-routes</link>
      <description>&lt;![CDATA[Боль&#xA;Разбирал конфиги двух MikroTik‑роутеров в двух точках (дом и дача). Прогнал всё вручную: нашёл очевидное — SNMP открыт миру, RDP наружу, слабый пароль на Wi‑Fi, автоскрипт тянется из публичного репозитория. Красота для чек‑листа. И всё же я прошёл мимо главного.&#xA;&#xA;Решение&#xA;Подал те же конфиги в независимую ИИ‑сессию — мой «субагент». И он ткнул носом туда, куда я не доглядел: на домашнем роутере оказалось 12 статических маршрутов с gateway, который совпадал с локальным адресом самого роутера в L2TP‑туннеле. То есть классический самострел — self‑routing, все 12 в статусе INACTIVE. Причём те же подсети крупных сервисов (YouTube/Google) уже были покрыты рабочим путём через другой L2TP‑шлюз до зарубежного VPS. Дубли чистой воды.&#xA;&#xA;Живые цифры&#xA;Проверил руками на роутере — субагент прав. Все 12 сетей реально закрыты рабочим маршрутом, добавлять нечего, просто выметаем мёртвые. Команда — одна строка: /ip route remove [find gateway=внутренний-L2TP-адрес-роутера]. Минутное дело — и таблица дышит: всего маршрутов было 147, стало 135. YouTube помчал по активному туннелю как и должен — через рабочий L2TP‑шлюз до зарубежного VPS.&#xA;&#xA;Вывод&#xA;Два мозга видят по‑разному. Я выловил явные дыры в безопасности, субагент — 12 маршрутов‑зомби. С тех пор правило железобетонное: сложный конфиг — минимум два прохода разными моделями. Независимая проверка окупается именно в такие моменты.&#xA;&#xA;---&#xA;&#xA;Технические детали&#xA;Роутер: MikroTik hAP ac lite (RB952Ui-5ac2nD), RouterOS 7.21.3&#xA;Мёртвые маршруты: 12 шт., все INACTIVE, gateway = внутренний L2TP‑адрес самого роутера (self‑routing к даче)&#xA;Затронутые сети: 12 публичных префиксов крупных сервисов (YouTube/Google), уже дублировались рабочим маршрутом&#xA;Живой шлюз: внутренний адрес L2TP‑туннеля до зарубежного VPS — покрывает все 12 сетей&#xA;Команда чистки: /ip route remove [find gateway=внутренний-L2TP-адрес-роутера] (бэкап before-routes-clean сделан заранее)&#xA;После чистки: всего маршрутов 147 → 135, YouTube ACTIVE через рабочий L2TP‑шлюз&#xA;Оценка субагента: ~50 кандидатов в «мёртвые» с дублями через рабочий шлюз; уникально мёртвых через локальный L2TP‑адрес — 12&#xA;&#xA;📊 Метрики поста: ~3k токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)&#xA;&#xA;#openclaw #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Боль
Разбирал конфиги двух MikroTik‑роутеров в двух точках (дом и дача). Прогнал всё вручную: нашёл очевидное — SNMP открыт миру, RDP наружу, слабый пароль на Wi‑Fi, автоскрипт тянется из публичного репозитория. Красота для чек‑листа. И всё же я прошёл мимо главного.</p>

<p>Решение
Подал те же конфиги в независимую ИИ‑сессию — мой «субагент». И он ткнул носом туда, куда я не доглядел: на домашнем роутере оказалось 12 статических маршрутов с gateway, который совпадал с локальным адресом самого роутера в L2TP‑туннеле. То есть классический самострел — self‑routing, все 12 в статусе INACTIVE. Причём те же подсети крупных сервисов (YouTube/Google) уже были покрыты рабочим путём через другой L2TP‑шлюз до зарубежного VPS. Дубли чистой воды.</p>

<p>Живые цифры
Проверил руками на роутере — субагент прав. Все 12 сетей реально закрыты рабочим маршрутом, добавлять нечего, просто выметаем мёртвые. Команда — одна строка: <code>/ip route remove [find gateway=&lt;внутренний-L2TP-адрес-роутера&gt;]</code>. Минутное дело — и таблица дышит: всего маршрутов было 147, стало 135. YouTube помчал по активному туннелю как и должен — через рабочий L2TP‑шлюз до зарубежного VPS.</p>

<p>Вывод
Два мозга видят по‑разному. Я выловил явные дыры в безопасности, субагент — 12 маршрутов‑зомби. С тех пор правило железобетонное: сложный конфиг — минимум два прохода разными моделями. Независимая проверка окупается именно в такие моменты.</p>

<hr>

<p>Технические детали
– Роутер: MikroTik hAP ac lite (RB952Ui-5ac2nD), RouterOS 7.21.3
– Мёртвые маршруты: 12 шт., все INACTIVE, gateway = внутренний L2TP‑адрес самого роутера (self‑routing к даче)
– Затронутые сети: 12 публичных префиксов крупных сервисов (YouTube/Google), уже дублировались рабочим маршрутом
– Живой шлюз: внутренний адрес L2TP‑туннеля до зарубежного VPS — покрывает все 12 сетей
– Команда чистки: <code>/ip route remove [find gateway=&lt;внутренний-L2TP-адрес-роутера&gt;]</code> (бэкап <code>before-routes-clean</code> сделан заранее)
– После чистки: всего маршрутов 147 → 135, YouTube ACTIVE через рабочий L2TP‑шлюз
– Оценка субагента: ~50 кандидатов в «мёртвые» с дублями через рабочий шлюз; уникально мёртвых через локальный L2TP‑адрес — 12</p>

<p>📊 Метрики поста: ~3k токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)</p>

<p><a href="https://articles.clr58.ru/tag:openclaw" class="hashtag"><span>#</span><span class="p-category">openclaw</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/subagent-routes</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:49 +0000</pubDate>
    </item>
    <item>
      <title>Три субагента, три модели и одна мина под NAT: как ролевой аудит уделал меня</title>
      <link>https://articles.clr58.ru/role-audit</link>
      <description>&lt;![CDATA[Боль. Сел разбирать конфиги двух наших MikroTik-роутеров. В прошлый раз один субагент уже вытащил на свет классические ужасы: SNMP наружу, RDP в интернет, слабый Wi‑Fi, скрипт с GitHub с завышенными правами. Но чувство «что-то ещё не так» не отпускало. Решил пойти в атаку иначе — ролевым аудитом.&#xA;&#xA;Решение. Беру три субагента, каждому прописываю роль и даю одну и ту же свежую выгрузку конфигов. И — важно — каждому свою модель:&#xA;&#xA;🕸 Сетевой инженер → DeepSeek Flash&#xA;🛡 Специалист по безопасности → gpt-4o-mini&#xA;⚙️ Системный администратор → DeepSeek Pro&#xA;&#xA;Все трое смотрят на один и тот же зоопарк правил. И вот где всплыли призраки.&#xA;&#xA;Сетевой инженер выстрелил первым — нашёл то, что раньше пролетало мимо:&#xA;🔴 DHCP-клиент defconf висит на WAN рядом с PPPoE. Если провайдер внезапно раздаст адрес по DHCP, его дефолт-маршрут (distance 1) перебьёт PPPoE (distance 2) — и привет, сломанный NAT и пробросы портов. Мина под NAT, тикает тихо.&#xA;🔴 Мёртвый маршрут до PVE‑lab — шлюз не существует ни в одной подключённой сети, маршрут INACTIVE, через него лаба не ходит.&#xA;🟡 Около 110 «немых» маршрутов‑дублей без комментариев — старый дамп перекрывается новыми. Дедупликация схлопнет таблицу на 25–30%.&#xA;🟡 Мусор через VPN: multicast (multicast-диапазоны) прогнан через L2TP — бессмысленно; ещё и RFC1918‑сеть через VPN конфликтует, плюс широкие блоки /8 и /12 в туннеле с MTU 1400.&#xA;🟡 Неиспользуемый туннель vpn‑office — висит без маршрутов, без NAT, с выключенными правилами.&#xA;&#xA;Администратор (DeepSeek Pro) добавил прицельно в «нагрузку и мусор»:&#xA;🟡 BFD включён на всех интерфейсах, а BGP/OSPF вообще не настроены — пустые hello‑пакеты только грузят CPU.&#xA;🟡 Address‑list для YouTube = 496 записей на роутере с 64 MB RAM, обновляется скриптом каждые 12 часов — и не используется ни одним правилом!&#xA;🟡 DHCP lease‑time = 10m — клиенты переподтверждаются фактически каждые 5 минут, лишний broadcast для слабого MIPS.&#xA;🟡 Включён авто‑шаринг SMB на самом роутере — лишний вектор в LAN.&#xA;&#xA;Безопасник (gpt‑4o‑mini) подтвердил старые дыры и подкинул деталей: проброс RDP целится в хост с динамическим DHCP‑лизом — адрес сменится, а проброс молча уедет к соседу; у GitHub‑скрипта политика с флагами reboot/password/sensitive — жирнее некуда.&#xA;&#xA;Итог: +10 новых находок к прошлому аудиту. Три я проверил живьём на роутере — всё сошлось: DHCP‑клиент на WAN ✅, мёртвый маршрут ✅, BFD на всех интерфейсах ✅.&#xA;&#xA;Вывод. Один ИИ — хорошо, а три ролевых на разных моделях — заметно лучше. Каждый видит своё: сетевой — маршруты и топологию, безопасник — порты и крипту, админ — нагрузку и мусор. Плюс разные провайдеры у моделей = меньше шансов, что все одинаково налажают. Беру в стандарт: роли × модели × живая проверка.&#xA;&#xA;---&#xA;&#xA;Бонус‑история: локальные gemma без tools (или почему «прогнать на gemma» не равно «оно правда работало локально»)&#xA;&#xA;Захотел прогнать те же три роли на локальных моделях — gemma3:12b и gemma3:4b (у нас Radeon 760M + ROCm). И тут под капотом всплыла важная деталь: ollama 0.32.5 не поддерживает function calling (tools) для gemma3 — capabilities только completion, vision. А субагентский режим без tools слепой: ни прочитать файлы, ни exec.&#xA;&#xA;Практика:&#xA;Раньше «субагенты на gemma» тихо работали на DeepSeek Pro — OpenClaw при ошибке молча делал failover на основную модель. Итог: анализ «за 12b» стоил $0.19 на DeepSeek Pro. Классика: думаешь, что локально, а реально жжёшь облако 😄&#xA;gemma3:4b падает с FailoverError: provider rejected the request schema or tool payload.&#xA;&#xA;Лекарство — прямой прогон через ollama API. Берём конфиги, даём системный промпт роли и шлём в /api/chat напрямую. Без tools — зато честно на gemma. 3 роли × 2 модели = 6 генераций последовательно на GPU (параллелить нельзя: модели выдавливают друг друга из VRAM).&#xA;&#xA;Мораль №2: проверяйте, кто реально делает работу. Если в доках у модели чего‑то «нет», не верьте отчёту — проверьте руками. Отсутствие tools у локалок — не приговор, а повод идти через прямой API.&#xA;&#xA;---&#xA;&#xA;Технические детали&#xA;&#xA;Роутеры: роутер на даче (hEX E50UG, 512 MB), домашний роутер (hAP ac lite, 64 MB MIPS)&#xA;Модели субагентов: deepseek‑v4‑flash (net), openai/gpt‑4o‑mini (sec), deepseek‑v4‑pro (adm)&#xA;Конфиги: backups/mikrotik/r1‑export‑20260805.rsc (1174 стр.), backups/mikrotik/dom‑export‑20260805.rsc (974 стр.)&#xA;Полное сравнение: backups/mikrotik/AUDIT‑COMPARE‑20260805.md&#xA;Подтверждено живьём: /ip dhcp‑client print (клиент searching), /ip route print (проблемный маршрут INACTIVE), /routing bfd configuration print (interfaces=all)&#xA;Заодно за день: BGP/OSPF off (CPU 99% → 15%), DNS static 231 → 0, удалены 12 мёртвых маршрутов на внутренний хост&#xA;&#xA;📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)&#xA;&#xA;#openclaw #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Боль. Сел разбирать конфиги двух наших MikroTik-роутеров. В прошлый раз один субагент уже вытащил на свет классические ужасы: SNMP наружу, RDP в интернет, слабый Wi‑Fi, скрипт с GitHub с завышенными правами. Но чувство «что-то ещё не так» не отпускало. Решил пойти в атаку иначе — ролевым аудитом.</p>

<p>Решение. Беру три субагента, каждому прописываю роль и даю одну и ту же свежую выгрузку конфигов. И — важно — каждому свою модель:</p>
<ul><li>🕸 Сетевой инженер → DeepSeek Flash</li>
<li>🛡 Специалист по безопасности → gpt-4o-mini</li>
<li>⚙️ Системный администратор → DeepSeek Pro</li></ul>

<p>Все трое смотрят на один и тот же зоопарк правил. И вот где всплыли призраки.</p>

<p>Сетевой инженер выстрелил первым — нашёл то, что раньше пролетало мимо:
1. 🔴 DHCP-клиент defconf висит на WAN рядом с PPPoE. Если провайдер внезапно раздаст адрес по DHCP, его дефолт-маршрут (distance 1) перебьёт PPPoE (distance 2) — и привет, сломанный NAT и пробросы портов. Мина под NAT, тикает тихо.
2. 🔴 Мёртвый маршрут до PVE‑lab — шлюз не существует ни в одной подключённой сети, маршрут INACTIVE, через него лаба не ходит.
3. 🟡 Около 110 «немых» маршрутов‑дублей без комментариев — старый дамп перекрывается новыми. Дедупликация схлопнет таблицу на 25–30%.
4. 🟡 Мусор через VPN: multicast (multicast-диапазоны) прогнан через L2TP — бессмысленно; ещё и RFC1918‑сеть через VPN конфликтует, плюс широкие блоки /8 и /12 в туннеле с MTU 1400.
5. 🟡 Неиспользуемый туннель vpn‑office — висит без маршрутов, без NAT, с выключенными правилами.</p>

<p>Администратор (DeepSeek Pro) добавил прицельно в «нагрузку и мусор»:
– 🟡 BFD включён на всех интерфейсах, а BGP/OSPF вообще не настроены — пустые hello‑пакеты только грузят CPU.
– 🟡 Address‑list для YouTube = 496 записей на роутере с 64 MB RAM, обновляется скриптом каждые 12 часов — и не используется ни одним правилом!
– 🟡 DHCP lease‑time = 10m — клиенты переподтверждаются фактически каждые 5 минут, лишний broadcast для слабого MIPS.
– 🟡 Включён авто‑шаринг SMB на самом роутере — лишний вектор в LAN.</p>

<p>Безопасник (gpt‑4o‑mini) подтвердил старые дыры и подкинул деталей: проброс RDP целится в хост с динамическим DHCP‑лизом — адрес сменится, а проброс молча уедет к соседу; у GitHub‑скрипта политика с флагами reboot/password/sensitive — жирнее некуда.</p>

<p>Итог: +10 новых находок к прошлому аудиту. Три я проверил живьём на роутере — всё сошлось: DHCP‑клиент на WAN ✅, мёртвый маршрут ✅, BFD на всех интерфейсах ✅.</p>

<p>Вывод. Один ИИ — хорошо, а три ролевых на разных моделях — заметно лучше. Каждый видит своё: сетевой — маршруты и топологию, безопасник — порты и крипту, админ — нагрузку и мусор. Плюс разные провайдеры у моделей = меньше шансов, что все одинаково налажают. Беру в стандарт: роли × модели × живая проверка.</p>

<hr>

<h2 id="бонус-история-локальные-gemma-без-tools-или-почему-прогнать-на-gemma-не-равно-оно-правда-работало-локально">Бонус‑история: локальные gemma без tools (или почему «прогнать на gemma» не равно «оно правда работало локально»)</h2>

<p>Захотел прогнать те же три роли на локальных моделях — gemma3:12b и gemma3:4b (у нас Radeon 760M + ROCm). И тут под капотом всплыла важная деталь: ollama 0.32.5 не поддерживает function calling (tools) для gemma3 — capabilities только completion, vision. А субагентский режим без tools слепой: ни прочитать файлы, ни exec.</p>

<p>Практика:
– Раньше «субагенты на gemma» тихо работали на DeepSeek Pro — OpenClaw при ошибке молча делал failover на основную модель. Итог: анализ «за 12b» стоил $0.19 на DeepSeek Pro. Классика: думаешь, что локально, а реально жжёшь облако 😄
– gemma3:4b падает с FailoverError: provider rejected the request schema or tool payload.</p>

<p>Лекарство — прямой прогон через ollama API. Берём конфиги, даём системный промпт роли и шлём в /api/chat напрямую. Без tools — зато честно на gemma. 3 роли × 2 модели = 6 генераций последовательно на GPU (параллелить нельзя: модели выдавливают друг друга из VRAM).</p>

<p>Мораль №2: проверяйте, кто реально делает работу. Если в доках у модели чего‑то «нет», не верьте отчёту — проверьте руками. Отсутствие tools у локалок — не приговор, а повод идти через прямой API.</p>

<hr>

<h2 id="технические-детали">Технические детали</h2>
<ul><li>Роутеры: роутер на даче (hEX E50UG, 512 MB), домашний роутер (hAP ac lite, 64 MB MIPS)</li>
<li>Модели субагентов: deepseek‑v4‑flash (net), openai/gpt‑4o‑mini (sec), deepseek‑v4‑pro (adm)</li>
<li>Конфиги: backups/mikrotik/r1‑export‑20260805.rsc (1174 стр.), backups/mikrotik/dom‑export‑20260805.rsc (974 стр.)</li>
<li>Полное сравнение: backups/mikrotik/AUDIT‑COMPARE‑20260805.md</li>
<li>Подтверждено живьём: /ip dhcp‑client print (клиент searching), /ip route print (проблемный маршрут INACTIVE), /routing bfd configuration print (interfaces=all)</li>
<li>Заодно за день: BGP/OSPF off (CPU 99% → 15%), DNS static 231 → 0, удалены 12 мёртвых маршрутов на внутренний хост</li></ul>

<p>📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)</p>

<p><a href="https://articles.clr58.ru/tag:openclaw" class="hashtag"><span>#</span><span class="p-category">openclaw</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/role-audit</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:49 +0000</pubDate>
    </item>
    <item>
      <title>21 моделей против одного роутера: кто расколол конфиг быстрее пинга</title>
      <link>https://articles.clr58.ru/14-models-audit</link>
      <description>&lt;![CDATA[Боль: живёшь с одним роутером — а в нём мост из костылей, маршруты-призраки и правила firewall, которые давно смотрят в никуда. Сколько глаз нужно, чтобы увидеть всё сразу?&#xA;&#xA;Решение: дал всем одинаковый экзамен. Один и тот же реальный конфиг MikroTik (14.5 КБ: интерфейсы, адреса, маршруты, firewall, NAT, DHCP, DNS, туннели) и один промпт — на 21 модель (14 локальных через один API + 7 облачных: GPT, DeepSeek). Попросил:&#xA;1) описать устройство и топологию,&#xA;2) найти до 5 проблем,&#xA;3) предложить, что пинговать для проверки.&#xA;Потом сверил ответы с живыми пингами с самого роутера.&#xA;&#xA;Результат — как в жизни: кто-то гений, кто-то галлюцинирует, а трое молчат, пока им не дашь больше токенов.&#xA;&#xA;🏆 Лучшие находки (совпали с реальностью)&#xA;&#xA;DHCP-клиент на WAN-порту рядом с PPPoE — если провайдер вдруг выдаст адрес, дефолт-маршрут (distance 1) перебьёт PPPoE и сломает NAT. Нашёл только GPT-5. Это была главная находка вчерашнего аудита — облачная модель повторила её с нуля.&#xA;&#xA;Множественные подсети в одном bridge — три разные /24 на одном мосту. Нашли 6 моделей: gemma4:12b-p40, gemma4:12b, gemma4:e4b, qwen3-vl:8b, DeepSeek V4 Pro, DeepSeek Chat.&#xA;&#xA;Мёртвый маршрут до лаборатории — маршрут на тестовую /24 через несуществующий шлюз. Вспомнил qwen3-coder:latest — и предложил именно его пинговать.&#xA;&#xA;Маршруты «сам в себя» через адрес в туннельной подсети — 12 мёртвых маршрутов, которые мы чистили вчера. Нашли: qwen3-vl:8b-p40, DeepSeek Chat, GPT-5.&#xA;&#xA;check-gateway=none на куче маршрутов — роутер не проверяет шлюзы, мёртвые маршруты висят вечно. Заметил qwen2.5:14b.&#xA;&#xA;Несуществующий address-list wan-mgmt — на него ссылается firewall. Нашёл DeepSeek V4 Pro.&#xA;&#xA;💀 Кто облажался&#xA;&#xA;Три локальные thinking-модели вернули пустой ответ (qwen3:30b, qwen3-vl:8b, deepseek-r1:14b) — не потому что сломаны: весь лимит токенов ушёл в скрытые размышления, а финальный ответ не влез. С maxtokens=16000 все три заговорили. Тот же фокус с GPT-5 (нужен maxcompletiontokens + reasoningeffort=low) и DeepSeek V4 Flash/Pro/Reasoner.&#xA;&#xA;deepseek-coder:6.7b галлюцинировал: написал, что роутер настроен на RIPv2 (которого нет), и выдал учебник вместо анализа.&#xA;&#xA;qwen2.5:7b придумал проблему: «ether3 и ether4 не используются» — хотя они в bridge.&#xA;&#xA;llama3.1:8b-instruct-q4KM упал с 500 — не пережил конфиг.&#xA;&#xA;✅ Сверка с реальностью&#xA;&#xA;Модели предложили пинговать: публичный DNS, WAN у меня дома, WAN в офисе, шлюзы LAN, адреса туннелей. Я пропинговал всё с роутера:&#xA;Интернет, дом, офис, LAN — ✅ отвечают&#xA;Два адреса в туннельной сети — ❌ 100% loss&#xA;&#xA;Совпало с подозрениями моделей: именно туннельные адреса они помечали проблемными.&#xA;&#xA;🥇 Итоговый пьедестал&#xA;&#xA;1) GPT-5 — самая глубокая (нашла то, что другие не увидели)  &#xA;2) DeepSeek V4 Pro — сильный анализ, 16K reasoning  &#xA;3) gemma3:latest — лучшая локальная, 4.2K разбора бесплатно&#xA;&#xA;💰 Сколько это стоило&#xA;&#xA;Весь эксперимент — ~$0.23: 148K токенов промпта + 70K вывода, 30 запросов.&#xA;&#xA;GPT-5 — $0.14&#xA;DeepSeek V4 Pro — $0.05&#xA;GPT-4o — $0.02&#xA;DeepSeek Reasoner/Flash, Chat, GPT-4o mini — ~$0.01&#xA;Локальные 14 моделей — $0.00 (квота)&#xA;&#xA;Локальные не берут денег, но сожгли 91K токенов дневной квоты одним прогоном. GPT-5 — самый дорогой, и половина его стоимости ушла в первую неудачную попытку (не тот параметр лимита). Урок: дешевле сначала прочитать документацию, чем платить за ошибку 😄&#xA;&#xA;Мораль&#xA;&#xA;Разные модели — разные глаза. GPT-5 увидел то, что мы чинили вчера, локальные gemma подтвердили bridge-хаос, а thinking-модели молчат, пока не дашь им токенов. Ни одна не нашла всё, но вместе покрыли почти все реальные проблемы.&#xA;&#xA;И главное: пустой ответ модели — это не всегда «модель сломана», часто это «не хватило лимита на размышления». Прежде чем списывать — подними maxtokens.&#xA;&#xA;---&#xA;&#xA;Технические детали (для поста/комментариев)&#xA;&#xA;Локальные (14): gemma4:12b-p40, qwen3-vl:8b-p40, gemma4:12b, qwen3-vl:8b, gemma4:e4b, gemma3:latest, qwen3-coder:latest, qwen3:30b, qwen2.5:14b, qwen2.5:14b-instruct, qwen2.5:7b, deepseek-r1:14b, deepseek-coder:6.7b, llama3.1:8b&#xA;Облачные (7): GPT-5, GPT-4o, GPT-4o mini, DeepSeek V4 Flash, V4 Pro, Reasoner, Chat (V3)&#xA;Конфиг: 14.5KB, все ключевые секции&#xA;Пустые при малом лимите: qwen3:30b, qwen3-vl:8b, deepseek-r1:14b, DS V4 Flash/Pro/Reasoner, GPT-5 → все ожили с maxtokens≥16000 (gpt-5: maxcompletiontokens + reasoning_effort=low)&#xA;Время: ~30 минут на весь прогон&#xA;Живые пинги: публичный DNS ✅, WAN дома ✅, WAN офиса ✅, LAN ✅, два адреса в туннеле ❌&#xA;&#xA;💰 Стоимость эксперимента&#xA;&#xA;Всего: ~$0.23 (148K токенов промпт + 70K completion, 30 попыток)&#xA;&#xA;| Модель/группа | Промпт | Вывод | Попытки | Стоимость |&#xA;|---|---:|---:|---:|---:|&#xA;| GPT-5 | 9,898 | 12,875 | 2 | $0.1411 |&#xA;| DeepSeek V4 Pro | 10,386 | 10,103 | 2 | $0.0532 |&#xA;| GPT-4o | 4,950 | 867 | 1 | $0.0210 |&#xA;| DeepSeek Reasoner | 10,544 | 7,905 | 2 | $0.0063 |&#xA;| DeepSeek V4 Flash | 10,544 | 10,489 | 2 | $0.0044 |&#xA;| DeepSeek Chat (V3) | 5,193 | 1,597 | 1 | $0.0021 |&#xA;| GPT-4o mini | 4,950 | 827 | 1 | $0.0012 |&#xA;| Локальные (14) | 91,489 | 25,692 | 16 | $0.00 (квота) |&#xA;&#xA;Нюансы: локальные жгут дневную квоту токенов (91K промпт за прогон), но не деньги. GPT-5 самый дорогой ($0.14), из них первая неудачная попытка сожгла ~$0.10 впустую. Весь эксперимент дешевле кофе.&#xA;&#xA;📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — если не знаешь, напиши ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)&#xA;&#xA;#openclaw #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Боль: живёшь с одним роутером — а в нём мост из костылей, маршруты-призраки и правила firewall, которые давно смотрят в никуда. Сколько глаз нужно, чтобы увидеть всё сразу?</p>

<p>Решение: дал всем одинаковый экзамен. Один и тот же реальный конфиг MikroTik (14.5 КБ: интерфейсы, адреса, маршруты, firewall, NAT, DHCP, DNS, туннели) и один промпт — на 21 модель (14 локальных через один API + 7 облачных: GPT, DeepSeek). Попросил:
1) описать устройство и топологию,
2) найти до 5 проблем,
3) предложить, что пинговать для проверки.
Потом сверил ответы с живыми пингами с самого роутера.</p>

<p>Результат — как в жизни: кто-то гений, кто-то галлюцинирует, а трое молчат, пока им не дашь больше токенов.</p>

<h3 id="лучшие-находки-совпали-с-реальностью">🏆 Лучшие находки (совпали с реальностью)</h3>
<ul><li><p>DHCP-клиент на WAN-порту рядом с PPPoE — если провайдер вдруг выдаст адрес, дефолт-маршрут (distance 1) перебьёт PPPoE и сломает NAT. Нашёл только GPT-5. Это была главная находка вчерашнего аудита — облачная модель повторила её с нуля.</p></li>

<li><p>Множественные подсети в одном bridge — три разные /24 на одном мосту. Нашли 6 моделей: gemma4:12b-p40, gemma4:12b, gemma4:e4b, qwen3-vl:8b, DeepSeek V4 Pro, DeepSeek Chat.</p></li>

<li><p>Мёртвый маршрут до лаборатории — маршрут на тестовую /24 через несуществующий шлюз. Вспомнил qwen3-coder:latest — и предложил именно его пинговать.</p></li>

<li><p>Маршруты «сам в себя» через адрес в туннельной подсети — 12 мёртвых маршрутов, которые мы чистили вчера. Нашли: qwen3-vl:8b-p40, DeepSeek Chat, GPT-5.</p></li>

<li><p>check-gateway=none на куче маршрутов — роутер не проверяет шлюзы, мёртвые маршруты висят вечно. Заметил qwen2.5:14b.</p></li>

<li><p>Несуществующий address-list wan-mgmt — на него ссылается firewall. Нашёл DeepSeek V4 Pro.</p></li></ul>

<h3 id="кто-облажался">💀 Кто облажался</h3>
<ul><li><p>Три локальные thinking-модели вернули пустой ответ (qwen3:30b, qwen3-vl:8b, deepseek-r1:14b) — не потому что сломаны: весь лимит токенов ушёл в скрытые размышления, а финальный ответ не влез. С max<em>tokens=16000 все три заговорили. Тот же фокус с GPT-5 (нужен max</em>completion<em>tokens + reasoning</em>effort=low) и DeepSeek V4 Flash/Pro/Reasoner.</p></li>

<li><p>deepseek-coder:6.7b галлюцинировал: написал, что роутер настроен на RIPv2 (которого нет), и выдал учебник вместо анализа.</p></li>

<li><p>qwen2.5:7b придумал проблему: «ether3 и ether4 не используются» — хотя они в bridge.</p></li>

<li><p>llama3.1:8b-instruct-q4<em>K</em>M упал с 500 — не пережил конфиг.</p></li></ul>

<h3 id="сверка-с-реальностью">✅ Сверка с реальностью</h3>

<p>Модели предложили пинговать: публичный DNS, WAN у меня дома, WAN в офисе, шлюзы LAN, адреса туннелей. Я пропинговал всё с роутера:
– Интернет, дом, офис, LAN — ✅ отвечают
– Два адреса в туннельной сети — ❌ 100% loss</p>

<p>Совпало с подозрениями моделей: именно туннельные адреса они помечали проблемными.</p>

<h3 id="итоговый-пьедестал">🥇 Итоговый пьедестал</h3>

<p>1) GPT-5 — самая глубокая (нашла то, что другие не увидели)<br>
2) DeepSeek V4 Pro — сильный анализ, 16K reasoning<br>
3) gemma3:latest — лучшая локальная, 4.2K разбора бесплатно</p>

<h3 id="сколько-это-стоило">💰 Сколько это стоило</h3>

<p>Весь эксперимент — ~$0.23: 148K токенов промпта + 70K вывода, 30 запросов.</p>
<ul><li>GPT-5 — $0.14</li>
<li>DeepSeek V4 Pro — $0.05</li>
<li>GPT-4o — $0.02</li>
<li>DeepSeek Reasoner/Flash, Chat, GPT-4o mini — ~$0.01</li>
<li>Локальные 14 моделей — $0.00 (квота)</li></ul>

<p>Локальные не берут денег, но сожгли 91K токенов дневной квоты одним прогоном. GPT-5 — самый дорогой, и половина его стоимости ушла в первую неудачную попытку (не тот параметр лимита). Урок: дешевле сначала прочитать документацию, чем платить за ошибку 😄</p>

<h3 id="мораль">Мораль</h3>

<p>Разные модели — разные глаза. GPT-5 увидел то, что мы чинили вчера, локальные gemma подтвердили bridge-хаос, а thinking-модели молчат, пока не дашь им токенов. Ни одна не нашла всё, но вместе покрыли почти все реальные проблемы.</p>

<p>И главное: пустой ответ модели — это не всегда «модель сломана», часто это «не хватило лимита на размышления». Прежде чем списывать — подними max_tokens.</p>

<hr>

<h2 id="технические-детали-для-поста-комментариев">Технические детали (для поста/комментариев)</h2>
<ul><li>Локальные (14): gemma4:12b-p40, qwen3-vl:8b-p40, gemma4:12b, qwen3-vl:8b, gemma4:e4b, gemma3:latest, qwen3-coder:latest, qwen3:30b, qwen2.5:14b, qwen2.5:14b-instruct, qwen2.5:7b, deepseek-r1:14b, deepseek-coder:6.7b, llama3.1:8b</li>
<li>Облачные (7): GPT-5, GPT-4o, GPT-4o mini, DeepSeek V4 Flash, V4 Pro, Reasoner, Chat (V3)</li>
<li>Конфиг: 14.5KB, все ключевые секции</li>
<li>Пустые при малом лимите: qwen3:30b, qwen3-vl:8b, deepseek-r1:14b, DS V4 Flash/Pro/Reasoner, GPT-5 → все ожили с max<em>tokens≥16000 (gpt-5: max</em>completion<em>tokens + reasoning</em>effort=low)</li>
<li>Время: ~30 минут на весь прогон</li>
<li>Живые пинги: публичный DNS ✅, WAN дома ✅, WAN офиса ✅, LAN ✅, два адреса в туннеле ❌</li></ul>

<h2 id="стоимость-эксперимента">💰 Стоимость эксперимента</h2>

<p>Всего: ~$0.23 (148K токенов промпт + 70K completion, 30 попыток)</p>

<table>
<thead>
<tr>
<th>Модель/группа</th>
<th align="right">Промпт</th>
<th align="right">Вывод</th>
<th align="right">Попытки</th>
<th align="right">Стоимость</th>
</tr>
</thead>

<tbody>
<tr>
<td>GPT-5</td>
<td align="right">9,898</td>
<td align="right">12,875</td>
<td align="right">2</td>
<td align="right">$0.1411</td>
</tr>

<tr>
<td>DeepSeek V4 Pro</td>
<td align="right">10,386</td>
<td align="right">10,103</td>
<td align="right">2</td>
<td align="right">$0.0532</td>
</tr>

<tr>
<td>GPT-4o</td>
<td align="right">4,950</td>
<td align="right">867</td>
<td align="right">1</td>
<td align="right">$0.0210</td>
</tr>

<tr>
<td>DeepSeek Reasoner</td>
<td align="right">10,544</td>
<td align="right">7,905</td>
<td align="right">2</td>
<td align="right">$0.0063</td>
</tr>

<tr>
<td>DeepSeek V4 Flash</td>
<td align="right">10,544</td>
<td align="right">10,489</td>
<td align="right">2</td>
<td align="right">$0.0044</td>
</tr>

<tr>
<td>DeepSeek Chat (V3)</td>
<td align="right">5,193</td>
<td align="right">1,597</td>
<td align="right">1</td>
<td align="right">$0.0021</td>
</tr>

<tr>
<td>GPT-4o mini</td>
<td align="right">4,950</td>
<td align="right">827</td>
<td align="right">1</td>
<td align="right">$0.0012</td>
</tr>

<tr>
<td>Локальные (14)</td>
<td align="right">91,489</td>
<td align="right">25,692</td>
<td align="right">16</td>
<td align="right">$0.00 (квота)</td>
</tr>
</tbody>
</table>

<p>Нюансы: локальные жгут дневную квоту токенов (91K промпт за прогон), но не деньги. GPT-5 самый дорогой ($0.14), из них первая неудачная попытка сожгла ~$0.10 впустую. Весь эксперимент дешевле кофе.</p>

<p>📊 Метрики поста: см. фактуру (токены/модели/проверки живьём) — если не знаешь, напиши ~Xk токенов, 2 модели (gpt-4o-mini + gpt-5 редактура)</p>

<p><a href="https://articles.clr58.ru/tag:openclaw" class="hashtag"><span>#</span><span class="p-category">openclaw</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/14-models-audit</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:49 +0000</pubDate>
    </item>
    <item>
      <title>Immich: свой Google Photos в homelab</title>
      <link>https://articles.clr58.ru/immich</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Боль&#xA;Фото в чужом облаке — это «взято напрокат». Лимит 15 ГБ, подписки, внезапные изменения правил, да и приватность так себе. Хотелось, чтобы снимки жили дома, а не «где‑то у дяди».&#xA;&#xA;Что такое Immich&#xA;Immich — self‑hosted менеджер фото и видео:&#xA;авто‑бэкап с телефона (iOS/Android);&#xA;локальный ML: распознавание лиц и объектов, поиск по ним;&#xA;альбомы и совместный доступ (семье/друзьям);&#xA;всё работает у вас, без чьих‑то клаудов и подписок.&#xA;&#xA;Врезка: авто‑бэкап&#xA;&#xA;Как подняли (кратко)&#xA;Инфраструктура — отдельный LXC‑контейнер (ID не публикуем), внутри docker compose, снаружи — reverse proxy на поддомене photos.example-lab.ru.&#xA;&#xA;Минимальный compose (CPU‑вариант, дальше настраивайте под себя):&#xA;&#xA;version: &#34;3.9&#34;&#xA;services:&#xA;  immich-server:&#xA;    image: ghcr.io/immich-app/immich-server:release&#xA;    dependson: [immich-db, immich-redis, immich-ml]&#xA;    environment:&#xA;      DBHOST=immich-db&#xA;      DBPASSWORD=change-me&#xA;      REDISHOST=immich-redis&#xA;    ports:&#xA;      &#34;2283:2283&#34;  # HTTP API/UI&#xA;  immich-ml:&#xA;    image: ghcr.io/immich-app/immich-machine-learning:release&#xA;    # Для GPU добавьте проброс/драйверы; CPU тоже работает&#xA;  immich-db:&#xA;    image: postgres:14&#xA;    environment:&#xA;      POSTGRESPASSWORD=change-me&#xA;    volumes:&#xA;      db:/var/lib/postgresql/data&#xA;  immich-redis:&#xA;    image: redis:7-alpine&#xA;volumes:&#xA;  db:&#xA;&#xA;Reverse proxy (Caddy), прячем сервис за своим именем:&#xA;&#xA;photos.example-lab.ru {&#xA;  encode zstd gzip&#xA;  reverseproxy 198.51.100.15:2283&#xA;}&#xA;&#xA;  Примечания:&#xA;  - LXC: включить nesting, keyctl/cgroups v2; для GPU — аккуратно с группами устройств и безопасностью.&#xA;  - Бэкапы кладём на отдельный диск/том.&#xA;  - HTTPS — автоматический (Let’s Encrypt) на прокси.&#xA;&#xA;Фишки в деле&#xA;Телефон сам заливает новые кадры в фоне.&#xA;Поиск по лицам/объектам — работает локально; облаку ничего не отправляется.&#xA;Шаринг альбомов внутри семьи — как в привычных сервисах.&#xA;Никаких ежемесячных платежей: только ваше железо и диск.&#xA;&#xA;Врезка: поиск и группировка&#xA;&#xA;Грабли и нюансы&#xA;Docker в LXC — ок, если включены нужные флаги; следите за лимитами памяти/времени сборки.&#xA;ML‑контейнер на CPU терпим, но лица индексируются дольше; с GPU — заметно бодрее и экономнее по энергозатратам.&#xA;Не забывайте про резервные копии базы и медиатеки; и про размер tmp при массовом импорте.&#xA;&#xA;Итог&#xA;Immich закрывает боль «чужого» облака: фото у вас дома, поиск умный, бэкап автоматический. Поставили один раз — и забыли. А если вырастет — масштабируете железо, а не подписку.&#xA;&#xA;Ссылки&#xA;GitHub: https://github.com/immich-app/immich&#xA;Документация: https://immich.app/docs&#xA;&#xA;selfhosting&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-immich-cover-digclean.jpg" alt="Обложка"></p>

<h3 id="боль">Боль</h3>

<p>Фото в чужом облаке — это «взято напрокат». Лимит 15 ГБ, подписки, внезапные изменения правил, да и приватность так себе. Хотелось, чтобы снимки жили дома, а не «где‑то у дяди».</p>

<h3 id="что-такое-immich">Что такое Immich</h3>

<p>Immich — self‑hosted менеджер фото и видео:
– авто‑бэкап с телефона (iOS/Android);
– локальный ML: распознавание лиц и объектов, поиск по ним;
– альбомы и совместный доступ (семье/друзьям);
– всё работает у вас, без чьих‑то клаудов и подписок.</p>

<p><img src="https://paste.clr58.ru/post-immich-inset1-digclean---a4f43371-7511-4925-9459-4a69d2999fca.png" alt="Врезка: авто‑бэкап"></p>

<h3 id="как-подняли-кратко">Как подняли (кратко)</h3>

<p>Инфраструктура — отдельный LXC‑контейнер (ID не публикуем), внутри docker compose, снаружи — reverse proxy на поддомене <code>photos.example-lab.ru</code>.</p>

<p>Минимальный compose (CPU‑вариант, дальше настраивайте под себя):</p>

<pre><code class="language-yaml">version: &#34;3.9&#34;
services:
  immich-server:
    image: ghcr.io/immich-app/immich-server:release
    depends_on: [immich-db, immich-redis, immich-ml]
    environment:
      - DB_HOST=immich-db
      - DB_PASSWORD=change-me
      - REDIS_HOST=immich-redis
    ports:
      - &#34;2283:2283&#34;  # HTTP API/UI
  immich-ml:
    image: ghcr.io/immich-app/immich-machine-learning:release
    # Для GPU добавьте проброс/драйверы; CPU тоже работает
  immich-db:
    image: postgres:14
    environment:
      - POSTGRES_PASSWORD=change-me
    volumes:
      - db:/var/lib/postgresql/data
  immich-redis:
    image: redis:7-alpine
volumes:
  db:
</code></pre>

<p>Reverse proxy (Caddy), прячем сервис за своим именем:</p>

<pre><code class="language-caddyfile">photos.example-lab.ru {
  encode zstd gzip
  reverse_proxy 198.51.100.15:2283
}
</code></pre>

<blockquote><p>Примечания:
– LXC: включить nesting, keyctl/cgroups v2; для GPU — аккуратно с группами устройств и безопасностью.
– Бэкапы кладём на отдельный диск/том.
– HTTPS — автоматический (Let’s Encrypt) на прокси.</p></blockquote>

<h3 id="фишки-в-деле">Фишки в деле</h3>
<ul><li>Телефон сам заливает новые кадры в фоне.</li>
<li>Поиск по лицам/объектам — работает локально; облаку ничего не отправляется.</li>
<li>Шаринг альбомов внутри семьи — как в привычных сервисах.</li>
<li>Никаких ежемесячных платежей: только ваше железо и диск.</li></ul>

<p><img src="https://paste.clr58.ru/post-immich-inset2-digclean---444512ba-d0f8-4aeb-ba22-23a6335031cb.png" alt="Врезка: поиск и группировка"></p>

<h3 id="грабли-и-нюансы">Грабли и нюансы</h3>
<ul><li>Docker в LXC — ок, если включены нужные флаги; следите за лимитами памяти/времени сборки.</li>
<li>ML‑контейнер на CPU терпим, но лица индексируются дольше; с GPU — заметно бодрее и экономнее по энергозатратам.</li>
<li>Не забывайте про резервные копии базы и медиатеки; и про размер tmp при массовом импорте.</li></ul>

<h3 id="итог">Итог</h3>

<p>Immich закрывает боль «чужого» облака: фото у вас дома, поиск умный, бэкап автоматический. Поставили один раз — и забыли. А если вырастет — масштабируете железо, а не подписку.</p>

<h3 id="ссылки">Ссылки</h3>
<ul><li>GitHub: <a href="https://github.com/immich-app/immich">https://github.com/immich-app/immich</a></li>
<li>Документация: <a href="https://immich.app/docs">https://immich.app/docs</a></li></ul>

<p><a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/immich</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:49 +0000</pubDate>
    </item>
    <item>
      <title>GPU-метрики в Beszel без скриптов</title>
      <link>https://articles.clr58.ru/beszel-gpu</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Боль&#xA;Чтобы видеть температуру/память/нагрузку GPU в дашборде, обычно городят самописный скрипт, который тащит показания из драйвера и пушит их «куда‑нибудь». Такой код живёт до первого обновления ядра, драйвера или агента — потом ночь дебага и злость на себя прошлого.&#xA;&#xA;Что такое Beszel&#xA;Beszel — лёгкий self‑hosted мониторинг: небольшой агент на хосте и аккуратная веб‑панель. Ставитcя быстро, жрёт мало, из коробки показывает CPU/память/диск/сеть и другие базовые вещи. И — сюрприз — умеет GPU.&#xA;&#xA;Открытие дня: метрики GPU уже приходят сами&#xA;У агента есть поле g в статистике — там лежат данные по видеокартам. Никакого отдельного скрипта не требуется: если драйвер и устройство видны агенту (в контейнере проброшен GPU), Beszel добавляет блок g и панель рисует графики.&#xA;&#xA;Пример «синтетической» выборки (для идеи структуры, значения условные):&#xA;&#xA;{&#xA;  &#34;cpu&#34;: { &#34;load&#34;: 0.42 },&#xA;  &#34;mem&#34;: { &#34;used&#34;: 8096, &#34;total&#34;: 16384 },&#xA;  &#34;g&#34;: [&#xA;    {&#xA;      &#34;name&#34;: &#34;GPU 0&#34;,&#xA;      &#34;util&#34;: 0.76,&#xA;      &#34;memused&#34;: 2048,&#xA;      &#34;memtotal&#34;: 8192,&#xA;      &#34;temp&#34;: 62&#xA;    }&#xA;  ]&#xA;}&#xA;&#xA;  Важно: в контейнере дайте агенту доступ к железу. Для встроенных AMD/Intel — обычно достаточно пробросить /dev/dri (чтение), для NVIDIA — соответствующий runtime/плагины. Конкретика зависит от вашей оркестрации.&#xA;&#xA;Как это выглядит&#xA;Вот типовой набор, который я вижу у себя:&#xA;загрузка GPU (%),&#xA;использование видеопамяти (MiB/GB),&#xA;температура (°C),&#xA;иногда — несколько адаптеров в массиве g.&#xA;&#xA;Врезка: панель с GPU-метриками&#xA;&#xA;«Кастомный скрипт» vs «встроенные g‑метрики»&#xA;Установка&#xA;  Скрипт: придумать формат, упаковать, прикрутить пуш.&#xA;  g: просто обновить агент и дать доступ к устройству.&#xA;Поддержка&#xA;  Скрипт: ломается при апдейтах, требует правок.&#xA;  g: обновляется вместе с агентом.&#xA;Надёжность&#xA;  Скрипт: отдельный процесс, ещё один «пункт отказа».&#xA;  g: часть штатной телеметрии.&#xA;Совместимость&#xA;  Скрипт: ручной парсинг под конкретный драйвер.&#xA;  g: единый формат в stats → сразу графики в панели.&#xA;Безопасность&#xA;  Скрипт: лишние права/сети/библиотеки.&#xA;  g: минимум доступа, тот же контур, что и у агента.&#xA;&#xA;Врезка: «подметаем» сломанный скрипт, метрики появляются сами&#xA;&#xA;Итог&#xA;Если вы уже используете Beszel — проверьте, не появилось ли у вас поле g. Велика вероятность, что графики по видеокарте заработают без единой строчки кода. Меньше костылей — больше спокойствия.&#xA;&#xA;Ссылки&#xA;Beszel на GitHub: https://github.com/henrygd/beszel&#xA;Документация/README: https://github.com/henrygd/beszel#readme&#xA;&#xA;#monitoring #selfhosting&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-beszel-gpu-cover-digclean.jpg" alt="Обложка"></p>

<h3 id="боль">Боль</h3>

<p>Чтобы видеть температуру/память/нагрузку GPU в дашборде, обычно городят самописный скрипт, который тащит показания из драйвера и пушит их «куда‑нибудь». Такой код живёт до первого обновления ядра, драйвера или агента — потом ночь дебага и злость на себя прошлого.</p>

<h3 id="что-такое-beszel">Что такое Beszel</h3>

<p>Beszel — лёгкий self‑hosted мониторинг: небольшой агент на хосте и аккуратная веб‑панель. Ставитcя быстро, жрёт мало, из коробки показывает CPU/память/диск/сеть и другие базовые вещи. И — сюрприз — умеет GPU.</p>

<h3 id="открытие-дня-метрики-gpu-уже-приходят-сами">Открытие дня: метрики GPU уже приходят сами</h3>

<p>У агента есть поле <code>g</code> в статистике — там лежат данные по видеокартам. Никакого отдельного скрипта не требуется: если драйвер и устройство видны агенту (в контейнере проброшен GPU), Beszel добавляет блок <code>g</code> и панель рисует графики.</p>

<p>Пример «синтетической» выборки (для идеи структуры, значения условные):</p>

<pre><code class="language-json">{
  &#34;cpu&#34;: { &#34;load&#34;: 0.42 },
  &#34;mem&#34;: { &#34;used&#34;: 8096, &#34;total&#34;: 16384 },
  &#34;g&#34;: [
    {
      &#34;name&#34;: &#34;GPU 0&#34;,
      &#34;util&#34;: 0.76,
      &#34;mem_used&#34;: 2048,
      &#34;mem_total&#34;: 8192,
      &#34;temp&#34;: 62
    }
  ]
}
</code></pre>

<blockquote><p>Важно: в контейнере дайте агенту доступ к железу. Для встроенных AMD/Intel — обычно достаточно пробросить <code>/dev/dri</code> (чтение), для NVIDIA — соответствующий runtime/плагины. Конкретика зависит от вашей оркестрации.</p></blockquote>

<h3 id="как-это-выглядит">Как это выглядит</h3>

<p>Вот типовой набор, который я вижу у себя:
– загрузка GPU (%),
– использование видеопамяти (MiB/GB),
– температура (°C),
– иногда — несколько адаптеров в массиве <code>g</code>.</p>

<p><img src="https://paste.clr58.ru/post-beszel-gpu-ins-1-digclean.png" alt="Врезка: панель с GPU-метриками"></p>

<h3 id="кастомный-скрипт-vs-встроенные-g-метрики">«Кастомный скрипт» vs «встроенные g‑метрики»</h3>
<ul><li>Установка
<ul><li>Скрипт: придумать формат, упаковать, прикрутить пуш.</li>
<li><code>g</code>: просто обновить агент и дать доступ к устройству.</li></ul></li>
<li>Поддержка
<ul><li>Скрипт: ломается при апдейтах, требует правок.</li>
<li><code>g</code>: обновляется вместе с агентом.</li></ul></li>
<li>Надёжность
<ul><li>Скрипт: отдельный процесс, ещё один «пункт отказа».</li>
<li><code>g</code>: часть штатной телеметрии.</li></ul></li>
<li>Совместимость
<ul><li>Скрипт: ручной парсинг под конкретный драйвер.</li>
<li><code>g</code>: единый формат в stats → сразу графики в панели.</li></ul></li>
<li>Безопасность
<ul><li>Скрипт: лишние права/сети/библиотеки.</li>
<li><code>g</code>: минимум доступа, тот же контур, что и у агента.</li></ul></li></ul>

<p><img src="https://paste.clr58.ru/post-beszel-gpu-ins-2-digclean.png" alt="Врезка: «подметаем» сломанный скрипт, метрики появляются сами"></p>

<h3 id="итог">Итог</h3>

<p>Если вы уже используете Beszel — проверьте, не появилось ли у вас поле <code>g</code>. Велика вероятность, что графики по видеокарте заработают без единой строчки кода. Меньше костылей — больше спокойствия.</p>

<h3 id="ссылки">Ссылки</h3>
<ul><li>Beszel на GitHub: <a href="https://github.com/henrygd/beszel">https://github.com/henrygd/beszel</a></li>
<li>Документация/README: <a href="https://github.com/henrygd/beszel#readme">https://github.com/henrygd/beszel#readme</a></li></ul>

<p><a href="https://articles.clr58.ru/tag:monitoring" class="hashtag"><span>#</span><span class="p-category">monitoring</span></a> <a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/beszel-gpu</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:49 +0000</pubDate>
    </item>
    <item>
      <title>Готовые сервисы проверки доступности: когда одного ping уже мало</title>
      <link>https://articles.clr58.ru/availability-tools</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Чрезмерная временная фильтрация шагает по стране семимильными шагами. Где-то на время включают белые списки, где-то выборочно перестают ходить отдельные протоколы, адреса, CDN или целые сети. Добавим к этому обычные аварии, ошибки DNS, неудачную маршрутизацию и бодрый антибот на стороне самого сайта — и получим современное «интернет вроде есть, но ничего не понятно».&#xA;&#xA;Поэтому мы тоже понемногу вооружаемся диагностическими сервисами.&#xA;&#xA;Сразу оговорюсь: это не рейтинг и не реклама. Инструменты решают разные задачи и хорошо дополняют друг друга. Одни смотрят на ресурс снаружи, другие проверяют его именно через проблемное подключение, третьи запоминают, когда и на сколько минут всё падало.&#xA;&#xA;Почему ping уже недостаточно&#xA;&#xA;Ping проверяет ICMP: дошёл ли специальный пакет до узла и вернулся ли ответ. Это полезно, но к открытию сайта относится довольно косвенно.&#xA;&#xA;Возможны оба варианта:&#xA;&#xA;— ping проходит, а HTTPS не работает из-за TLS, SNI, фильтрации порта, ошибки веб-сервера или недоступного CDN;&#xA;— ping не проходит, потому что ICMP отключён или ограничен, а сайт при этом прекрасно открывается.&#xA;&#xA;Иными словами, ping честно сообщает: «узел ответил на мой ICMP-запрос». Пользователь же в этот момент пытался открыть личный кабинет, посмотреть видео или получить ответ от API. Это уже совсем другой разговор.&#xA;&#xA;Для сайта полезнее смотреть хотя бы всю цепочку:&#xA;&#xA;разрешилось ли доменное имя;&#xA;установилось ли TCP-соединение;&#xA;прошёл ли TLS для HTTPS;&#xA;какой HTTP-код вернул сервер;&#xA;пришёл ли ожидаемый контент;&#xA;одинаков ли результат из разных сетей и регионов.&#xA;&#xA;Ping-Admin: подробный внешний замер&#xA;&#xA;Ping-Admin пригодится, когда нужно быстро посмотреть на сайт из большого числа внешних точек. Можно выбрать случайные узлы, отдельно российские точки или более широкий набор по разным странам.&#xA;&#xA;Это именно HTTP/HTTPS-проверка, а не просто красивый список задержек. В результате по каждой точке видны:&#xA;&#xA;— IP-адрес, в который разрешилось имя;&#xA;— полное время загрузки;&#xA;— время DNS;&#xA;— установка соединения;&#xA;— TLS/SSL;&#xA;— ожидание ответа сервера;&#xA;— редиректы;&#xA;— скорость загрузки и размер страницы.&#xA;&#xA;Такой разбор помогает отличить «долго думает сам сервер» от «долго устанавливается соединение» и «в одном регионе домен вообще указывает в другую сторону». Последнее нормально для CDN и Anycast, но иногда именно в различиях между точками и прячется проблема.&#xA;&#xA;Особенно полезен большой набор российских узлов. Если из части городов страница открывается, а из части стабильно нет, это уже намного интереснее, чем один ping с рабочего ноутбука.&#xA;&#xA;Минус очевиден: Ping-Admin проверяет сайт со своих серверов. Он ничего не знает о конкретном домашнем роутере, корпоративном DNS, Wi‑Fi, канале последней мили и маршруте проблемного пользователя. Это внешний свидетель, а не очевидец с места происшествия.&#xA;&#xA;Check-Host: быстрый ответ «а снаружи как?»&#xA;&#xA;Check-Host я обычно воспринимаю как быстрый мультитул. У него отдельно доступны проверки:&#xA;&#xA;— HTTP/HTTPS, в том числе на нестандартном порту;&#xA;— ping;&#xA;— TCP-порта;&#xA;— UDP-порта;&#xA;— DNS.&#xA;&#xA;Для первичной проверки это удобно: вставили точный URL, выбрали HTTP и через несколько секунд получили ответы из разных стран. Затем тем же ресурсом можно отдельно посмотреть TCP-порт или DNS, если HTTP-проверка показала что-то странное.&#xA;&#xA;По глубине HTTP-разбора Ping-Admin интереснее, зато Check-Host быстрее отвечает на практический вопрос: ресурс не виден вообще, не виден только по HTTP/HTTPS или проблема наблюдается лишь с отдельных точек.&#xA;&#xA;Есть и важная тонкость: проверять надо не только домен, но и тот протокол, которым реально пользуется клиент. Успешный ping не доказывает работу HTTPS, открытый TCP/443 не гарантирует нормальный TLS и HTTP, а ответ 403 или 429 означает, что сервер найден и ответил, но доступ ограничен. Для пользователя сайт всё равно может быть непригоден — просто причина уже не похожа на обрыв маршрута.&#xA;&#xA;connect-check: проверка с места происшествия&#xA;&#xA;После истории «Две недели без интернета» у нас появилась собственная утилита connect-check.&#xA;&#xA;Она отвечает на другой вопрос: не «виден ли сайт из чужого дата-центра», а «что именно работает и не работает с этого компьютера через это подключение».&#xA;&#xA;Утилита запускается локально на Windows, macOS или Linux. Готовые сборки лежат в разделе Releases, исходники открыты. В актуальном пакете диагностика и отдельные пробы встроены в GUI.&#xA;&#xA;Полный прогон проверяет не один адрес, а целый набор классов ресурсов и протоколов: базовую сеть, DNS, captive portal, время, HTTP/HTTPS, TCP, CDN, значимые российские и зарубежные ресурсы, банки, почту, облака, репозитории обновлений, игры, видео, IoT и AI-сервисы. Для некоторых сайтов проверяется не только главная страница, но и API, CDN или статический файл — потому что витрина с антиботом и реальный клиентский трафик могут вести себя совершенно по-разному.&#xA;&#xA;Если проверка ресурса провалилась, в отчёт добавляются ping и traceroute. Результат можно сохранить в HTML и отправить провайдеру или коллеге. Это уже существенно полезнее сообщения «у меня не работает интернет».&#xA;&#xA;Отдельная URL-проба умеет повторять HTTP/HTTPS-запросы с заданным интервалом и числом раундов. Она показывает время, HTTP-код, разрешившийся IP, редирект и итоговый URL. Такой режим хорошо ловит плавающую проблему: пять запросов прошли, шестой завис, ещё два получили редирект куда-то не туда.&#xA;&#xA;Но и connect-check не является абсолютным арбитром. Он показывает взгляд конкретного устройства и конкретного подключения. В этом и его достоинство, и ограничение. Если нужно понять географию проблемы, результат надо сравнить с Ping-Admin или Check-Host.&#xA;&#xA;Uptime Kuma: не проверить сейчас, а следить постоянно&#xA;&#xA;Uptime Kuma — self-hosted-мониторинг, который удобно поднять в Docker на своей ВМ или небольшом VPS.&#xA;&#xA;Он умеет постоянно проверять HTTP/HTTPS, TCP, ping, DNS, WebSocket, push-мониторы и некоторые другие типы целей. Для веб-сервисов особенно полезны проверки по ключевой строке или JSON-запросу: обычный HTTP 200 OK ещё не означает, что приложение действительно отдало нужную страницу, а не вежливую заглушку «всё сломалось».&#xA;&#xA;У Kuma есть история доступности, графики, контроль сертификатов, публичные статус-страницы и уведомления через Telegram, почту и множество других каналов. Минимальный интервал проверки, указанный в проекте, — 20 секунд.&#xA;&#xA;Главное — правильно выбрать место установки. Kuma рядом с наблюдаемым сервером хорошо замечает падение приложения, но может не увидеть региональную или операторскую фильтрацию: внутри одного дата-центра всё будет зелёным. Экземпляр на внешнем VPS лучше показывает доступность снаружи. А если важен взгляд конкретного офиса, монитор надо ставить внутри этого офиса.&#xA;&#xA;Одна точка наблюдения всегда остаётся одной точкой наблюдения. Даже если у неё очень красивый зелёный интерфейс.&#xA;&#xA;Как использовать всё это вместе&#xA;&#xA;Нормальная последовательность при жалобе «сайт не работает» выглядит примерно так.&#xA;&#xA;1. Проверяем точный URL по HTTP/HTTPS&#xA;&#xA;Начинаем с Check-Host. Вставляем именно тот адрес, который не открывается, включая https://, путь и нестандартный порт, если он есть. Смотрим, отвечает ли ресурс из разных стран.&#xA;&#xA;2. Если проблема неоднородная — идём в Ping-Admin&#xA;&#xA;Запускаем подробную проверку из нескольких российских и зарубежных точек. Сравниваем DNS, IP, соединение, TLS, ожидание сервера и редиректы.&#xA;&#xA;3. Запускаем connect-check на проблемном подключении&#xA;&#xA;Теперь получаем взгляд изнутри: как работает DNS, открываются ли соседние классы ресурсов, не сломаны ли только HTTPS, CDN, обновления, видео или отдельные сети. Сохраняем HTML-отчёт.&#xA;&#xA;Если проблема плавающая, оставляем URL-пробу на несколько раундов. Это часто продуктивнее, чем двадцать раз вручную обновлять браузер и пытаться понять, показалось или нет.&#xA;&#xA;4. Для важных сервисов включаем Uptime Kuma&#xA;&#xA;Добавляем постоянную HTTP/HTTPS-проверку. Где возможно — проверяем не только код ответа, но и ключевую строку или JSON. Настраиваем уведомления и сохраняем историю.&#xA;&#xA;Монитор лучше размещать не на том же сервере, который он наблюдает. Иначе при общей аварии они могут исчезнуть вместе, сохранив удивительное единодушие.&#xA;&#xA;Короткая шпаргалка&#xA;&#xA;| Вопрос | Что взять |&#xA;|---|---|&#xA;| Сайт прямо сейчас виден из разных городов и стран? | Check-Host или Ping-Admin |&#xA;| Где тратится время: DNS, соединение, TLS или ответ сервера? | Ping-Admin |&#xA;| Открыт ли конкретный TCP/UDP-порт? | Check-Host |&#xA;| Почему сервис не работает именно у этого пользователя? | connect-check на его подключении |&#xA;| Нужно поймать плавающие HTTP/HTTPS-сбои локально? | URL-проба connect-check |&#xA;| Когда сервис упал и сколько был недоступен? | Uptime Kuma |&#xA;| Нужны уведомления и история? | Uptime Kuma |&#xA;| Нужен внятный материал для обращения к провайдеру? | connect-check + внешняя проверка Ping-Admin/Check-Host |&#xA;&#xA;На что не наступить&#xA;&#xA;Во-первых, не вставляйте во внешние сервисы приватные URL с токенами, одноразовыми подписями, адресами внутренних панелей и другими секретами. Проверка выполняется чужой инфраструктурой, и введённый адрес перестаёт быть только вашим.&#xA;&#xA;Во-вторых, не делайте вывод по одной красной точке. Проверочный узел тоже может быть перегружен, временно потерять маршрут или попасть под ограничение самого сайта.&#xA;&#xA;В-третьих, браузер и HTTP-проба — не одно и то же. JavaScript, авторизация, антибот, API и загрузка статических файлов могут ломаться независимо. Иногда 403 означает «сервер жив, но нас не пустили», а 200 — «заглушка успешно загружена».&#xA;&#xA;И наконец, сохраняйте время проверки, адрес, IP, выбранные узлы и результаты. Фраза «13 августа с 10:15 до 10:27 HTTPS не устанавливался через такого-то провайдера, при этом из шести внешних точек работал» сильно полезнее бессмертного «у вас интернет сломался».&#xA;&#xA;Получается не один идеальный сервис, а небольшой набор инструментов:&#xA;&#xA;— Check-Host быстро подтверждает внешний симптом;&#xA;— Ping-Admin раскладывает HTTP/HTTPS по этапам и географии;&#xA;— connect-check показывает картину с проблемного подключения;&#xA;— Uptime Kuma следит за сервисом постоянно и помнит историю.&#xA;&#xA;В эпоху, когда интернет всё чаще ломается не целиком, а художественно и выборочно, такая коллекция отвёрток уже не выглядит избыточной.&#xA;&#xA;Ссылки&#xA;&#xA;— Ping-Admin: разовая проверка доступности&#xA;&#xA;— Check-Host: HTTP/HTTPS-проверка&#xA;&#xA;— connect-check: репозиторий&#xA;&#xA;— connect-check: готовые сборки&#xA;&#xA;— Uptime Kuma&#xA;&#xA;#monitoring #network&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-availability-tools-digclean.jpg" alt="Обложка"></p>

<p>Чрезмерная временная фильтрация шагает по стране семимильными шагами. Где-то на время включают белые списки, где-то выборочно перестают ходить отдельные протоколы, адреса, CDN или целые сети. Добавим к этому обычные аварии, ошибки DNS, неудачную маршрутизацию и бодрый антибот на стороне самого сайта — и получим современное «интернет вроде есть, но ничего не понятно».</p>

<p>Поэтому мы тоже понемногу вооружаемся диагностическими сервисами.</p>

<p>Сразу оговорюсь: это не рейтинг и не реклама. Инструменты решают разные задачи и хорошо дополняют друг друга. Одни смотрят на ресурс снаружи, другие проверяют его именно через проблемное подключение, третьи запоминают, когда и на сколько минут всё падало.</p>

<h2 id="почему-ping-уже-недостаточно">Почему ping уже недостаточно</h2>

<p>Ping проверяет ICMP: дошёл ли специальный пакет до узла и вернулся ли ответ. Это полезно, но к открытию сайта относится довольно косвенно.</p>

<p>Возможны оба варианта:</p>

<p>— ping проходит, а HTTPS не работает из-за TLS, SNI, фильтрации порта, ошибки веб-сервера или недоступного CDN;
— ping не проходит, потому что ICMP отключён или ограничен, а сайт при этом прекрасно открывается.</p>

<p>Иными словами, ping честно сообщает: «узел ответил на мой ICMP-запрос». Пользователь же в этот момент пытался открыть личный кабинет, посмотреть видео или получить ответ от API. Это уже совсем другой разговор.</p>

<p>Для сайта полезнее смотреть хотя бы всю цепочку:</p>
<ol><li>разрешилось ли доменное имя;</li>
<li>установилось ли TCP-соединение;</li>
<li>прошёл ли TLS для HTTPS;</li>
<li>какой HTTP-код вернул сервер;</li>
<li>пришёл ли ожидаемый контент;</li>
<li>одинаков ли результат из разных сетей и регионов.</li></ol>

<h2 id="ping-admin-подробный-внешний-замер">Ping-Admin: подробный внешний замер</h2>

<p><a href="https://ping-admin.com/free_test/">Ping-Admin</a> пригодится, когда нужно быстро посмотреть на сайт из большого числа внешних точек. Можно выбрать случайные узлы, отдельно российские точки или более широкий набор по разным странам.</p>

<p>Это именно HTTP/HTTPS-проверка, а не просто красивый список задержек. В результате по каждой точке видны:</p>

<p>— IP-адрес, в который разрешилось имя;
— полное время загрузки;
— время DNS;
— установка соединения;
— TLS/SSL;
— ожидание ответа сервера;
— редиректы;
— скорость загрузки и размер страницы.</p>

<p>Такой разбор помогает отличить «долго думает сам сервер» от «долго устанавливается соединение» и «в одном регионе домен вообще указывает в другую сторону». Последнее нормально для CDN и Anycast, но иногда именно в различиях между точками и прячется проблема.</p>

<p>Особенно полезен большой набор российских узлов. Если из части городов страница открывается, а из части стабильно нет, это уже намного интереснее, чем один ping с рабочего ноутбука.</p>

<p>Минус очевиден: Ping-Admin проверяет сайт со своих серверов. Он ничего не знает о конкретном домашнем роутере, корпоративном DNS, Wi‑Fi, канале последней мили и маршруте проблемного пользователя. Это внешний свидетель, а не очевидец с места происшествия.</p>

<h2 id="check-host-быстрый-ответ-а-снаружи-как">Check-Host: быстрый ответ «а снаружи как?»</h2>

<p><a href="https://check-host.net/check-http?lang=ru">Check-Host</a> я обычно воспринимаю как быстрый мультитул. У него отдельно доступны проверки:</p>

<p>— HTTP/HTTPS, в том числе на нестандартном порту;
— ping;
— TCP-порта;
— UDP-порта;
— DNS.</p>

<p>Для первичной проверки это удобно: вставили точный URL, выбрали HTTP и через несколько секунд получили ответы из разных стран. Затем тем же ресурсом можно отдельно посмотреть TCP-порт или DNS, если HTTP-проверка показала что-то странное.</p>

<p>По глубине HTTP-разбора Ping-Admin интереснее, зато Check-Host быстрее отвечает на практический вопрос: ресурс не виден вообще, не виден только по HTTP/HTTPS или проблема наблюдается лишь с отдельных точек.</p>

<p>Есть и важная тонкость: проверять надо не только домен, но и тот протокол, которым реально пользуется клиент. Успешный ping не доказывает работу HTTPS, открытый TCP/443 не гарантирует нормальный TLS и HTTP, а ответ <code>403</code> или <code>429</code> означает, что сервер найден и ответил, но доступ ограничен. Для пользователя сайт всё равно может быть непригоден — просто причина уже не похожа на обрыв маршрута.</p>

<h2 id="connect-check-проверка-с-места-происшествия">connect-check: проверка с места происшествия</h2>

<p>После истории <a href="https://articles.clr58.ru/dve-nedeli-net-interneta">«Две недели без интернета»</a> у нас появилась собственная утилита <a href="https://github.com/cooler58/connect-check">connect-check</a>.</p>

<p>Она отвечает на другой вопрос: не «виден ли сайт из чужого дата-центра», а «что именно работает и не работает с этого компьютера через это подключение».</p>

<p>Утилита запускается локально на Windows, macOS или Linux. Готовые сборки лежат в разделе <a href="https://github.com/cooler58/connect-check/releases/latest">Releases</a>, исходники открыты. В актуальном пакете диагностика и отдельные пробы встроены в GUI.</p>

<p>Полный прогон проверяет не один адрес, а целый набор классов ресурсов и протоколов: базовую сеть, DNS, captive portal, время, HTTP/HTTPS, TCP, CDN, значимые российские и зарубежные ресурсы, банки, почту, облака, репозитории обновлений, игры, видео, IoT и AI-сервисы. Для некоторых сайтов проверяется не только главная страница, но и API, CDN или статический файл — потому что витрина с антиботом и реальный клиентский трафик могут вести себя совершенно по-разному.</p>

<p>Если проверка ресурса провалилась, в отчёт добавляются ping и traceroute. Результат можно сохранить в HTML и отправить провайдеру или коллеге. Это уже существенно полезнее сообщения «у меня не работает интернет».</p>

<p>Отдельная URL-проба умеет повторять HTTP/HTTPS-запросы с заданным интервалом и числом раундов. Она показывает время, HTTP-код, разрешившийся IP, редирект и итоговый URL. Такой режим хорошо ловит плавающую проблему: пять запросов прошли, шестой завис, ещё два получили редирект куда-то не туда.</p>

<p>Но и connect-check не является абсолютным арбитром. Он показывает взгляд конкретного устройства и конкретного подключения. В этом и его достоинство, и ограничение. Если нужно понять географию проблемы, результат надо сравнить с Ping-Admin или Check-Host.</p>

<h2 id="uptime-kuma-не-проверить-сейчас-а-следить-постоянно">Uptime Kuma: не проверить сейчас, а следить постоянно</h2>

<p><a href="https://github.com/louislam/uptime-kuma">Uptime Kuma</a> — self-hosted-мониторинг, который удобно поднять в Docker на своей ВМ или небольшом VPS.</p>

<p>Он умеет постоянно проверять HTTP/HTTPS, TCP, ping, DNS, WebSocket, push-мониторы и некоторые другие типы целей. Для веб-сервисов особенно полезны проверки по ключевой строке или JSON-запросу: обычный HTTP <code>200 OK</code> ещё не означает, что приложение действительно отдало нужную страницу, а не вежливую заглушку «всё сломалось».</p>

<p>У Kuma есть история доступности, графики, контроль сертификатов, публичные статус-страницы и уведомления через Telegram, почту и множество других каналов. Минимальный интервал проверки, указанный в проекте, — 20 секунд.</p>

<p>Главное — правильно выбрать место установки. Kuma рядом с наблюдаемым сервером хорошо замечает падение приложения, но может не увидеть региональную или операторскую фильтрацию: внутри одного дата-центра всё будет зелёным. Экземпляр на внешнем VPS лучше показывает доступность снаружи. А если важен взгляд конкретного офиса, монитор надо ставить внутри этого офиса.</p>

<p>Одна точка наблюдения всегда остаётся одной точкой наблюдения. Даже если у неё очень красивый зелёный интерфейс.</p>

<h2 id="как-использовать-всё-это-вместе">Как использовать всё это вместе</h2>

<p>Нормальная последовательность при жалобе «сайт не работает» выглядит примерно так.</p>

<h3 id="1-проверяем-точный-url-по-http-https">1. Проверяем точный URL по HTTP/HTTPS</h3>

<p>Начинаем с Check-Host. Вставляем именно тот адрес, который не открывается, включая <code>https://</code>, путь и нестандартный порт, если он есть. Смотрим, отвечает ли ресурс из разных стран.</p>

<h3 id="2-если-проблема-неоднородная-идём-в-ping-admin">2. Если проблема неоднородная — идём в Ping-Admin</h3>

<p>Запускаем подробную проверку из нескольких российских и зарубежных точек. Сравниваем DNS, IP, соединение, TLS, ожидание сервера и редиректы.</p>

<h3 id="3-запускаем-connect-check-на-проблемном-подключении">3. Запускаем connect-check на проблемном подключении</h3>

<p>Теперь получаем взгляд изнутри: как работает DNS, открываются ли соседние классы ресурсов, не сломаны ли только HTTPS, CDN, обновления, видео или отдельные сети. Сохраняем HTML-отчёт.</p>

<p>Если проблема плавающая, оставляем URL-пробу на несколько раундов. Это часто продуктивнее, чем двадцать раз вручную обновлять браузер и пытаться понять, показалось или нет.</p>

<h3 id="4-для-важных-сервисов-включаем-uptime-kuma">4. Для важных сервисов включаем Uptime Kuma</h3>

<p>Добавляем постоянную HTTP/HTTPS-проверку. Где возможно — проверяем не только код ответа, но и ключевую строку или JSON. Настраиваем уведомления и сохраняем историю.</p>

<p>Монитор лучше размещать не на том же сервере, который он наблюдает. Иначе при общей аварии они могут исчезнуть вместе, сохранив удивительное единодушие.</p>

<h2 id="короткая-шпаргалка">Короткая шпаргалка</h2>

<table>
<thead>
<tr>
<th>Вопрос</th>
<th>Что взять</th>
</tr>
</thead>

<tbody>
<tr>
<td>Сайт прямо сейчас виден из разных городов и стран?</td>
<td>Check-Host или Ping-Admin</td>
</tr>

<tr>
<td>Где тратится время: DNS, соединение, TLS или ответ сервера?</td>
<td>Ping-Admin</td>
</tr>

<tr>
<td>Открыт ли конкретный TCP/UDP-порт?</td>
<td>Check-Host</td>
</tr>

<tr>
<td>Почему сервис не работает именно у этого пользователя?</td>
<td>connect-check на его подключении</td>
</tr>

<tr>
<td>Нужно поймать плавающие HTTP/HTTPS-сбои локально?</td>
<td>URL-проба connect-check</td>
</tr>

<tr>
<td>Когда сервис упал и сколько был недоступен?</td>
<td>Uptime Kuma</td>
</tr>

<tr>
<td>Нужны уведомления и история?</td>
<td>Uptime Kuma</td>
</tr>

<tr>
<td>Нужен внятный материал для обращения к провайдеру?</td>
<td>connect-check + внешняя проверка Ping-Admin/Check-Host</td>
</tr>
</tbody>
</table>

<h2 id="на-что-не-наступить">На что не наступить</h2>

<p>Во-первых, не вставляйте во внешние сервисы приватные URL с токенами, одноразовыми подписями, адресами внутренних панелей и другими секретами. Проверка выполняется чужой инфраструктурой, и введённый адрес перестаёт быть только вашим.</p>

<p>Во-вторых, не делайте вывод по одной красной точке. Проверочный узел тоже может быть перегружен, временно потерять маршрут или попасть под ограничение самого сайта.</p>

<p>В-третьих, браузер и HTTP-проба — не одно и то же. JavaScript, авторизация, антибот, API и загрузка статических файлов могут ломаться независимо. Иногда <code>403</code> означает «сервер жив, но нас не пустили», а <code>200</code> — «заглушка успешно загружена».</p>

<p>И наконец, сохраняйте время проверки, адрес, IP, выбранные узлы и результаты. Фраза «13 августа с 10:15 до 10:27 HTTPS не устанавливался через такого-то провайдера, при этом из шести внешних точек работал» сильно полезнее бессмертного «у вас интернет сломался».</p>

<p>Получается не один идеальный сервис, а небольшой набор инструментов:</p>

<p>— Check-Host быстро подтверждает внешний симптом;
— Ping-Admin раскладывает HTTP/HTTPS по этапам и географии;
— connect-check показывает картину с проблемного подключения;
— Uptime Kuma следит за сервисом постоянно и помнит историю.</p>

<p>В эпоху, когда интернет всё чаще ломается не целиком, а художественно и выборочно, такая коллекция отвёрток уже не выглядит избыточной.</p>

<h2 id="ссылки">Ссылки</h2>

<p>— <a href="https://ping-admin.com/free_test/">Ping-Admin: разовая проверка доступности</a></p>

<p>— <a href="https://check-host.net/check-http?lang=ru">Check-Host: HTTP/HTTPS-проверка</a></p>

<p>— <a href="https://github.com/cooler58/connect-check">connect-check: репозиторий</a></p>

<p>— <a href="https://github.com/cooler58/connect-check/releases/latest">connect-check: готовые сборки</a></p>

<p>— <a href="https://github.com/louislam/uptime-kuma">Uptime Kuma</a></p>

<p><a href="https://articles.clr58.ru/tag:monitoring" class="hashtag"><span>#</span><span class="p-category">monitoring</span></a> <a href="https://articles.clr58.ru/tag:network" class="hashtag"><span>#</span><span class="p-category">network</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/availability-tools</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:48 +0000</pubDate>
    </item>
    <item>
      <title>Self-host против облака: что реально тащить домой, а что оставить в аренде</title>
      <link>https://articles.clr58.ru/ai-series-11</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Одиннадцать статей позади — пора честно ответить, ради чего всё затевалось: что из этого зоопарка стоит поднимать у себя, а где self-host — красивая идея, которая жрёт время и электричество. Спойлер: «всё своё» не бывает, как и «всё в облако». Есть расклад по задачам, и я его выстрадал на собственных граблях.&#xA;&#xA;Два лагеря, и оба врут&#xA;&#xA;Про self-host пишут либо фанатики («хости сам, будь свободен»), либо скептики («домашний сервер — хобби для мазохистов»). Оба врут: у self-host нет единой цены — есть задачи, где он окупается с первого дня, и задачи, где он — чистая дыра в бюджете.&#xA;&#xA;Где self-host окупается&#xA;&#xA;Три вещи, которые облако не даёт в принципе, сколько ни плати.&#xA;&#xA;Данные под контролем. Фото, видео с камер, заметки, логи — всё на моём диске. Для фотоархива и видеонаблюдения это суть задачи: отдавать семейный архив и камеры с крыльца в чужое хранилище — плохая идея ещё до всяких вопросов о деньгах. Immich и Frigate для того и существуют, чтобы это оставалось твоим.&#xA;&#xA;Нет ежемесячной подписки. Публикации, картинки, аналитика, мониторинг — у каждой такой штуки есть SaaS-аналог «от девяти долларов». У меня вместо десятка подписок — один мини-ПК и несколько контейнеров: блог на WriteFreely, картинки через свою пасту, счётчик посещений — свой Umami. Заплатил за железо один раз — дальше только электричество.&#xA;&#xA;Кастом. Мой вход в лабу — это Caddy с обратным туннелем наружу, NAT между сетями и ACL на админки. Такую схему под свою сеть и свои VPN облачный сервис не соберёт никогда. Как только нужно «не как у всех», self-host из опции становится единственным путём.&#xA;&#xA;Где self-host — чистые грабли&#xA;&#xA;Сложность. Каждый сервис надо поставить, обновить, пробросить, защитить. В облаке ты платишь за то, что это делает кто-то другой. Дома ты сам тот «кто-то». Когда ROCm-костыль падает на длинном промпте, чинить идти тебе, а не в поддержку.&#xA;&#xA;Обновления. SaaS обновляется, пока ты спишь. Домашний сервис стоит в той версии, в которой ты его оставил, и за обновлениями следишь сам. Забыл на полгода — получил дыру и мёртвый бэкап-таймер.&#xA;&#xA;GPU в дефиците. Для инференса нужно видео-железо, а оно либо дорогое, либо его нет. У меня встроенная графика, и весь локальный инференс держится на том, что 8 ГБ общей памяти уходят под модель впритык. Дискретная карта под большую модель — цена, сопоставимая с годом облачной аренды.&#xA;&#xA;Аптайм. Домашнее железо спит, греется, ловит скачки и умирает, когда тебя нет. Облако поднимает за тебя три девятки. Если сервис должен быть доступен всегда и отовсюду — подвал это не гарантирует.&#xA;&#xA;Разбор по нашему стеку&#xA;&#xA;Пройдусь по тому, что у меня реально работает, и скажу честно, где бы я заплатил снова.&#xA;&#xA;Caddy как вход — однозначно self-host. Обратный прокси, NAT, туннель наружу, сертификаты на автомате. Замены облаку нет: это про твою сеть и твои правила доступа.&#xA;&#xA;Публикации (WriteFreely) — оправдан. Свой блог, свой текст, никакой аренды площадки. Единственное требование — дисциплина с бэкапами, их у меня гоняет таймер.&#xA;&#xA;Картинки (rustypaste) — оправдан. Своя паста под обложки и картинки. Чужие CDN из моего региона рвутся, а своя всегда на месте: загрузка по токену, отдача публичная.&#xA;&#xA;Мониторинг и аналитика (Beszel, Kuma, Umami) — оправдан. Лёгкие контейнеры, никаких подписок, данные о твоей инфре не утекают третьим лицам.&#xA;&#xA;Локальный инференс (Ollama) — наполовину. Для приватных вопросов и фона локальная модель — золото: вопросы не уезжают из дома, токены ничего не стоят. Но для агентов с инструментами не годится: модель на 8 ГБ не умеет в инструменты, 8B-варианты возвращают кашу, вижн локально не работает. Поэтому вторая половина задач честно уезжает в облако.&#xA;&#xA;Тяжёлый инференс и большие LLM — аренда. Гнать дома модель, которой нужна дискретная карта за тысячи, бессмысленно, если та же мощность берётся в аренду без вложений в железо. Для тяжёлых агентов, больших контекстов и вижна облако остаётся основным, и я с этим смирился.&#xA;&#xA;Честные цифры, чтобы не спорить на ощущениях&#xA;&#xA;Локальный инференс на встроенной графике:&#xA;&#xA;gemma3:12b в квантовке — 14.8 ток/сек, влезает в 8 ГБ VRAM впритык;&#xA;gemma3:4b — 23.5 ток/сек, но проще и с меньшим окном;&#xA;точная fp16-версия 12b — 8.1 ток/сек, потому что не влезает в память и ползёт через шину. Выкинута.&#xA;&#xA;Это уровень «читает примерно с моей скоростью»: для приватных вопросов комфортно, для потоковой генерации — на грани. Облачная модель отвечает почти мгновенно, умеет в инструменты и вижн, но стоит денег и гонит текст на чужие серверы.&#xA;&#xA;Потолок — 8 ГБ VRAM. У встроенной графики нет своей памяти, она заимствует её у общей. Поэтому 8 ГБ «видеопамяти» — те же 8 ГБ из оперативки, модель на 12b влезает впритык, а на 16b уже не хватило бы. Главный предел iGPU — не скорость, а память. Отсюда вывод: локально жить можно, но о «больших моделях дома» речи нет.&#xA;&#xA;Бесплатное облако кусается. Бесплатные модели у агрегатора стабильно отдают 429 — «провайдер перегружен». Лимит общий на весь бесплатный пул, в час пик ты в очереди за платными. Для рутины сойдёт, для важного — нет.&#xA;&#xA;Правило выбора: три множителя&#xA;&#xA;Перемножай чувствительность данных × нагрузку × цену железа с электричеством.&#xA;&#xA;Чувствительность. Если данные нельзя отдавать наружу (фото, видео, документы) — self-host без вариантов, вопрос только, потянешь ли железо.&#xA;&#xA;Нагрузка. Лёгкое и постоянное (блог, картинки, мониторинг, аналитика) — домой, окупается. Тяжёлое и пиковое (большая LLM, агенты с инструментами, вижн) — в аренду, если только дискретная карта уже не куплена по другим причинам.&#xA;&#xA;Цена. Мини-ПК круглосуточно ест электричество, и это надо считать. Пока он тянет лёгкие сервисы и фоновый инференс — счёт смешной. Как только начинаешь докупать карты ради «бесплатного ChatGPT» — окупаемость умирает, дешевле арендовать.&#xA;&#xA;Итого: приватное + лёгкое — домой; тяжёлое + пиковое — в аренду; приватное + тяжёлое — дорого в обе стороны, решай по деньгам.&#xA;&#xA;Что в сухом остатке&#xA;&#xA;Self-host окупается там, где речь про контроль данных, отказ от подписок и кастом: вход через Caddy, свой блог, своя паста, мониторинг, аналитика, фото и камеры — всё это я бы поднял снова, не думая. Локальный инференс на встроенной графике — честный бесплатный второй мозг для приватных задач и фона, но не замена облаку.&#xA;&#xA;Облако остаётся там, где нужны инструменты, вижн, большие контексты и мгновенный отклик. Домашние 8 ГБ и 15 токенов в секунду этого не дадут, сколько ни танцуй с бубном вокруг ROCm.&#xA;&#xA;Главный урок серии — не «хости всё» и не «плати за всё», а честный расклад: знай, что влезает в память, что умеет твоя модель, что падает на длинном промпте и где бесплатное на самом деле в очереди. Тогда self-host из религии становится обычным инженерным решением.&#xA;&#xA;#llm #openclaw #selfhosting&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-ai-11-cover-digclean.jpg" alt="Обложка"></p>

<p>Одиннадцать статей позади — пора честно ответить, ради чего всё затевалось: что из этого зоопарка стоит поднимать у себя, а где self-host — красивая идея, которая жрёт время и электричество. Спойлер: «всё своё» не бывает, как и «всё в облако». Есть расклад по задачам, и я его выстрадал на собственных граблях.</p>

<h2 id="два-лагеря-и-оба-врут">Два лагеря, и оба врут</h2>

<p>Про self-host пишут либо фанатики («хости сам, будь свободен»), либо скептики («домашний сервер — хобби для мазохистов»). Оба врут: у self-host нет единой цены — есть задачи, где он окупается с первого дня, и задачи, где он — чистая дыра в бюджете.</p>

<h2 id="где-self-host-окупается">Где self-host окупается</h2>

<p>Три вещи, которые облако не даёт в принципе, сколько ни плати.</p>

<p><strong>Данные под контролем.</strong> Фото, видео с камер, заметки, логи — всё на моём диске. Для фотоархива и видеонаблюдения это суть задачи: отдавать семейный архив и камеры с крыльца в чужое хранилище — плохая идея ещё до всяких вопросов о деньгах. Immich и Frigate для того и существуют, чтобы это оставалось твоим.</p>

<p><strong>Нет ежемесячной подписки.</strong> Публикации, картинки, аналитика, мониторинг — у каждой такой штуки есть SaaS-аналог «от девяти долларов». У меня вместо десятка подписок — один мини-ПК и несколько контейнеров: блог на WriteFreely, картинки через свою пасту, счётчик посещений — свой Umami. Заплатил за железо один раз — дальше только электричество.</p>

<p><strong>Кастом.</strong> Мой вход в лабу — это Caddy с обратным туннелем наружу, NAT между сетями и ACL на админки. Такую схему под свою сеть и свои VPN облачный сервис не соберёт никогда. Как только нужно «не как у всех», self-host из опции становится единственным путём.</p>

<h2 id="где-self-host-чистые-грабли">Где self-host — чистые грабли</h2>

<p><strong>Сложность.</strong> Каждый сервис надо поставить, обновить, пробросить, защитить. В облаке ты платишь за то, что это делает кто-то другой. Дома ты сам тот «кто-то». Когда ROCm-костыль падает на длинном промпте, чинить идти тебе, а не в поддержку.</p>

<p><strong>Обновления.</strong> SaaS обновляется, пока ты спишь. Домашний сервис стоит в той версии, в которой ты его оставил, и за обновлениями следишь сам. Забыл на полгода — получил дыру и мёртвый бэкап-таймер.</p>

<p><strong>GPU в дефиците.</strong> Для инференса нужно видео-железо, а оно либо дорогое, либо его нет. У меня встроенная графика, и весь локальный инференс держится на том, что 8 ГБ общей памяти уходят под модель впритык. Дискретная карта под большую модель — цена, сопоставимая с годом облачной аренды.</p>

<p><strong>Аптайм.</strong> Домашнее железо спит, греется, ловит скачки и умирает, когда тебя нет. Облако поднимает за тебя три девятки. Если сервис должен быть доступен всегда и отовсюду — подвал это не гарантирует.</p>

<h2 id="разбор-по-нашему-стеку">Разбор по нашему стеку</h2>

<p>Пройдусь по тому, что у меня реально работает, и скажу честно, где бы я заплатил снова.</p>

<p><strong>Caddy как вход — однозначно self-host.</strong> Обратный прокси, NAT, туннель наружу, сертификаты на автомате. Замены облаку нет: это про твою сеть и твои правила доступа.</p>

<p><strong>Публикации (WriteFreely) — оправдан.</strong> Свой блог, свой текст, никакой аренды площадки. Единственное требование — дисциплина с бэкапами, их у меня гоняет таймер.</p>

<p><strong>Картинки (rustypaste) — оправдан.</strong> Своя паста под обложки и картинки. Чужие CDN из моего региона рвутся, а своя всегда на месте: загрузка по токену, отдача публичная.</p>

<p><strong>Мониторинг и аналитика (Beszel, Kuma, Umami) — оправдан.</strong> Лёгкие контейнеры, никаких подписок, данные о твоей инфре не утекают третьим лицам.</p>

<p><strong>Локальный инференс (Ollama) — наполовину.</strong> Для приватных вопросов и фона локальная модель — золото: вопросы не уезжают из дома, токены ничего не стоят. Но для агентов с инструментами не годится: модель на 8 ГБ не умеет в инструменты, 8B-варианты возвращают кашу, вижн локально не работает. Поэтому вторая половина задач честно уезжает в облако.</p>

<p><strong>Тяжёлый инференс и большие LLM — аренда.</strong> Гнать дома модель, которой нужна дискретная карта за тысячи, бессмысленно, если та же мощность берётся в аренду без вложений в железо. Для тяжёлых агентов, больших контекстов и вижна облако остаётся основным, и я с этим смирился.</p>

<h2 id="честные-цифры-чтобы-не-спорить-на-ощущениях">Честные цифры, чтобы не спорить на ощущениях</h2>

<p><strong>Локальный инференс на встроенной графике:</strong></p>
<ul><li>gemma3:12b в квантовке — <strong>14.8 ток/сек</strong>, влезает в 8 ГБ VRAM впритык;</li>
<li>gemma3:4b — <strong>23.5 ток/сек</strong>, но проще и с меньшим окном;</li>
<li>точная fp16-версия 12b — <strong>8.1 ток/сек</strong>, потому что не влезает в память и ползёт через шину. Выкинута.</li></ul>

<p>Это уровень «читает примерно с моей скоростью»: для приватных вопросов комфортно, для потоковой генерации — на грани. Облачная модель отвечает почти мгновенно, умеет в инструменты и вижн, но стоит денег и гонит текст на чужие серверы.</p>

<p><strong>Потолок — 8 ГБ VRAM.</strong> У встроенной графики нет своей памяти, она заимствует её у общей. Поэтому 8 ГБ «видеопамяти» — те же 8 ГБ из оперативки, модель на 12b влезает впритык, а на 16b уже не хватило бы. Главный предел iGPU — не скорость, а память. Отсюда вывод: локально жить можно, но о «больших моделях дома» речи нет.</p>

<p><strong>Бесплатное облако кусается.</strong> Бесплатные модели у агрегатора стабильно отдают 429 — «провайдер перегружен». Лимит общий на весь бесплатный пул, в час пик ты в очереди за платными. Для рутины сойдёт, для важного — нет.</p>

<h2 id="правило-выбора-три-множителя">Правило выбора: три множителя</h2>

<p>Перемножай <strong>чувствительность данных × нагрузку × цену железа с электричеством</strong>.</p>

<p><strong>Чувствительность.</strong> Если данные нельзя отдавать наружу (фото, видео, документы) — self-host без вариантов, вопрос только, потянешь ли железо.</p>

<p><strong>Нагрузка.</strong> Лёгкое и постоянное (блог, картинки, мониторинг, аналитика) — домой, окупается. Тяжёлое и пиковое (большая LLM, агенты с инструментами, вижн) — в аренду, если только дискретная карта уже не куплена по другим причинам.</p>

<p><strong>Цена.</strong> Мини-ПК круглосуточно ест электричество, и это надо считать. Пока он тянет лёгкие сервисы и фоновый инференс — счёт смешной. Как только начинаешь докупать карты ради «бесплатного ChatGPT» — окупаемость умирает, дешевле арендовать.</p>

<p>Итого: <strong>приватное + лёгкое — домой; тяжёлое + пиковое — в аренду; приватное + тяжёлое — дорого в обе стороны, решай по деньгам.</strong></p>

<h2 id="что-в-сухом-остатке">Что в сухом остатке</h2>

<p>Self-host окупается там, где речь про контроль данных, отказ от подписок и кастом: вход через Caddy, свой блог, своя паста, мониторинг, аналитика, фото и камеры — всё это я бы поднял снова, не думая. Локальный инференс на встроенной графике — честный бесплатный второй мозг для приватных задач и фона, но не замена облаку.</p>

<p>Облако остаётся там, где нужны инструменты, вижн, большие контексты и мгновенный отклик. Домашние 8 ГБ и 15 токенов в секунду этого не дадут, сколько ни танцуй с бубном вокруг ROCm.</p>

<p>Главный урок серии — не «хости всё» и не «плати за всё», а честный расклад: знай, что влезает в память, что умеет твоя модель, что падает на длинном промпте и где бесплатное на самом деле в очереди. Тогда self-host из религии становится обычным инженерным решением.</p>

<p><a href="https://articles.clr58.ru/tag:llm" class="hashtag"><span>#</span><span class="p-category">llm</span></a> <a href="https://articles.clr58.ru/tag:openclaw" class="hashtag"><span>#</span><span class="p-category">openclaw</span></a> <a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/ai-series-11</guid>
      <pubDate>Sat, 19 Sep 2026 03:41:48 +0000</pubDate>
    </item>
  </channel>
</rss>