<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>lifehacks &amp;mdash; Цифровой дворник</title>
    <link>https://articles.clr58.ru/tag:lifehacks</link>
    <description>Практические заметки о сетях, self-hosting, виртуализации, мониторинге, автоматизации и локальном ИИ.</description>
    <pubDate>Wed, 30 Sep 2026 01:17:18 +0000</pubDate>
    <item>
      <title>Зарубежные подписки без Visa/Mastercard: карта через Telegram-бота</title>
      <link>https://articles.clr58.ru/pipl</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Когда уехали Visa и Mastercard, я полез оплачивать ChatGPT, GitHub и пару других зарубежных сервисов — и упёрся в стену. СБП внутри РФ работает, а наружу не пускает. Решил попробовать виртуальную карту от Pipl (t.me/pipl) — сервис, о котором много говорят в околоайтишных чатах. Рассказываю, как это устроено на самом деле, со всеми граблями.&#xA;&#xA;🔧 Как это работает&#xA;&#xA;Всё делается через Telegram Mini App бота t.me/pipl&#xA;Регистрация с KYC по гос. документу — заняла пару минут&#xA;Выпуск карты — от 2 минут после оплаты&#xA;Пополняешь через СБП, платишь картой как обычной&#xA;&#xA;По сути это предоплаченная карта Visa/Mastercard: номер, срок, CVV. Есть виртуальные и пластиковые, часть — с Apple Pay/Google Pay. Никакого банковского счёта за этим не стоит.&#xA;&#xA;📊 Цифры, которые стоит знать ДО&#xA;&#xA;Выпуск — от 860 ₽ (от 10 USD)&#xA;Обслуживание — 5$ в месяц, капает всегда&#xA;Пополнение — комиссия 3,5%&#xA;Каждая транзакция — 0,5 USD. Даже отклонённая&#xA;Лимиты — до 50 000 USD за транзакцию, 200 000 в день&#xA;&#xA;💡 Личный опыт&#xA;&#xA;Пользуюсь давно. Работает так:&#xA;&#xA;Пополнение по СБП — реально без проблем, деньги приходят быстро&#xA;Платежи в большинстве сервисов проходят нормально&#xA;Если сервис отклоняет карту — завожу новую, за пару минут&#xA;Переводы на карту принять нельзя — только платить с неё&#xA;&#xA;⚠️ Грабли&#xA;&#xA;0,5$ снимается за каждую транзакцию, даже неуспешную. Пока платил, пару раз долбил оплату повторно — и получил минус на балансе просто так&#xA;Обслуживание 5$/мес списывается, даже если карта лежит без дела — это не «завёл и забыл»&#xA;Возврат в холде — минуты, после списания — до 35 банковских дней&#xA;С PayPal карта не работает&#xA;Для оплаты внутри РФ карта бесполезна — это инструмент строго для зарубежных сервисов&#xA;После закрытия карты остаток выводят в крипту (до 48 ч) или переносят на новую карту&#xA;&#xA;По сути это удобный, но платный костыль. Для пары подписок в месяц — ок. Держать на ней крупные суммы смысла нет.&#xA;&#xA;lifehacks&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-pipl-digclean---e95278ac-4cd8-490f-b098-d2179c659928.jpg" alt="Обложка"></p>

<p>Когда уехали Visa и Mastercard, я полез оплачивать ChatGPT, GitHub и пару других зарубежных сервисов — и упёрся в стену. СБП внутри РФ работает, а наружу не пускает. Решил попробовать виртуальную карту от Pipl (t.me/pipl) — сервис, о котором много говорят в околоайтишных чатах. Рассказываю, как это устроено на самом деле, со всеми граблями.</p>

<h2 id="как-это-работает">🔧 Как это работает</h2>
<ol><li>Всё делается через Telegram Mini App бота <a href="https://t.me/pipl">t.me/pipl</a></li>
<li>Регистрация с KYC по гос. документу — заняла пару минут</li>
<li>Выпуск карты — от 2 минут после оплаты</li>
<li>Пополняешь через СБП, платишь картой как обычной</li></ol>

<p>По сути это предоплаченная карта Visa/Mastercard: номер, срок, CVV. Есть виртуальные и пластиковые, часть — с Apple Pay/Google Pay. Никакого банковского счёта за этим не стоит.</p>

<h2 id="цифры-которые-стоит-знать-до">📊 Цифры, которые стоит знать ДО</h2>
<ul><li><strong>Выпуск</strong> — от 860 ₽ (от 10 USD)</li>
<li><strong>Обслуживание</strong> — 5$ в месяц, капает всегда</li>
<li><strong>Пополнение</strong> — комиссия 3,5%</li>
<li><strong>Каждая транзакция</strong> — 0,5 USD. Даже отклонённая</li>
<li><strong>Лимиты</strong> — до 50 000 USD за транзакцию, 200 000 в день</li></ul>

<h2 id="личный-опыт">💡 Личный опыт</h2>

<p>Пользуюсь давно. Работает так:</p>
<ul><li>Пополнение по СБП — реально без проблем, деньги приходят быстро</li>
<li>Платежи в большинстве сервисов проходят нормально</li>
<li>Если сервис отклоняет карту — завожу новую, за пару минут</li>
<li>Переводы на карту принять нельзя — только платить с неё</li></ul>

<h2 id="грабли">⚠️ Грабли</h2>
<ul><li>0,5$ снимается за каждую транзакцию, даже неуспешную. Пока платил, пару раз долбил оплату повторно — и получил минус на балансе просто так</li>
<li>Обслуживание 5$/мес списывается, даже если карта лежит без дела — это не «завёл и забыл»</li>
<li>Возврат в холде — минуты, после списания — до 35 банковских дней</li>
<li>С PayPal карта не работает</li>
<li>Для оплаты внутри РФ карта бесполезна — это инструмент строго для зарубежных сервисов</li>
<li>После закрытия карты остаток выводят в крипту (до 48 ч) или переносят на новую карту</li></ul>

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

<p><a href="https://articles.clr58.ru/tag:lifehacks" class="hashtag"><span>#</span><span class="p-category">lifehacks</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/pipl</guid>
      <pubDate>Tue, 15 Sep 2026 12:16:41 +0000</pubDate>
    </item>
    <item>
      <title>Паста на своих: rustypaste вместо капризного CDN</title>
      <link>https://articles.clr58.ru/rustypaste</link>
      <description>&lt;![CDATA[Почему пришлось брать метлу в лапки&#xA;Мы хостили иллюстрации для постов на catbox.moe. В какой‑то момент их CDN (files.catbox.moe) из РФ стал отвечать &#34;Connection reset by peer&#34;: TLS обрывался, картинки не открывались. Наш робот‑дворник посмотрел на этот сугроб разрывов, вздохнул, махнул метлой и сказал: «Хватит, делаем своё».&#xA;&#xA;Что за rustypaste и почему он&#xA;rustypaste (v0.17.0) — минималистичный paste/file‑host на одном бинарнике Rust. Базы данных нет, всё хранится в файловой системе, конфиг — один config.toml. Из коробки:&#xA;загрузка файлов и текста, в том числе из удалённого URL;&#xA;угадывает MIME и позволяет его переопределять/блокировать;&#xA;одноразовые ссылки, срок жизни, удаление по токену;&#xA;аутентификация простым Authorization токеном или списком токенов в конфиге.&#xA;&#xA;Нам нужен был быстрый и автономный хост для картинок канала — без лишней магии и с контролем загрузки. Rustypaste закрыл все пункты.&#xA;&#xA;Как подняли: LXC + systemd + Caddy&#xA;Отдельный контейнер (LXC) во внутренней сети сервисов 198.51.100.0/24, порт 8000.&#xA;Снаружи — поддомен paste.example через Caddy reverseproxy. Сертификат Let’s Encrypt выпустился автоматически (HTTP‑01 challenge).&#xA;Загрузка разрешена только с токеном в заголовке Authorization. Отдача — публичная, с корректным Content-Type (например, image/png).&#xA;&#xA;systemd-юнит&#xA;Создаём пользователя и юнит:&#xA;один раз&#xA;&#xA;Обложка&#xA;&#xA;useradd -r -s /usr/sbin/nologin -m -d /var/lib/rustypaste rustypaste || true&#xA;install -d -o rustypaste -g rustypaste /var/lib/rustypaste/upload /etc/rustypaste&#xA;&#xA;cat   /etc/systemd/system/rustypaste.service &lt;&lt;&#39;UNIT&#39;&#xA;[Unit]&#xA;Description=Rustypaste service&#xA;After=network-online.target&#xA;Wants=network-online.target&#xA;&#xA;[Service]&#xA;User=rustypaste&#xA;Group=rustypaste&#xA;WorkingDirectory=/var/lib/rustypaste&#xA;Environment=CONFIG=/etc/rustypaste/config.toml&#xA;Environment=RUSTLOG=info&#xA;ExecStart=/usr/local/bin/rustypaste&#xA;Restart=always&#xA;&#xA;[Install]&#xA;WantedBy=multi-user.target&#xA;UNIT&#xA;&#xA;systemctl daemon-reload&#xA;systemctl enable --now rustypaste&#xA;&#xA;Конфиг rustypaste (/etc/rustypaste/config.toml)&#xA;  Важно: ниже используются документные диапазоны (RFC 5737) и заглушки — подставьте свой поддомен/пути/токены. Для heredoc используйте литеральный режим &lt;&lt;&#39;TOML&#39; — это спасает от «съедания» бэкслешей.&#xA;&#xA;cat   /etc/rustypaste/config.toml &lt;&lt;&#39;TOML&#39;&#xA;[server]&#xA;address = &#34;198.51.100.42:8000&#34;        # LXC во внутренней сети&#xA;url = &#34;https://paste.example&#34;         # внешний адрес за Caddy&#xA;uploadpath = &#34;/var/lib/rustypaste/upload&#34;&#xA;authtokens = [&#34;PASTEUPLOADTOKEN&#34;]&#xA;exposeversion = false&#xA;hardening = true&#xA;&#xA;[paste]&#xA;Расширение по умолчанию для текстов без явного имени&#xA;defaultextension = &#34;txt&#34;&#xA;Переопределения MIME по regex — используйте литеральные строки (одинарные кавычки)&#xA;mimeoverride = [&#xA;  { mime = &#39;image/png&#39;,  regex = &#39;^.\.png$&#39; },&#xA;  { mime = &#39;image/jpeg&#39;, regex = &#39;^.\.(jpg|jpeg)$&#39; },&#xA;  { mime = &#39;image/gif&#39;,  regex = &#39;^.\.gif$&#39; }&#xA;]&#xA;Что принудительно отдавать как text/plain (для предпросмотра)&#xA;textmimeoverrides = [&#34;text/markdown&#34;, &#34;application/json&#34;]&#xA;TOML&#xA;&#xA;chown -R rustypaste:rustypaste /etc/rustypaste /var/lib/rustypaste&#xA;systemctl restart rustypaste&#xA;&#xA;Caddy reverseproxy&#xA;Минимальный сайт‑блок:&#xA;paste.example {&#xA;  encode zstd gzip&#xA;  reverseproxy 198.51.100.42:8000&#xA;}&#xA;Caddy сам пройдёт HTTP‑01 и выпустит сертификат для paste.example.&#xA;&#xA;Загрузка и проверка&#xA;Без токена — 401 Unauthorized&#xA;curl -fsS -F &#34;file=@x.png&#34; https://paste.clr58.ru/ || echo &#34;→ 401 as expected&#34;&#xA;&#xA;С токеном — получаем ссылку вида https://paste.clr58.ru/имя.png&#xA;curl -fsS -H &#34;Authorization: PASTEUPLOADTOKEN&#34; -F &#34;file=@x.png&#34; https://paste.clr58.ru/&#xA;&#xA;Пакетная переливка картинок (пример):&#xA;for f in ./images/; do&#xA;  curl -s -H &#34;Authorization: PASTEUPLOADTOKEN&#34; -F &#34;file=@$f&#34; https://paste.clr58.ru/     uploadedurls.txt&#xA;  echo     uploaded_urls.txt&#xA;done&#xA;&#xA;Грабли, на которые наступили&#xA;1) TOML + regex: «TOML parse error: missing escaped value». Мы сначала писали regex в двойных кавычках и заливали конфиг heredoc’ом без литерального режима — bash скромно «почистил» бэкслеши. Лечение: либо heredoc с &lt;&lt;&#39;TOML&#39;, либо TOML‑строки в одинарных кавычках (литеральные), как в примере выше.&#xA;&#xA;2) «config.toml is not found» и цикл рестартов. Первая передача конфига в контейнер банально не долетела — сервис честно падал и перезапускался. Проверяйте, что файл реально на месте и виден пользователю сервиса: ls -l /etc/rustypaste/config.toml и права на каталог.&#xA;&#xA;Итог: картинки вернулись домой&#xA;Свой paste на rustypaste избавил нас от капризов чужого CDN.&#xA;Загрузка защищена токеном, отдача идёт с правильным MIME.&#xA;Перелили архив картинок и пересобрали посты — читатели снова видят иллюстрации.&#xA;&#xA;  Робот‑дворник доволен: меньше мусора из внешних зависимостей — больше чистых дорожек в контент‑плане.&#xA;&#xA;Ссылки&#xA;Репозиторий: https://github.com/orhun/rustypaste&#xA;Релизы: https://github.com/orhun/rustypaste/releases&#xA;&#xA;#selfhosting #lifehacks&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="почему-пришлось-брать-метлу-в-лапки">Почему пришлось брать метлу в лапки</h3>

<p>Мы хостили иллюстрации для постов на catbox.moe. В какой‑то момент их CDN (files.catbox.moe) из РФ стал отвечать “Connection reset by peer”: TLS обрывался, картинки не открывались. Наш робот‑дворник посмотрел на этот сугроб разрывов, вздохнул, махнул метлой и сказал: «Хватит, делаем своё».</p>

<h3 id="что-за-rustypaste-и-почему-он">Что за rustypaste и почему он</h3>

<p>rustypaste (v0.17.0) — минималистичный paste/file‑host на одном бинарнике Rust. Базы данных нет, всё хранится в файловой системе, конфиг — один <code>config.toml</code>. Из коробки:
– загрузка файлов и текста, в том числе из удалённого URL;
– угадывает MIME и позволяет его переопределять/блокировать;
– одноразовые ссылки, срок жизни, удаление по токену;
– аутентификация простым <code>Authorization</code> токеном или списком токенов в конфиге.</p>

<p>Нам нужен был быстрый и автономный хост для картинок канала — без лишней магии и с контролем загрузки. Rustypaste закрыл все пункты.</p>

<h3 id="как-подняли-lxc-systemd-caddy">Как подняли: LXC + systemd + Caddy</h3>
<ul><li>Отдельный контейнер (LXC) во внутренней сети сервисов <code>198.51.100.0/24</code>, порт <code>8000</code>.</li>
<li>Снаружи — поддомен <code>paste.example</code> через Caddy <code>reverse_proxy</code>. Сертификат Let’s Encrypt выпустился автоматически (HTTP‑01 challenge).</li>
<li>Загрузка разрешена только с токеном в заголовке <code>Authorization</code>. Отдача — публичная, с корректным <code>Content-Type</code> (например, <code>image/png</code>).</li></ul>

<h4 id="systemd-юнит">systemd-юнит</h4>

<p>Создаём пользователя и юнит:</p>

<pre><code class="language-bash"># один раз

![Обложка](https://paste.clr58.ru/post-rustypaste-cover-digclean.jpg)

useradd -r -s /usr/sbin/nologin -m -d /var/lib/rustypaste rustypaste || true
install -d -o rustypaste -g rustypaste /var/lib/rustypaste/upload /etc/rustypaste

cat &gt;/etc/systemd/system/rustypaste.service &lt;&lt;&#39;UNIT&#39;
[Unit]
Description=Rustypaste service
After=network-online.target
Wants=network-online.target

[Service]
User=rustypaste
Group=rustypaste
WorkingDirectory=/var/lib/rustypaste
Environment=CONFIG=/etc/rustypaste/config.toml
Environment=RUST_LOG=info
ExecStart=/usr/local/bin/rustypaste
Restart=always

[Install]
WantedBy=multi-user.target
UNIT

systemctl daemon-reload
systemctl enable --now rustypaste
</code></pre>

<h4 id="конфиг-rustypaste-etc-rustypaste-config-toml">Конфиг rustypaste (<code>/etc/rustypaste/config.toml</code>)</h4>

<blockquote><p>Важно: ниже используются документные диапазоны (RFC 5737) и заглушки — подставьте свой поддомен/пути/токены. Для heredoc используйте литеральный режим <code>&lt;&lt;&#39;TOML&#39;</code> — это спасает от «съедания» бэкслешей.</p></blockquote>

<pre><code class="language-bash">cat &gt; /etc/rustypaste/config.toml &lt;&lt;&#39;TOML&#39;
[server]
address = &#34;198.51.100.42:8000&#34;        # LXC во внутренней сети
url = &#34;https://paste.example&#34;         # внешний адрес за Caddy
upload_path = &#34;/var/lib/rustypaste/upload&#34;
auth_tokens = [&#34;&lt;PASTE_UPLOAD_TOKEN&gt;&#34;]
expose_version = false
hardening = true

[paste]
# Расширение по умолчанию для текстов без явного имени
default_extension = &#34;txt&#34;
# Переопределения MIME по regex — используйте литеральные строки (одинарные кавычки)
mime_override = [
  { mime = &#39;image/png&#39;,  regex = &#39;^.*\.png$&#39; },
  { mime = &#39;image/jpeg&#39;, regex = &#39;^.*\.(jpg|jpeg)$&#39; },
  { mime = &#39;image/gif&#39;,  regex = &#39;^.*\.gif$&#39; }
]
# Что принудительно отдавать как text/plain (для предпросмотра)
text_mime_overrides = [&#34;text/markdown&#34;, &#34;application/json&#34;]
TOML

chown -R rustypaste:rustypaste /etc/rustypaste /var/lib/rustypaste
systemctl restart rustypaste
</code></pre>

<h4 id="caddy-reverse-proxy">Caddy <code>reverse_proxy</code></h4>

<p>Минимальный сайт‑блок:</p>

<pre><code class="language-caddy">paste.example {
  encode zstd gzip
  reverse_proxy 198.51.100.42:8000
}
</code></pre>

<p>Caddy сам пройдёт HTTP‑01 и выпустит сертификат для <code>paste.example</code>.</p>

<h4 id="загрузка-и-проверка">Загрузка и проверка</h4>

<pre><code class="language-bash"># Без токена — 401 Unauthorized
curl -fsS -F &#34;file=@x.png&#34; https://paste.clr58.ru/ || echo &#34;→ 401 as expected&#34;

# С токеном — получаем ссылку вида https://paste.clr58.ru/&lt;имя&gt;.png
curl -fsS -H &#34;Authorization: &lt;PASTE_UPLOAD_TOKEN&gt;&#34; -F &#34;file=@x.png&#34; https://paste.clr58.ru/
</code></pre>

<p>Пакетная переливка картинок (пример):</p>

<pre><code class="language-bash">for f in ./images/*; do
  curl -s -H &#34;Authorization: &lt;PASTE_UPLOAD_TOKEN&gt;&#34; -F &#34;file=@$f&#34; https://paste.clr58.ru/ &gt;&gt; uploaded_urls.txt
  echo &gt;&gt; uploaded_urls.txt
done
</code></pre>

<h3 id="грабли-на-которые-наступили">Грабли, на которые наступили</h3>

<p>1) TOML + regex: «TOML parse error: missing escaped value». Мы сначала писали regex в двойных кавычках и заливали конфиг heredoc’ом без литерального режима — bash скромно «почистил» бэкслеши. Лечение: либо heredoc с <code>&lt;&lt;&#39;TOML&#39;</code>, либо TOML‑строки в одинарных кавычках (литеральные), как в примере выше.</p>

<p>2) «config.toml is not found» и цикл рестартов. Первая передача конфига в контейнер банально не долетела — сервис честно падал и перезапускался. Проверяйте, что файл реально на месте и виден пользователю сервиса: <code>ls -l /etc/rustypaste/config.toml</code> и права на каталог.</p>

<h3 id="итог-картинки-вернулись-домой">Итог: картинки вернулись домой</h3>
<ul><li>Свой paste на <code>rustypaste</code> избавил нас от капризов чужого CDN.</li>
<li>Загрузка защищена токеном, отдача идёт с правильным MIME.</li>
<li>Перелили архив картинок и пересобрали посты — читатели снова видят иллюстрации.</li></ul>

<blockquote><p>Робот‑дворник доволен: меньше мусора из внешних зависимостей — больше чистых дорожек в контент‑плане.</p></blockquote>

<h3 id="ссылки">Ссылки</h3>
<ul><li>Репозиторий: <a href="https://github.com/orhun/rustypaste">https://github.com/orhun/rustypaste</a></li>
<li>Релизы: <a href="https://github.com/orhun/rustypaste/releases">https://github.com/orhun/rustypaste/releases</a></li></ul>

<p><a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</span></a> <a href="https://articles.clr58.ru/tag:lifehacks" class="hashtag"><span>#</span><span class="p-category">lifehacks</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/rustypaste</guid>
      <pubDate>Fri, 28 Aug 2026 12:15:05 +0000</pubDate>
    </item>
    <item>
      <title>Свой блог без лишней боли: почему мы выбрали WriteFreely и что с Instant View</title>
      <link>https://articles.clr58.ru/writefreely</link>
      <description>&lt;![CDATA[Робот-дворник собирает статьи в своём блоге&#xA;&#xA;1) Боль: хватит жить на чужом Telegraph&#xA;&#xA;Telegraph классный для быстрых заметок, но это чужой сервис. Нет контроля над доменом, нет нормального RSS, картинки лежат «где-то там», а аналитику нельзя встроить. Для «Цифрового дворника» хотелось полноценный блог, которым мы управляем сами.&#xA;&#xA;2) Что хотели от платформы&#xA;&#xA;self-hosted без внешних SaaS;&#xA;Markdown-редактор;&#xA;один Go-бинарник + SQLite (без MySQL/PostgreSQL);&#xA;single-user режим и аскетичный UI без отвлекающих «порталов»;&#xA;HTTPS через Caddy (Let&#39;s Encrypt);&#xA;картинки — на своём paste-хостинге (paste.example.ru);&#xA;каталог по тегам и RSS из коробки;&#xA;веб-аналитика Umami (umami.example.ru);&#xA;в Telegram-канал — только превью с обложкой и аннотацией, читать — на сайте (articles.example.ru).&#xA;&#xA;3) Альтернативы и почему не они (кратко)&#xA;&#xA;Ghost — мощно, но стек Node + внешняя БД, тяжеловато ради одного блога.&#xA;WordPress — перебор по функциональности и операционным хлопотам.&#xA;Hugo/Jekyll — требуют сборки/деплоя, нет живого редактора в браузере.&#xA;Notion/Obsidian Publish — не self-hosted и/или платно/закрыто.&#xA;Telegraph — оставили запасным вариантом для набросков, но не для основного блога.&#xA;&#xA;Выбор платформы: тяжёлые комбайны против маленького бинарника&#xA;&#xA;4) Почему WriteFreely&#xA;&#xA;один бинарник на Go;&#xA;хранение в SQLite;&#xA;single-user режим, минимализм;&#xA;Markdown и RSS из коробки;&#xA;есть HTTP API для автопубликации из пайплайна.&#xA;&#xA;5) Как ставили (кратко)&#xA;&#xA;LXC-контейнер с systemd и выделенным пользователем приложения;&#xA;сервис writefreely.service, автозапуск и перезапуск при падениях;&#xA;Caddy как reverse_proxy перед приложением + автоматический Let&#39;s Encrypt;&#xA;регистрация и федерация отключены (single-user блог без чужих аккаунтов).&#xA;&#xA;6) Грабли по пути — только то, что реально встретили&#xA;&#xA;writefreely --config — это интерактивный конфигуратор, а не путь к файлу. В юните systemd нужен флаг -c /opt/writefreely/config.ini, иначе сервис «уходит» в диалоговый режим и не стартует.&#xA;Бинд на 127.0.0.1 + reverse proxy с другого хоста = 502. Если прокси живёт вне контейнера с приложением, слушаем внутренний IP (например, 10.0.x.x:8080), а в Caddy проксируем именно на него, а не на loopback.&#xA;API v0.17.2 игнорирует поле appearance (режим тизеров на главной). Пришлось сделать анонсы чистым CSS (ограничение высоты + затухание), без участия API.&#xA;&#xA;7) Что не получилось пока — Instant View&#xA;&#xA;Встроенный редактор Telegram (instantview.telegram.org) сейчас не может забрать страницу блога из РФ: «Can&#39;t fetch page». Внешний входящий трафик на 80/443 до лабы режется, а IV-редактор ходит снаружи, поэтому он банально не видит наш сайт. Сам шаблон (XPath) готов и лежит в проекте — как только появится доступ снаружи (или настроим прокси), подключим IV и вернём красивый ⚡️-превью в канале. Это ограничение сети, а не блога.&#xA;&#xA;Instant View: дверь пока заперта, превью отложено&#xA;&#xA;8) Итог&#xA;&#xA;Теперь у нас свой аккуратный блог на articles.example.ru, а в Telegram остаются лаконичные превью. Картинки — с нашего paste.example.ru, каталог — по тегам, RSS работает, аналитику даёт umami.example.ru. Минимум движущихся частей, максимум контроля.&#xA;&#xA;#selfhosting #openclaw #lifehacks&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-writefreely-cover.jpg" alt="Робот-дворник собирает статьи в своём блоге"></p>

<h2 id="1-боль-хватит-жить-на-чужом-telegraph">1) Боль: хватит жить на чужом Telegraph</h2>

<p>Telegraph классный для быстрых заметок, но это чужой сервис. Нет контроля над доменом, нет нормального RSS, картинки лежат «где-то там», а аналитику нельзя встроить. Для «Цифрового дворника» хотелось полноценный блог, которым мы управляем сами.</p>

<h2 id="2-что-хотели-от-платформы">2) Что хотели от платформы</h2>
<ul><li>self-hosted без внешних SaaS;</li>
<li>Markdown-редактор;</li>
<li>один Go-бинарник + SQLite (без MySQL/PostgreSQL);</li>
<li>single-user режим и аскетичный UI без отвлекающих «порталов»;</li>
<li>HTTPS через Caddy (Let&#39;s Encrypt);</li>
<li>картинки — на своём paste-хостинге (paste.example.ru);</li>
<li>каталог по тегам и RSS из коробки;</li>
<li>веб-аналитика Umami (umami.example.ru);</li>
<li>в Telegram-канал — только превью с обложкой и аннотацией, читать — на сайте (articles.example.ru).</li></ul>

<h2 id="3-альтернативы-и-почему-не-они-кратко">3) Альтернативы и почему не они (кратко)</h2>
<ul><li><strong>Ghost</strong> — мощно, но стек Node + внешняя БД, тяжеловато ради одного блога.</li>
<li><strong>WordPress</strong> — перебор по функциональности и операционным хлопотам.</li>
<li><strong>Hugo/Jekyll</strong> — требуют сборки/деплоя, нет живого редактора в браузере.</li>
<li><strong>Notion/Obsidian Publish</strong> — не self-hosted и/или платно/закрыто.</li>
<li><strong>Telegraph</strong> — оставили запасным вариантом для набросков, но не для основного блога.</li></ul>

<p><img src="https://paste.clr58.ru/post-writefreely-ins-1.jpg" alt="Выбор платформы: тяжёлые комбайны против маленького бинарника"></p>

<h2 id="4-почему-writefreely">4) Почему WriteFreely</h2>
<ul><li>один бинарник на Go;</li>
<li>хранение в SQLite;</li>
<li>single-user режим, минимализм;</li>
<li>Markdown и RSS из коробки;</li>
<li>есть HTTP API для автопубликации из пайплайна.</li></ul>

<h2 id="5-как-ставили-кратко">5) Как ставили (кратко)</h2>
<ul><li>LXC-контейнер с systemd и выделенным пользователем приложения;</li>
<li>сервис writefreely.service, автозапуск и перезапуск при падениях;</li>
<li>Caddy как reverse_proxy перед приложением + автоматический Let&#39;s Encrypt;</li>
<li>регистрация и федерация отключены (single-user блог без чужих аккаунтов).</li></ul>

<h2 id="6-грабли-по-пути-только-то-что-реально-встретили">6) Грабли по пути — только то, что реально встретили</h2>
<ul><li><code>writefreely --config</code> — это интерактивный конфигуратор, а не путь к файлу. В юните systemd нужен флаг <code>-c /opt/writefreely/config.ini</code>, иначе сервис «уходит» в диалоговый режим и не стартует.</li>
<li>Бинд на <code>127.0.0.1</code> + reverse proxy с другого хоста = 502. Если прокси живёт вне контейнера с приложением, слушаем внутренний IP (например, <code>10.0.x.x:8080</code>), а в Caddy проксируем именно на него, а не на loopback.</li>
<li>API v0.17.2 игнорирует поле <code>appearance</code> (режим тизеров на главной). Пришлось сделать анонсы чистым CSS (ограничение высоты + затухание), без участия API.</li></ul>

<h2 id="7-что-не-получилось-пока-instant-view">7) Что не получилось пока — Instant View</h2>

<p>Встроенный редактор Telegram (instantview.telegram.org) сейчас не может забрать страницу блога из РФ: «Can&#39;t fetch page». Внешний входящий трафик на 80/443 до лабы режется, а IV-редактор ходит снаружи, поэтому он банально не видит наш сайт. Сам шаблон (XPath) готов и лежит в проекте — как только появится доступ снаружи (или настроим прокси), подключим IV и вернём красивый ⚡️-превью в канале. Это ограничение сети, а не блога.</p>

<p><img src="https://paste.clr58.ru/post-writefreely-ins-2.jpg" alt="Instant View: дверь пока заперта, превью отложено"></p>

<h2 id="8-итог">8) Итог</h2>

<p>Теперь у нас свой аккуратный блог на articles.example.ru, а в Telegram остаются лаконичные превью. Картинки — с нашего paste.example.ru, каталог — по тегам, RSS работает, аналитику даёт umami.example.ru. Минимум движущихся частей, максимум контроля.</p>

<p><a href="https://articles.clr58.ru/tag:selfhosting" class="hashtag"><span>#</span><span class="p-category">selfhosting</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:lifehacks" class="hashtag"><span>#</span><span class="p-category">lifehacks</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/writefreely</guid>
      <pubDate>Thu, 13 Aug 2026 15:06:04 +0000</pubDate>
    </item>
    <item>
      <title>Пагинация в терминале: как не притащить мусор в конфиг</title>
      <link>https://articles.clr58.ru/pagination-terminal</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Есть такой классический сетевой ритуал: зайти на железку, снять конфиг, сохранить в файл, потом когда-нибудь использовать его для восстановления или сверки.&#xA;&#xA;Звучит просто.  &#xA;Но есть один нюанс, который регулярно портит людям жизнь: пагинация в терминале.&#xA;&#xA;Это когда устройство не вываливает весь конфиг сразу, а показывает его кусками:&#xA;&#xA;--More--&#xA;&#xA;или:&#xA;&#xA;....press ENTER to next line, CTRLC to break, other key to next page....&#xA;&#xA;На экране это выглядит нормально: нажал Enter или Space, поехали дальше.  &#xA;А вот если в этот момент логируется сессия или копируется вывод, эта служебная строка может попасть прямо в файл с конфигом.&#xA;&#xA;Потом кто-то берёт этот файл, вставляет обратно в устройство, и железка начинает честно выполнять вот это:&#xA;&#xA;....press ENTER to next line....&#xA;&#xA;Спойлер: такой команды обычно нет.&#xA;&#xA;В итоге получаем:&#xA;&#xA;% Unrecognized command, and error detected at &#39;^&#39; marker.&#xA;&#xA;и небольшую экскурсию в мир грусти.&#xA;&#xA;---&#xA;&#xA;Главное правило&#xA;&#xA;Перед снятием большого конфига нужно отключить постраничный вывод.&#xA;&#xA;Пагинация — это не часть конфигурации.  &#xA;Это мусор интерфейса терминала, который очень убедительно притворяется командами.&#xA;&#xA;---&#xA;&#xA;Huawei / Huawei-like GPON / коммутаторы&#xA;&#xA;Для Huawei и похожих CLI обычно помогает:&#xA;&#xA;screen-length 0 temporary&#xA;display current-configuration&#xA;&#xA;или, если на конкретной модели команда короче:&#xA;&#xA;screen-length 0 temporary&#xA;display current-config&#xA;&#xA;Ключевое слово здесь — temporary.  &#xA;Оно отключает пагинацию только на текущую сессию, без изменения постоянных настроек.&#xA;&#xA;---&#xA;&#xA;Cisco IOS / IOS-XE&#xA;&#xA;terminal length 0&#xA;show running-config&#xA;&#xA;После этого конфиг выводится целиком, без --More--.&#xA;&#xA;---&#xA;&#xA;Cisco ASA&#xA;&#xA;terminal pager 0&#xA;show running-config&#xA;&#xA;На ASA используется именно terminal pager 0, а не terminal length 0.&#xA;&#xA;---&#xA;&#xA;Juniper JunOS&#xA;&#xA;Можно отключить длину экрана в CLI:&#xA;&#xA;set cli screen-length 0&#xA;show configuration&#xA;&#xA;Или использовать вариант на одну команду:&#xA;&#xA;show configuration | no-more&#xA;&#xA;Второй способ удобен, когда не хочется менять параметры текущей CLI-сессии.&#xA;&#xA;---&#xA;&#xA;MikroTik RouterOS&#xA;&#xA;Обычно экспорт нормально уходит без классической терминальной пагинации:&#xA;&#xA;/export&#xA;&#xA;Для более компактного вывода:&#xA;&#xA;/export terse&#xA;&#xA;Если надо сохранить сразу в файл на самом устройстве:&#xA;&#xA;/export file=backup&#xA;&#xA;Потом файл можно скачать с роутера.&#xA;&#xA;---&#xA;&#xA;Eltex / Edge-Core / D-Link и похожие CLI&#xA;&#xA;Тут всё зависит от модели и версии прошивки. Часто встречаются варианты:&#xA;&#xA;terminal length 0&#xA;&#xA;terminal datadump&#xA;&#xA;disable clipaging&#xA;&#xA;После этого уже:&#xA;&#xA;show running-config&#xA;&#xA;или аналогичная команда просмотра конфигурации.&#xA;&#xA;Если команда не сработала — лучше посмотреть ? в CLI, потому что у одного и того же вендора синтаксис может отличаться от линейки к линейке.&#xA;&#xA;---&#xA;&#xA;Linux-серверы и системные команды&#xA;&#xA;На Linux проблема обычно не в сетевом CLI, а в pager’ах вроде less.&#xA;&#xA;Для systemctl:&#xA;&#xA;systemctl --no-pager status nginx&#xA;&#xA;Для journalctl:&#xA;&#xA;journalctl --no-pager -u nginx&#xA;&#xA;Можно принудительно заменить pager на cat:&#xA;&#xA;PAGER=cat команда&#xA;&#xA;---&#xA;&#xA;Что чистить, если уже попало&#xA;&#xA;Если конфиг уже снят с мусором, ищем и удаляем строки вида:&#xA;&#xA;--More--&#xA;&#xA;---- More ----&#xA;&#xA;....press ENTER to next line, CTRLC to break, other key to next page....&#xA;&#xA;А также управляющие хвосты терминала, которые могут выглядеть как странные символы или ANSI-последовательности.&#xA;&#xA;Перед применением такого конфига лучше хотя бы быстро поискать:&#xA;&#xA;grep -Ei &#34;more|press ENTER|next page|CTRL_C&#34; backup.cfg&#xA;&#xA;Если что-то нашлось — это не конфиг, это привет от терминала.&#xA;&#xA;---&#xA;&#xA;Мини-чек-лист перед сохранением конфига&#xA;&#xA;[ ] Отключили пагинацию.&#xA;[ ] Сняли конфиг.&#xA;[ ] Проверили, что нет --More--, press ENTER, next page.&#xA;[ ] Сохранили оригинальный файл.&#xA;[ ] Для восстановления используем очищенный файл.&#xA;[ ] Не удаляем служебные команды типа commit / quit, если они являются частью CLI-логики устройства.&#xA;&#xA;Особенно это важно на устройствах, где конфиг состоит из профилей. Например, на Huawei GPON внутри line-profile, vlan-profile, rule-profile, specific-profile команды commit и quit могут быть не мусором, а нормальной частью применения настроек.&#xA;&#xA;---&#xA;&#xA;Короткий вывод&#xA;&#xA;Отключить пагинацию — это 5 секунд.&#xA;&#xA;Не отключить — это потом полчаса смотреть на:&#xA;&#xA;% Unrecognized command&#xA;&#xA;и думать, почему железка пытается выполнить человеческую просьбу «press ENTER to next line».&#xA;&#xA;---&#xA;&#xA;#network #lifehacks&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-pagination-cover.png" alt="Обложка"></p>

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

<p>Звучит просто.<br>
Но есть один нюанс, который регулярно портит людям жизнь: <strong>пагинация в терминале</strong>.</p>

<p>Это когда устройство не вываливает весь конфиг сразу, а показывает его кусками:</p>

<pre><code class="language-text">--More--
</code></pre>

<p>или:</p>

<pre><code class="language-text">....press ENTER to next line, CTRL_C to break, other key to next page....
</code></pre>

<p>На экране это выглядит нормально: нажал Enter или Space, поехали дальше.<br>
А вот если в этот момент логируется сессия или копируется вывод, эта служебная строка может попасть прямо в файл с конфигом.</p>

<p>Потом кто-то берёт этот файл, вставляет обратно в устройство, и железка начинает честно выполнять вот это:</p>

<pre><code class="language-text">....press ENTER to next line....
</code></pre>

<p>Спойлер: такой команды обычно нет.</p>

<p>В итоге получаем:</p>

<pre><code class="language-text">% Unrecognized command, and error detected at &#39;^&#39; marker.
</code></pre>

<p>и небольшую экскурсию в мир грусти.</p>

<hr>

<h2 id="главное-правило">Главное правило</h2>

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

<p>Пагинация — это не часть конфигурации.<br>
Это мусор интерфейса терминала, который очень убедительно притворяется командами.</p>

<hr>

<h2 id="huawei-huawei-like-gpon-коммутаторы">Huawei / Huawei-like GPON / коммутаторы</h2>

<p>Для Huawei и похожих CLI обычно помогает:</p>

<pre><code class="language-text">screen-length 0 temporary
display current-configuration
</code></pre>

<p>или, если на конкретной модели команда короче:</p>

<pre><code class="language-text">screen-length 0 temporary
display current-config
</code></pre>

<p>Ключевое слово здесь — <code>temporary</code>.<br>
Оно отключает пагинацию только на текущую сессию, без изменения постоянных настроек.</p>

<hr>

<h2 id="cisco-ios-ios-xe">Cisco IOS / IOS-XE</h2>

<pre><code class="language-text">terminal length 0
show running-config
</code></pre>

<p>После этого конфиг выводится целиком, без <code>--More--</code>.</p>

<hr>

<h2 id="cisco-asa">Cisco ASA</h2>

<pre><code class="language-text">terminal pager 0
show running-config
</code></pre>

<p>На ASA используется именно <code>terminal pager 0</code>, а не <code>terminal length 0</code>.</p>

<hr>

<h2 id="juniper-junos">Juniper JunOS</h2>

<p>Можно отключить длину экрана в CLI:</p>

<pre><code class="language-text">set cli screen-length 0
show configuration
</code></pre>

<p>Или использовать вариант на одну команду:</p>

<pre><code class="language-text">show configuration | no-more
</code></pre>

<p>Второй способ удобен, когда не хочется менять параметры текущей CLI-сессии.</p>

<hr>

<h2 id="mikrotik-routeros">MikroTik RouterOS</h2>

<p>Обычно экспорт нормально уходит без классической терминальной пагинации:</p>

<pre><code class="language-text">/export
</code></pre>

<p>Для более компактного вывода:</p>

<pre><code class="language-text">/export terse
</code></pre>

<p>Если надо сохранить сразу в файл на самом устройстве:</p>

<pre><code class="language-text">/export file=backup
</code></pre>

<p>Потом файл можно скачать с роутера.</p>

<hr>

<h2 id="eltex-edge-core-d-link-и-похожие-cli">Eltex / Edge-Core / D-Link и похожие CLI</h2>

<p>Тут всё зависит от модели и версии прошивки. Часто встречаются варианты:</p>

<pre><code class="language-text">terminal length 0
</code></pre>

<pre><code class="language-text">terminal datadump
</code></pre>

<pre><code class="language-text">disable clipaging
</code></pre>

<p>После этого уже:</p>

<pre><code class="language-text">show running-config
</code></pre>

<p>или аналогичная команда просмотра конфигурации.</p>

<p>Если команда не сработала — лучше посмотреть <code>?</code> в CLI, потому что у одного и того же вендора синтаксис может отличаться от линейки к линейке.</p>

<hr>

<h2 id="linux-серверы-и-системные-команды">Linux-серверы и системные команды</h2>

<p>На Linux проблема обычно не в сетевом CLI, а в pager’ах вроде <code>less</code>.</p>

<p>Для <code>systemctl</code>:</p>

<pre><code class="language-bash">systemctl --no-pager status nginx
</code></pre>

<p>Для <code>journalctl</code>:</p>

<pre><code class="language-bash">journalctl --no-pager -u nginx
</code></pre>

<p>Можно принудительно заменить pager на <code>cat</code>:</p>

<pre><code class="language-bash">PAGER=cat команда
</code></pre>

<hr>

<h2 id="что-чистить-если-уже-попало">Что чистить, если уже попало</h2>

<p>Если конфиг уже снят с мусором, ищем и удаляем строки вида:</p>

<pre><code class="language-text">--More--
</code></pre>

<pre><code class="language-text">---- More ----
</code></pre>

<pre><code class="language-text">....press ENTER to next line, CTRL_C to break, other key to next page....
</code></pre>

<p>А также управляющие хвосты терминала, которые могут выглядеть как странные символы или ANSI-последовательности.</p>

<p>Перед применением такого конфига лучше хотя бы быстро поискать:</p>

<pre><code class="language-bash">grep -Ei &#34;more|press ENTER|next page|CTRL_C&#34; backup.cfg
</code></pre>

<p>Если что-то нашлось — это не конфиг, это привет от терминала.</p>

<hr>

<h2 id="мини-чек-лист-перед-сохранением-конфига">Мини-чек-лист перед сохранением конфига</h2>
<ul><li>[ ] Отключили пагинацию.</li>
<li>[ ] Сняли конфиг.</li>
<li>[ ] Проверили, что нет <code>--More--</code>, <code>press ENTER</code>, <code>next page</code>.</li>
<li>[ ] Сохранили оригинальный файл.</li>
<li>[ ] Для восстановления используем очищенный файл.</li>
<li>[ ] Не удаляем служебные команды типа <code>commit</code> / <code>quit</code>, если они являются частью CLI-логики устройства.</li></ul>

<p>Особенно это важно на устройствах, где конфиг состоит из профилей. Например, на Huawei GPON внутри <code>line-profile</code>, <code>vlan-profile</code>, <code>rule-profile</code>, <code>specific-profile</code> команды <code>commit</code> и <code>quit</code> могут быть не мусором, а нормальной частью применения настроек.</p>

<hr>

<h2 id="короткий-вывод">Короткий вывод</h2>

<p>Отключить пагинацию — это 5 секунд.</p>

<p>Не отключить — это потом полчаса смотреть на:</p>

<pre><code class="language-text">% Unrecognized command
</code></pre>

<p>и думать, почему железка пытается выполнить человеческую просьбу «press ENTER to next line».</p>

<hr>

<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:lifehacks" class="hashtag"><span>#</span><span class="p-category">lifehacks</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/pagination-terminal</guid>
      <pubDate>Thu, 13 Aug 2026 14:23:13 +0000</pubDate>
    </item>
    <item>
      <title>Один бухгалтер — несколько организаций: делаем отдельный рабочий контур через VPS</title>
      <link>https://articles.clr58.ru/accounting-gateway</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;В предыдущих публикациях мы поставили OpenClaw на сервер с помощью Cursor, подключили DeepSeek и Telegram, дали помощнику память и правила работы, а в финале собрали готовые промпты и практические подсказки. Всё это было подготовкой. Теперь перейдём к задаче, которую действительно можно встретить в обычном офисе.&#xA;&#xA;У нас есть бухгалтер, обслуживающий несколько организаций. Он может работать в одном кабинете, за одним компьютером и через одно подключение к интернету. Технически все действия будут выходить наружу с одного IP-адреса.&#xA;&#xA;Сам по себе общий IP ничего не доказывает. В одном бизнес-центре за одним адресом могут находиться десятки независимых компаний. Бухгалтерский аутсорсинг тоже является нормальной деятельностью. Но ФНС рассматривает совпадение IP вместе с общим бухгалтером, общими контактами и единым управлением как один из возможных индикаторов дробления бизнеса. Поэтому лучше не маскировать цифровой след, а сделать его понятным и объяснимым.&#xA;&#xA;Врезка: общий IP&#xA;&#xA;Наша цель — создать для каждой организации отдельный рабочий контур с закреплённым выходным адресом, индивидуальными пользователями и нормальным журналом доступа.&#xA;&#xA;Сначала важный дисклеймер&#xA;&#xA;VPS, VPN, VDI, API и AI-агенты являются обычными техническими инструментами. Законность их применения определяется не названием программы, а целью, полномочиями пользователей и выполняемыми действиями.&#xA;&#xA;Описанные ниже схемы нельзя использовать, чтобы:&#xA;&#xA;скрывать фактическое единое управление организациями или незаконное дробление бизнеса;&#xA;вводить в заблуждение ФНС, банки, государственные информационные системы или электронные площадки;&#xA;координировать заявки формально независимых участников закупки или скрывать антиконкурентное соглашение;&#xA;обходить банковский антифрод, требования финансового мониторинга или установленные законом ограничения;&#xA;работать с чужой квалифицированной электронной подписью, банк-клиентом, Госуслугами или личным кабинетом без оформленных полномочий;&#xA;получать несанкционированный доступ к информационным системам;&#xA;скрывать источник вредоносного трафика, атак, мошенничества или иных противоправных действий;&#xA;обрабатывать персональные данные и коммерческую тайну без законного основания и необходимых мер защиты.&#xA;&#xA;Разные IP-адреса не доказывают независимость компаний и не превращают незаконную деятельность в законную. Здесь мы решаем другую задачу: нормально разделяем инфраструктуру организаций, которые действительно ведут самостоятельную деятельность.&#xA;&#xA;Вариант первый: обычный VPS без всякого AI&#xA;&#xA;Самая простая схема выглядит так.&#xA;&#xA;Организация регистрирует аккаунт у хостинг-провайдера, заключает договор и оплачивает небольшой VPS. На сервере поднимается VPN-шлюз либо полноценное удалённое рабочее место.&#xA;&#xA;Почему лучше оформлять аккаунт и договор на ту организацию, которая будет использовать сервер? Потому что тогда происхождение IP легко объясняется документами: есть клиент хостинга, договор, счета, платежи и конкретный корпоративный ресурс.&#xA;&#xA;Это не единственная законная модель. Например, бухгалтерская компания может сама предоставлять клиентам защищённые рабочие места. Но тогда такая услуга должна быть прямо описана в договоре, а внутри инфраструктуры всё равно необходимо разделить клиентов. Плохой вариант — купить VPS на частное лицо или бухгалтера, а затем делать вид, что сервер принадлежит обслуживаемой организации.&#xA;&#xA;Врезка: варианты схем&#xA;&#xA;VPN-шлюз&#xA;&#xA;Для VPN подойдёт недорогой Linux-VPS с публичным IPv4-адресом. Бухгалтер подключается к VPN перед работой с конкретной организацией, и её интернет-трафик выходит через адрес этого VPS.&#xA;&#xA;Плюсы:&#xA;&#xA;можно использовать самый младший тариф;&#xA;не требуется переносить все программы на сервер;&#xA;у организации появляется отдельный стабильный выходной IP;&#xA;доступ легко отозвать, удалив профиль конкретного пользователя.&#xA;&#xA;Но VPN разделяет только сетевой маршрут. Он не разделяет браузерные профили, файлы, сертификаты, cookies и учётные записи. Поэтому для каждой организации всё равно нужен отдельный профиль браузера, а лучше отдельная виртуальная машина на компьютере бухгалтера.&#xA;&#xA;VDI или удалённое рабочее место&#xA;&#xA;Второй вариант — развернуть на VPS полноценное рабочее место и подключаться к нему удалённо. VDI в данном случае можно понимать просто как отдельный виртуальный компьютер, на котором находятся браузер, бухгалтерские программы и документы конкретной организации.&#xA;&#xA;Такой вариант лучше изолирует данные, но стоит дороже. Для Windows могут потребоваться лицензии, больше памяти и процессорных ресурсов. Отдельно придётся проверить работу КЭП, КриптоПро, токенов и нужных плагинов. Поэтому самый дешёвый тариф обычно подходит для VPN-шлюза, но не всегда подходит для VDI.&#xA;&#xA;Врезка: VDI&#xA;&#xA;Сервер нельзя просто выставить в интернет&#xA;&#xA;Здесь часто совершают главную ошибку: создают Windows-сервер, открывают наружу RDP на порту 3389 и считают задачу законченной. Делать так не стоит.&#xA;&#xA;Минимальные требования выглядят следующим образом:&#xA;&#xA;доступ к VDI или RDP разрешается только через VPN либо защищённый шлюз с MFA;&#xA;межсетевой экран пропускает только необходимые порты;&#xA;SSH доступен только администратору, желательно с разрешённых адресов и только по ключу;&#xA;вход по паролю для root отключается после первоначальной настройки;&#xA;для бухгалтера создаётся отдельная учётная запись без административных прав;&#xA;каждому пользователю выдаётся отдельный VPN-профиль — один общий ключ на всех использовать не надо;&#xA;операционная система и приложения регулярно обновляются;&#xA;включаются резервное копирование и журналирование входов;&#xA;данные для подключения передаются через защищённый канал, а не обычным сообщением в общем чате.&#xA;&#xA;Бухгалтеру не нужны пароль root, панель управления хостингом или API-ключ. Ему выдаётся только персональный VPN-профиль либо собственная учётная запись удалённого рабочего места.&#xA;&#xA;И ещё один важный момент: отдельный IP не заменяет полномочия. Для сдачи электронной отчётности представителем используется МЧД, а сертификаты и доступы должны принадлежать тем лицам, которым они действительно выданы.&#xA;&#xA;Вариант второй: наш метод через OpenClaw или Cursor&#xA;&#xA;Теперь начинается то, ради чего мы устанавливали помощника.&#xA;&#xA;Регистрируем аккаунт на нужную организацию у хостинг-провайдера. В качестве примера — не рекламы — можно взять Timeweb Cloud или Fatmetal. У Timeweb Cloud есть публичный API и MCP-интеграция, а Fatmetal предоставляет MCP-сервер, через который агент может получать каталог тарифов, создавать VPS, узнавать их адреса и управлять состоянием серверов.&#xA;&#xA;Дальше создаём отдельный API-ключ. Не основной ключ от всей инфраструктуры, а отдельный токен для этой задачи. Если провайдер позволяет ограничить ключ проектом и набором операций, используем минимально необходимые права. Если ключ даёт доступ ко всему аккаунту, для каждой организации лучше иметь отдельный аккаунт или как минимум отдельный изолированный проект, а после развёртывания отозвать временный write-токен.&#xA;&#xA;Сам ключ не надо вставлять в текст запроса, отправлять в Telegram или сохранять в статье. Он подключается к Cursor через настройки MCP и переменные окружения, а в OpenClaw — через защищённую конфигурацию skill. В запросе агенту остаётся только имя нужного подключения.&#xA;&#xA;Документацию по API/MCP и правила работы мы даём помощнику вместе с понятным заданием.&#xA;&#xA;Врезка: MCP&#xA;&#xA;Пример задания помощнику&#xA;&#xA;Ты работаешь только в проекте ACCOUNTING-GATEWAY организации НАЗВАНИЕ.&#xA;&#xA;Сначала покажи:&#xA;какие инструменты API/MCP тебе доступны;&#xA;какой минимальный тариф подходит для VPN-шлюза;&#xA;регион размещения, наличие публичного IPv4 и итоговую ежемесячную стоимость;&#xA;какие ресурсы будут созданы и какие изменения выполнены.&#xA;&#xA;До отдельной команды «ПОДТВЕРЖДАЮ СОЗДАНИЕ» ничего не создавай.&#xA;&#xA;После подтверждения:&#xA;создай минимальный KVM VPS на поддерживаемой версии Ubuntu или Debian;&#xA;добавь SSH-ключ администратора и отключи вход root по паролю;&#xA;настрой облачный и локальный firewall: разреши только VPN-порт, а SSH — только с адреса ADMINIP;&#xA;установи self-hosted AmneziaVPN/AmneziaWG по официальной документации либо подготовь сервер для установки из приложения AmneziaVPN;&#xA;создай отдельные профили для администратора и каждого указанного пользователя;&#xA;не показывай приватные ключи в чате и не записывай их в журнал;&#xA;сохрани конфигурации в защищённый каталог с правами 0600;&#xA;проверь внешний IP через VPN и просканируй публичные порты;&#xA;выдай итоговый отчёт без секретов: провайдер, проект, ID сервера, тариф, стоимость, IP, открытые порты и список созданных пользователей.&#xA;&#xA;Не удаляй и не заменяй существующие серверы без отдельного подтверждения.&#xA;&#xA;AmneziaVPN специально рассчитана на установку собственного VPN на арендованный сервер. Официальное приложение может само подключиться к VPS по SSH и развернуть серверную часть. Поэтому помощнику необязательно изобретать собственный установочный скрипт: он может создать VPS, закрыть firewall и подготовить SSH-доступ, после чего администратор завершит установку через приложение.&#xA;&#xA;Можно ли автоматически менять VPS и IP&#xA;&#xA;Технически можно дать OpenClaw задание периодически создавать новый сервер, переносить конфигурацию и выдавать новые профили. Но для нашей задачи регулярная смена IP без причины — плохая идея.&#xA;&#xA;Стабильный адрес, закреплённый за организацией, проще объяснить. Частые входы с новых адресов хостинговых сетей могут привести к дополнительным подтверждениям со стороны банков и информационных систем. Кроме того, постоянная рассылка новых ключей повышает вероятность их утечки.&#xA;&#xA;Поэтому автоматическую миграцию стоит применять при понятном событии:&#xA;&#xA;отказе или закрытии старого VPS;&#xA;плановом переносе между площадками;&#xA;компрометации сервера или ключей;&#xA;попадании адреса в блок-лист;&#xA;невозможности продолжать работу у текущего провайдера.&#xA;&#xA;Во многих облаках можно пересоздать VPS, сохранив публичный IP. Например, Timeweb Cloud относит свои IPv4 к «плавающим»: адрес можно перенести между сервисами внутри аккаунта. Для корпоративного шлюза это обычно лучше, чем менять и сервер, и адрес одновременно.&#xA;&#xA;Если IP действительно требуется заменить, агент должен сначала создать и проверить новый контур, зафиксировать причину и старый/новый адрес, дождаться подтверждения администратора, безопасно передать новые индивидуальные профили и только после этого выводить старый сервер из эксплуатации. Рассылка VPN-ключей открытым текстом через Telegram или электронную почту в такой сценарий не входит.&#xA;&#xA;Превращаем процедуру в приватный skill OpenClaw&#xA;&#xA;Чтобы не писать большой запрос каждый раз, процедуру можно оформить в собственный skill. Skill в OpenClaw — это каталог с файлом SKILL.md, в котором описано, когда и как помощник должен выполнять задачу.&#xA;&#xA;Для инфраструктурной операции лучше сделать skill приватным, запускать его только явной командой и запретить модели вызывать его самостоятельно. Каркас может выглядеть так:&#xA;&#xA;---&#xA;name: accounting-gateway&#xA;description: Создание и контролируемая миграция VPN-шлюза организации через разрешённый MCP/API хостинга.&#xA;user-invocable: true&#xA;disable-model-invocation: true&#xA;metadata:&#xA;  openclaw:&#xA;    requires:&#xA;      env:&#xA;        HOSTINGAPITOKEN&#xA;---&#xA;&#xA;Accounting Gateway&#xA;&#xA;Работай только с организацией, аккаунтом и проектом, явно указанными пользователем.&#xA;&#xA;Перед началом обязательно запроси:&#xA;&#xA;название организации;&#xA;подтверждение полномочий на управление её инфраструктурой;&#xA;провайдера и проект;&#xA;допустимый бюджет;&#xA;регион;&#xA;административный IP;&#xA;список пользователей;&#xA;основание для создания или миграции.&#xA;&#xA;Сначала покажи план, стоимость и изменения. Для создания дождись точной фразы&#xA;«ПОДТВЕРЖДАЮ СОЗДАНИЕ». Для миграции — «ПОДТВЕРЖДАЮ МИГРАЦИЮ».&#xA;&#xA;Не выполняй плановую смену IP с целью скрытия источника действий, обхода контроля&#xA;или введения третьих лиц в заблуждение.&#xA;&#xA;Используй минимальный подходящий VPS, SSH-ключи, firewall и отдельный VPN-профиль&#xA;для каждого пользователя. Не публикуй секреты в чате и журналах.&#xA;&#xA;При миграции не удаляй старый сервер до проверки нового, подтверждения администратора&#xA;и фиксации причины, старого и нового IP.&#xA;&#xA;В финале выдай только несекретный отчёт: ID ресурсов, стоимость, IP, открытые порты,&#xA;результаты проверки и список пользователей без ключей.&#xA;&#xA;Файл можно предложить OpenClaw через Skill Workshop, проверить сформированный вариант и только после ревью применить. Это важнее, чем скачать случайный готовый skill из каталога: наш помощник получает реальный доступ к облаку, серверам и секретам.&#xA;&#xA;Что в результате получает бухгалтер&#xA;&#xA;После настройки бухгалтеру не надо знать, что такое API, MCP, cloud-init или таблица маршрутизации. У него остаётся простой порядок работы:&#xA;&#xA;выбрать организацию;&#xA;запустить её виртуальную машину или VPN-профиль;&#xA;войти под своей учётной записью;&#xA;выполнить работу;&#xA;отключиться.&#xA;&#xA;Для каждой организации используются собственные сетевой маршрут, внешний IP, браузерный профиль, полномочия и журнал доступа. Это удобнее для бухгалтера, безопаснее для компаний и гораздо легче объясняется, чем один общий компьютер с общей кучей токенов, паролей и открытых вкладок.&#xA;&#xA;Но важно помнить первоначальный принцип: мы не рисуем искусственную независимость там, где её нет. Мы создаём нормальные рабочие места для организаций, которые действительно являются самостоятельными и законно поручили бухгалтеру выполнять работу.&#xA;&#xA;Полезные ссылки&#xA;&#xA;Все 4 части гайда «Помощник по инфре за один вечер»: https://telegra.ph/Pomoshchnik-po-tvoej-infre-za-odin-vecher-i-5-Realno-08-12&#xA;&#xA;ФНС о совпадении IP, общем бухгалтере и других индикаторах дробления бизнеса: https://www.nalog.gov.ru/rn60/news/activitiesfts/16616815/&#xA;ФНС о МЧД при сдаче отчётности представителем: https://www.nalog.gov.ru/rn49/news/activities_fts/16621686/&#xA;API Timeweb Cloud: https://timeweb.cloud/api-docs&#xA;Timeweb Cloud MCP: https://timeweb.cloud/docs/ai-agents/timeweb-cloud-mcp&#xA;Настройка публичных IP Timeweb Cloud: https://timeweb.cloud/docs/cloud-servers/manage-servers/network&#xA;MCP-сервер Fatmetal: https://fatmetal.ru/mcp&#xA;Установка собственного VPN через AmneziaVPN: https://docs.amnezia.org/documentation/instructions/install-vpn-on-server/&#xA;Требования AmneziaVPN к VPS: https://docs.amnezia.org/documentation/supported-linux-os-for-vps/&#xA;Создание skills в OpenClaw: https://docs.openclaw.ai/tools/creating-skills&#xA;Подключение MCP в Cursor: https://cursor.com/docs/mcp&#xA;&#xA;#openclaw #lifehacks&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-accounting-cover.png" alt="Обложка"></p>

<p>В предыдущих публикациях мы <a href="https://t.me/digclean/26">поставили OpenClaw на сервер с помощью Cursor</a>, <a href="https://t.me/digclean/28">подключили DeepSeek и Telegram</a>, <a href="https://t.me/digclean/30">дали помощнику память и правила работы</a>, а в финале собрали <a href="https://t.me/digclean/33">готовые промпты и практические подсказки</a>. Всё это было подготовкой. Теперь перейдём к задаче, которую действительно можно встретить в обычном офисе.</p>

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

<p>Сам по себе общий IP ничего не доказывает. В одном бизнес-центре за одним адресом могут находиться десятки независимых компаний. Бухгалтерский аутсорсинг тоже является нормальной деятельностью. Но ФНС рассматривает совпадение IP вместе с общим бухгалтером, общими контактами и единым управлением как один из возможных индикаторов дробления бизнеса. Поэтому лучше не маскировать цифровой след, а сделать его понятным и объяснимым.</p>

<p><img src="https://paste.clr58.ru/post-accounting-ins-1.png" alt="Врезка: общий IP"></p>

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

<h2 id="сначала-важный-дисклеймер">Сначала важный дисклеймер</h2>

<p>VPS, VPN, VDI, API и AI-агенты являются обычными техническими инструментами. Законность их применения определяется не названием программы, а целью, полномочиями пользователей и выполняемыми действиями.</p>

<p>Описанные ниже схемы нельзя использовать, чтобы:</p>
<ul><li>скрывать фактическое единое управление организациями или незаконное дробление бизнеса;</li>
<li>вводить в заблуждение ФНС, банки, государственные информационные системы или электронные площадки;</li>
<li>координировать заявки формально независимых участников закупки или скрывать антиконкурентное соглашение;</li>
<li>обходить банковский антифрод, требования финансового мониторинга или установленные законом ограничения;</li>
<li>работать с чужой квалифицированной электронной подписью, банк-клиентом, Госуслугами или личным кабинетом без оформленных полномочий;</li>
<li>получать несанкционированный доступ к информационным системам;</li>
<li>скрывать источник вредоносного трафика, атак, мошенничества или иных противоправных действий;</li>
<li>обрабатывать персональные данные и коммерческую тайну без законного основания и необходимых мер защиты.</li></ul>

<p>Разные IP-адреса не доказывают независимость компаний и не превращают незаконную деятельность в законную. Здесь мы решаем другую задачу: нормально разделяем инфраструктуру организаций, которые действительно ведут самостоятельную деятельность.</p>

<h2 id="вариант-первый-обычный-vps-без-всякого-ai">Вариант первый: обычный VPS без всякого AI</h2>

<p>Самая простая схема выглядит так.</p>

<p>Организация регистрирует аккаунт у хостинг-провайдера, заключает договор и оплачивает небольшой VPS. На сервере поднимается VPN-шлюз либо полноценное удалённое рабочее место.</p>

<p>Почему лучше оформлять аккаунт и договор на ту организацию, которая будет использовать сервер? Потому что тогда происхождение IP легко объясняется документами: есть клиент хостинга, договор, счета, платежи и конкретный корпоративный ресурс.</p>

<p>Это не единственная законная модель. Например, бухгалтерская компания может сама предоставлять клиентам защищённые рабочие места. Но тогда такая услуга должна быть прямо описана в договоре, а внутри инфраструктуры всё равно необходимо разделить клиентов. Плохой вариант — купить VPS на частное лицо или бухгалтера, а затем делать вид, что сервер принадлежит обслуживаемой организации.</p>

<p><img src="https://paste.clr58.ru/post-accounting-ins-2.png" alt="Врезка: варианты схем"></p>

<h3 id="vpn-шлюз">VPN-шлюз</h3>

<p>Для VPN подойдёт недорогой Linux-VPS с публичным IPv4-адресом. Бухгалтер подключается к VPN перед работой с конкретной организацией, и её интернет-трафик выходит через адрес этого VPS.</p>

<p>Плюсы:</p>
<ul><li>можно использовать самый младший тариф;</li>
<li>не требуется переносить все программы на сервер;</li>
<li>у организации появляется отдельный стабильный выходной IP;</li>
<li>доступ легко отозвать, удалив профиль конкретного пользователя.</li></ul>

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

<h3 id="vdi-или-удалённое-рабочее-место">VDI или удалённое рабочее место</h3>

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

<p>Такой вариант лучше изолирует данные, но стоит дороже. Для Windows могут потребоваться лицензии, больше памяти и процессорных ресурсов. Отдельно придётся проверить работу КЭП, КриптоПро, токенов и нужных плагинов. Поэтому самый дешёвый тариф обычно подходит для VPN-шлюза, но не всегда подходит для VDI.</p>

<p><img src="https://paste.clr58.ru/post-accounting-ins-3.png" alt="Врезка: VDI"></p>

<h2 id="сервер-нельзя-просто-выставить-в-интернет">Сервер нельзя просто выставить в интернет</h2>

<p>Здесь часто совершают главную ошибку: создают Windows-сервер, открывают наружу RDP на порту 3389 и считают задачу законченной. Делать так не стоит.</p>

<p>Минимальные требования выглядят следующим образом:</p>
<ul><li>доступ к VDI или RDP разрешается только через VPN либо защищённый шлюз с MFA;</li>
<li>межсетевой экран пропускает только необходимые порты;</li>
<li>SSH доступен только администратору, желательно с разрешённых адресов и только по ключу;</li>
<li>вход по паролю для root отключается после первоначальной настройки;</li>
<li>для бухгалтера создаётся отдельная учётная запись без административных прав;</li>
<li>каждому пользователю выдаётся отдельный VPN-профиль — один общий ключ на всех использовать не надо;</li>
<li>операционная система и приложения регулярно обновляются;</li>
<li>включаются резервное копирование и журналирование входов;</li>
<li>данные для подключения передаются через защищённый канал, а не обычным сообщением в общем чате.</li></ul>

<p>Бухгалтеру не нужны пароль root, панель управления хостингом или API-ключ. Ему выдаётся только персональный VPN-профиль либо собственная учётная запись удалённого рабочего места.</p>

<p>И ещё один важный момент: отдельный IP не заменяет полномочия. Для сдачи электронной отчётности представителем используется МЧД, а сертификаты и доступы должны принадлежать тем лицам, которым они действительно выданы.</p>

<h2 id="вариант-второй-наш-метод-через-openclaw-или-cursor">Вариант второй: наш метод через OpenClaw или Cursor</h2>

<p>Теперь начинается то, ради чего мы устанавливали помощника.</p>

<p>Регистрируем аккаунт на нужную организацию у хостинг-провайдера. В качестве примера — не рекламы — можно взять Timeweb Cloud или Fatmetal. У Timeweb Cloud есть публичный API и MCP-интеграция, а Fatmetal предоставляет MCP-сервер, через который агент может получать каталог тарифов, создавать VPS, узнавать их адреса и управлять состоянием серверов.</p>

<p>Дальше создаём отдельный API-ключ. Не основной ключ от всей инфраструктуры, а отдельный токен для этой задачи. Если провайдер позволяет ограничить ключ проектом и набором операций, используем минимально необходимые права. Если ключ даёт доступ ко всему аккаунту, для каждой организации лучше иметь отдельный аккаунт или как минимум отдельный изолированный проект, а после развёртывания отозвать временный write-токен.</p>

<p>Сам ключ не надо вставлять в текст запроса, отправлять в Telegram или сохранять в статье. Он подключается к Cursor через настройки MCP и переменные окружения, а в OpenClaw — через защищённую конфигурацию skill. В запросе агенту остаётся только имя нужного подключения.</p>

<p>Документацию по API/MCP и правила работы мы даём помощнику вместе с понятным заданием.</p>

<p><img src="https://paste.clr58.ru/post-accounting-ins-4.png" alt="Врезка: MCP"></p>

<h3 id="пример-задания-помощнику">Пример задания помощнику</h3>

<pre><code class="language-text">Ты работаешь только в проекте ACCOUNTING-GATEWAY организации &lt;НАЗВАНИЕ&gt;.

Сначала покажи:
1. какие инструменты API/MCP тебе доступны;
2. какой минимальный тариф подходит для VPN-шлюза;
3. регион размещения, наличие публичного IPv4 и итоговую ежемесячную стоимость;
4. какие ресурсы будут созданы и какие изменения выполнены.

До отдельной команды «ПОДТВЕРЖДАЮ СОЗДАНИЕ» ничего не создавай.

После подтверждения:
- создай минимальный KVM VPS на поддерживаемой версии Ubuntu или Debian;
- добавь SSH-ключ администратора и отключи вход root по паролю;
- настрой облачный и локальный firewall: разреши только VPN-порт, а SSH — только с адреса &lt;ADMIN_IP&gt;;
- установи self-hosted AmneziaVPN/AmneziaWG по официальной документации либо подготовь сервер для установки из приложения AmneziaVPN;
- создай отдельные профили для администратора и каждого указанного пользователя;
- не показывай приватные ключи в чате и не записывай их в журнал;
- сохрани конфигурации в защищённый каталог с правами 0600;
- проверь внешний IP через VPN и просканируй публичные порты;
- выдай итоговый отчёт без секретов: провайдер, проект, ID сервера, тариф, стоимость, IP, открытые порты и список созданных пользователей.

Не удаляй и не заменяй существующие серверы без отдельного подтверждения.
</code></pre>

<p>AmneziaVPN специально рассчитана на установку собственного VPN на арендованный сервер. Официальное приложение может само подключиться к VPS по SSH и развернуть серверную часть. Поэтому помощнику необязательно изобретать собственный установочный скрипт: он может создать VPS, закрыть firewall и подготовить SSH-доступ, после чего администратор завершит установку через приложение.</p>

<h2 id="можно-ли-автоматически-менять-vps-и-ip">Можно ли автоматически менять VPS и IP</h2>

<p>Технически можно дать OpenClaw задание периодически создавать новый сервер, переносить конфигурацию и выдавать новые профили. Но для нашей задачи регулярная смена IP без причины — плохая идея.</p>

<p>Стабильный адрес, закреплённый за организацией, проще объяснить. Частые входы с новых адресов хостинговых сетей могут привести к дополнительным подтверждениям со стороны банков и информационных систем. Кроме того, постоянная рассылка новых ключей повышает вероятность их утечки.</p>

<p>Поэтому автоматическую миграцию стоит применять при понятном событии:</p>
<ul><li>отказе или закрытии старого VPS;</li>
<li>плановом переносе между площадками;</li>
<li>компрометации сервера или ключей;</li>
<li>попадании адреса в блок-лист;</li>
<li>невозможности продолжать работу у текущего провайдера.</li></ul>

<p>Во многих облаках можно пересоздать VPS, сохранив публичный IP. Например, Timeweb Cloud относит свои IPv4 к «плавающим»: адрес можно перенести между сервисами внутри аккаунта. Для корпоративного шлюза это обычно лучше, чем менять и сервер, и адрес одновременно.</p>

<p>Если IP действительно требуется заменить, агент должен сначала создать и проверить новый контур, зафиксировать причину и старый/новый адрес, дождаться подтверждения администратора, безопасно передать новые индивидуальные профили и только после этого выводить старый сервер из эксплуатации. Рассылка VPN-ключей открытым текстом через Telegram или электронную почту в такой сценарий не входит.</p>

<h2 id="превращаем-процедуру-в-приватный-skill-openclaw">Превращаем процедуру в приватный skill OpenClaw</h2>

<p>Чтобы не писать большой запрос каждый раз, процедуру можно оформить в собственный skill. Skill в OpenClaw — это каталог с файлом <code>SKILL.md</code>, в котором описано, когда и как помощник должен выполнять задачу.</p>

<p>Для инфраструктурной операции лучше сделать skill приватным, запускать его только явной командой и запретить модели вызывать его самостоятельно. Каркас может выглядеть так:</p>

<pre><code class="language-markdown">---
name: accounting-gateway
description: Создание и контролируемая миграция VPN-шлюза организации через разрешённый MCP/API хостинга.
user-invocable: true
disable-model-invocation: true
metadata:
  openclaw:
    requires:
      env:
        - HOSTING_API_TOKEN
---

# Accounting Gateway

Работай только с организацией, аккаунтом и проектом, явно указанными пользователем.

Перед началом обязательно запроси:

- название организации;
- подтверждение полномочий на управление её инфраструктурой;
- провайдера и проект;
- допустимый бюджет;
- регион;
- административный IP;
- список пользователей;
- основание для создания или миграции.

Сначала покажи план, стоимость и изменения. Для создания дождись точной фразы
«ПОДТВЕРЖДАЮ СОЗДАНИЕ». Для миграции — «ПОДТВЕРЖДАЮ МИГРАЦИЮ».

Не выполняй плановую смену IP с целью скрытия источника действий, обхода контроля
или введения третьих лиц в заблуждение.

Используй минимальный подходящий VPS, SSH-ключи, firewall и отдельный VPN-профиль
для каждого пользователя. Не публикуй секреты в чате и журналах.

При миграции не удаляй старый сервер до проверки нового, подтверждения администратора
и фиксации причины, старого и нового IP.

В финале выдай только несекретный отчёт: ID ресурсов, стоимость, IP, открытые порты,
результаты проверки и список пользователей без ключей.
</code></pre>

<p>Файл можно предложить OpenClaw через Skill Workshop, проверить сформированный вариант и только после ревью применить. Это важнее, чем скачать случайный готовый skill из каталога: наш помощник получает реальный доступ к облаку, серверам и секретам.</p>

<h2 id="что-в-результате-получает-бухгалтер">Что в результате получает бухгалтер</h2>

<p>После настройки бухгалтеру не надо знать, что такое API, MCP, cloud-init или таблица маршрутизации. У него остаётся простой порядок работы:</p>
<ol><li>выбрать организацию;</li>
<li>запустить её виртуальную машину или VPN-профиль;</li>
<li>войти под своей учётной записью;</li>
<li>выполнить работу;</li>
<li>отключиться.</li></ol>

<p>Для каждой организации используются собственные сетевой маршрут, внешний IP, браузерный профиль, полномочия и журнал доступа. Это удобнее для бухгалтера, безопаснее для компаний и гораздо легче объясняется, чем один общий компьютер с общей кучей токенов, паролей и открытых вкладок.</p>

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

<h2 id="полезные-ссылки">Полезные ссылки</h2>
<ul><li><p>Все 4 части гайда «Помощник по инфре за один вечер»: <a href="https://telegra.ph/Pomoshchnik-po-tvoej-infre-za-odin-vecher-i-5-Realno-08-12">https://telegra.ph/Pomoshchnik-po-tvoej-infre-za-odin-vecher-i-5-Realno-08-12</a></p></li>

<li><p>ФНС о совпадении IP, общем бухгалтере и других индикаторах дробления бизнеса: <a href="https://www.nalog.gov.ru/rn60/news/activities_fts/16616815/">https://www.nalog.gov.ru/rn60/news/activities_fts/16616815/</a></p></li>

<li><p>ФНС о МЧД при сдаче отчётности представителем: <a href="https://www.nalog.gov.ru/rn49/news/activities_fts/16621686/">https://www.nalog.gov.ru/rn49/news/activities_fts/16621686/</a></p></li>

<li><p>API Timeweb Cloud: <a href="https://timeweb.cloud/api-docs">https://timeweb.cloud/api-docs</a></p></li>

<li><p>Timeweb Cloud MCP: <a href="https://timeweb.cloud/docs/ai-agents/timeweb-cloud-mcp">https://timeweb.cloud/docs/ai-agents/timeweb-cloud-mcp</a></p></li>

<li><p>Настройка публичных IP Timeweb Cloud: <a href="https://timeweb.cloud/docs/cloud-servers/manage-servers/network">https://timeweb.cloud/docs/cloud-servers/manage-servers/network</a></p></li>

<li><p>MCP-сервер Fatmetal: <a href="https://fatmetal.ru/mcp">https://fatmetal.ru/mcp</a></p></li>

<li><p>Установка собственного VPN через AmneziaVPN: <a href="https://docs.amnezia.org/documentation/instructions/install-vpn-on-server/">https://docs.amnezia.org/documentation/instructions/install-vpn-on-server/</a></p></li>

<li><p>Требования AmneziaVPN к VPS: <a href="https://docs.amnezia.org/documentation/supported-linux-os-for-vps/">https://docs.amnezia.org/documentation/supported-linux-os-for-vps/</a></p></li>

<li><p>Создание skills в OpenClaw: <a href="https://docs.openclaw.ai/tools/creating-skills">https://docs.openclaw.ai/tools/creating-skills</a></p></li>

<li><p>Подключение MCP в Cursor: <a href="https://cursor.com/docs/mcp">https://cursor.com/docs/mcp</a></p></li></ul>

<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:lifehacks" class="hashtag"><span>#</span><span class="p-category">lifehacks</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/accounting-gateway</guid>
      <pubDate>Thu, 13 Aug 2026 13:48:09 +0000</pubDate>
    </item>
    <item>
      <title>Qplus Онлайн: виртуальная карта для зарубежных сервисов</title>
      <link>https://articles.clr58.ru/qplus</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;bРазбираю виртуальную карту Qplus Онлайн — что это и где подвох/b&#xA;&#xA;Наткнулся на Qplus (qplus.ru) — кошелёк, который позиционируют как наследника QIWI: запущен Киви вместе с банком «Евроальянс» (лицензия ЦБ №1781) после отзыва лицензии у КИВИ Банка в 2024. Решил разобраться, стоит ли вообще смотреть в эту сторону. Сам не пользовался — только сайт, их блог и отзывы.&#xA;&#xA;💳 Что за карта&#xA;&#xA;• Долларовая, виртуальная, выпуск в Сингапуре&#xA;• Выпуск — 40$, из них 25$ сразу на баланс карты (т.е. 15$ — просто плата за эмиссию)&#xA;• Реквизиты появляются сразу в приложении&#xA;• Пополнение — с рублёвого счёта кошелька, курс конвертации свой, смотри в момент операции&#xA;• Лимиты «лайт»-статуса: ~15 000 ₽ за раз и ~40 000 ₽ в месяц; выше статус (3 уровня идентификации) — выше лимиты&#xA;&#xA;📊 Что обещают оплачивать&#xA;&#xA;• ChatGPT/OpenAI, Cursor AI — «0% комиссии» (на словах)&#xA;• Steam, PS Store (Турция/США), Roblox, PUBG&#xA;• Booking, Airbnb, подарочные карты Apple US&#xA;&#xA;⚠️ Что смущает (по отзывам и фактам)&#xA;&#xA;• Карта сингапурская — часть сервисов режет по стране выпуска: например, Claude (Anthropic) скорее всего не примет&#xA;• Лайт-лимиты душат: 15к/раз и 40к/мес — для серьёзных покупок мало, придётся идти в идентификацию&#xA;• Отзывы средние: otzovik ~3.2 (рекомендуют 55%), в RuStore ~690 отзывов; формулировки в духе «сыроват, но по функционалу как QIWI»&#xA;• Комиссии «0%» проверяй на своём платеже — по отдельным операциям они есть&#xA;• Бренд QIWI после отзыва лицензии — репутация подмочена, хотя за кошельком стоит банк с лицензией, а не шарашкина контора&#xA;&#xA;Вывод: рабочий инструмент с оговорками, не серебряная пуля. Если брать — начинать с малой суммы и проверять, что твой сервис реально принимает карту.&#xA;&#xA;А вы пользовались Qplus? 👇&#xA;🔥 — да, пользуюсь&#xA;👍 — нет, но присматриваюсь&#xA;👎 — пробовал, не зашло&#xA;&#xA;lifehacks&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-qplus-cover.png" alt="Обложка"></p>

<p><b>Разбираю виртуальную карту Qplus Онлайн — что это и где подвох</b></p>

<p>Наткнулся на Qplus (qplus.ru) — кошелёк, который позиционируют как наследника QIWI: запущен Киви вместе с банком «Евроальянс» (лицензия ЦБ №1781) после отзыва лицензии у КИВИ Банка в 2024. Решил разобраться, стоит ли вообще смотреть в эту сторону. Сам не пользовался — только сайт, их блог и отзывы.</p>

<p>💳 Что за карта</p>

<p>• Долларовая, виртуальная, выпуск в Сингапуре
• Выпуск — 40$, из них 25$ сразу на баланс карты (т.е. 15$ — просто плата за эмиссию)
• Реквизиты появляются сразу в приложении
• Пополнение — с рублёвого счёта кошелька, курс конвертации свой, смотри в момент операции
• Лимиты «лайт»-статуса: ~15 000 ₽ за раз и ~40 000 ₽ в месяц; выше статус (3 уровня идентификации) — выше лимиты</p>

<p>📊 Что обещают оплачивать</p>

<p>• ChatGPT/OpenAI, Cursor AI — «0% комиссии» (на словах)
• Steam, PS Store (Турция/США), Roblox, PUBG
• Booking, Airbnb, подарочные карты Apple US</p>

<p>⚠️ Что смущает (по отзывам и фактам)</p>

<p>• Карта сингапурская — часть сервисов режет по стране выпуска: например, Claude (Anthropic) скорее всего не примет
• Лайт-лимиты душат: 15к/раз и 40к/мес — для серьёзных покупок мало, придётся идти в идентификацию
• Отзывы средние: otzovik ~3.2 (рекомендуют 55%), в RuStore ~690 отзывов; формулировки в духе «сыроват, но по функционалу как QIWI»
• Комиссии «0%» проверяй на своём платеже — по отдельным операциям они есть
• Бренд QIWI после отзыва лицензии — репутация подмочена, хотя за кошельком стоит банк с лицензией, а не шарашкина контора</p>

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

<p>А вы пользовались Qplus? 👇
🔥 — да, пользуюсь
👍 — нет, но присматриваюсь
👎 — пробовал, не зашло</p>

<p><a href="https://articles.clr58.ru/tag:lifehacks" class="hashtag"><span>#</span><span class="p-category">lifehacks</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/qplus</guid>
      <pubDate>Thu, 13 Aug 2026 13:30:58 +0000</pubDate>
    </item>
    <item>
      <title>Дубль IP: как «чужой MAC» съел мой ComfyUI</title>
      <link>https://articles.clr58.ru/comfy-ip-dupe</link>
      <description>&lt;![CDATA[Обложка&#xA;&#xA;Вводные. Лаба на Proxmox, всё в LXC. Внутрянка на br1 (198.51.100.0/24). Снаружи — один вход через Caddy: обратный прокси, TLS сам. Админки и мониторинг — за ACL: только мой IP, остальным 403. ComfyUI (SD 1.5) живёт в lxc-comfy (198.51.100.18), раньше пыхтел на CPU, в этот день переехал на GPU: Radeon 760M, ROCm-торч, HSAOVERRIDEGFXVERSION=11.0.0, ollama временно стопнул, чтобы не бодалась за GPU. ComfyUI слушает 8188, в мир — comfy.example-lab.ru. Параллельно ставил Frigate в свежем lxc-frigate.&#xA;&#xA;Симптом. «Комфи 403, остальное открывается». photos.example-lab.ru — ок, beszel/uptime — ок, а comfy.example-lab.ru — 403, позже 502. Подозрение на ACL: «может, IP не тот?»&#xA;&#xA;Хроника.&#xA;&#xA;1) Логи Caddy: с телефона (открывал из Telegram) подряд два respond &#34;Access denied&#34; 403. Потом — 502: connect refused к 198.51.100.18:8188.&#xA;&#xA;2) Внутри lxc-comfy:&#xA;ss -tlnp | grep 8188 → LISTEN 0.0.0.0:8188 (python)&#xA;curl http://127.0.0.1:8188/ → 200, UI отдался&#xA;curl http://198.51.100.18:8188/ -I → 200&#xA;&#xA;Значит, жив и слушает на всех интерфейсах.&#xA;&#xA;3) Снаружи (с хоста/через Caddy/с соседнего контейнера):&#xA;bash -lc &#39;  /dev/tcp/198.51.100.18/8188&#39; → Connection refused&#xA;tcpdump -i any -n port 8188 внутри lxc-comfy → 0 пакетов&#xA;tcpdump -i br1 -n host 198.51.100.18 and port 8188 → SYN доходит и прилетает RST&#xA;&#xA;Если бы отвечал ComfyUI, был бы SYN-ACK. Значит, откликается кто-то другой.&#xA;&#xA;4) Исключаем банальное: PVE firewall — пусто, ebtables — пусто, nft/iptables в контейнерах — ACCEPT, ipforward=0 (но у нас L2-мост). Чисто.&#xA;&#xA;Разгадка — ARP.&#xA;ip neigh show 198.51.100.18 → lladdr «чужой MAC»&#xA;А у lxc-comfy MAC другой.&#xA;bridge fdb show | grep «чужой MAC» → этот MAC висит на порту lxc-frigate.&#xA;&#xA;Бинго: у lxc-frigate оказался тот же IP 198.51.100.18. ARP резолвит адрес в «чужой MAC», трафик уезжает во Frigate, там 8188 не слушается — оттого RST. 403 здесь просто шум от ACL на первых попытках, корень — дубль IP.&#xA;&#xA;Фикс.&#xA;Перекинул lxc-frigate на 198.51.100.19:&#xA;  pct set frigateid --net0 name=eth0,bridge=br1,ip=198.51.100.19/24,gw=198.51.100.1&#xA;  pct reboot frigateid&#xA;ip neigh flush 198.51.100.18&#xA;Проверка: 198.51.100.18 снова указывает на MAC lxc-comfy.&#xA;comfy.example-lab.ru → 200, UI летает на GPU.&#xA;&#xA;Мораль. Когда «не открывается», сперва проверь, твой ли это вообще адрес. Дубль IP — тихий убийца: ICMP может отвечать «кто-то один», а TCP будет резать RST с чужого контейнера. Диагностика по тропинке: ss (слушает?) → tcpdump (доходит?) → ARP/fdb (чей MAC?).&#xA;&#xA;А вы чем страхуете лабу от дублей: DHCP-резервы, IPAM, arpwatch на br1 или что-то своё?&#xA;&#xA;#network #lifehacks&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><img src="https://paste.clr58.ru/post-comfy-ip-dupe-cover.jpg" alt="Обложка"></p>

<p><strong>Вводные.</strong> Лаба на Proxmox, всё в LXC. Внутрянка на br1 (198.51.100.0/24). Снаружи — один вход через Caddy: обратный прокси, TLS сам. Админки и мониторинг — за ACL: только мой IP, остальным 403. ComfyUI (SD 1.5) живёт в lxc-comfy (198.51.100.18), раньше пыхтел на CPU, в этот день переехал на GPU: Radeon 760M, ROCm-торч, HSA<em>OVERRIDE</em>GFX_VERSION=11.0.0, ollama временно стопнул, чтобы не бодалась за GPU. ComfyUI слушает 8188, в мир — comfy.example-lab.ru. Параллельно ставил Frigate в свежем lxc-frigate.</p>

<p><strong>Симптом.</strong> «Комфи 403, остальное открывается». photos.example-lab.ru — ок, beszel/uptime — ок, а comfy.example-lab.ru — 403, позже 502. Подозрение на ACL: «может, IP не тот?»</p>

<p><strong>Хроника.</strong></p>

<p>1) Логи Caddy: с телефона (открывал из Telegram) подряд два respond “Access denied” 403. Потом — 502: connect refused к 198.51.100.18:8188.</p>

<p>2) Внутри lxc-comfy:
– <code>ss -tlnp | grep 8188</code> → LISTEN 0.0.0.0:8188 (python)
– <code>curl http://127.0.0.1:8188/</code> → 200, UI отдался
– <code>curl http://198.51.100.18:8188/ -I</code> → 200</p>

<p>Значит, жив и слушает на всех интерфейсах.</p>

<p>3) Снаружи (с хоста/через Caddy/с соседнего контейнера):
– <code>bash -lc &#39;&gt;/dev/tcp/198.51.100.18/8188&#39;</code> → Connection refused
– <code>tcpdump -i any -n port 8188</code> внутри lxc-comfy → 0 пакетов
– <code>tcpdump -i br1 -n host 198.51.100.18 and port 8188</code> → SYN доходит и прилетает RST</p>

<p>Если бы отвечал ComfyUI, был бы SYN-ACK. Значит, откликается кто-то другой.</p>

<p>4) Исключаем банальное: PVE firewall — пусто, ebtables — пусто, nft/iptables в контейнерах — ACCEPT, ip_forward=0 (но у нас L2-мост). Чисто.</p>

<p><strong>Разгадка — ARP.</strong>
– <code>ip neigh show 198.51.100.18</code> → lladdr «чужой MAC»
– А у lxc-comfy MAC другой.
– <code>bridge fdb show | grep «чужой MAC»</code> → этот MAC висит на порту lxc-frigate.</p>

<p>Бинго: у lxc-frigate оказался тот же IP 198.51.100.18. ARP резолвит адрес в «чужой MAC», трафик уезжает во Frigate, там 8188 не слушается — оттого RST. 403 здесь просто шум от ACL на первых попытках, корень — дубль IP.</p>

<p><strong>Фикс.</strong>
– Перекинул lxc-frigate на 198.51.100.19:
  <code>pct set &lt;frigate_id&gt; --net0 name=eth0,bridge=br1,ip=198.51.100.19/24,gw=198.51.100.1</code>
  <code>pct reboot &lt;frigate_id&gt;</code>
– <code>ip neigh flush 198.51.100.18</code>
– Проверка: 198.51.100.18 снова указывает на MAC lxc-comfy.
– comfy.example-lab.ru → 200, UI летает на GPU.</p>

<p><strong>Мораль.</strong> Когда «не открывается», сперва проверь, твой ли это вообще адрес. Дубль IP — тихий убийца: ICMP может отвечать «кто-то один», а TCP будет резать RST с чужого контейнера. Диагностика по тропинке: ss (слушает?) → tcpdump (доходит?) → ARP/fdb (чей MAC?).</p>

<p>А вы чем страхуете лабу от дублей: DHCP-резервы, IPAM, arpwatch на br1 или что-то своё?</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:lifehacks" class="hashtag"><span>#</span><span class="p-category">lifehacks</span></a></p>
]]></content:encoded>
      <guid>https://articles.clr58.ru/comfy-ip-dupe</guid>
      <pubDate>Thu, 13 Aug 2026 13:30:57 +0000</pubDate>
    </item>
  </channel>
</rss>