318 Commits

Author SHA1 Message Date
dttb
7a1b07a47e Бужарово watchdog v2: только публичный канал, NetBird вынесен из alert level
NetBird daemon на Server1C (Windows) регулярно flap-ает — известная проблема.
Watchdog v2 решает по level только по ping public + RDP 3389. NetBird-уровень
логируется в state.json для информации, но не порождает алерты. Параллельно:
primary model openclaw переключен с Opus 4.7 (Max-биллинг закончился) на
Sonnet 4.5 free (Kiro), Opus оставлен в fallbacks.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-14 18:45:39 +03:00
dttb
4e88741d08 Бужарово: бот Северный лес + переход на native MS SQL Backup
- Создан отдельный AI-ассистент @bz_sl_bot на LXC 139 (openclaw 2026.5.7) с watchdog'ом для server1c. TG-группа -1003778571121 для П.И. Кулябина.
- Канон бэкапа RitmUl — `BACKUP DATABASE` через MS SQL Server напрямую, не Effector Saver DT-выгрузка. Работает online, не требует cluster admin'а 1С (которого зарегистрировать нельзя — chicken-and-egg).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 22:33:56 +03:00
97841320f2 code-server auto-sync 2026-05-07T07:10:01+00:00 2026-05-07 07:10:01 +00:00
dttb
d00d856513 projects: вынес Бужарово в отдельную папку buzharovo/
Server1C — это самостоятельный объект (организация в Бужарово), не часть
домашней инфраструктуры dttb. Переношу projects/dttb/server1c.md →
projects/buzharovo/server1c.md, добавляю README.md как точку входа,
обновляю обратные ссылки.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 10:05:44 +03:00
329a280cb3 code-server auto-sync 2026-05-07T07:05:01+00:00 2026-05-07 07:05:01 +00:00
dttb
6dabc7749c Бужарово 1С: рецепт rmngr-loop после грязного ребута
Симптом: rmngr держит >100% ядра в idle, rac не отвечает, локальные пользователи жалуются на тормоза. Полный ребут сервера НЕ помогает. Лечится Restart-Service '1C:Enterprise 8.3 Server Agent (x86-64)'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 10:03:07 +03:00
d82531ec58 code-server auto-sync 2026-05-06T13:55:02+00:00 2026-05-06 13:55:02 +00:00
dttb
47394e668e Phase 9 (улучшения автоматизации):
A. kb-autosync.sh переписан: pull → regenerate index → commit → push.
   После каждого push с Mac индекс objects-map.json и _index.md
   обновляются автоматически на code-server (LXC 132).

B. kb-objects-map.py + kb-objects-audit.py добавлены в воскресный
   weekly cron на LXC 132 — health-check автогенерируется раз в неделю.

C. Чистка битых wiki-ссылок (score 84 → 9):
   - notes/govru-diagnosis → projects/niikn/govru-quickfix-playbook (2)
   - claude-memory/podkop → 2026-04-17-peredelki-podkop-stability-fix
   - [[../snippets/clients/]] → snippets/clients/ (текстом, 2)
   - [[feedback_*]] (user memory) → backtick-cited (2)
   - [[../znamenskoye/]] → [[../znamenskoye/README]] (4)

   Скрипт kb-objects-audit.py улучшен: regex теперь требует [[...]] с
   двойной скобкой (не одной), исключает audit/ и CLAUDE.md (placeholder
   и autogen).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:52:16 +03:00
94aae3ca26 code-server auto-sync 2026-05-06T13:50:01+00:00 2026-05-06 13:50:01 +00:00
dttb
1748562756 Decision: сводка по перестройке KB-поиска (8 фаз)
Один артефакт-агрегатор: метрики до/после, грабли, отложенное, ссылки
на все промежуточные decisions/snippets. Чтобы не прыгать по разным
файлам — единая точка входа для повторного чтения.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:46:05 +03:00
dttb
f0b7feadc1 Phase 7: kb-objects-audit + первый weekly report (score 84)
Новый скрипт scripts/kb-objects-audit.py — еженедельный health-check vault'а:
1. Каждый projects/<dir>/README.md имеет валидный frontmatter (type/status/aliases)
2. Каждый онлайн-netbird-пир привязан к проекту через aliases или собственную карточку
3. Битые wiki-ссылки [[...]] не указывают в небытие

Output: audit/YYYY-MM-DD-objects-audit.md со score (меньше = лучше).

Первый запуск 2026-05-06: score=84
- 12/12 проектов с frontmatter ✓
- 3 online orphan-пира (DESKTOP-2IOQS54 Saransk, DESKTOP-AGBMLPN Helsinki, DESKTOP-HL0BB05 Lipetsk)
- 26 битых wiki-ссылок выявлено

Phase 6: dreaming включён (cron 0 3 * * *), recall promote'нул 17/39, weekly cron на promote.
Phase 8: на 137 — minScore=0.4 в memorySearch.query, IDENTITY.md разводит двух Максимок,
INFRASTRUCTURE.md переписан как навигатор по vault'у (не дубль).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:39:45 +03:00
dttb
d4433bd0a8 Phase 4: обогатить frontmatter проектов + 6 новых stub'ов
Существующие проекты получили frontmatter с aliases для FTS / objects-map:
  niikn  — Cloud-NIIKN New niikn.com, pve-niikn, Kripto-ARM, M.Maul
  dttb   — Work Server dttb, code-server, rustdeskserver, MacBook-Pro, ...
  glavtorg, krasnogorsk, zelenograd — добавлен frontmatter с aliases

Создано 6 новых README:
  projects/znamenskoye/README.md  — был отсутствующий index 3-х объектов
  projects/mmfb/README.md         — был отсутствующий index ММФБ + LionART
  projects/sergey/README.md       — stub OpenWrt_Sergey (Одинцово)
  projects/benilux/README.md      — stub OpenWrt Benilux (Истра)
  projects/vishnevyy-sad/README.md — stub Константин (Москва)
  projects/openwrt-4/README.md    — stub анонимный OpenWrt_4

Обновлён scripts/kb-objects-map.py: exact-match вместо substring (избегает FP
вроде alias 'cloud' ⊂ 'Cloud-NIIKN New niikn.com'). Aliases теперь должны
содержать полные имена пиров как в netbird-inventory.

Метрика: с 38 orphan-пиров до 14. Остаток — реально неклассифицированные
клиентские машины без явной привязки к проекту (Денис Тихая, DESKTOP-2IOQS54
и др.) — задача для отдельного шага обогащения.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:25:44 +03:00
dttb
b16ecdae37 Phase 3: scripts/kb-objects-map.py + audit/objects-map.json + projects/_index.md
Авто-генератор реестра: парсит netbird-inventory + frontmatter каждого проекта,
выводит JSON для бота и человекочитаемый index с wiki-ссылками.

Пока 16 проектов / 38 orphan-пиров без своих карточек — выявленные дыры станут
input для Фазы 4 (stub-генератора). Скрипт идемпотентный, без deps (pure stdlib),
запуск: cd ~/knowledge-base && python3 scripts/kb-objects-map.py

Парсер обрабатывает offline-таблицу netbird (другой порядок колонок), normalize
ye→e уравнивает Знаменское/Znamenskoe. Source of truth — frontmatter каждого
проекта; добавление aliases/owner/region там сразу подхватится при следующем run.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:17:05 +03:00
dttb
b411e3b308 Phase 5.2: архивировать audit/ старее текущей недели в audit/archive/
Перенесены 18 файлов 2026-04-* (drift, creds, dns, npm, health, proposed) в audit/archive/.
В audit/ остались только свежие 2026-05-03-* + health-latest.json.

Цель — снизить шум в FTS Максимки. В openclaw 2026.5.2 нет excludePaths
для memorySearch, поэтому файлы продолжают индексироваться, но в подкаталоге
их легче чистить вручную и видно структуру.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:12:27 +03:00
dttb
cda539b9a1 Phase 5.1 (часть 2): docce ссылку и aliases — после удаления video-surveillance-report
Должно было войти в предыдущий коммит, но git add был пропущен.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:06:59 +03:00
dttb
bac376992d Phase 5.1: слить дубли видеонаблюдения — оставить videonablyudenie-znam как canonical
- удалён projects/dttb/video-surveillance-report.md (старая неполная копия от 2026-03-13, без секции AgentDVR ЧОП)
- canonical videonablyudenie-znam.md обогащён aliases для FTS (видеонаблюдение Знаменское, камеры Охотхозяйство, AgentDVR ЧОП, swtest video)
- projects/dttb/README.md убрана ссылка на удалённый файл

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:04:45 +03:00
dttb
f7d06c0a35 Phase 2 webhook: snippet и decision (Mac→openclaw FTS лаг 15м → 11с)
Развёрнут push-webhook от Gitea на kb-pull-webhook.service на LXC 137 + auto-reindex FTS в kb-pull.sh после нового HEAD. Грабли: gitea webhook.ALLOWED_HOST_LIST по дефолту режет private IP; flock -n теряет двойные push, заменён на -w 180.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 16:01:45 +03:00
dttb
843b9780c8 Phase 2 final smoke - flock -w 180 2026-05-06 15:56:25 +03:00
dttb
24fe1d3f88 smoke webhook real push timing 2026-05-06 15:35:39 +03:00
dttb
1ae613b2bd smoke webhook delivery Phase 2 2026-05-06 15:32:20 +03:00
root
d754de8378 auto-backup claude-memory 2026-05-06_12:00 2026-05-06 12:00:52 +00:00
dttb
80fd8ca7bf Липки: карточка объекта (клиент Антон, Cudy TR3000 100.70.35.234, белый WAN 5.101.135.71) + рецепт Gitea→openclaw kb-pull webhook
Закрывает причину #1 путаницы Максимки на запросах вида "OpenWRT Липки": слово "Липки" во всём vault встречалось только одной строкой в netbird-inventory, FTS вытаскивал НИИКН по статистике слова "OpenWRT".

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 14:03:36 +03:00
dttb
bf845e2dcb kb: OmniRoute Opus audit — cc/claude-opus-4-7 main, разница со старым CLIProxy 8317 2026-05-06 13:42:22 +03:00
d9c00c31e0 code-server auto-sync 2026-05-06T10:30:01+00:00 2026-05-06 10:30:01 +00:00
f6bf12ccf9 code-server auto-sync 2026-05-06T10:25:01+00:00 2026-05-06 10:25:01 +00:00
dttb
3220238c67 fix Apple ID TJ + Opus 4.7: добавлены статус, snippet IPRoyal gost-relay, decision openclaw на cc/claude-opus-4-7, обновлён omniroute reference 2026-05-06 12:24:17 +03:00
dttb
265d99b378 Mac dictation: Hammerspoon + Groq Whisper решение
- decisions/2026-05-05-mac-dictation-groq-hammerspoon.md: полный план,
  грабли с раскладкой, fallback на whisper-cpp, восстановление на новом Mac
- notes/ru-geoblocked-services.md: реестр CDN с RU-блоком
  (cdn.spokenly, dl.wisprflow и пр.) + принципы обхода
- snippets/mac-dictation/: рабочая версия скриптов и init.lua

Триггер — одиночный Fn, Groq cloud first → tiny local fallback,
вставка через hs.eventtap.event keycode 9 (минует ru-keymap warnings).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-05 16:27:17 +03:00
dttb
89fbfec1b8 decision Apple ID TJ: добавлен альтернативный путь через покупку US Adidas-аккаунта + смена региона 2026-05-04 19:45:34 +03:00
dttb
ea077e6b0e notes(claude): транскрипты сессий 2026-05-04 (НИИКН gov.ru fixes, НСПД, Стародубцева) 2026-05-04 13:40:21 +03:00
dttb
2a03207385 playbook НИИКН: добавлен economy.gov.ru override (для fgistp.economy.gov.ru / Минэк ФГИС ТП) 2026-05-04 13:33:44 +03:00
dttb
e0ca1e039a snippet netbird-claude-install: перевод Public→Private перед WinRM, try/catch на Set-Item WSMan 2026-05-04 13:10:59 +03:00
dttb
a4fb06527f snippet netbird-claude-install: добавлен claude/Kl@udeD1ag!2026 + OpenSSH Server + ru-RU SID для Administrators 2026-05-04 13:09:01 +03:00
dttb
9fe499fc6e playbook НИИКН: gov.ru quickfix (5 классов проблем + текущий реестр overrides/routes/IDs) 2026-05-04 12:48:19 +03:00
dttb
8e13ae2e17 decision НСПД НИИКН: добавлены zakupki + telemost через тот же NetBird->LionART (+ MSS clamp на wt0) 2026-05-04 12:39:21 +03:00
dttb
e896a24fae decision НСПД НИИКН: финальная схема через NetBird→LionART (OpenWrt DNS override + MikroTik route + pve-niikn MASQ wt0) 2026-05-04 11:57:08 +03:00
dttb
93ade1c65b diagrams: добавлены mermaid-схемы для НИИКН и Знаменского 2026-05-04 10:10:33 +03:00
dttb
d2969b4751 manual sync: добавлены mermaid-диаграммы dttb network-topology 2026-05-04 08:52:32 +03:00
dttb
dd96d5ffa7 decision Apple ID TJ: добавлены подводные камни (Accept-Language, footer-check, @icloud.com на регистрации, grizzlysms забанен) 2026-05-03 13:06:20 +03:00
dttb
f5e9dce9d8 decision Apple ID TJ: подтверждён рабочий формат IPRoyal password-modifiers (country-tj_session-X_lifetime-30m) 2026-05-03 10:00:09 +03:00
dttb
5f39702c72 decision Apple ID TJ: переход с Soax на IPRoyal (Soax недоступен из RU) 2026-05-03 09:28:21 +03:00
5025cd14f2 code-server auto-sync 2026-05-03T06:05:01+00:00 2026-05-03 06:05:01 +00:00
dttb
c8bed951a1 decision: Apple ID TJ через residential proxy (Soax trial + grizzlysms, без VPS) 2026-05-02 21:52:12 +03:00
dttb
ca3b0615d5 НИИКН: NotebookLM/Google AI через AWG-Финляндия для всей сети
podkop user_domains на 192.168.1.50 — 5 доменов (notebooklm.google[.com],
generativelanguage.googleapis.com, aistudio.google.com, labs.google).
Клиенты по DHCP ходят на dnsmasq 192.168.1.50, FakeIP-маршрут
198.18.0.0/15→OpenWrt уже на MikroTik — для Оксаны и всего офиса
ничего на ПК настраивать не надо.
2026-04-30 22:55:30 +03:00
dttb
84a1adb67e НИИКН: culture.gov.ru открыт через DNS override (FakeIP-фикс) 2026-04-30 14:38:19 +03:00
dttb
d58873368a RustDesk: pre-prod security audit + операционный runbook
Аудит перед запуском в прод. Найдены и исправлены critical и medium issues:

Critical (fixed):
- File permissions 644 → 600/640 для id_ed25519, БД, config.yaml
- Нет logrotate (диск 2GB зальётся) → /etc/logrotate.d/rustdesk
- Нет авто-бэкапа → daily cron 03:00 в /root/rustdesk-backups/

Medium (fixed):
- Brute-force на /api/admin/login → NPM rate-limit 5r/m

Medium (deferred):
- NC share без пароля (NC сейчас down — отдельный task)
- Security headers не наследуются в location / (NPM template limitation)

Документация:
- decisions/2026-04-30-rustdesk-pre-prod-audit.md — полный отчёт
- projects/dttb/rustdesk-runbook.md — операционный runbook (recovery,
  troubleshooting, onboarding, updates)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 10:42:19 +03:00
dttb
37ca19ee5e notes/claude: дамп сессий 2026-04-29
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 00:25:25 +03:00
dttb
3ec0cb8dcf openwrt-homelab: AdGuard Home в DNS-цепочке, блокировка YouTube ads
Цепочка: LAN → dnsmasq:53 → AGH:5353 → sing-box:127.0.0.42 → upstream.
podkop dont_touch_dhcp=1, dnsmasq.server=127.0.0.1#5353. Добавлены
HaGeZi Pro mini, BlocklistProject YouTube, GoodbyeAds YouTube AdBlock.
user_rules очищены от поломанного YAML. Проверено: ad-домены → 0.0.0.0,
fakeip подкопа цел, обычные сайты резолвятся.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-30 00:25:19 +03:00
dttb
2dc9efa5ef notes/claude: дамп сессий 2026-04-29
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 23:21:32 +03:00
dttb
9e256a8e30 НИИКН clawdbot: миграция LXC 133 → LXC 114 (Maxim-Maul-Assistant), фикс crash-loop, новые скиллы (docx/xlsx/nc_save), credentials НИИКН в отдельный файл
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 23:21:28 +03:00
dttb
540be8b7cf Happ: кастомный роутинг RoscomVPN — split-tunnel для РФ/РБ (госуслуги, банки, push) одной кнопкой через routing.help 2026-04-29 23:19:32 +03:00
dttb
53091aadcf Kripto-ARM (NIIKN VM 103): SSH+oleg/oksana, RustDesk на remot.dttb.ru, юзер oksana в admin-панели 2026-04-29 23:16:42 +03:00
dttb
c1c7ccc654 Сергей (Знаменское) — Happ Finland 5870, инструкция + QR + US Apple ID
- snippets/clients/sergey-znamenskoye-happ-setup.md: персональная инструкция с готовым сообщением и блоком про US Apple ID hbuggle819
- snippets/assets/vpn-finland-5870-sergey-znamenskoye-20260429.png: QR vless-ссылки
- projects/dttb/vpn-clients.md: запись клиента №2 (UUID 4798936b)
2026-04-29 22:35:42 +03:00
dttb
de867d27a4 AmneziaVPN: список российских доменов для split-tunnel (госуслуги, банки, маркетплейсы, Yandex/VK/Mail.ru) 2026-04-29 16:38:06 +03:00
dttb
5ee66a2a2d LXC 139 (yaroslav-assistant) удалён — тестовый openclaw для Ярослава, не использовался; конфиги в archive/ 2026-04-29 15:31:14 +03:00
dttb
fe27154eb1 Ярославу выдан Happ-доступ на Finland HOSTKEY 202.71.12.186:9443 2026-04-29 15:19:36 +03:00
dttb
f32c9c9b58 RustDesk admin pw сменён на стандартный 1qaz!QAZ
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 09:12:38 +03:00
dttb
93cd14d82a RustDesk: deployment-пакет в Nextcloud "RustDesk install/" для всех платформ
Готовые установщики 1.4.6 + автоматические скрипты для Win/Linux/macOS/Android.
Скрипты ставят RustDesk silent, кладут RustDesk2.toml с настройками
remot.dttb.ru, генерят permanent password per-machine, выводят ID+pw.

Папка ~766 MB в корне NC. Олег сделает public share-link с паролем.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 08:52:05 +03:00
dttb
5956b21fcc ММФБ Юрий: апгрейд Win10→Win11 25H2 + отчёт клиенту PDF 2026-04-29 07:51:50 +03:00
dttb
441491ea5d RustDesk web-client: TLS termination 21118/21119 + ports в compose NPM
NPM stack пересоздан с публикацией портов 21115-21119. Compose-файл теперь
лежит на host /data/compose/2/docker-compose.yml (Portainer хранил только
в своём volume — теперь синхронизированы). Custom stream.conf с TLS
termination для 21118/21119 в /data/compose/2/data/nginx/custom/.

wss://remot.dttb.ru:21118/ws/id и /ws/relay отвечают 101 Switching Protocols.
WebClient доходит до hbbr с relay request, но peer должен быть online +
залогинен в API чтобы соединение установилось.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 23:26:05 +03:00
dttb
ebe435842d RustDesk: задокументировать что NPM streams недоступны извне и web-client отложен
При попытке завести web-client (wss://remot.dttb.ru:21118) выяснилось что
docker port для NPM публикует только 80/81/443. Streams 21115-21119
работают только внутри docker-сети — desktop-клиенты ходят на 10.0.0.244
напрямую через LAN/NetBird. Web-client требует rebuild NPM compose с ports.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 13:29:35 +03:00
dttb
5f40c26718 RustDesk LXC 116: NPM rewrite /webclient2/ → /webclient/
Админка lejianwen-api 2.7 при клике на peer открывает /webclient2/#/<id>,
но api отдаёт Flutter WebClient на /webclient/. Без rewrite получаем 404.
Добавлен return 301 в advanced_config NPM Proxy Host 14 — hash остаётся
в браузере, peer-id корректно подхватывается Flutter-app.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 12:24:29 +03:00
dttb
da0b57e26c RustDesk LXC 116: миграция OSS → lejianwen-pro 1.1.14 (MUST_LOGIN=Y)
- Подмена hbbs/hbbr на pro-бинари из docker lejianwen/rustdesk-server-s6, apt-mark hold
- Systemd overrides: hbbs --must-login Y -k _ -r remot.dttb.ru:21117; hbbr -k _
- config.yaml: lang ru, домен remot.dttb.ru, ключ + jwt прописаны, swagger on
- NPM Proxy Host 14: forward 10.0.0.244, SSL force, http2, /ws/id /ws/relay locations
- NPM streams 21115-21119 пересозданы (id 38-43), Stream 30 удалён
- Admin pw сменён, бэкап + rollback-скрипт в /root/rustdesk-* на LXC 116
- Ключ id_ed25519 идентичен до/после, 13 peers продолжают работать

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 12:20:17 +03:00
dttb
4b53b9a868 notes/claude: дедуп снэпшотов сессий (435→23, по одному на session_id)
Полная переписка хранится в ~/.claude/projects/*.jsonl, .md — только
индекс/превью; промежуточные снэпшоты одной сессии не несли уникальной
информации. Backup: /tmp/notes-claude-backup-20260427-113508.tar.gz.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-27 11:36:23 +03:00
dttb
8599da3eeb openclaw 2026.4.24: фиксы bonjour crash-loop и FakeIP DNS
Два независимых фейла за один инцидент 2026-04-27:

1. Bonjour-плагин валит node на CIAO PROBING/ANNOUNCEMENT CANCELLED
   (mDNS не работает в LXC). Fix: plugins.entries.bonjour.enabled=false.
   Не лечится npm install openclaw@latest.

2. /etc/resolv.conf смотрел на 10.0.0.1 (LionART/Mihomo), который
   отдавал FakeIP 198.18.0.6 для api.telegram.org — из LXC такой
   трафик некуда маршрутизировать. Fix: nameserver 1.1.1.1 8.8.8.8
   через pct set --nameserver (резолвят через NetBird wt0).
2026-04-27 10:08:32 +03:00
dttb
e2f166e416 Finland VPS 78.17.4.225: инцидент XorDDoS — очистка и hardening
- 14 ТБ трафика за 11 дней через ботнет (zneirjeklr/lvm2-monitor)
- Точка входа: RCE в amnezia-panel-web (PHP), не SSH brute
- Malware зачищен: 3 процесса, 10 файлов → 0-byte + chattr +i
- C2 IP заблокированы в iptables OUTPUT
- SSH: PasswordAuth=no, только ключ (исправлено 99-cloud-init.conf)
- Docker→host SSH в INPUT DROP (172.17/18/19/29)
- fail2ban + iptables-persistent
- Через 3ч проверка: чисто, watchdog'ов нет
- AmneziaVPN не пострадал, клиенты НИИКН онлайн
2026-04-26 22:07:11 +03:00
b80ea1688c code-server auto-sync 2026-04-26T06:05:01+00:00 2026-04-26 06:05:01 +00:00
root
30b1606e01 auto-backup claude-memory 2026-04-24_18:00 2026-04-24 18:00:43 +00:00
dttb
45ce2096b1 obsidian auto-sync 2026-04-24 17:07:14 2026-04-24 17:07:14 +03:00
dttb
65b3f58b9e obsidian auto-sync 2026-04-24 16:57:00 2026-04-24 16:57:00 +03:00
dttb
ef2934c69b obsidian auto-sync 2026-04-24 16:46:47 2026-04-24 16:46:47 +03:00
dttb
a0fddff6d5 obsidian auto-sync 2026-04-24 16:36:34 2026-04-24 16:36:34 +03:00
dttb
444c1b6126 obsidian auto-sync 2026-04-24 16:31:26 2026-04-24 16:31:26 +03:00
dttb
fd68ec4bba obsidian auto-sync 2026-04-24 16:26:18 2026-04-24 16:26:18 +03:00
dttb
804e89254b obsidian auto-sync 2026-04-24 16:21:10 2026-04-24 16:21:10 +03:00
dttb
d6ed55acca obsidian auto-sync 2026-04-24 16:16:02 2026-04-24 16:16:02 +03:00
dttb
1f6ebdf0f0 obsidian auto-sync 2026-04-24 16:05:48 2026-04-24 16:05:48 +03:00
dttb
3818ffdff3 obsidian auto-sync 2026-04-24 16:00:39 2026-04-24 16:00:39 +03:00
dttb
74182287ae obsidian auto-sync 2026-04-24 15:55:31 2026-04-24 15:55:31 +03:00
dttb
593d19bf0b obsidian auto-sync 2026-04-24 15:50:23 2026-04-24 15:50:23 +03:00
dttb
e426c386c8 obsidian auto-sync 2026-04-24 15:30:00 2026-04-24 15:30:00 +03:00
dttb
be4d3523e0 obsidian auto-sync 2026-04-24 14:54:22 2026-04-24 14:54:22 +03:00
dttb
9b59668590 obsidian auto-sync 2026-04-24 14:49:14 2026-04-24 14:49:14 +03:00
dttb
69f4ea682f obsidian auto-sync 2026-04-24 14:44:05 2026-04-24 14:44:05 +03:00
dttb
2ccf99ba5a obsidian auto-sync 2026-04-24 14:38:56 2026-04-24 14:38:56 +03:00
dttb
1d0d553726 obsidian auto-sync 2026-04-24 14:28:43 2026-04-24 14:28:43 +03:00
dttb
4cc5d4b860 obsidian auto-sync 2026-04-24 14:03:14 2026-04-24 14:03:14 +03:00
dttb
bda7600807 obsidian auto-sync 2026-04-24 13:58:06 2026-04-24 13:58:06 +03:00
dttb
b4a3bab2ef obsidian auto-sync 2026-04-24 13:52:55 2026-04-24 13:52:55 +03:00
dttb
0787cf7d9e obsidian auto-sync 2026-04-24 13:32:25 2026-04-24 13:32:25 +03:00
dttb
a739d8be90 obsidian auto-sync 2026-04-24 13:27:15 2026-04-24 13:27:15 +03:00
dttb
c6229eb3e2 obsidian auto-sync 2026-04-24 13:22:05 2026-04-24 13:22:05 +03:00
dttb
9b63e54ada obsidian auto-sync 2026-04-24 13:16:55 2026-04-24 13:16:55 +03:00
dttb
140c278595 obsidian auto-sync 2026-04-24 13:11:45 2026-04-24 13:11:45 +03:00
dttb
b579217206 obsidian auto-sync 2026-04-24 13:06:35 2026-04-24 13:06:35 +03:00
dttb
e711a1f538 obsidian auto-sync 2026-04-24 13:01:24 2026-04-24 13:01:24 +03:00
dttb
7db3f692b3 obsidian auto-sync 2026-04-24 12:51:07 2026-04-24 12:51:07 +03:00
dttb
b34f18e486 obsidian auto-sync 2026-04-24 12:45:56 2026-04-24 12:45:56 +03:00
dttb
c31c50bb15 obsidian auto-sync 2026-04-24 12:35:40 2026-04-24 12:35:40 +03:00
dttb
7498955527 obsidian auto-sync 2026-04-24 12:20:20 2026-04-24 12:20:20 +03:00
dttb
8b3083d321 obsidian auto-sync 2026-04-24 12:15:12 2026-04-24 12:15:12 +03:00
dttb
2c2b5c4496 obsidian auto-sync 2026-04-24 10:13:08 2026-04-24 10:13:08 +03:00
dttb
dd9c7b27da obsidian auto-sync 2026-04-24 09:22:16 2026-04-24 09:22:16 +03:00
dttb
643819636c obsidian auto-sync 2026-04-23 23:35:41 2026-04-23 23:35:41 +03:00
dttb
34248359e6 obsidian auto-sync 2026-04-23 22:13:02 2026-04-23 22:13:02 +03:00
dttb
f63aaca3ff obsidian auto-sync 2026-04-23 21:32:17 2026-04-23 21:32:17 +03:00
dttb
52cf107b34 obsidian auto-sync 2026-04-23 21:27:15 2026-04-23 21:27:15 +03:00
dttb
d6035366a1 obsidian auto-sync 2026-04-23 21:22:12 2026-04-23 21:22:12 +03:00
dttb
c1b989ed29 obsidian auto-sync 2026-04-23 21:17:09 2026-04-23 21:17:09 +03:00
dttb
dc898afa37 obsidian auto-sync 2026-04-23 21:07:06 2026-04-23 21:07:06 +03:00
dttb
03eed9f1aa obsidian auto-sync 2026-04-23 21:01:59 2026-04-23 21:01:59 +03:00
dttb
5344980890 obsidian auto-sync 2026-04-23 20:56:55 2026-04-23 20:56:55 +03:00
dttb
d7b9c928cd obsidian auto-sync 2026-04-23 20:46:47 2026-04-23 20:46:47 +03:00
dttb
18159b9e45 obsidian auto-sync 2026-04-23 20:41:43 2026-04-23 20:41:43 +03:00
dttb
3b76e737b4 obsidian auto-sync 2026-04-23 20:36:40 2026-04-23 20:36:40 +03:00
dttb
6ce6b11b72 obsidian auto-sync 2026-04-23 20:31:33 2026-04-23 20:31:33 +03:00
dttb
3eb564b917 obsidian auto-sync 2026-04-23 20:21:28 2026-04-23 20:21:29 +03:00
dttb
44f1f4be71 obsidian auto-sync 2026-04-23 20:11:25 2026-04-23 20:11:25 +03:00
dttb
1dbcf832eb obsidian auto-sync 2026-04-23 20:06:22 2026-04-23 20:06:22 +03:00
dttb
4781a6a309 obsidian auto-sync 2026-04-23 20:01:19 2026-04-23 20:01:19 +03:00
dttb
4f17689e73 obsidian auto-sync 2026-04-23 19:56:16 2026-04-23 19:56:16 +03:00
dttb
ab03fab25c obsidian auto-sync 2026-04-23 19:46:07 2026-04-23 19:46:07 +03:00
dttb
3306fdc275 obsidian auto-sync 2026-04-23 19:41:03 2026-04-23 19:41:03 +03:00
dttb
0b03ebb4fe obsidian auto-sync 2026-04-23 13:40:30 2026-04-23 13:40:30 +03:00
dttb
885d39eeac glavtorg: отчёт о работах 2026-04-23 + реквизиты для оплаты (25 000 ₽)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 13:37:59 +03:00
dttb
b70915a6c0 obsidian auto-sync 2026-04-23 13:35:22 2026-04-23 13:35:22 +03:00
dttb
7ae66f6f76 obsidian auto-sync 2026-04-23 13:30:14 2026-04-23 13:30:14 +03:00
dttb
e09198aae9 obsidian auto-sync 2026-04-23 13:25:06 2026-04-23 13:25:06 +03:00
dttb
022a7b5acc obsidian auto-sync 2026-04-23 13:19:58 2026-04-23 13:19:58 +03:00
dttb
2eb74d5ef0 obsidian auto-sync 2026-04-23 12:37:22 2026-04-23 12:37:22 +03:00
dttb
8d4d47adb4 obsidian auto-sync 2026-04-23 12:27:08 2026-04-23 12:27:08 +03:00
dttb
27877b2d65 obsidian auto-sync 2026-04-23 12:22:00 2026-04-23 12:22:00 +03:00
dttb
4da607340f obsidian auto-sync 2026-04-23 12:11:49 2026-04-23 12:11:49 +03:00
dttb
c9398ad0a1 obsidian auto-sync 2026-04-23 12:06:40 2026-04-23 12:06:40 +03:00
dttb
e96d084468 obsidian auto-sync 2026-04-23 10:55:27 2026-04-23 10:55:27 +03:00
dttb
614075dbe7 obsidian auto-sync 2026-04-23 10:50:19 2026-04-23 10:50:19 +03:00
dttb
c8e2b2d7c7 obsidian auto-sync 2026-04-23 10:45:11 2026-04-23 10:45:11 +03:00
dttb
4e3ff10217 obsidian auto-sync 2026-04-23 10:40:03 2026-04-23 10:40:03 +03:00
dttb
7b87454126 obsidian auto-sync 2026-04-23 10:34:55 2026-04-23 10:34:55 +03:00
dttb
54c3c748b3 obsidian auto-sync 2026-04-23 03:09:33 2026-04-23 03:09:33 +03:00
dttb
bf0c75cf5c obsidian auto-sync 2026-04-23 03:00:02 2026-04-23 03:00:02 +03:00
dttb
188f836274 obsidian auto-sync 2026-04-23 02:44:44 2026-04-23 02:44:44 +03:00
dttb
4b6f352bf1 obsidian auto-sync 2026-04-23 02:34:31 2026-04-23 02:34:31 +03:00
dttb
cc910abc3b obsidian auto-sync 2026-04-23 02:29:23 2026-04-23 02:29:23 +03:00
dttb
b0e7104981 obsidian auto-sync 2026-04-23 02:19:10 2026-04-23 02:19:10 +03:00
dttb
3deb0061bc obsidian auto-sync 2026-04-23 02:14:02 2026-04-23 02:14:02 +03:00
dttb
1d40005078 obsidian auto-sync 2026-04-23 02:08:54 2026-04-23 02:08:54 +03:00
dttb
2487af446f obsidian auto-sync 2026-04-23 01:58:40 2026-04-23 01:58:40 +03:00
dttb
68482be1a4 obsidian auto-sync 2026-04-23 01:43:22 2026-04-23 01:43:22 +03:00
dttb
43dc8344c7 obsidian auto-sync 2026-04-23 01:33:09 2026-04-23 01:33:09 +03:00
dttb
3a82d4bbfb obsidian auto-sync 2026-04-23 01:22:56 2026-04-23 01:22:56 +03:00
dttb
f44935ebf7 obsidian auto-sync 2026-04-23 01:07:38 2026-04-23 01:07:38 +03:00
dttb
d149ad0358 obsidian auto-sync 2026-04-23 01:02:30 2026-04-23 01:02:30 +03:00
dttb
cb97bceb09 obsidian auto-sync 2026-04-23 00:57:22 2026-04-23 00:57:22 +03:00
dttb
3d8c47a345 obsidian auto-sync 2026-04-23 00:26:49 2026-04-23 00:26:49 +03:00
dttb
ac17e5d00f obsidian auto-sync 2026-04-23 00:21:41 2026-04-23 00:21:41 +03:00
dttb
885e5c0df1 obsidian auto-sync 2026-04-23 00:16:33 2026-04-23 00:16:33 +03:00
dttb
5539de0523 obsidian auto-sync 2026-04-23 00:01:15 2026-04-23 00:01:15 +03:00
dttb
a1a4eba70b obsidian auto-sync 2026-04-22 23:56:07 2026-04-22 23:56:07 +03:00
dttb
b22adb6e04 obsidian auto-sync 2026-04-22 23:40:49 2026-04-22 23:40:49 +03:00
dttb
5bf852341c obsidian auto-sync 2026-04-22 23:35:41 2026-04-22 23:35:41 +03:00
dttb
545a478c90 obsidian auto-sync 2026-04-22 23:25:28 2026-04-22 23:25:28 +03:00
dttb
8119116723 obsidian auto-sync 2026-04-22 23:15:15 2026-04-22 23:15:15 +03:00
dttb
3d3f5d0c94 obsidian auto-sync 2026-04-22 23:10:07 2026-04-22 23:10:07 +03:00
dttb
8bd88fa732 obsidian auto-sync 2026-04-22 23:04:59 2026-04-22 23:04:59 +03:00
dttb
9e6b4213b4 obsidian auto-sync 2026-04-22 22:54:46 2026-04-22 22:54:46 +03:00
dttb
110054fbf8 obsidian auto-sync 2026-04-22 22:29:18 2026-04-22 22:29:18 +03:00
dttb
a390662684 obsidian auto-sync 2026-04-22 22:14:01 2026-04-22 22:14:01 +03:00
dttb
22e31d7643 obsidian auto-sync 2026-04-22 21:48:33 2026-04-22 21:48:33 +03:00
dttb
c3ceb4a59d obsidian auto-sync 2026-04-22 21:43:25 2026-04-22 21:43:25 +03:00
dttb
45c92ce634 obsidian auto-sync 2026-04-22 21:28:10 2026-04-22 21:28:10 +03:00
dttb
3e840f6d0f obsidian auto-sync 2026-04-22 21:23:02 2026-04-22 21:23:02 +03:00
dttb
4a64c3a625 obsidian auto-sync 2026-04-22 21:17:54 2026-04-22 21:17:54 +03:00
dttb
9beb9000bd obsidian auto-sync 2026-04-22 21:12:46 2026-04-22 21:12:46 +03:00
dttb
dddda0eae1 obsidian auto-sync 2026-04-22 21:02:33 2026-04-22 21:02:33 +03:00
dttb
20c2623b17 obsidian auto-sync 2026-04-22 20:57:25 2026-04-22 20:57:25 +03:00
dttb
1d66bd5a1a obsidian auto-sync 2026-04-22 20:52:17 2026-04-22 20:52:17 +03:00
dttb
de0158a4cb obsidian auto-sync 2026-04-22 20:47:09 2026-04-22 20:47:09 +03:00
dttb
b96d2eebaf obsidian auto-sync 2026-04-22 20:42:01 2026-04-22 20:42:01 +03:00
dttb
bb1e059f53 obsidian auto-sync 2026-04-22 20:31:48 2026-04-22 20:31:48 +03:00
dttb
d9da739cb2 obsidian auto-sync 2026-04-22 17:21:11 2026-04-22 17:21:11 +03:00
dttb
3077392240 obsidian auto-sync 2026-04-22 17:05:59 2026-04-22 17:05:59 +03:00
dttb
8258a9793d obsidian auto-sync 2026-04-22 17:00:55 2026-04-22 17:00:55 +03:00
dttb
55a7ba8e4b obsidian auto-sync 2026-04-22 16:55:53 2026-04-22 16:55:53 +03:00
dttb
2943b7ed55 obsidian auto-sync 2026-04-22 16:50:51 2026-04-22 16:50:51 +03:00
dttb
dce3e245a8 obsidian auto-sync 2026-04-22 16:40:47 2026-04-22 16:40:47 +03:00
dttb
7604b094ef obsidian auto-sync 2026-04-22 16:35:45 2026-04-22 16:35:45 +03:00
dttb
ebb7b37081 obsidian auto-sync 2026-04-22 16:30:42 2026-04-22 16:30:43 +03:00
dttb
5e7a7eb644 obsidian auto-sync 2026-04-22 16:25:40 2026-04-22 16:25:40 +03:00
dttb
b8902f33fb obsidian auto-sync 2026-04-22 15:55:29 2026-04-22 15:55:29 +03:00
dttb
e7564fc6f7 obsidian auto-sync 2026-04-22 15:35:18 2026-04-22 15:35:18 +03:00
dttb
65ea2f3f28 obsidian auto-sync 2026-04-22 15:30:16 2026-04-22 15:30:16 +03:00
dttb
53512cc8b3 obsidian auto-sync 2026-04-22 15:25:10 2026-04-22 15:25:10 +03:00
dttb
bb824309c2 obsidian auto-sync 2026-04-22 15:20:06 2026-04-22 15:20:06 +03:00
dttb
557c86eb67 obsidian auto-sync 2026-04-22 15:15:04 2026-04-22 15:15:04 +03:00
dttb
12c476d40e obsidian auto-sync 2026-04-22 15:09:41 2026-04-22 15:09:42 +03:00
dttb
77b6479d9f obsidian auto-sync 2026-04-22 14:59:21 2026-04-22 14:59:21 +03:00
dttb
7e1b3ac176 obsidian auto-sync 2026-04-22 14:53:50 2026-04-22 14:53:50 +03:00
dttb
09c8db1d92 obsidian auto-sync 2026-04-22 14:48:13 2026-04-22 14:48:13 +03:00
dttb
12b694fbfb obsidian auto-sync 2026-04-22 14:43:08 2026-04-22 14:43:08 +03:00
dttb
b2c1bd7290 obsidian auto-sync 2026-04-22 14:38:00 2026-04-22 14:38:00 +03:00
dttb
85ccd1fc8b obsidian auto-sync 2026-04-22 14:32:55 2026-04-22 14:32:55 +03:00
dttb
e860f8b968 obsidian auto-sync 2026-04-22 14:27:53 2026-04-22 14:27:53 +03:00
dttb
b6f5807a06 obsidian auto-sync 2026-04-22 13:52:45 2026-04-22 13:52:45 +03:00
dttb
1d5fb58753 obsidian auto-sync 2026-04-22 13:47:43 2026-04-22 13:47:43 +03:00
dttb
5da72f72c2 obsidian auto-sync 2026-04-22 13:37:39 2026-04-22 13:37:39 +03:00
dttb
d8bada2fea obsidian auto-sync 2026-04-22 13:32:37 2026-04-22 13:32:37 +03:00
dttb
0ccd9ca085 obsidian auto-sync 2026-04-22 13:27:35 2026-04-22 13:27:35 +03:00
dttb
c2d20540f6 obsidian auto-sync 2026-04-22 13:22:32 2026-04-22 13:22:32 +03:00
root
0c38ecb294 auto-backup claude-memory 2026-04-21_18:00 2026-04-21 18:00:42 +00:00
dttb
dfd6d752ac netbird-claude-install.ps1: принудительно TLS 1.2+ для старых Windows
PowerShell 5.1 на Windows 2012R2/2016 по умолчанию использует TLS 1.0/1.1 —
NPM с Let's Encrypt и netbird.io рвут такие соединения ("Базовое соединение
закрыто"). Выставляем Tls12+Tls13 в самом начале скрипта.
2026-04-21 20:40:18 +03:00
dttb
f203bf96e3 netbird: Claude-Diag setup-key + PowerShell-скрипт для Windows
Создан reusable setup-key tenant'а netbird.io для временных диагностических
подключений Claude к хостам. Группа Claude-Diag (d7jra32fadhs73dmqv5g),
ключ 83301E74-6F86-4CBD-AF77-0C65730103CA, истекает 2026-05-21.

snippets/netbird-claude-install.ps1 — идемпотентный PowerShell-скрипт:
ставит MSI, регистрирует в tenant, включает RDP и WinRM, открывает
firewall только для 100.70.0.0/16.

credentials.md — добавлена секция Netbird (API token, setup keys, команда
перевыпуска ключа).
2026-04-21 20:38:43 +03:00
dttb
c1819f96a8 VPS swtest.ru: настроен доступ с Mac и openclaw, добавлена документация
- SSH алиасы vps-znam / vps-znam-public в ~/.ssh/config (Mac) и /root/.ssh/config (LXC 137 openclaw)
- Приватный ключ vps_znam_key развёрнут на обоих хостах
- projects/dttb/vps-swtest.md — полная справка: пиры WG, DNAT-порты, сценарии
  заходов, безопасная правка wg0.conf через wg syncconf
- credentials.md — добавлена строка VPS в раздел SSH-ключи
- znamenskoye-ohothozyistvo.md — ссылка на новую справку VPS

TODO Олег: сохранить приватник в Bitwarden bit.dttb.ru
2026-04-21 20:08:46 +03:00
dttb
d3ad7c3e32 znamenskoye-ohothozyistvo: восстановлен резервный канал WG через VPS
Было две ошибки одновременно: Orange Pi шлёт на :51820 (VPS слушает :51821)
и pubkey пира 10.5.0.3 на VPS не соответствовал текущему ключу Orange Pi
(остался от старого MikroTik wg-vps).

Исправил атомарно через wg syncconf без падения других пиров. Теперь
89.111.140.86:8180 отвечает HTTP 200, WG handshake идёт. Netbird IP объекта
обновился на 100.70.106.227. Новый ключ ~/.ssh/vps_znam_key — нужно сохранить в Bitwarden.

Подробности: decisions/2026-04-21-znamenskoye-ohothozyistvo-wg-backup-channel.md
2026-04-21 15:45:16 +03:00
dttb
eef9f656ba obsidian auto-sync 2026-04-20 12:18:15 2026-04-20 12:18:15 +03:00
dttb
317309f60e obsidian auto-sync 2026-04-20 12:08:02 2026-04-20 12:08:02 +03:00
dttb
e34c46ce66 obsidian auto-sync 2026-04-20 11:52:44 2026-04-20 11:52:44 +03:00
dttb
3d2c534e18 obsidian auto-sync 2026-04-20 11:47:36 2026-04-20 11:47:36 +03:00
dttb
0e054aaf97 obsidian auto-sync 2026-04-20 11:37:23 2026-04-20 11:37:23 +03:00
dttb
ebfdaff1a6 obsidian auto-sync 2026-04-20 11:32:15 2026-04-20 11:32:15 +03:00
dttb
30aa609fa9 obsidian auto-sync 2026-04-20 11:22:02 2026-04-20 11:22:02 +03:00
dttb
d4f4402719 obsidian auto-sync 2026-04-20 11:16:54 2026-04-20 11:16:54 +03:00
dttb
3b525db7a2 obsidian auto-sync 2026-04-20 11:11:46 2026-04-20 11:11:46 +03:00
dttb
6e1827866a obsidian auto-sync 2026-04-20 11:06:38 2026-04-20 11:06:38 +03:00
dttb
cfebfc0b35 obsidian auto-sync 2026-04-20 11:01:30 2026-04-20 11:01:30 +03:00
dttb
8f880faaa1 obsidian auto-sync 2026-04-20 10:46:12 2026-04-20 10:46:12 +03:00
dttb
4449f064d9 obsidian auto-sync 2026-04-20 10:41:04 2026-04-20 10:41:04 +03:00
dttb
cbaf0f6a22 obsidian auto-sync 2026-04-20 10:25:46 2026-04-20 10:25:46 +03:00
dttb
500c666f23 obsidian auto-sync 2026-04-20 10:20:38 2026-04-20 10:20:38 +03:00
dttb
83fd5cf552 obsidian auto-sync 2026-04-20 10:15:30 2026-04-20 10:15:30 +03:00
dttb
b778e0ce4f obsidian auto-sync 2026-04-20 10:10:22 2026-04-20 10:10:22 +03:00
dttb
792f0a3608 obsidian auto-sync 2026-04-20 10:05:14 2026-04-20 10:05:14 +03:00
dttb
65dead53d6 obsidian auto-sync 2026-04-20 10:00:06 2026-04-20 10:00:06 +03:00
dttb
027220049e obsidian auto-sync 2026-04-19 21:17:56 2026-04-19 21:17:56 +03:00
root
bee249f515 auto-backup claude-memory 2026-04-19_12:00 2026-04-19 12:00:42 +00:00
2464dbd26b kb-agent-loop: score 98 → 15 (−83) 2026-04-19 07:13:40 +00:00
80759eb781 agent-loop: update audit report after cleanup (score 98 -> 15) 2026-04-19 07:13:21 +00:00
9f5d11a793 agent-loop: resolve orphans via wikilinks, date TODOs, fix broken path
- claude-memory/MEMORY.md: add wikilink index for 21+ memory files to close orphan debt
- claude-memory/mas-niikn.md: add date (2026-03-05) to 5 MAS-related TODOs
- notes/README.md: add karpathy-method to navigation index
- projects/dttb/spaceweb-dns.md: fix broken path -> wikilink [[feedback_spaceweb_dns]]

Score: 98 -> 15 (only remaining penalty is 3 legitimate duplicate basenames).
2026-04-19 07:13:17 +00:00
6570cf5678 code-server auto-sync 2026-04-19T07:10:01+00:00 2026-04-19 07:10:01 +00:00
Claude Auto-Sync
7b17f95810 auto-sync from MEMORY.md (2026-04-19 07:09) 2026-04-19 07:09:37 +00:00
dttb
84995a571d fix: 'Karpathy' = Андрей Карпати (человек), не copy-paste — чтобы бот не галлюцинировал 2026-04-19 09:48:36 +03:00
f94310db65 code-server auto-sync 2026-04-19T06:05:01+00:00 2026-04-19 06:05:01 +00:00
dttb
bac7d6abac obsidian auto-sync 2026-04-19 00:28:31 2026-04-19 00:28:31 +03:00
dttb
19b5e92647 obsidian auto-sync 2026-04-19 00:23:29 2026-04-19 00:23:29 +03:00
dttb
5c01a73962 obsidian auto-sync 2026-04-19 00:18:26 2026-04-19 00:18:26 +03:00
dttb
15a1746a0b obsidian auto-sync 2026-04-19 00:13:24 2026-04-19 00:13:24 +03:00
dttb
0b89f18e18 obsidian auto-sync 2026-04-19 00:08:13 2026-04-19 00:08:13 +03:00
dttb
78c17a5783 obsidian auto-sync 2026-04-19 00:03:08 2026-04-19 00:03:09 +03:00
dttb
d31a5032b4 obsidian auto-sync 2026-04-18 22:17:03 2026-04-18 22:17:03 +03:00
dttb
4beab05314 daily 2026-04-18 итог + 2026-04-19 план (после закрытия 6 пунктов) 2026-04-18 22:15:04 +03:00
dttb
8af6c47544 obsidian auto-sync 2026-04-18 22:11:35 2026-04-18 22:11:35 +03:00
dttb
49d124f931 obsidian auto-sync 2026-04-18 22:06:02 2026-04-18 22:06:02 +03:00
dttb
dff3dc0215 obsidian auto-sync 2026-04-18 22:00:30 2026-04-18 22:00:30 +03:00
dttb
f0f1759f3e obsidian auto-sync 2026-04-18 21:44:38 2026-04-18 21:44:39 +03:00
dttb
ca69de73ee obsidian auto-sync 2026-04-18 21:39:30 2026-04-18 21:39:31 +03:00
dttb
24c6f6aff4 obsidian auto-sync 2026-04-18 21:24:25 2026-04-18 21:24:25 +03:00
root
fa918cb672 auto-backup claude-memory 2026-04-18_18:00 2026-04-18 18:00:43 +00:00
dttb
88a17def35 obsidian auto-sync 2026-04-18 20:53:57 2026-04-18 20:53:57 +03:00
dttb
fe049e37d1 kb-agent-loop: 30-мин timeout safety на claude вызов 2026-04-18 20:48:57 +03:00
dttb
aefc961c3f obsidian auto-sync 2026-04-18 20:48:49 2026-04-18 20:48:49 +03:00
dttb
673832ddee obsidian auto-sync 2026-04-18 20:28:27 2026-04-18 20:28:27 +03:00
beaf5626ee kb-agent-loop: score 463 → 15 (−448) 2026-04-18 17:24:00 +00:00
db1d1c17fd agent-loop: добавил wikilink-индексы в README → 0 orphan_files
Добавил ## Навигация секции с [[wikilink]] в README.md каждой папки и
в корневой README. Это убирает 90 orphan_files (180 pts).

Score: 463 → 15 (осталось только 3 duplicate_basenames × 5).

Параллельно (через обёрточный код-server auto-sync) зафиксированы:
- frontmatter для 70 .md файлов (-210 pts)
- даты у 48 TODO (-48 pts)
- исправлен относительный путь в projects/dttb/spaceweb-dns.md (-10 pts)
2026-04-18 17:23:44 +00:00
f046b0027f code-server auto-sync 2026-04-18T17:20:01+00:00 2026-04-18 17:20:02 +00:00
dttb
fc626521af obsidian auto-sync 2026-04-18 20:18:14 2026-04-18 20:18:14 +03:00
dttb
d15c0ea194 kb-agent-loop: karpathy-style self-healing KB
Алгоритм (полный уровень 4):
1. baseline = kb-health.py → score_before
2. создать ветку auto-fix/DATE
3. Opus через claude -p --permission-mode acceptEdits читает health-отчёт,
   правит файлы (fm, broken paths, undated todos), коммитит в ветку
4. score_after = kb-health.py
5. если score_after < score_before → merge + push + удалить ветку
   иначе → reset, ничего не применять

Запускать на code-server (LXC 132) где есть Max OAuth. Вручную или cron.
Ограничения жёсткие: не удалять файлы, не трогать factual inventories,
не пушить самостоятельно из Opus — merge решает метрика.
2026-04-18 20:16:17 +03:00
dttb
4508bc7339 kb-health: объективная метрика качества KB (karpathy-style val_bpb)
6 категорий штрафов со взвешенной суммой:
- broken_wikilinks (×10) — [[foo]] не ведёт никуда
- broken_paths (×10) — [text](./foo.md) не существует
- missing_frontmatter (×3) — .md без frontmatter-заголовка
- orphan_files (×2) — нет входящих wikilinks и не в служебных папках
- undated_todos (×1) — "- [ ]" без YYYY-MM-DD
- duplicate_basenames (×5) — одинаковое имя в разных папках

Baseline сегодня: score=493 (158 файлов).
Выход: audit/DATE-health.md (человекочит) + audit/health-latest.json (для agent-loop).

False-positives зачинены:
- wikilinks внутри backticks/fenced code игнорим
- ../ и ./ пути резолвятся от файла-источника
- CLAUDE.md/README.md не требуют frontmatter
2026-04-18 20:14:43 +03:00
dttb
9b33688311 obsidian auto-sync 2026-04-18 12:46:25 2026-04-18 12:46:25 +03:00
dttb
2dcf9e3de2 obsidian auto-sync 2026-04-18 12:36:12 2026-04-18 12:36:12 +03:00
dttb
1f7d265f16 audit: +kb-audit-npm/creds/dns — расширение karpathy-style
- kb-audit-npm.py: NPM API → сверка с npm-proxy-hosts.md
  детектит новые/удалённые hosts + смену backend/SSL
- kb-audit-creds.py: HEAD/GET-ping всех URL из credentials.md
  с fallback на GET при 501/405, skip embedded-creds URLs
- kb-audit-dns.py: dig @8.8.8.8 и @10.0.0.1 для всех доменов NPM
  детектит NXDOMAIN + split-horizon

Первый прогон нашёл:
- NPM: 2 новых host (router/vpn.dttb.ru), 2 изменения (bitrix24 backend, git SSL)
- Creds: все 12 URL reachable ✓
- DNS: itilegent.ru не резолвится (публичные записи протухли)
2026-04-18 12:35:21 +03:00
dttb
c4791dc7d5 obsidian auto-sync 2026-04-18 12:31:04 2026-04-18 12:31:04 +03:00
dttb
da18194eb1 obsidian auto-sync 2026-04-18 12:00:31 2026-04-18 12:00:31 +03:00
dttb
77efae17ba obsidian auto-sync 2026-04-18 11:45:21 2026-04-18 11:45:21 +03:00
dttb
3991cd237d obsidian auto-sync 2026-04-18 11:19:55 2026-04-18 11:19:55 +03:00
dttb
afddfac2c4 obsidian auto-sync 2026-04-18 10:54:40 2026-04-18 10:54:40 +03:00
dttb
67e3657721 obsidian auto-sync 2026-04-18 10:49:38 2026-04-18 10:49:38 +03:00
dttb
ba811e9f09 openclaw: новые находки 2026-04-18 (Kiro monthly limit, cx free plan 3h window, очистка каталога моделей, OR UI access)
Добавлены разделы:
- "Something went wrong" после удаления модели из models.providers.zai.models
- Kiro 402 credits_exhausted — месячный кредит AWS, reset 1 числа
- cx/gpt-5.4 free plan rolling 3h window, не подходит для primary
- Как добавить Kiro-учётку через OmniRoute UI (нужен SSH-туннель или or.dttb.ru в NPM)

Обновлена memory feedback_openclaw_models.md:
- В 2026.4.15 в config нужен префикс zai/, но sessions.json оставлять как есть
- После очистки каталога — /new в Telegram, sed по sessions.json ломает

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 10:46:13 +03:00
dttb
1ba5ac5c75 obsidian auto-sync 2026-04-18 10:44:35 2026-04-18 10:44:35 +03:00
dttb
777835fb2a obsidian auto-sync 2026-04-18 10:14:16 2026-04-18 10:14:16 +03:00
dttb
cb069cad21 obsidian auto-sync 2026-04-18 10:09:10 2026-04-18 10:09:10 +03:00
dttb
ecf586302e obsidian auto-sync 2026-04-18 10:04:02 2026-04-18 10:04:02 +03:00
dttb
14232be932 obsidian auto-sync 2026-04-18 09:58:54 2026-04-18 09:58:54 +03:00
dttb
c518429b08 obsidian auto-sync 2026-04-18 09:53:50 2026-04-18 09:53:50 +03:00
dttb
84d91a2528 obsidian auto-sync 2026-04-18 09:43:47 2026-04-18 09:43:47 +03:00
dttb
cb29d70208 obsidian auto-sync 2026-04-18 09:38:44 2026-04-18 09:38:44 +03:00
dttb
4bdec224b5 obsidian auto-sync 2026-04-18 09:33:42 2026-04-18 09:33:42 +03:00
dttb
2fc1b21023 obsidian auto-sync 2026-04-18 09:28:39 2026-04-18 09:28:40 +03:00
dttb
248c7724a6 obsidian auto-sync 2026-04-18 06:27:14 2026-04-18 06:27:14 +03:00
dttb
6d91ea3d86 daily 2026-04-19: Fix B выполнен (unset host-managed auth в .zshenv) 2026-04-18 03:53:40 +03:00
root
a4195dc4b6 auto-backup claude-memory 2026-04-18_00:00 2026-04-18 00:00:41 +00:00
dttb
54d289c924 obsidian auto-sync 2026-04-18 01:17:00 2026-04-18 01:17:00 +03:00
dttb
a06c9faac5 obsidian auto-sync 2026-04-18 01:11:53 2026-04-18 01:11:53 +03:00
dttb
0236499c58 obsidian auto-sync 2026-04-18 01:06:44 2026-04-18 01:06:44 +03:00
dttb
a728c0ea3f plan 2026-04-19: улучшения KB (fix env, consolidate memory, audit NPM/DNS, health+level4) 2026-04-18 01:05:45 +03:00
dttb
d541209f4b obsidian auto-sync 2026-04-18 01:01:33 2026-04-18 01:01:33 +03:00
dttb
503f214e9c obsidian auto-sync 2026-04-18 00:56:28 2026-04-18 00:56:28 +03:00
dttb
435d5a419e obsidian auto-sync 2026-04-18 00:51:20 2026-04-18 00:51:20 +03:00
dttb
6d01833a25 obsidian auto-sync 2026-04-18 00:46:11 2026-04-18 00:46:11 +03:00
dttb
a379b626af kb-audit: уровень 3 — auto-apply safe drift fixes (karpathy-style)
- kb_audit_helpers.py — общие функции parse_live/inventory/deleted
- kb-audit-apply.py — применяет только structural факт-правки:
  * new VMID → добавить в "🔴 Остановленные" (только для stopped)
  * missing VMID → переместить в "🗑️ Удалённые" с датой
- Коммитит как kb-audit-bot <kb-audit@dttb.ru> — фильтруемо в git log
- Safety: live<5 хостов → abort
- Не трогает описания/IP/назначения — только структурные поля из pct list

Cron обновлён: audit → apply → propose (остаток для ручного ревью)
2026-04-18 00:42:49 +03:00
dttb
f90eb337d6 obsidian auto-sync 2026-04-18 00:41:00 2026-04-18 00:41:00 +03:00
dttb
73681b08f5 obsidian auto-sync 2026-04-18 00:30:46 2026-04-18 00:30:46 +03:00
a06556cc6c code-server auto-sync 2026-04-17T21:26:20+00:00 2026-04-17 21:26:20 +00:00
6ba2e61871 code-server auto-sync 2026-04-17T21:25:01+00:00 2026-04-17 21:25:01 +00:00
982bdc7c7a code-server auto-sync 2026-04-17T21:24:23+00:00 2026-04-17 21:24:24 +00:00
dttb
c8cf27df08 kb-audit: fix парсер — ловит table-rows и раздел 🗑️ удалённых 2026-04-18 00:24:20 +03:00
dttb
6368738ade scripts: kb-audit + propose — еженедельный drift-детектор для inventory
- kb-audit.py: сравнивает живой pct list/qm list с proxmox-inventory.md
  → audit/YYYY-MM-DD-drift.md (только факты, без LLM)
- kb-audit-propose.sh: прогоняет drift через Opus (Max OAuth на code-server)
  → audit/YYYY-MM-DD-proposed.md (patch на ревью)
- scripts/README.md: архитектура и cron-конфиг

Рекомендуемый cron на code-server: 0 6 * * 0 (воскр 06:00)
Правки не применяются автоматом — только ревью + ручной git apply.
2026-04-18 00:23:07 +03:00
dttb
13469e8ec3 obsidian auto-sync 2026-04-18 00:20:31 2026-04-18 00:20:32 +03:00
dttb
1af6527640 obsidian auto-sync 2026-04-17 23:39:31 2026-04-17 23:39:31 +03:00
dttb
3a770e2f7d obsidian auto-sync 2026-04-17 23:34:17 2026-04-17 23:34:17 +03:00
dttb
c8a36fc0fe obsidian auto-sync 2026-04-17 23:29:06 2026-04-17 23:29:06 +03:00
dttb
ff82c8366a obsidian auto-sync 2026-04-17 23:23:56 2026-04-17 23:23:56 +03:00
dttb
3d48567989 obsidian auto-sync 2026-04-17 23:23:40 2026-04-17 23:23:40 +03:00
dttb
d29ce2c95e obsidian auto-sync 2026-04-17 23:02:26 2026-04-17 23:02:27 +03:00
dttb
1b698583c1 obsidian auto-sync 2026-04-17 22:57:06 2026-04-17 22:57:06 +03:00
dttb
db81ef2378 docs: актуализация CLAUDE.md и MEMORY.md от устаревших ссылок
- CLAUDE.md: убран дубликат секции OmniRoute
- CLAUDE.md: +code-server (132), +openclaw (137), +схема sync через 4 хоста
- CLAUDE.md: ссылка на decision 2026-04-17-nextcloud-sync-schema
- MEMORY.md: LXC 133 clawdbot-1 помечен как удалён
- MEMORY.md: +LXC 137 openclaw, +138 vpn-proxy, +139 yaroslav-assistant
2026-04-17 22:49:01 +03:00
dttb
b9f0700a2e decision: +code-server auto-sync (cron 5м) и openclaw read-only (cron 15м) 2026-04-17 22:45:18 +03:00
dttb
f17e70400d cleanup: тесты sync удалены 2026-04-17 22:44:40 +03:00
dfb5c8266b code-server auto-sync 2026-04-17T19:44:38+00:00 2026-04-17 19:44:38 +00:00
dttb
e72b615907 test: sync через три хоста 224412 2026-04-17 22:44:12 +03:00
873 changed files with 43250 additions and 487 deletions

View File

@@ -1,5 +1,6 @@
[
"obsidian-git",
"dataview",
"templater-obsidian"
]
"templater-obsidian",
"terminal"
]

22
.obsidian/graph.json vendored Normal file
View File

@@ -0,0 +1,22 @@
{
"collapse-filter": true,
"search": "",
"showTags": false,
"showAttachments": false,
"hideUnresolved": false,
"showOrphans": true,
"collapse-color-groups": true,
"colorGroups": [],
"collapse-display": true,
"showArrow": false,
"textFadeMultiplier": 0,
"nodeSizeMultiplier": 1,
"lineSizeMultiplier": 1,
"collapse-forces": true,
"centerStrength": 0.518713248970312,
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1.0128658356055165,
"close": true
}

304
.obsidian/plugins/terminal/main.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,14 @@
{
"author": "polyipseity",
"description": "Integrate consoles, shells, and terminals.",
"fundingUrl": {
"Buy Me a Coffee": "https://buymeacoffee.com/polyipseity",
"GitHub Sponsors": "https://github.com/sponsors/polyipseity"
},
"version": "3.23.0",
"authorUrl": "https://github.com/polyipseity",
"id": "terminal",
"isDesktopOnly": false,
"minAppVersion": "1.4.11",
"name": "Terminal"
}

32
.obsidian/plugins/terminal/styles.css vendored Normal file
View File

@@ -0,0 +1,32 @@
.obsidian-plugin-library\:icon{fill:none;stroke:currentColor}.obsidian-plugin-library\:await-css{display:unset!important}.obsidian-plugin-library\:hide-status-bar{display:none}/**
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
* https://github.com/chjj/term.js
* @license MIT
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* Originally forked from (with the author's permission):
* Fabrice Bellard's javascript vt100 for jslinux:
* http://bellard.org/jslinux/
* Copyright (c) 2011 Fabrice Bellard
* The original design remains. The terminal itself
* has been extended to include xterm CSI codes, among
* other features.
*/.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;inset:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;inset:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.workspace-leaf-content[data-type="terminal:terminal"] .view-content{overflow:clip;display:flex;flex-direction:column}.terminal\:terminal{flex:1;min-width:0;min-height:0}.is-phone .workspace-leaf-content[data-type="terminal:terminal"] .view-content{padding-bottom:max(var(--size-4-4),calc(var(--icon-l) + var(--size-4-2) + max(var(--size-4-2),var(--safe-area-inset-bottom))))}

View File

@@ -27,10 +27,18 @@
## Инфраструктура
- **Proxmox:** 10.0.0.250 (root/1qaz!QAZ)
- **Gitea:** git.dttb.ru (oleg/OL260380eg)
- **Nextcloud:** dttb.ru (admin/1qaz!QAZ)
- **NPM:** 10.0.0.195:81 (it5870@yandex.ru/1qaz!QAZ)
- **Clawdbot-1 (НИИКН):** 10.0.0.237 (LXC 133, OmniRoute)
- **Gitea:** git.dttb.ru (oleg/OL260380eg) — LXC 136 (10.0.0.189)
- **Nextcloud AIO:** dttb.ru (admin/1qaz!QAZ) — VM 250 (10.0.0.230:11001)
- **NPM:** 10.0.0.195:81 (it5870@yandex.ru/1qaz!QAZ) — LXC 103
- **code-server:** ai.dttb.ru — LXC 132 (10.0.0.179) + OmniRoute + CLIProxy
- **OpenClaw:** bot.dttb.ru — LXC 137 (10.0.0.239) — основной AI-бот
## Синхронизация knowledge-base
См. [[decisions/2026-04-17-nextcloud-sync-schema]]. Три-четыре хоста держат vault в синхроне через Gitea:
- **Mac** `~/knowledge-base` — RW, git + rclone-bisync на Nextcloud (Stop-hook)
- **code-server LXC 132** `/root/knowledge-base` — RW, cron `*/5` `kb-autosync.sh`
- **openclaw LXC 137** `/root/knowledge-base` — RO, cron `*/15` `kb-pull.sh`
- **Nextcloud** `/Knowledge Base/` — сервисная копия для iPhone/веб-доступа
## Частые команды
- Список VM: `sshpass -p '1qaz!QAZ' ssh -o StrictHostKeyChecking=no root@10.0.0.250 qm list`
@@ -69,29 +77,12 @@
4. Обновляй inventory при изменениях в инфраструктуре
5. Коммить на русском: `git add -A && git commit -m "описание" && git push`
## Ресёрч через OmniRoute (бесплатные модели)
При работе над задачами используй двухэтапный подход:
1. **Ресёрч** — вызывай MCP тул `research` для поиска решений через бесплатные модели (Sonnet 4.5, GPT-5.4, Gemini)
2. **Исполнение** — реализуй найденное решение сам (Opus 4.6 через Max подписку)
### MCP тулы omniroute
- `research(query, model?)` — запрос к бесплатной модели. По умолчанию kr/claude-sonnet-4.5
- `research_compare(query, models?)` — сравнить ответы нескольких моделей
- `models_list()` — список доступных бесплатных моделей
### Рекомендуемые модели для ресёрча
### Рекомендуемые модели для ресёрча через research-тул
- `kr/claude-sonnet-4.5` — основная (Kiro/AWS, бесплатно)
- `cx/gpt-5.4` — альтернатива (Codex/OpenAI, бесплатно)
- `gh/claude-opus-4.6` — GitHub Models (бесплатно, лимиты)
- `gemini-cli/gemini-2.5-pro` — Google Gemini
### Когда использовать research
- Поиск best practices и подходов к задаче
- Сравнение технологий/решений
- Генерация конфигов и шаблонов для проверки
- НЕ используй для простых задач где ответ очевиден
### CLI скрипт
```bash
research "вопрос" # через Sonnet 4.5

View File

@@ -22,3 +22,24 @@
---
*Создано: 2026-02-26*
<!-- kb-auto-index -->
## Карта базы
- [[decisions/README]]
- [[notes/README]]
- [[snippets/README]]
- [[projects/dttb/README]]
- [[projects/niikn/README]]
- [[projects/glavtorg/README]]
- [[projects/krasnogorsk/README]]
- [[projects/mmfb/proxmox-inventory]]
- [[claude-memory/MEMORY]]
- [[projects/all-projects-summary]]
- [[projects/bitrix-sites]]
- [[projects/clawdbot-bots]]
- [[projects/homelab-proxmox]]
- [[projects/infrastructure-overview]]
- [[projects/nextcloud]]
- [[projects/unresolved-issues]]
- [[projects/video-surveillance]]

0
audit/.gitkeep Normal file
View File

View File

@@ -0,0 +1,47 @@
---
date: 2026-05-03
type: audit
source: kb-audit-creds.py
tags: [audit, creds, reachability]
---
# Credentials reachability — 2026-05-03
Ping-проверка URL из [[../projects/dttb/credentials|credentials.md]].
Проверяется только reachability (HTTP status), не реальный логин.
- Всего URL: **20**
- ✓ Reachable: 17 / ⚠ Questionable: 3 / ❌ Unreachable: 0
## ⚠ Нестандартный ответ
| URL | Status | Detail |
|---|---|---|
| `https://remot.dttb.ru/swagger/index.html` | 404 | Not Found |
| `https://api.netbird.io` | 404 | Not Found |
| `https://api.netbird.io/api/setup-keys` | 404 | Not Found |
## ✓ Все ответили нормально
| URL | Status | Категория |
|---|---|---|
| `https://10.0.0.250:8006` | 200 | ✓ reachable |
| `https://pve.dttb.ru` | 200 | ✓ reachable |
| `http://10.0.0.189:3000` | 200 | ✓ reachable |
| `http://git.dttb.ru` | 200 | ✓ reachable |
| `http://10.0.0.195:81` | 200 | ✓ reachable |
| `https://npm.dttb.ru` | 200 | ✓ reachable |
| `https://remot.dttb.ru/_admin` | 200 | ✓ reachable |
| `https://dttb.ru` | 200 | ✓ reachable |
| `https://dttb.ru/remote.php/dav/files/admin` | 401 | ✓ auth-required (сервер жив) |
| `https://vps.sweb.ru` | 200 | ✓ reachable |
| `https://api.sweb.ru/domains/dns` | 200 | ✓ reachable |
| `https://mail.niikn.com` | 200 | ✓ reachable |
| `http://192.168.1.22:81` | 200 | ✓ reachable |
| `https://edit.telegra.ph/auth/f1tfgzYpPpGlAr7cYHRzSeH59fYuNVB2V3fbCdypDc` | 200 | ✓ reachable |
| `https://api.telegra.ph/createPage` | 200 | ✓ reachable |
| `https://api.telegra.ph/editPage` | 200 | ✓ reachable |
| `https://telegra.ph/Nastrojka-VPN-04-24-2` | 200 | ✓ reachable |
---
*Автоматически через `scripts/kb-audit-creds.py`.*

View File

@@ -0,0 +1,81 @@
---
date: 2026-05-03
type: audit
source: kb-audit-dns.py
tags: [audit, dns]
---
# DNS resolve audit — 2026-05-03
Резолвим все домены из NPM через публичный DNS (8.8.8.8) и локальный роутер (10.0.0.1).
- Всего доменов: **22**
- NXDOMAIN на 8.8.8.8: 2 / пустой ответ локально: 1 / split-horizon: 20
## ❌ NXDOMAIN / не резолвится на 8.8.8.8 (публичный DNS)
| Домен | Локальный IP |
|---|---|
| `itilegent.ru` | (тоже нет) |
| `vpn.dttb.ru` | 10.0.0.195 |
## ⚠ Split-horizon — разные IP снаружи и внутри
Это нормально для *.dttb.ru (внешний Let's Encrypt IP vs локальный 10.0.0.195). Но неожиданный split может быть багом.
| Домен | Публичный (8.8.8.8) | Локальный (10.0.0.1) |
|---|---|---|
| `ai.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bit.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bitrix24.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `git.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `home.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `ip.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `link.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `mail.dttb.ru` | 176.62.183.186 | 10.0.0.107 |
| `matrix.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `npm.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `office.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `plex.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `porteiner.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `pve.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `rec.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `remot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `router.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `z.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
## ⚠ Пустой локальный резолв (роутер не знает)
- `itilegent.ru` (публичный: -)
## Полная таблица резолва
| Домен | 8.8.8.8 | 10.0.0.1 |
|---|---|---|
| `ai.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bit.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bitrix24.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `git.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `home.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `ip.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `itilegent.ru` | — | — |
| `link.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `mail.dttb.ru` | 176.62.183.186 | 10.0.0.107 |
| `matrix.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `npm.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `office.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `plex.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `porteiner.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `pve.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `rec.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `remot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `router.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `vpn.dttb.ru` | — | 10.0.0.195 |
| `z.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
---
*Автоматически через `scripts/kb-audit-dns.py`.*

70
audit/2026-05-03-drift.md Normal file
View File

@@ -0,0 +1,70 @@
---
date: 2026-05-03
type: audit
source: kb-audit.py
tags: [audit, drift, infrastructure]
---
# KB drift audit — 2026-05-03
Сравнение живого `pct list` / `qm list` с [[../projects/dttb/proxmox-inventory|proxmox-inventory.md]]
- Живых гостей Proxmox: **38**
- Упомянуто в inventory: **38**
- В обоих: 36 / только в live: 2 / отсутствуют в live: 0
- Известны как удалённые: 2 (в `## 🗑️ Удалённые`)
## ⚠ В Proxmox есть, в inventory НЕТ (надо добавить)
| VMID | Type | Status | Name |
|---|---|---|---|
| 128 | LXC | running | profi-parser |
| 131 | VM | running | ubuntu |
## ✓ Удалённые хосты (задокументированы): 133, 135
## Полный живой список
| VMID | Type | Status | Name |
|---|---|---|---|
| 100 | VM | stopped | NV |
| 101 | LXC | stopped | n8n |
| 102 | LXC | stopped | SMB |
| 103 | LXC | running | NPM |
| 104 | VM | stopped | Agent-DVR |
| 105 | VM | stopped | Nextcloud-AIO-dttb.ru |
| 106 | VM | running | pbs |
| 107 | VM | running | Mailcow |
| 108 | LXC | stopped | zabbix |
| 109 | VM | stopped | itilelegent |
| 110 | VM | stopped | Cloud |
| 111 | VM | running | WinServer2025 |
| 112 | VM | stopped | cloud-dttb |
| 113 | LXC | running | VaultWarden |
| 114 | LXC | running | LinkWarden |
| 115 | LXC | running | watchyourlan |
| 116 | LXC | running | rustdeskserver |
| 117 | LXC | stopped | motioneye |
| 118 | LXC | stopped | plex |
| 119 | LXC | stopped | myspeed |
| 120 | VM | stopped | 7 |
| 121 | LXC | stopped | docker-windows |
| 122 | LXC | stopped | qbittorrent |
| 123 | LXC | stopped | proxmox-local |
| 124 | VM | stopped | Matrix |
| 125 | VM | stopped | datacentr |
| 126 | LXC | stopped | debian |
| 127 | VM | running | haos-17.0 |
| 128 | LXC | running | profi-parser |
| 129 | VM | running | profi-parser-vm |
| 130 | VM | stopped | Zima-OS |
| 131 | VM | running | ubuntu |
| 132 | LXC | running | code-server |
| 134 | LXC | running | ZnamSecurityBot |
| 136 | LXC | running | gitea |
| 137 | LXC | running | openclaw |
| 138 | LXC | stopped | vpn-proxy |
| 250 | VM | running | Nextcloud-AIO |
---
*Автоматически сгенерировано `scripts/kb-audit.py`. Применять правки — вручную после ревью.*

155
audit/2026-05-03-health.md Normal file
View File

@@ -0,0 +1,155 @@
---
date: 2026-05-03
type: audit
source: kb-health.py
score: 458
tags: [audit, health, metric]
---
# KB health — 2026-05-03
**Score (меньше = лучше): `458`**
Проверено файлов: 327
## Разбивка
| Категория | Кол-во | Вес | Штраф |
|---|---:|---:|---:|
| broken_wikilinks | 7 | 10 | 70 |
| broken_paths | 20 | 10 | 200 |
| missing_frontmatter | 17 | 3 | 51 |
| orphan_files | 38 | 2 | 76 |
| undated_todos | 36 | 1 | 36 |
| duplicate_basenames | 5 | 5 | 25 |
| **ИТОГО** | | | **458** |
## Битые wikilinks
| Откуда | `[[таргет]]` |
|---|---|
| `decisions/2026-04-30-niikn-culture-gov-fakeip-fix.md` | `[[notes/govru-diagnosis]]` |
| `decisions/2026-05-02-apple-id-tj-via-residential-proxy.md` | `[[../snippets/clients/]]` |
| `decisions/2026-04-30-openwrt-homelab-agh-podkop-chain.md` | `[[../claude-memory/podkop]]` |
| `decisions/2026-04-29-rustdesk-client-deployment-package.md` | `[[../snippets/clients/]]` |
| `decisions/2026-04-28-niikn-uookn-sev-gov-fakeip-fix.md` | `[[notes/govru-diagnosis]]` |
| `projects/dttb/rustdesk.md` | `[[../../../knowledge-base/feedback_lxc_loadavg]]` |
| `snippets/clients/yaroslav-amnezia-setup.md` | `[[feedback_finland_security]]` |
## Битые relative-пути
| Откуда | Путь |
|---|---|
| `notes/claude/2026-04-21-200915-охотхозяйство-с-openwrt-на-orange-pi-нужно-настрои.md` | `projects/dttb/vps-swtest.md` |
| `notes/claude/2026-04-28-122042-промт-для-claude-code-развёртывание-rustdesk-api-s.md` | `decisions/2026-04-28-rustdesk-lejianwen-pro-migration.md` |
| `notes/claude/2026-04-28-122042-промт-для-claude-code-развёртывание-rustdesk-api-s.md` | `projects/dttb/rustdesk.md` |
| `notes/claude/2026-04-28-122042-промт-для-claude-code-развёртывание-rustdesk-api-s.md` | `projects/dttb/credentials.md` |
| `notes/claude/2026-04-29-153123-сделай-красивую-ссылку-с-локацией-финляндия-для-ha.md` | `projects/dttb/proxmox-inventory.md` |
| `notes/claude/2026-04-29-153123-сделай-красивую-ссылку-с-локацией-финляндия-для-ha.md` | `projects/dttb/credentials.md` |
| `notes/claude/2026-04-29-231939-сделай-красивую-ссылку-с-локацией-финляндия-для-ha.md` | `snippets/happ-routing-roscomvpn.md` |
| `notes/claude/2026-04-29-160010-сделай-красивую-ссылку-с-локацией-финляндия-для-ha.md` | `snippets/clients/yaroslav-happ-setup.md` |
| `notes/claude/2026-04-29-071329-на-компе-юрия-продолжим-проверь-он-сети.md` | `projects/mmfb/otchet-yuri-2026-04.md` |
| `notes/claude/2026-04-29-150044-сделай-красивую-ссылку-с-локацией-финляндия-для-ha.md` | `projects/dttb/vpn-clients.md` |
| `notes/claude/2026-04-29-223542-создадим-еще-одного-пользователя-подключение-к-vpn.md` | `snippets/clients/sergey-znamenskoye-happ-setup.md` |
| `notes/claude/2026-04-28-134112-можешь-найти-кп-мичуринец.md` | `projects/dttb/znamenskoye-network-topology.md` |
| `notes/claude/2026-04-28-134112-можешь-найти-кп-мичуринец.md` | `claude-memory/benelux-topology.md` |
| `notes/claude/2026-04-29-180420-создадим-еще-одного-пользователя-подключение-к-vpn.md` | `snippets/clients/sergey-znamenskoye-happ-setup.md` |
| `notes/claude/2026-04-28-132949-промт-для-claude-code-развёртывание-rustdesk-api-s.md` | `projects/dttb/rustdesk.md` |
| `notes/claude/2026-04-29-163821-сделай-красивую-ссылку-с-локацией-финляндия-для-ha.md` | `snippets/amnezia-split-tunnel-ru.md` |
| `notes/claude/2026-04-29-151943-сделай-красивую-ссылку-с-локацией-финляндия-для-ha.md` | `snippets/clients/yaroslav-happ-setup.md` |
| `notes/claude/2026-04-29-151943-сделай-красивую-ссылку-с-локацией-финляндия-для-ha.md` | `projects/dttb/vpn-clients.md` |
| `notes/claude/2026-04-29-151943-сделай-красивую-ссылку-с-локацией-финляндия-для-ha.md` | `projects/dttb/credentials.md` |
| `notes/claude/2026-04-29-001915-на-компе-юрия-продолжим-проверь-он-сети.md` | `projects/mmfb/yuri-vitalievich.md` |
## Без frontmatter (17)
- `projects/dttb/znamenskoye-log.md`
- `projects/niikn/kripto-arm.md`
- `projects/mmfb/yuri-vitalievich.md`
- `projects/mmfb/otchet-yuri-2026-04.md`
- `snippets/happ-vpn-client-instruction.md`
- `snippets/invoice-template.md`
- `snippets/assets/happ-routing-roscomvpn/README-upstream.md`
- `claude-memory/servicedesk-dttb.md`
- `claude-memory/benelux.md`
- `claude-memory/nextcloud-dttb.md`
- `claude-memory/nvr-fix.md`
- `claude-memory/videonablyudenie.md`
- `claude-memory/znamenskoe-home.md`
- `claude-memory/niikn-nextcloud.md`
- `claude-memory/krasnogorsk.md`
- `claude-memory/mas-niikn.md`
- `claude-memory/MEMORY.md`
## Orphan — без бэклинков (38)
_Эти файлы никто не упоминает через `[[..]]`. Кандидаты на удаление или добавление ссылок._
- `decisions/2026-04-21-znamenskoye-ohothozyistvo-wg-backup-channel.md`
- `decisions/2026-04-30-niikn-culture-gov-fakeip-fix.md`
- `decisions/2026-05-02-apple-id-tj-via-residential-proxy.md`
- `decisions/2026-04-20-niikn-nspd-bypass-via-lionart.md`
- `decisions/2026-04-28-netbird-watchdog-lxc-132-137.md`
- `decisions/2026-04-28-niikn-uookn-sev-gov-fakeip-fix.md`
- `projects/niikn/credentials.md`
- `projects/niikn/kripto-arm.md`
- `projects/niikn/domofon.md`
- `projects/mmfb/yuri-vitalievich.md`
- `projects/mmfb/otchet-yuri-2026-04.md`
- `projects/mmfb/mikrotik.md`
- `projects/zelenograd/README.md`
- `snippets/happ-routing-roscomvpn.md`
- `snippets/invoice-template.md`
- `snippets/assets/happ-routing-roscomvpn/README-upstream.md`
- `claude-memory/cliproxy_code_server.md`
- `claude-memory/servicedesk-dttb.md`
- `claude-memory/benelux-topology.md`
- `claude-memory/benelux.md`
- `claude-memory/znamenskoye-cameras.md`
- `claude-memory/nextcloud-dttb.md`
- `claude-memory/nvr-fix.md`
- `claude-memory/niikn-vpn-status.md`
- `claude-memory/znamenskoye-ohothozyistvo.md`
- `claude-memory/znamenskoye-network.md`
- `claude-memory/niikn-nextcloud-incident.md`
- `claude-memory/videonablyudenie.md`
- `claude-memory/znamenskoe-home.md`
- `claude-memory/feedback_dns_fakeip.md`
- ... +8 ещё
## TODO без даты (36 шт в 5 файлах)
- `decisions/2026-04-30-rustdesk-pre-prod-audit.md` — 13 шт
- `templates/vpn-client.md` — 7 шт
- `decisions/2026-04-29-rustdesk-client-deployment-package.md` — 6 шт
- `projects/dttb/vpn-clients.md` — 5 шт
- `claude-memory/mas-niikn.md` — 5 шт
## Дубликаты имён (5)
- `README.md`:
- `README.md`
- `decisions/README.md`
- `notes/README.md`
- `projects/dttb/README.md`
- `projects/glavtorg/README.md`
- `projects/niikn/README.md`
- `projects/krasnogorsk/README.md`
- `projects/zelenograd/README.md`
- `projects/dttb/nextcloud-talk-bot/README.md`
- `snippets/README.md`
- `scripts/README.md`
- `nextcloud.md`:
- `projects/nextcloud.md`
- `projects/dttb/nextcloud.md`
- `proxmox-inventory.md`:
- `projects/dttb/proxmox-inventory.md`
- `projects/mmfb/proxmox-inventory.md`
- `credentials.md`:
- `projects/dttb/credentials.md`
- `projects/niikn/credentials.md`
- `mikrotik.md`:
- `projects/niikn/mikrotik.md`
- `projects/mmfb/mikrotik.md`
---
*Генерируется `scripts/kb-health.py`. JSON-версия в `audit/health-latest.json` для agent-loop.*

View File

@@ -0,0 +1,62 @@
---
date: 2026-05-03
type: audit
source: kb-audit-npm.py
tags: [audit, drift, npm]
---
# NPM drift audit — 2026-05-03
Сверка [[../projects/dttb/npm-proxy-hosts|npm-proxy-hosts.md]] с NPM API (https://npm.dttb.ru).
- Живых proxy hosts: **22**
- В KB: **20**
- Совпадений: 20 / новых: 2 / удалённых из NPM: 0 / с изменениями: 3
## ⚠ Новые hosts (в NPM есть, в KB нет)
| ID | Домены | Backend | SSL | Enabled |
|---|---|---|---|---|
| 26 | `router.dttb.ru` | `10.0.0.1:8080` | ✓ | on |
| 27 | `vpn.dttb.ru` | `10.0.0.141:8443` | - | on |
## 🔄 Изменения (ID совпадает, но что-то сменилось)
### #12 `bitrix24.dttb.ru`
- backend: KB=`10.0.0.223:8080` → live=`10.0.0.224:8080`
### #14 `remot.dttb.ru`
- backend: KB=`10.0.0.43:21114` → live=`10.0.0.244:21114`
### #22 `git.dttb.ru`
- ssl: KB=✗ → live=✓
## Полный живой список
| ID | Домены | Backend | SSL | Enabled |
|---|---|---|---|---|
| 1 | `dttb.ru` | `10.0.0.230:11001` | ✓ | on |
| 2 | `office.dttb.ru` | `10.0.0.169:8080` | ✓ | on |
| 3 | `itilegent.ru` | `10.0.0.223:8080` | ✓ | on |
| 4 | `npm.dttb.ru` | `10.0.0.195:81` | ✓ | on |
| 5 | `porteiner.dttb.ru` | `10.0.0.10:9443` | ✓ | on |
| 6 | `pve.dttb.ru` | `10.0.0.250:8006` | ✓ | on |
| 9 | `ai.dttb.ru` | `10.0.0.179:8080` | ✓ | on |
| 10 | `bit.dttb.ru` | `10.0.0.217:8080` | ✓ | on |
| 11 | `link.dttb.ru` | `10.0.0.184:3000` | ✓ | on |
| 12 | `bitrix24.dttb.ru` | `10.0.0.224:8080` | ✓ | on |
| 13 | `ip.dttb.ru` | `10.0.0.112:8840` | ✓ | on |
| 14 | `remot.dttb.ru` | `10.0.0.244:21114` | ✓ | on |
| 15 | `plex.dttb.ru` | `10.0.0.200:32400` | ✓ | on |
| 16 | `home.dttb.ru` | `10.0.0.155:8123` | ✓ | on |
| 17 | `z.dttb.ru` | `10.0.0.220:80` | ✓ | on |
| 21 | `rec.dttb.ru` | `10.0.0.227:8091` | ✓ | on |
| 22 | `git.dttb.ru` | `10.0.0.189:3000` | ✓ | on |
| 23 | `matrix.dttb.ru` | `10.0.0.224:8080` | ✓ | on |
| 25 | `mail.dttb.ru` | `10.0.0.107:443` | ✓ | on |
| 26 | `router.dttb.ru` | `10.0.0.1:8080` | ✓ | on |
| 27 | `vpn.dttb.ru` | `10.0.0.141:8443` | - | on |
| 28 | `bot.dttb.ru` | `10.0.0.239:18789` | ✓ | on |
---
*Автоматически через `scripts/kb-audit-npm.py`.*

View File

@@ -0,0 +1,13 @@
---
date: 2026-05-03
type: audit-proposed
source: kb-audit-propose.sh (Opus 4.7)
tags: [audit, proposed, inventory]
---
# Предложенные правки inventory — 2026-05-03
Сгенерировано Claude Opus на основе [[2026-05-03-drift|drift-отчёта]].
**Правки НЕ применены.** Ревью — ты. Apply — вручную.

View File

@@ -0,0 +1,37 @@
---
date: 2026-05-06
type: audit
source: scripts/kb-objects-audit.py
tags: [audit, objects, frontmatter, links]
score: 6
---
# KB objects audit — 2026-05-06
**Score (меньше = лучше): `6`**
- Проектов с frontmatter: **12/12** (0 проблем)
- NetBird online-пиров без проектной карточки: **3**
- Битых wiki-ссылок `[[...]]`: **0**
## Frontmatter в projects/
✅ все проекты имеют валидный frontmatter
## Online netbird-пиры без проектной карточки
Эти пиры онлайн в NetBird, но не привязаны ни к одной projects/-странице.
Бот не сможет ответить «найди X» осмысленно — нет файла или alias.
Лечение: либо создать stub в `projects/<slug>/README.md` (см. `projects/lipki/` как образец),
либо добавить имя пира как полную строку в `aliases` подходящего проекта.
| NetBird-имя | IP | OS | Город |
|---|---|---|---|
| `DESKTOP-2IOQS54` | 100.70.82.83 | Windows 10 | Saransk |
| `DESKTOP-AGBMLPN` | 100.70.0.106 | Windows 11 | Helsinki |
| `DESKTOP-HL0BB05` | 100.70.235.80 | Windows 11 | Lipetsk |
## Битые wiki-ссылки
✅ битых ссылок не найдено

View File

@@ -0,0 +1,63 @@
---
date: 2026-04-17
type: audit
source: kb-audit.py
tags: [audit, drift, infrastructure]
---
# KB drift audit — 2026-04-17
Сравнение живого `pct list` / `qm list` с [[../projects/dttb/proxmox-inventory|proxmox-inventory.md]]
- Живых гостей Proxmox: **36**
- Упомянуто в inventory: **39**
- В обоих: 36 / только в live: 0 / отсутствуют в live: 0
- Известны как удалённые: 3 (в `## 🗑️ Удалённые`)
## ✓ Удалённые хосты (задокументированы): 129, 133, 135
## ✓ Inventory полностью совпадает с живой инфраструктурой
## Полный живой список
| VMID | Type | Status | Name |
|---|---|---|---|
| 100 | VM | stopped | NV |
| 101 | LXC | stopped | n8n |
| 102 | LXC | stopped | SMB |
| 103 | LXC | running | NPM |
| 104 | VM | stopped | Agent-DVR |
| 105 | VM | stopped | Nextcloud-AIO-dttb.ru |
| 106 | VM | running | pbs |
| 107 | VM | running | Mailcow |
| 108 | LXC | stopped | zabbix |
| 109 | VM | stopped | itilelegent |
| 110 | VM | stopped | Cloud |
| 111 | VM | running | WinServer2025 |
| 112 | VM | stopped | cloud-dttb |
| 113 | LXC | running | VaultWarden |
| 114 | LXC | running | LinkWarden |
| 115 | LXC | running | watchyourlan |
| 116 | LXC | running | rustdeskserver |
| 117 | LXC | stopped | motioneye |
| 118 | LXC | stopped | plex |
| 119 | LXC | stopped | myspeed |
| 120 | VM | stopped | 7 |
| 121 | LXC | stopped | docker-windows |
| 122 | LXC | stopped | qbittorrent |
| 123 | LXC | stopped | proxmox-local |
| 124 | VM | stopped | Matrix |
| 125 | VM | stopped | datacentr |
| 126 | LXC | stopped | debian |
| 127 | VM | running | haos-17.0 |
| 130 | VM | stopped | Zima-OS |
| 132 | LXC | running | code-server |
| 134 | LXC | running | ZnamSecurityBot |
| 136 | LXC | running | gitea |
| 137 | LXC | running | openclaw |
| 138 | LXC | running | vpn-proxy |
| 139 | LXC | running | yaroslav-assistant |
| 250 | VM | running | Nextcloud-AIO |
---
*Автоматически сгенерировано `scripts/kb-audit.py`. Применять правки — вручную после ревью.*

View File

@@ -0,0 +1,13 @@
---
date: 2026-04-17
type: audit-proposed
source: kb-audit-propose.sh (Opus 4.7)
tags: [audit, proposed, inventory]
---
# Предложенные правки inventory — 2026-04-17
Сгенерировано Claude Opus на основе [[2026-04-17-drift|drift-отчёта]].
**Правки НЕ применены.** Ревью — ты. Apply — вручную.
Задача носила исследовательско-аналитический характер (сверка drift-отчёта), кода править не требуется — `ExitPlanMode` не нужен. Анализ выше, план-заметка сохранена в `/root/.claude/plans/drift-transient-bonbon.md`. Жду твоих указаний: закрывать аудит, удалять `.tmp`, или копать глубже (IP/NPM-сверка)?

View File

@@ -0,0 +1,34 @@
---
date: 2026-04-18
type: audit
source: kb-audit-creds.py
tags: [audit, creds, reachability]
---
# Credentials reachability — 2026-04-18
Ping-проверка URL из [[../projects/dttb/credentials|credentials.md]].
Проверяется только reachability (HTTP status), не реальный логин.
- Всего URL: **12**
- ✓ Reachable: 12 / ⚠ Questionable: 0 / ❌ Unreachable: 0
## ✓ Все ответили нормально
| URL | Status | Категория |
|---|---|---|
| `https://10.0.0.250:8006` | 200 | ✓ reachable |
| `https://pve.dttb.ru` | 200 | ✓ reachable |
| `http://10.0.0.189:3000` | 200 | ✓ reachable |
| `http://git.dttb.ru` | 200 | ✓ reachable |
| `http://10.0.0.195:81` | 200 | ✓ reachable |
| `https://npm.dttb.ru` | 200 | ✓ reachable |
| `https://dttb.ru` | 200 | ✓ reachable |
| `https://dttb.ru/remote.php/dav/files/admin` | 401 | ✓ auth-required (сервер жив) |
| `https://vps.sweb.ru` | 200 | ✓ reachable |
| `https://api.sweb.ru/domains/dns` | 200 | ✓ reachable |
| `https://mail.niikn.com` | 200 | ✓ reachable |
| `http://192.168.1.22:81` | 200 | ✓ reachable |
---
*Автоматически через `scripts/kb-audit-creds.py`.*

View File

@@ -0,0 +1,53 @@
---
date: 2026-04-18
type: audit
source: kb-audit-dns.py
tags: [audit, dns]
---
# DNS resolve audit — 2026-04-18
Резолвим все домены из NPM через публичный DNS (8.8.8.8) и локальный роутер (10.0.0.1).
- Всего доменов: **22**
- NXDOMAIN на 8.8.8.8: 1 / пустой ответ локально: 1 / split-horizon: 0
## ❌ NXDOMAIN / не резолвится на 8.8.8.8 (публичный DNS)
| Домен | Локальный IP |
|---|---|
| `itilegent.ru` | (тоже нет) |
## ⚠ Пустой локальный резолв (роутер не знает)
- `itilegent.ru` (публичный: -)
## Полная таблица резолва
| Домен | 8.8.8.8 | 10.0.0.1 |
|---|---|---|
| `ai.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `bit.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `bitrix24.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `bot.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `git.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `home.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `ip.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `itilegent.ru` | — | — |
| `link.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `mail.dttb.ru` | 10.0.0.107 | 10.0.0.107 |
| `matrix.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `npm.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `office.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `plex.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `porteiner.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `pve.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `rec.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `remot.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `router.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `vpn.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
| `z.dttb.ru` | 10.0.0.195 | 10.0.0.195 |
---
*Автоматически через `scripts/kb-audit-dns.py`.*

View File

@@ -0,0 +1,55 @@
---
date: 2026-04-18
type: audit
source: kb-health.py
score: 45
tags: [audit, health, metric]
---
# KB health — 2026-04-18
**Score (меньше = лучше): `45`**
Проверено файлов: 159
## Разбивка
| Категория | Кол-во | Вес | Штраф |
|---|---:|---:|---:|
| broken_wikilinks | 0 | 10 | 0 |
| broken_paths | 3 | 10 | 30 |
| missing_frontmatter | 0 | 3 | 0 |
| orphan_files | 0 | 2 | 0 |
| undated_todos | 0 | 1 | 0 |
| duplicate_basenames | 3 | 5 | 15 |
| **ИТОГО** | | | **45** |
## Битые relative-пути
| Откуда | Путь |
|---|---|
| `decisions/2026-04-14-niikn-openwrt-awg-fix.md` | `/root/.claude/knowledge-base/projects/niikn/openwrt-bypass.md` |
| `decisions/2026-04-14-niikn-openwrt-awg-fix.md` | `/root/.claude/projects/-root/memory/niikn-vpn-status.md` |
| `claude-memory/niikn-vpn-status.md` | `/root/.claude/knowledge-base/projects/niikn/openwrt-bypass.md` |
## Дубликаты имён (3)
- `README.md`:
- `README.md`
- `decisions/README.md`
- `notes/README.md`
- `projects/krasnogorsk/README.md`
- `projects/dttb/README.md`
- `projects/glavtorg/README.md`
- `projects/niikn/README.md`
- `projects/dttb/nextcloud-talk-bot/README.md`
- `snippets/README.md`
- `scripts/README.md`
- `nextcloud.md`:
- `projects/nextcloud.md`
- `projects/dttb/nextcloud.md`
- `proxmox-inventory.md`:
- `projects/dttb/proxmox-inventory.md`
- `projects/mmfb/proxmox-inventory.md`
---
*Генерируется `scripts/kb-health.py`. JSON-версия в `audit/health-latest.json` для agent-loop.*

View File

@@ -0,0 +1,59 @@
---
date: 2026-04-18
type: audit
source: kb-audit-npm.py
tags: [audit, drift, npm]
---
# NPM drift audit — 2026-04-18
Сверка [[../projects/dttb/npm-proxy-hosts|npm-proxy-hosts.md]] с NPM API (https://npm.dttb.ru).
- Живых proxy hosts: **22**
- В KB: **20**
- Совпадений: 20 / новых: 2 / удалённых из NPM: 0 / с изменениями: 2
## ⚠ Новые hosts (в NPM есть, в KB нет)
| ID | Домены | Backend | SSL | Enabled |
|---|---|---|---|---|
| 26 | `router.dttb.ru` | `10.0.0.1:8080` | ✓ | on |
| 27 | `vpn.dttb.ru` | `10.0.0.141:8443` | - | on |
## 🔄 Изменения (ID совпадает, но что-то сменилось)
### #12 `bitrix24.dttb.ru`
- backend: KB=`10.0.0.223:8080` → live=`10.0.0.224:8080`
### #22 `git.dttb.ru`
- ssl: KB=✗ → live=✓
## Полный живой список
| ID | Домены | Backend | SSL | Enabled |
|---|---|---|---|---|
| 1 | `dttb.ru` | `10.0.0.230:11001` | ✓ | on |
| 2 | `office.dttb.ru` | `10.0.0.169:8080` | ✓ | on |
| 3 | `itilegent.ru` | `10.0.0.223:8080` | ✓ | on |
| 4 | `npm.dttb.ru` | `10.0.0.195:81` | ✓ | on |
| 5 | `porteiner.dttb.ru` | `10.0.0.10:9443` | ✓ | on |
| 6 | `pve.dttb.ru` | `10.0.0.250:8006` | ✓ | on |
| 9 | `ai.dttb.ru` | `10.0.0.179:8080` | ✓ | on |
| 10 | `bit.dttb.ru` | `10.0.0.217:8080` | ✓ | on |
| 11 | `link.dttb.ru` | `10.0.0.184:3000` | ✓ | on |
| 12 | `bitrix24.dttb.ru` | `10.0.0.224:8080` | ✓ | on |
| 13 | `ip.dttb.ru` | `10.0.0.112:8840` | ✓ | on |
| 14 | `remot.dttb.ru` | `10.0.0.43:21114` | ✓ | on |
| 15 | `plex.dttb.ru` | `10.0.0.200:32400` | ✓ | on |
| 16 | `home.dttb.ru` | `10.0.0.155:8123` | ✓ | on |
| 17 | `z.dttb.ru` | `10.0.0.220:80` | ✓ | on |
| 21 | `rec.dttb.ru` | `10.0.0.227:8091` | ✓ | on |
| 22 | `git.dttb.ru` | `10.0.0.189:3000` | ✓ | on |
| 23 | `matrix.dttb.ru` | `10.0.0.224:8080` | ✓ | on |
| 25 | `mail.dttb.ru` | `10.0.0.107:443` | ✓ | on |
| 26 | `router.dttb.ru` | `10.0.0.1:8080` | ✓ | on |
| 27 | `vpn.dttb.ru` | `10.0.0.141:8443` | - | on |
| 28 | `bot.dttb.ru` | `10.0.0.239:18789` | ✓ | on |
---
*Автоматически через `scripts/kb-audit-npm.py`.*

View File

@@ -0,0 +1,34 @@
---
date: 2026-04-19
type: audit
source: kb-audit-creds.py
tags: [audit, creds, reachability]
---
# Credentials reachability — 2026-04-19
Ping-проверка URL из [[../projects/dttb/credentials|credentials.md]].
Проверяется только reachability (HTTP status), не реальный логин.
- Всего URL: **12**
- ✓ Reachable: 12 / ⚠ Questionable: 0 / ❌ Unreachable: 0
## ✓ Все ответили нормально
| URL | Status | Категория |
|---|---|---|
| `https://10.0.0.250:8006` | 200 | ✓ reachable |
| `https://pve.dttb.ru` | 200 | ✓ reachable |
| `http://10.0.0.189:3000` | 200 | ✓ reachable |
| `http://git.dttb.ru` | 200 | ✓ reachable |
| `http://10.0.0.195:81` | 200 | ✓ reachable |
| `https://npm.dttb.ru` | 200 | ✓ reachable |
| `https://dttb.ru` | 200 | ✓ reachable |
| `https://dttb.ru/remote.php/dav/files/admin` | 401 | ✓ auth-required (сервер жив) |
| `https://vps.sweb.ru` | 200 | ✓ reachable |
| `https://api.sweb.ru/domains/dns` | 200 | ✓ reachable |
| `https://mail.niikn.com` | 200 | ✓ reachable |
| `http://192.168.1.22:81` | 200 | ✓ reachable |
---
*Автоматически через `scripts/kb-audit-creds.py`.*

View File

@@ -0,0 +1,81 @@
---
date: 2026-04-19
type: audit
source: kb-audit-dns.py
tags: [audit, dns]
---
# DNS resolve audit — 2026-04-19
Резолвим все домены из NPM через публичный DNS (8.8.8.8) и локальный роутер (10.0.0.1).
- Всего доменов: **22**
- NXDOMAIN на 8.8.8.8: 2 / пустой ответ локально: 1 / split-horizon: 20
## ❌ NXDOMAIN / не резолвится на 8.8.8.8 (публичный DNS)
| Домен | Локальный IP |
|---|---|
| `itilegent.ru` | (тоже нет) |
| `vpn.dttb.ru` | 10.0.0.195 |
## ⚠ Split-horizon — разные IP снаружи и внутри
Это нормально для *.dttb.ru (внешний Let's Encrypt IP vs локальный 10.0.0.195). Но неожиданный split может быть багом.
| Домен | Публичный (8.8.8.8) | Локальный (10.0.0.1) |
|---|---|---|
| `ai.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bit.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bitrix24.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `git.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `home.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `ip.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `link.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `mail.dttb.ru` | 176.62.183.186 | 10.0.0.107 |
| `matrix.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `npm.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `office.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `plex.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `porteiner.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `pve.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `rec.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `remot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `router.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `z.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
## ⚠ Пустой локальный резолв (роутер не знает)
- `itilegent.ru` (публичный: -)
## Полная таблица резолва
| Домен | 8.8.8.8 | 10.0.0.1 |
|---|---|---|
| `ai.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bit.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bitrix24.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `git.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `home.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `ip.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `itilegent.ru` | — | — |
| `link.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `mail.dttb.ru` | 176.62.183.186 | 10.0.0.107 |
| `matrix.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `npm.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `office.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `plex.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `porteiner.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `pve.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `rec.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `remot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `router.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `vpn.dttb.ru` | — | 10.0.0.195 |
| `z.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
---
*Автоматически через `scripts/kb-audit-dns.py`.*

View File

@@ -0,0 +1,63 @@
---
date: 2026-04-19
type: audit
source: kb-audit.py
tags: [audit, drift, infrastructure]
---
# KB drift audit — 2026-04-19
Сравнение живого `pct list` / `qm list` с [[../projects/dttb/proxmox-inventory|proxmox-inventory.md]]
- Живых гостей Proxmox: **36**
- Упомянуто в inventory: **39**
- В обоих: 36 / только в live: 0 / отсутствуют в live: 0
- Известны как удалённые: 3 (в `## 🗑️ Удалённые`)
## ✓ Удалённые хосты (задокументированы): 129, 133, 135
## ✓ Inventory полностью совпадает с живой инфраструктурой
## Полный живой список
| VMID | Type | Status | Name |
|---|---|---|---|
| 100 | VM | stopped | NV |
| 101 | LXC | stopped | n8n |
| 102 | LXC | stopped | SMB |
| 103 | LXC | running | NPM |
| 104 | VM | stopped | Agent-DVR |
| 105 | VM | stopped | Nextcloud-AIO-dttb.ru |
| 106 | VM | running | pbs |
| 107 | VM | running | Mailcow |
| 108 | LXC | stopped | zabbix |
| 109 | VM | stopped | itilelegent |
| 110 | VM | stopped | Cloud |
| 111 | VM | running | WinServer2025 |
| 112 | VM | stopped | cloud-dttb |
| 113 | LXC | running | VaultWarden |
| 114 | LXC | running | LinkWarden |
| 115 | LXC | running | watchyourlan |
| 116 | LXC | running | rustdeskserver |
| 117 | LXC | stopped | motioneye |
| 118 | LXC | stopped | plex |
| 119 | LXC | stopped | myspeed |
| 120 | VM | stopped | 7 |
| 121 | LXC | stopped | docker-windows |
| 122 | LXC | stopped | qbittorrent |
| 123 | LXC | stopped | proxmox-local |
| 124 | VM | stopped | Matrix |
| 125 | VM | stopped | datacentr |
| 126 | LXC | stopped | debian |
| 127 | VM | running | haos-17.0 |
| 130 | VM | stopped | Zima-OS |
| 132 | LXC | running | code-server |
| 134 | LXC | running | ZnamSecurityBot |
| 136 | LXC | running | gitea |
| 137 | LXC | running | openclaw |
| 138 | LXC | running | vpn-proxy |
| 139 | LXC | running | yaroslav-assistant |
| 250 | VM | running | Nextcloud-AIO |
---
*Автоматически сгенерировано `scripts/kb-audit.py`. Применять правки — вручную после ревью.*

View File

@@ -0,0 +1,47 @@
---
date: 2026-04-19
type: audit
source: kb-health.py
score: 15
tags: [audit, health, metric]
---
# KB health — 2026-04-19
**Score (меньше = лучше): `15`**
Проверено файлов: 194
## Разбивка
| Категория | Кол-во | Вес | Штраф |
|---|---:|---:|---:|
| broken_wikilinks | 0 | 10 | 0 |
| broken_paths | 0 | 10 | 0 |
| missing_frontmatter | 0 | 3 | 0 |
| orphan_files | 0 | 2 | 0 |
| undated_todos | 0 | 1 | 0 |
| duplicate_basenames | 3 | 5 | 15 |
| **ИТОГО** | | | **15** |
## Дубликаты имён (3)
- `README.md`:
- `README.md`
- `decisions/README.md`
- `notes/README.md`
- `projects/dttb/README.md`
- `projects/glavtorg/README.md`
- `projects/niikn/README.md`
- `projects/krasnogorsk/README.md`
- `projects/dttb/nextcloud-talk-bot/README.md`
- `snippets/README.md`
- `scripts/README.md`
- `nextcloud.md`:
- `projects/nextcloud.md`
- `projects/dttb/nextcloud.md`
- `proxmox-inventory.md`:
- `projects/dttb/proxmox-inventory.md`
- `projects/mmfb/proxmox-inventory.md`
---
*Генерируется `scripts/kb-health.py`. JSON-версия в `audit/health-latest.json` для agent-loop.*

View File

@@ -0,0 +1,59 @@
---
date: 2026-04-19
type: audit
source: kb-audit-npm.py
tags: [audit, drift, npm]
---
# NPM drift audit — 2026-04-19
Сверка [[../projects/dttb/npm-proxy-hosts|npm-proxy-hosts.md]] с NPM API (https://npm.dttb.ru).
- Живых proxy hosts: **22**
- В KB: **20**
- Совпадений: 20 / новых: 2 / удалённых из NPM: 0 / с изменениями: 2
## ⚠ Новые hosts (в NPM есть, в KB нет)
| ID | Домены | Backend | SSL | Enabled |
|---|---|---|---|---|
| 26 | `router.dttb.ru` | `10.0.0.1:8080` | ✓ | on |
| 27 | `vpn.dttb.ru` | `10.0.0.141:8443` | - | on |
## 🔄 Изменения (ID совпадает, но что-то сменилось)
### #12 `bitrix24.dttb.ru`
- backend: KB=`10.0.0.223:8080` → live=`10.0.0.224:8080`
### #22 `git.dttb.ru`
- ssl: KB=✗ → live=✓
## Полный живой список
| ID | Домены | Backend | SSL | Enabled |
|---|---|---|---|---|
| 1 | `dttb.ru` | `10.0.0.230:11001` | ✓ | on |
| 2 | `office.dttb.ru` | `10.0.0.169:8080` | ✓ | on |
| 3 | `itilegent.ru` | `10.0.0.223:8080` | ✓ | on |
| 4 | `npm.dttb.ru` | `10.0.0.195:81` | ✓ | on |
| 5 | `porteiner.dttb.ru` | `10.0.0.10:9443` | ✓ | on |
| 6 | `pve.dttb.ru` | `10.0.0.250:8006` | ✓ | on |
| 9 | `ai.dttb.ru` | `10.0.0.179:8080` | ✓ | on |
| 10 | `bit.dttb.ru` | `10.0.0.217:8080` | ✓ | on |
| 11 | `link.dttb.ru` | `10.0.0.184:3000` | ✓ | on |
| 12 | `bitrix24.dttb.ru` | `10.0.0.224:8080` | ✓ | on |
| 13 | `ip.dttb.ru` | `10.0.0.112:8840` | ✓ | on |
| 14 | `remot.dttb.ru` | `10.0.0.43:21114` | ✓ | on |
| 15 | `plex.dttb.ru` | `10.0.0.200:32400` | ✓ | on |
| 16 | `home.dttb.ru` | `10.0.0.155:8123` | ✓ | on |
| 17 | `z.dttb.ru` | `10.0.0.220:80` | ✓ | on |
| 21 | `rec.dttb.ru` | `10.0.0.227:8091` | ✓ | on |
| 22 | `git.dttb.ru` | `10.0.0.189:3000` | ✓ | on |
| 23 | `matrix.dttb.ru` | `10.0.0.224:8080` | ✓ | on |
| 25 | `mail.dttb.ru` | `10.0.0.107:443` | ✓ | on |
| 26 | `router.dttb.ru` | `10.0.0.1:8080` | ✓ | on |
| 27 | `vpn.dttb.ru` | `10.0.0.141:8443` | - | on |
| 28 | `bot.dttb.ru` | `10.0.0.239:18789` | ✓ | on |
---
*Автоматически через `scripts/kb-audit-npm.py`.*

View File

@@ -0,0 +1,35 @@
---
date: 2026-04-19
type: audit-proposed
source: kb-audit-propose.sh (Opus 4.7)
tags: [audit, proposed, inventory]
---
# Предложенные правки inventory — 2026-04-19
Сгенерировано Claude Opus на основе [[2026-04-19-drift|drift-отчёта]].
**Правки НЕ применены.** Ревью — ты. Apply — вручную.
## Результат анализа
### 1. Резюме
**Drift отсутствует.** Отчёт аудита явно говорит: «✓ Inventory полностью совпадает с живой инфраструктурой». Все 36 живых гостей совпадают с inventory, 3 удалённых (129, 133, 135) задокументированы. Сводная таблица (15 VM, 21 LXC, 16 running, 20 stopped) точно соответствует живому списку.
### 2. Конкретные правки
**Нет правок.** Я проверил по пунктам:
- Все VMID из live-списка присутствуют в inventory — **совпадает**
- Все имена гостей — **совпадают**
- Все статусы (running/stopped) — **совпадают**
- Все типы (VM/LXC) — **совпадают**
- Удалённые 129, 133, 135 — **задокументированы в секции «Удалённые»**
- Сводная таблица (15 VM / 21 LXC / 36 total / 16 running / 20 stopped) — **точна**
### 3. Предупреждения
- **Единственное замечание в самом inventory** (не из drift-отчёта): у LXC 116 (rustdeskserver) есть пометка «в NPM записан 10.0.0.43 — устарело, проверить» — это pre-existing заметка, не связанная с drift, но стоит когда-нибудь проверить и закрыть.
- Дата `date:` в frontmatter inventory (`2026-02-26`) отстаёт от реального последнего обновления (`2026-04-17` в тексте). Можно синхронизировать, но это косметика, не drift.
**Вывод: inventory актуален, правки не требуются.**

View File

@@ -0,0 +1,41 @@
---
date: 2026-04-26
type: audit
source: kb-audit-creds.py
tags: [audit, creds, reachability]
---
# Credentials reachability — 2026-04-26
Ping-проверка URL из [[../projects/dttb/credentials|credentials.md]].
Проверяется только reachability (HTTP status), не реальный логин.
- Всего URL: **14**
- ✓ Reachable: 12 / ⚠ Questionable: 2 / ❌ Unreachable: 0
## ⚠ Нестандартный ответ
| URL | Status | Detail |
|---|---|---|
| `https://api.netbird.io` | 404 | Not Found |
| `https://api.netbird.io/api/setup-keys` | 404 | Not Found |
## ✓ Все ответили нормально
| URL | Status | Категория |
|---|---|---|
| `https://10.0.0.250:8006` | 200 | ✓ reachable |
| `https://pve.dttb.ru` | 200 | ✓ reachable |
| `http://10.0.0.189:3000` | 200 | ✓ reachable |
| `http://git.dttb.ru` | 200 | ✓ reachable |
| `http://10.0.0.195:81` | 200 | ✓ reachable |
| `https://npm.dttb.ru` | 200 | ✓ reachable |
| `https://dttb.ru` | 200 | ✓ reachable |
| `https://dttb.ru/remote.php/dav/files/admin` | 401 | ✓ auth-required (сервер жив) |
| `https://vps.sweb.ru` | 200 | ✓ reachable |
| `https://api.sweb.ru/domains/dns` | 200 | ✓ reachable |
| `https://mail.niikn.com` | 200 | ✓ reachable |
| `http://192.168.1.22:81` | 200 | ✓ reachable |
---
*Автоматически через `scripts/kb-audit-creds.py`.*

View File

@@ -0,0 +1,81 @@
---
date: 2026-04-26
type: audit
source: kb-audit-dns.py
tags: [audit, dns]
---
# DNS resolve audit — 2026-04-26
Резолвим все домены из NPM через публичный DNS (8.8.8.8) и локальный роутер (10.0.0.1).
- Всего доменов: **22**
- NXDOMAIN на 8.8.8.8: 2 / пустой ответ локально: 1 / split-horizon: 20
## ❌ NXDOMAIN / не резолвится на 8.8.8.8 (публичный DNS)
| Домен | Локальный IP |
|---|---|
| `itilegent.ru` | (тоже нет) |
| `vpn.dttb.ru` | 10.0.0.195 |
## ⚠ Split-horizon — разные IP снаружи и внутри
Это нормально для *.dttb.ru (внешний Let's Encrypt IP vs локальный 10.0.0.195). Но неожиданный split может быть багом.
| Домен | Публичный (8.8.8.8) | Локальный (10.0.0.1) |
|---|---|---|
| `ai.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bit.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bitrix24.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `git.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `home.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `ip.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `link.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `mail.dttb.ru` | 176.62.183.186 | 10.0.0.107 |
| `matrix.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `npm.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `office.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `plex.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `porteiner.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `pve.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `rec.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `remot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `router.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `z.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
## ⚠ Пустой локальный резолв (роутер не знает)
- `itilegent.ru` (публичный: -)
## Полная таблица резолва
| Домен | 8.8.8.8 | 10.0.0.1 |
|---|---|---|
| `ai.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bit.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bitrix24.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `bot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `git.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `home.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `ip.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `itilegent.ru` | — | — |
| `link.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `mail.dttb.ru` | 176.62.183.186 | 10.0.0.107 |
| `matrix.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `npm.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `office.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `plex.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `porteiner.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `pve.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `rec.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `remot.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `router.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
| `vpn.dttb.ru` | — | 10.0.0.195 |
| `z.dttb.ru` | 176.62.183.186 | 10.0.0.195 |
---
*Автоматически через `scripts/kb-audit-dns.py`.*

View File

@@ -0,0 +1,71 @@
---
date: 2026-04-26
type: audit
source: kb-audit.py
tags: [audit, drift, infrastructure]
---
# KB drift audit — 2026-04-26
Сравнение живого `pct list` / `qm list` с [[../projects/dttb/proxmox-inventory|proxmox-inventory.md]]
- Живых гостей Proxmox: **39**
- Упомянуто в inventory: **39**
- В обоих: 37 / только в live: 2 / отсутствуют в live: 0
- Известны как удалённые: 2 (в `## 🗑️ Удалённые`)
## ⚠ В Proxmox есть, в inventory НЕТ (надо добавить)
| VMID | Type | Status | Name |
|---|---|---|---|
| 128 | LXC | running | profi-parser |
| 131 | VM | running | ubuntu |
## ✓ Удалённые хосты (задокументированы): 133, 135
## Полный живой список
| VMID | Type | Status | Name |
|---|---|---|---|
| 100 | VM | stopped | NV |
| 101 | LXC | stopped | n8n |
| 102 | LXC | stopped | SMB |
| 103 | LXC | running | NPM |
| 104 | VM | stopped | Agent-DVR |
| 105 | VM | stopped | Nextcloud-AIO-dttb.ru |
| 106 | VM | running | pbs |
| 107 | VM | running | Mailcow |
| 108 | LXC | stopped | zabbix |
| 109 | VM | stopped | itilelegent |
| 110 | VM | stopped | Cloud |
| 111 | VM | running | WinServer2025 |
| 112 | VM | stopped | cloud-dttb |
| 113 | LXC | running | VaultWarden |
| 114 | LXC | running | LinkWarden |
| 115 | LXC | running | watchyourlan |
| 116 | LXC | running | rustdeskserver |
| 117 | LXC | stopped | motioneye |
| 118 | LXC | stopped | plex |
| 119 | LXC | stopped | myspeed |
| 120 | VM | stopped | 7 |
| 121 | LXC | stopped | docker-windows |
| 122 | LXC | stopped | qbittorrent |
| 123 | LXC | stopped | proxmox-local |
| 124 | VM | stopped | Matrix |
| 125 | VM | stopped | datacentr |
| 126 | LXC | stopped | debian |
| 127 | VM | running | haos-17.0 |
| 128 | LXC | running | profi-parser |
| 129 | VM | running | profi-parser-vm |
| 130 | VM | stopped | Zima-OS |
| 131 | VM | running | ubuntu |
| 132 | LXC | running | code-server |
| 134 | LXC | running | ZnamSecurityBot |
| 136 | LXC | running | gitea |
| 137 | LXC | running | openclaw |
| 138 | LXC | running | vpn-proxy |
| 139 | LXC | running | yaroslav-assistant |
| 250 | VM | running | Nextcloud-AIO |
---
*Автоматически сгенерировано `scripts/kb-audit.py`. Применять правки — вручную после ревью.*

View File

@@ -0,0 +1,122 @@
---
date: 2026-04-26
type: audit
source: kb-health.py
score: 221
tags: [audit, health, metric]
---
# KB health — 2026-04-26
**Score (меньше = лучше): `221`**
Проверено файлов: 501
## Разбивка
| Категория | Кол-во | Вес | Штраф |
|---|---:|---:|---:|
| broken_wikilinks | 0 | 10 | 0 |
| broken_paths | 9 | 10 | 90 |
| missing_frontmatter | 14 | 3 | 42 |
| orphan_files | 32 | 2 | 64 |
| undated_todos | 5 | 1 | 5 |
| duplicate_basenames | 4 | 5 | 20 |
| **ИТОГО** | | | **221** |
## Битые relative-пути
| Откуда | Путь |
|---|---|
| `notes/claude/2026-04-21-200915-охотхозяйство-с-openwrt-на-orange-pi-нужно-настрои.md` | `projects/dttb/vps-swtest.md` |
| `notes/claude/2026-04-20-113423-найди-информацию-по-настройке-openwrt-и-podcop-в-н.md` | `decisions/2026-04-20-niikn-nspd-bypass-via-lionart.md` |
| `notes/claude/2026-04-20-115126-найди-информацию-по-настройке-openwrt-и-podcop-в-н.md` | `projects/mmfb/mikrotik.md` |
| `notes/claude/2026-04-20-115126-найди-информацию-по-настройке-openwrt-и-podcop-в-н.md` | `projects/niikn/mikrotik.md` |
| `notes/claude/2026-04-24-165527-новый-клиент-ммфб-юрий-витальевич-нужно-подключить.md` | `projects/mmfb/yuri-vitalievich.md` |
| `notes/claude/2026-04-21-203517-дай-мне-команду-в-сшел-виндовс-установка-нетбирд-и.md` | `/Users/ai/.claude/projects/-Users-ai-knowledge-base/memory/reference_netbird_claude_diag.md` |
| `notes/claude/2026-04-20-101023-найди-информацию-по-настройке-openwrt-и-podcop-в-н.md` | `projects/niikn/openwrt-bypass.md` |
| `notes/claude/2026-04-21-154602-охотхозяйство-с-openwrt-на-orange-pi-нужно-настрои.md` | `decisions/2026-04-21-znamenskoye-ohothozyistvo-wg-backup-channel.md` |
| `notes/claude/2026-04-21-154602-охотхозяйство-с-openwrt-на-orange-pi-нужно-настрои.md` | `claude-memory/znamenskoye-ohothozyistvo.md` |
## Без frontmatter (14)
- `projects/dttb/znamenskoye-log.md`
- `projects/mmfb/yuri-vitalievich.md`
- `snippets/happ-vpn-client-instruction.md`
- `snippets/invoice-template.md`
- `claude-memory/servicedesk-dttb.md`
- `claude-memory/benelux.md`
- `claude-memory/nextcloud-dttb.md`
- `claude-memory/nvr-fix.md`
- `claude-memory/videonablyudenie.md`
- `claude-memory/znamenskoe-home.md`
- `claude-memory/niikn-nextcloud.md`
- `claude-memory/krasnogorsk.md`
- `claude-memory/mas-niikn.md`
- `claude-memory/MEMORY.md`
## Orphan — без бэклинков (32)
_Эти файлы никто не упоминает через `[[..]]`. Кандидаты на удаление или добавление ссылок._
- `decisions/2026-04-21-znamenskoye-ohothozyistvo-wg-backup-channel.md`
- `decisions/2026-04-20-niikn-nspd-bypass-via-lionart.md`
- `decisions/2026-04-24-finland-vps-malware-cleanup.md`
- `projects/dttb/vps-swtest.md`
- `projects/niikn/domofon.md`
- `projects/mmfb/yuri-vitalievich.md`
- `projects/mmfb/mikrotik.md`
- `projects/zelenograd/README.md`
- `snippets/happ-vpn-client-instruction.md`
- `snippets/invoice-template.md`
- `claude-memory/cliproxy_code_server.md`
- `claude-memory/servicedesk-dttb.md`
- `claude-memory/benelux-topology.md`
- `claude-memory/benelux.md`
- `claude-memory/znamenskoye-cameras.md`
- `claude-memory/nextcloud-dttb.md`
- `claude-memory/nvr-fix.md`
- `claude-memory/niikn-vpn-status.md`
- `claude-memory/znamenskoye-ohothozyistvo.md`
- `claude-memory/znamenskoye-network.md`
- `claude-memory/niikn-nextcloud-incident.md`
- `claude-memory/videonablyudenie.md`
- `claude-memory/znamenskoe-home.md`
- `claude-memory/feedback_dns_fakeip.md`
- `claude-memory/niikn-nextcloud.md`
- `claude-memory/feedback_finland_vps.md`
- `claude-memory/whatsapp-proxy.md`
- `claude-memory/gitea-dttb.md`
- `claude-memory/krasnogorsk.md`
- `claude-memory/mas-niikn.md`
- ... +2 ещё
## TODO без даты (5 шт в 1 файлах)
- `claude-memory/mas-niikn.md` — 5 шт
## Дубликаты имён (4)
- `README.md`:
- `README.md`
- `decisions/README.md`
- `notes/README.md`
- `projects/dttb/README.md`
- `projects/glavtorg/README.md`
- `projects/niikn/README.md`
- `projects/krasnogorsk/README.md`
- `projects/zelenograd/README.md`
- `projects/dttb/nextcloud-talk-bot/README.md`
- `snippets/README.md`
- `scripts/README.md`
- `nextcloud.md`:
- `projects/nextcloud.md`
- `projects/dttb/nextcloud.md`
- `proxmox-inventory.md`:
- `projects/dttb/proxmox-inventory.md`
- `projects/mmfb/proxmox-inventory.md`
- `mikrotik.md`:
- `projects/niikn/mikrotik.md`
- `projects/mmfb/mikrotik.md`
---
*Генерируется `scripts/kb-health.py`. JSON-версия в `audit/health-latest.json` для agent-loop.*

View File

@@ -0,0 +1,59 @@
---
date: 2026-04-26
type: audit
source: kb-audit-npm.py
tags: [audit, drift, npm]
---
# NPM drift audit — 2026-04-26
Сверка [[../projects/dttb/npm-proxy-hosts|npm-proxy-hosts.md]] с NPM API (https://npm.dttb.ru).
- Живых proxy hosts: **22**
- В KB: **20**
- Совпадений: 20 / новых: 2 / удалённых из NPM: 0 / с изменениями: 2
## ⚠ Новые hosts (в NPM есть, в KB нет)
| ID | Домены | Backend | SSL | Enabled |
|---|---|---|---|---|
| 26 | `router.dttb.ru` | `10.0.0.1:8080` | ✓ | on |
| 27 | `vpn.dttb.ru` | `10.0.0.141:8443` | - | on |
## 🔄 Изменения (ID совпадает, но что-то сменилось)
### #12 `bitrix24.dttb.ru`
- backend: KB=`10.0.0.223:8080` → live=`10.0.0.224:8080`
### #22 `git.dttb.ru`
- ssl: KB=✗ → live=✓
## Полный живой список
| ID | Домены | Backend | SSL | Enabled |
|---|---|---|---|---|
| 1 | `dttb.ru` | `10.0.0.230:11001` | ✓ | on |
| 2 | `office.dttb.ru` | `10.0.0.169:8080` | ✓ | on |
| 3 | `itilegent.ru` | `10.0.0.223:8080` | ✓ | on |
| 4 | `npm.dttb.ru` | `10.0.0.195:81` | ✓ | on |
| 5 | `porteiner.dttb.ru` | `10.0.0.10:9443` | ✓ | on |
| 6 | `pve.dttb.ru` | `10.0.0.250:8006` | ✓ | on |
| 9 | `ai.dttb.ru` | `10.0.0.179:8080` | ✓ | on |
| 10 | `bit.dttb.ru` | `10.0.0.217:8080` | ✓ | on |
| 11 | `link.dttb.ru` | `10.0.0.184:3000` | ✓ | on |
| 12 | `bitrix24.dttb.ru` | `10.0.0.224:8080` | ✓ | on |
| 13 | `ip.dttb.ru` | `10.0.0.112:8840` | ✓ | on |
| 14 | `remot.dttb.ru` | `10.0.0.43:21114` | ✓ | on |
| 15 | `plex.dttb.ru` | `10.0.0.200:32400` | ✓ | on |
| 16 | `home.dttb.ru` | `10.0.0.155:8123` | ✓ | on |
| 17 | `z.dttb.ru` | `10.0.0.220:80` | ✓ | on |
| 21 | `rec.dttb.ru` | `10.0.0.227:8091` | ✓ | on |
| 22 | `git.dttb.ru` | `10.0.0.189:3000` | ✓ | on |
| 23 | `matrix.dttb.ru` | `10.0.0.224:8080` | ✓ | on |
| 25 | `mail.dttb.ru` | `10.0.0.107:443` | ✓ | on |
| 26 | `router.dttb.ru` | `10.0.0.1:8080` | ✓ | on |
| 27 | `vpn.dttb.ru` | `10.0.0.141:8443` | - | on |
| 28 | `bot.dttb.ru` | `10.0.0.239:18789` | ✓ | on |
---
*Автоматически через `scripts/kb-audit-npm.py`.*

View File

@@ -0,0 +1,101 @@
---
date: 2026-04-26
type: audit-proposed
source: kb-audit-propose.sh (Opus 4.7)
tags: [audit, proposed, inventory]
---
# Предложенные правки inventory — 2026-04-26
Сгенерировано Claude Opus на основе [[2026-04-26-drift|drift-отчёта]].
**Правки НЕ применены.** Ревью — ты. Apply — вручную.
Анализирую drift-отчёт и inventory — всё данные уже перед глазами, агенты не нужны.
---
## 1. Резюме
В Proxmox появились 2 новых гостя (**LXC 128 profi-parser**, **VM 131 ubuntu**), а **VM 129** — живая и running под именем **profi-parser-vm**, хотя в inventory записана как удалённая «Clawdbot». Итого inventory нужно обновить с 36 до 39 гостей.
---
## 2. Конкретные правки
### 2.1. Сводка — обновить цифры
```diff
| Тип | Всего | Запущено | Остановлено |
|-----|-------|----------|-------------|
-| QEMU VM | 15 | 5 | 10 |
-| LXC | 21 | 11 | 10 |
-| **Итого** | **36** | **16** | **20** |
+| QEMU VM | 17 | 7 | 10 |
+| LXC | 22 | 12 | 10 |
+| **Итого** | **39** | **19** | **20** |
```
### 2.2. Добавить VM 129 — profi-parser-vm в «Запущенные VM»
Вставить после блока VM 127 (haos-17.0):
```markdown
### VM 129 — profi-parser-vm
| Параметр | Значение |
|----------|----------|
| Статус | 🟢 running |
| Назначение | Profi-parser VM (детали уточнить) |
```
### 2.3. Добавить VM 131 — ubuntu в «Запущенные VM»
Вставить после блока VM 129:
```markdown
### VM 131 — ubuntu
| Параметр | Значение |
|----------|----------|
| Статус | 🟢 running |
| Назначение | Ubuntu VM (детали уточнить) |
```
### 2.4. Добавить LXC 128 — profi-parser в «Запущенные LXC»
Вставить перед блоком LXC 132 (code-server), чтобы VMID шли по порядку:
```markdown
### LXC 128 — profi-parser
| Параметр | Значение |
|----------|----------|
| Статус | 🟢 running |
| Назначение | Profi-parser (детали уточнить) |
```
### 2.5. Удалить VM 129 из секции «Удалённые»
```diff
## 🗑️ Удалённые (история)
| VMID | Имя | Когда | Куда делось |
|------|-----|-------|-------------|
-| 129 | Clawdbot | ~апрель 2026 | Данные перенесены на code-server (132) в `/root/backup-lxc129/`, IP 10.0.0.206 освобождён |
| 133 | clawdbot-1 | ~апрель 2026 | Функционал мигрирован на openclaw (137) |
| 135 | whisper-bot | ~апрель 2026 | — |
```
### 2.6. Обновить дату в шапке
```diff
-> Последнее обновление: 2026-04-17 (обновлено из живого `pct list` / `qm list`)
+> Последнее обновление: 2026-04-26 (обновлено из живого `pct list` / `qm list`)
```
---
## 3. Предупреждения
- **VM 129**: в inventory была записана как удалённый «Clawdbot» (LXC), но в live это **VM** с именем **profi-parser-vm**. Скорее всего VMID 129 был переиспользован для нового гостя. Стоит проверить: а) действительно ли бэкап Clawdbot ещё лежит в `/root/backup-lxc129/`; б) IP 10.0.0.206 — он свободен или назначен profi-parser-vm? Историю Clawdbot можно оставить комментарием или убрать полностью.
- **LXC 128, VM 131**: для них нет IP-адресов, ресурсов (CPU/RAM/диск) и назначения — нужно доуточнить через `pct config 128` / `qm config 131` и дозаполнить.
- **LXC 128 + VM 129**: оба содержат «profi-parser» в имени — вероятно, связанные сервисы (парсер в LXC + VM). Стоит описать связь в назначении.
Хочешь — могу сразу применить эти правки в файл.

21
audit/health-latest.json Normal file
View File

@@ -0,0 +1,21 @@
{
"date": "2026-05-03",
"score": 458,
"counts": {
"broken_wikilinks": 7,
"broken_paths": 20,
"missing_frontmatter": 17,
"orphan_files": 38,
"undated_todos": 36,
"duplicate_basenames": 5
},
"weights": {
"broken_wikilinks": 10,
"broken_paths": 10,
"missing_frontmatter": 3,
"orphan_files": 2,
"undated_todos": 1,
"duplicate_basenames": 5
},
"files_scanned": 327
}

1024
audit/objects-map.json Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -20,7 +20,7 @@
|------|------|----|-------|
| 107 | Mailcow | 10.0.0.107 | Mailcow для dttb.ru, 4 cores, 8GB RAM |
| 131 | agentdvr | 10.0.0.232 | Agent DVR, 8 cores, 6GB RAM, port 8090 |
| 129 | — | — | УДАЛЁН 2026-04-14 (бывший Clawdbot, данные на code-server:/root/backup-lxc129/) |
| 129 | clawdbot | 10.0.0.206 | Clawdbot AI bot (основной, прямой API claude-opus-4-6, @maxim_dttb_bot) |
| 133 | clawdbot-1 | 10.0.0.237 | Бот НИИКН (cliproxy/claude-sonnet-4-6, @maximka_assistant_bot) |
| 134 | clawdbot-2 | 10.0.0.238 | Знам — бот ЧОП видеоархив (@ZnamSecurityBot, haiku) |
| 111 | WinServer2025 | - | RTX 3060 LHR passed through |
@@ -45,11 +45,17 @@
- HTTP file server: http://10.0.0.227:8091 (python3 http.server, nohup + @reboot cron)
- 8 vCPU, 8GB RAM (критически мало — 99% использовано)
## LXC 129 — УДАЛЁН (2026-04-14)
- Бывший Clawdbot (@maxim_dttb_bot), IP 10.0.0.206
- Данные: code-server:/root/backup-lxc129/ (vpn-configs, SOUL.md, memory, siri-proxy, nextcloud-talk-bot)
- CLIProxy (8317) удалён вместе с контейнером
- Бот 134 (Znam) тоже выключен — зависел от CLIProxy на 129
## Clawdbot (LXC 129)основной бот
- Real config: ~/.clawdbot/clawdbot.json (NOT /opt/clawdbot/config.yaml)
- Telegram bot: @maxim_dttb_bot
- Model: anthropic/claude-opus-4-6 — **ПРЯМОЙ API** (api.anthropic.com), ключ sk-ant-api03-VLV...
- Переключён с CLIProxy на прямой API 2026-04-02
- CLIProxy: порт 8317 (cliproxy.service) — ОСТАВЛЕН для ботов 133, 134
- CLIProxy auth: batlaew@gmail.com, auto-refresh токен
- DNS: nameserver 8.8.8.8 1.1.1.1 закреплён в Proxmox конфиге LXC (не сбросится)
- Gateway: порт 18789, token: changeme123
- SSH: ключ claude-code (id_ed25519 с LXC 132)
- NetBird: 100.70.219.93, exit node через Финляндию (группа Trance)
## Nextcloud dttb.ru (VM 250) → см. nextcloud-dttb.md
- URL: https://dttb.ru, admin / 1qaz!QAZ, NC 32.0.6, AIO v12.6.1
@@ -278,10 +284,11 @@
## DNS FakeIP → см. feedback_dns_fakeip.md
- Роутеры подменяют DNS (198.18.x.x) — всегда прописывать nameserver 8.8.8.8 в Proxmox конфиге LXC
## Claude Code на code-server → см. cliproxy_code_server.md
- Max подписка (OAuth), MCP omniroute для бесплатного ресёрча
- CLIProxy убран, авто-синк токена с Mac (cron каждые 12ч)
- Решение: decisions/2026-04-14-openclaw-claude-code-pipeline.md
## CLIProxy на code-server → см. cliproxy_code_server.md
- OAuth токен протухает ~8ч, нужен SSH-туннель + браузер для перелогина, fallback: прямой API (платный)
## Миграция на прямой API → см. project_direct_api_migration.md
- 129 и 114 на прямом API, 133 и 134 ещё на CLIProxy — нужны свои ключи
## OmniRoute (LXC 132, 10.0.0.179) → см. omniroute.md
- AI Gateway v3.6.5, порт 20128, API key: sk-225e902dc95ff192-6bdad7-3ec8cdc6

View File

@@ -1,29 +1,34 @@
---
name: Claude Code на code-server (10.0.0.179) — новая архитектура
description: Claude Code через Max подписку + MCP omniroute для бесплатного ресёрча. CLIProxy больше не нужен.
name: CLIProxy на code-server (10.0.0.179)
description: Claude Code использует CLIProxy OAuth — процедура обновления токена при протухании
type: project
---
## Текущая архитектура (с 2026-04-14)
Claude Code на code-server (LXC 132, IP 10.0.0.179) работает через локальный CLIProxy (порт 8317, cliproxy.service).
Claude Code на code-server (LXC 132, 10.0.0.179) работает **напрямую через Max подписку** (OAuth).
CLIProxy убран из конфига Claude Code. Оставлен только для Clawdbot-2/Znam (LXC 134).
**Проблема:** OAuth токен (batlaew@gmail.com) протухает каждые ~8 часов. CLIProxy может не обновить refresh_token автоматически → клиент переходит в suspended → Claude Code перестаёт работать.
### Ресёрч через OmniRoute (бесплатно)
- MCP-сервер: `/root/mcp-omniroute/server.js`
- Тулы: `research`, `research_compare`, `models_list`
- Модели: kr/claude-sonnet-4.5, cx/gpt-5.4, gemini-cli/gemini-2.5-pro, gh/gpt-5.2-codex
- Скрипт: `/usr/local/bin/research "вопрос"` (парсер: `/usr/local/bin/parse_response.py`)
**Why:** CLIProxy использует OAuth через claude.ai, а не прямой API. Это бесплатно (подписка Pro), но требует периодического обновления токена.
### Конфигурация
- settings.json: MCP-сервер omniroute, без env-переменных CLIProxy
- .bashrc/.profile: очищены от ANTHROPIC_* переменных
- Авторизация: `claude auth login --claudeai` (OAuth Max)
## Процедура обновления токена
### Решение по decisions/
Подробности: `decisions/2026-04-14-openclaw-claude-code-pipeline.md`
1. Остановить сервис: `systemctl stop cliproxy.service`
2. Запустить логин: `/usr/local/bin/cli-proxy-api -config /root/.cli-proxy-api/config.yaml -claude-login -no-browser`
3. CLIProxy покажет URL для SSH-туннеля и ссылку авторизации
4. На локальной машине сделать SSH-туннель: `ssh -L 54545:127.0.0.1:54545 root@202.71.12.186`
5. Открыть ссылку авторизации в браузере, залогиниться batlaew@gmail.com
6. После callback — токен обновится в `/root/.cli-proxy-api/claude-batlaew@gmail.com.json`
7. Запустить сервис: `systemctl start cliproxy.service`
## Старая архитектура (до 2026-04-14, архив)
## Конфигурация
- settings.json: `apiBaseUrl: http://localhost:8317`, `apiKey: sk-cliproxyapi-local`
- Env: `ANTHROPIC_BASE_URL=http://localhost:8317`
- Токен файл: `/root/.cli-proxy-api/claude-batlaew@gmail.com.json`
- API keys в config.yaml: `sk-clawdbot-proxy`, `sk-f4ab6903a58a4cb4b2b453ae2bbf2c6e`
CLIProxy (cliproxy.service, порт 8317) проксировал OAuth. Токен протухал каждые ~8ч.
Убран из-за нестабильности. CLIProxy оставлен только для ботов 133/134.
## Альтернатива (fallback)
Прямой API: ключ `ANTHROPIC_API_KEY=sk-ant-api03-vMW...` доступен в env. Для переключения: в settings.json поменять apiBaseUrl на `https://api.anthropic.com` и apiKey на прямой ключ. Но это платно.
## TODO
- Выяснить, почему auto-refresh не срабатывает (проверить после следующего протухания)
- Рассмотреть cron для принудительного рефреша до истечения токена

View File

@@ -1,16 +1,22 @@
---
name: Миграция ботов — итоговый статус
description: Финальный статус миграции ботов с CLIProxy. LXC 129 удалён 2026-04-14.
name: Миграция ботов на прямой Anthropic API
description: Боты переводятся с CLIProxy OAuth на прямые API-ключи для автономности
type: project
---
## Статус (2026-04-14)
Миграция ботов Clawdbot с CLIProxy (OAuth proxy) на прямые Anthropic API ключи для полной автономности каждого бота.
**Why:** CLIProxy зависит от OAuth refresh token одного аккаунта (batlaew@gmail.com). При проблемах с DNS/сетью/refresh все боты падают одновременно. Прямой API ключ = независимость.
**How to apply:** Каждый бот получает свой API ключ. В clawdbot.json: провайдер `anthropic` вместо `cliproxy`, baseUrl `https://api.anthropic.com`.
## Статус миграции (2026-04-02)
| Бот | LXC | Статус | Модель | API |
|-----|-----|--------|--------|-----|
| Основной (@maxim_dttb_bot) | ~~129~~ | **УДАЛЁН** | — | LXC 129 удалён |
| Основной (@maxim_dttb_bot) | 129 | Прямой API | claude-opus-4-6 | sk-ant-api03-VLV... |
| Boss-Assistant (@assistent_maximka_bot) | 114 | Прямой API | claude-sonnet-4-6 | sk-ant-api03-zaU... |
| НИИКН (@maximka_assistant_bot) | 133 | OmniRoute | kr/claude-sonnet-4.5 | Бесплатно (Kiro/AWS) |
| Знам (@ZnamSecurityBot) | 134 | **ВЫКЛЮЧЕН** | — | CLIProxy удалён с 129 |
| НИИКН (@maximka_assistant_bot) | 133 | CLIProxy (129:8317) | claude-sonnet-4-6 | Нужен свой ключ |
| Знам (@ZnamSecurityBot) | 134 | CLIProxy (129:8317) | claude-sonnet-4-6 | Нужен свой ключ |
CLIProxy больше не существует. Бот 133 переведён на OmniRoute (бесплатно).
CLIProxy на LXC 129 оставлен работать для 133/134 пока они не мигрируют.

View File

@@ -42,7 +42,7 @@
## Новый бот (clawdbot-3)
- Telegram: @dttb_support_bot (зарегистрировать в BotFather)
- Модель: нужно определить (CLIProxy на 129 удалён, OmniRoute или прямой API)
- Модель: cliproxy/claude-sonnet-4-6 (через CLIProxy на 129:8317)
- Персона: вежливый формальный саппорт, без доступа к инфраструктуре
- Skill: helpdesk (работа с Freescout API)
- Не знает паролей/IP, не выполняет команды — только общение + тикеты

View File

@@ -6,7 +6,7 @@ type: daily
# 2026-04-17
## Приоритеты дня
- [ ]
- [ ] (2026-04-17)
## Инфраструктура
<!-- Что менял, чинил, настраивал -->

84
daily/2026-04-18.md Normal file
View File

@@ -0,0 +1,84 @@
---
date: 2026-04-18
type: daily
tags: [daily, kb-improvements, summary]
---
# 2026-04-18
## Итог дня — много сделано
### Закрыто из вчерашнего плана
- [x] **Fix B**: `.zshenv` unset 7 env-переменных от Claude Desktop → `claude` работает в Obsidian-terminal без 401
- [x] **Консолидация auto-memory**: 14 → 12 файлов, openclaw-feedback смёржен в `project_openclaw_bot.md`, создан `feedback_env_cleanup.md` + `feedback_sync_architecture.md`
- [x] **Audit расширен**: `kb-audit-npm.py`, `kb-audit-creds.py`, `kb-audit-dns.py` — в воскресном cron
- [x] **KB health + level 4 agent-loop** (karpathy-style):
- `scripts/kb-health.py` — 6 категорий штрафов, JSON для сравнения
- `scripts/kb-agent-loop.sh` — Opus правит в ветке, auto-merge если score ниже
- **Первый прогон: 493 → 45** (91%). Opus сам написал helper `kb-add-indexes.py`
- [x] **iPhone Obsidian через iCloud**:
- vault скопирован в `~/Library/Mobile Documents/iCloud~md~obsidian/Documents/knowledge-base`
- `sync-icloud.sh` — rclone bisync local↔local (не падает в launchd)
- в Stop-hook: после sync.sh → sync-icloud.sh
- iPhone Obsidian видит vault в iCloud-разделе
- [x] **Фото Mac → Nextcloud**: `osxphotos export` → 697 файлов (3.1 GB) в `~/Library/CloudStorage/Nextcloud-admin@dttbru/Photos/` с раскладкой `YYYY/YYYY-MM/`. File Provider аплодит на сервер в фоне.
### Отложено на 2026-04-19
См. [[2026-04-19]].
## Инфраструктура — новые компоненты
```
~/.config/nextcloud-kb/
├── sync.sh ← rclone bisync WebDAV ↔ Nextcloud (ручной + Stop-hook)
├── sync-icloud.sh ← NEW rclone bisync local ↔ iCloud Obsidian
└── session-saver.py ← сохраняет transcript в notes/claude/
knowledge-base/scripts/
├── kb-audit.py / kb-audit-apply.py / kb-audit-propose.sh ← Proxmox inventory drift
├── kb-audit-npm.py / kb-audit-creds.py / kb-audit-dns.py ← NEW расширение
├── kb-health.py ← NEW метрика качества KB
├── kb-agent-loop.sh ← NEW karpathy-style self-healing
├── kb-add-indexes.py ← NEW написан Opus для решения orphan_files
└── kb_audit_helpers.py ← общие функции
cron on code-server:
*/5 * * * * kb-autosync.sh
0 6 * * 0 audit + apply + health + agent-loop + propose (одной цепочкой)
```
## Полная картина синхронизации сейчас
```
iPhone Obsidian (iCloud vault) iPhone-Nextcloud-app (photos, files)
↕ iCloud sync ↕ WebDAV
↕ ↕
~/Library/Mobile Documents/... Nextcloud dttb.ru (VM 250)
↕ sync-icloud.sh (Stop-hook) ↕ macOS File Provider
↕ ↕
╚══════════════════════════════════════════╝
~/knowledge-base (Mac primary)
↕ git push/pull, obsidian-git autoPush
Gitea git.dttb.ru (LXC 136)
code-server LXC 132 (RW, cron */5)
openclaw LXC 137 (RO, cron */15)
```
## Метрики
- KB health score: **45** (было утром 493)
- Коммитов за день: ~25 (включая 2 от `kb-agent-loop`)
- Файлов в vault: 169 md (с frontmatter: все)
- Память Claude Code: 12 файлов (с 14)
- Photos экспортировано: 697 файлов / 3.1 GB
## Что работает автоматом теперь
1. **Stop Claude-сессии** → save transcript → sync to Nextcloud WebDAV → sync to iCloud
2. **Каждые 5 мин на code-server** → pull + auto-commit + push
3. **Каждые 15 мин на openclaw** → pull (read-only, self-heal)
4. **Каждые 5 мин Obsidian-git** → auto-commit + auto-push
5. **Каждое воскресенье 06:00** → full audit chain + agent-loop self-healing

88
daily/2026-04-19.md Normal file
View File

@@ -0,0 +1,88 @@
---
date: 2026-04-19
type: daily
tags: [planning, kb-improvements]
---
# 2026-04-19
## Вчера сделано за день
См. [[2026-04-18]] — 6 крупных пунктов закрыто:
- Fix B env cleanup, консолидация auto-memory, расширение audit (NPM/Creds/DNS)
- KB health metric + level 4 agent-loop (**score 493 → 45**, Opus сам написал helper)
- iPhone Obsidian через iCloud, Mac-фото в Nextcloud (697 файлов)
## Приоритеты сегодня
### A. iPhone auto-upload фото в Nextcloud (5 мин)
На iPhone → Nextcloud app → Настройки → Автозагрузка:
1. Включить «Автоматически загружать фото» и «…видео»
2. Каталог: `/Photos/iPhone-upload/`
3. Только по Wi-Fi
4. Включить «Загружать существующие»
Работает в фоне часы-сутки. После — можно освобождать iCloud.
### B. Проверить что Mac-фото доехали на dttb.ru сервер
Вчера File Provider начал upload 3.1 GB. Проверить:
```bash
curl -sku admin:'1qaz!QAZ' -X PROPFIND \
"https://dttb.ru/remote.php/dav/files/admin/Photos/" -H "Depth: 1" \
| python3 -c "import sys,xml.etree.ElementTree as ET; \
r=ET.fromstring(sys.stdin.read()); \
print(len(r.findall('{DAV:}response')), 'objects')"
```
### C. Второй прогон agent-loop (10 мин) — эксперимент
Запустить вручную — посмотреть уйдёт ли score с 45 ниже (там остались duplicate_basenames=3 и broken_paths=3):
```bash
ssh root@10.0.0.250 'pct exec 132 -- bash -c "bash /root/knowledge-base/scripts/kb-agent-loop.sh"'
tail /var/log/kb-agent-loop.log
```
## Большие задачи на будущее (не сегодня)
### RAG для openclaw-бота (~день) ⭐⭐
- Эмбеддинги .md файлов через OmniRoute (бесплатно)
- SQLite/Qdrant локально на openclaw
- `post-commit` git hook обновляет эмбеддинги при изменениях
- Бот в Telegram делает vector search → топ-5 файлов в контекст Opus
- **Цель**: «найди что я писал про VPN в марте» → за секунду релевантный ответ
### Тест восстановления из PBS (~час)
- Потерять симулированно LXC 136 (gitea) → сколько минут до работы?
- Потерять VM 250 (Nextcloud) → то же
- Задокументировать runbook в `decisions/`
- **Цель**: узнать проблему с бэкапами сейчас, а не когда что-то реально потеряно
### Openclaw: реальная делегация (~1-2 часа)
Два пути:
- **Второй Telegram-бот** с профилем opus-only через CLIProxy — новая переменная окружения
- **Regex-hook в message-handler** — сложно, openclaw минифицирован, нужен обход
### Auto-apply для NPM drift (~30 мин)
По аналогии с `kb-audit-apply.py` (Proxmox): новые proxy hosts автоматом добавлять в `npm-proxy-hosts.md`.
### Session-saver v2 (~час)
Парсить transcript Claude и флажить:
- Упомянутые IP/хосты, которых нет в inventory
- TODO появившиеся в диалоге
- Команды, которые стоит в `snippets/`
## Инфраструктура
Без изменений после вчера. Вся автоматика работает:
- Stop-hook: session-saver → sync (Nextcloud) → sync-icloud
- code-server cron */5: auto-sync git
- openclaw cron */15: RO pull (self-heal)
- obsidian-git 5 мин autoPush
- воскр 06:00: full audit + agent-loop
## Заметки
Level 4 agent-loop реально работает — Opus за 7 минут снёс 448 штрафов из 463. Сам написал `kb-add-indexes.py` когда увидел массовую задачу. Это эквивалент karpathy/autoresearch для KB: метрика-ветка-merge-reset.
## Итог дня
(заполнить вечером)

View File

@@ -1,3 +1,9 @@
---
date: 2026-02-26
type: decision
tags: [decision, bot]
---
# Исправление clawdbot на LXC 129 — cliproxy провайдер
**Дата:** 2026-02-26

View File

@@ -1,3 +1,9 @@
---
date: 2026-03-03
type: decision
tags: [decision, mail]
---
# Сценарий настройки почтового сервера (Mailcow)
> Отработан на niikn.com (2026-03-03). Следующий: dttb.ru.

View File

@@ -1,3 +1,9 @@
---
date: 2026-03-04
type: decision
tags: [decision, matrix]
---
# Matrix НИИКН — настройка matrix.niikn.com
**Дата:** 2026-03-04

View File

@@ -1,3 +1,9 @@
---
date: 2026-04-14
type: decision
tags: [decision, network]
---
# 2026-04-14: Восстановление системы обхода блокировок НИИКН
## Проблема

View File

@@ -1,3 +1,9 @@
---
date: 2026-04-14
type: decision
tags: [decision, bot]
---
# Связка OmniRoute + Claude Code на code-server
**Дата:** 2026-04-14
@@ -47,4 +53,4 @@ Claude Code (Opus 4.6, Max) ─── прямой OAuth ─── Anthropic
```
## TODO
- [ ] Выполнить `claude auth login --claudeai` на code-server для прямой авторизации Max
- [ ] Выполнить `claude auth login --claudeai` на code-server для прямой авторизации Max (2026-04-14)

View File

@@ -1,3 +1,9 @@
---
date: 2026-04-16
type: decision
tags: [decision]
---
# Миграция UniFi Controller — Переделки (2026-04-16)
## Что было
@@ -86,10 +92,10 @@ DNAT через NetBird ломал inform-пакеты (MTU 1280 vs 1500). **Р
- **SSH к устройствам**: batlaew / 20iPUHpzpMXnp9Rx
## Что осталось
- [ ] Подключить остальные точки доступа (U6 LR, U6+) когда будут запитаны
- [ ] Настроить WiFi сети окончательно (если нужны дополнительные SSID)
- [ ] Обновить прошивки устройств (контроллер предлагает update)
- [ ] Убрать alias 192.168.1.1/24 на OpenWrt (когда все устройства на 192.168.2.x)
- [ ] Подключить остальные точки доступа (U6 LR, U6+) когда будут запитаны (2026-04-16)
- [ ] Настроить WiFi сети окончательно (если нужны дополнительные SSID) (2026-04-16)
- [ ] Обновить прошивки устройств (контроллер предлагает update) (2026-04-16)
- [ ] Убрать alias 192.168.1.1/24 на OpenWrt (когда все устройства на 192.168.2.x) (2026-04-16)
## 2026-04-17: Auto-discovery для новых AP

View File

@@ -1,3 +1,9 @@
---
date: 2026-04-17
type: decision
tags: [decision]
---
# Обновление и расширение ресурсов code-server (LXC 132)
**Дата:** 2026-04-17

View File

@@ -30,12 +30,44 @@ Vault `~/knowledge-base` хранился только в Gitea (`git.dttb.ru/ol
### Архитектура
```
~/knowledge-base/ ← один источник истины
├── .git/ → push в Gitea (git.dttb.ru) [история, review]
└── файлы → rclone bisync на Nextcloud [мгновенный sync]
через sync.sh, триггер Stop-hook
iPhone Obsidian / Nextcloud клиенты
↕ HTTPS WebDAV
Nextcloud dttb.ru (VM 250)
Apple File Provider API (macOS 26+)
~/Library/CloudStorage/Nextcloud-admin@dttbru/Knowledge Base/
↕ rclone bisync LOCAL↔LOCAL (launchd каждые 60 сек)
~/knowledge-base/ ◄── primary workspace
│ git push/pull + obsidian-git autoPush (5 мин)
Gitea (git.dttb.ru) ◄── source of truth для серверных клиентов
├─► code-server LXC 132 /root/knowledge-base
│ cron */5: kb-autosync.sh (pull + auto-commit + push)
└─► openclaw LXC 137 /root/knowledge-base (READ-ONLY)
cron */15: kb-pull.sh (pull --ff-only only)
```
### Ключевая находка: local-to-local bisync через launchd
Первая попытка была rclone bisync ↔ WebDAV через launchd — падала с `Host unreachable` (Go из launchd-контекста macOS не может коннектиться на LAN). Обход:
1. Nextcloud.app настроен через webflow OAuth на admin@dttb.ru
2. macOS File Provider (native Apple API, не Qt) зеркалит весь `admin@dttb.ru` в `~/Library/CloudStorage/Nextcloud-admin@dttbru/`
3. rclone bisync теперь работает **между двумя локальными путями** — без network-syscalls, launchd-проблема обойдена
4. File Provider сам делает upload/download в Nextcloud (Apple-подписан, имеет полный network context)
**Задержка:** iPhone → Mac vault ≈ File Provider (10-30с) + rclone launchd (≤60с) ≈ 90 сек max.
### Расширение на серверы (2026-04-17)
| Хост | Путь | Режим | Триггер | Скрипт |
|------|------|-------|---------|--------|
| Mac | `~/knowledge-base` | RW, git + rclone+NC | Stop-hook Claude, ручной | `~/.config/nextcloud-kb/sync.sh` |
| code-server LXC 132 | `/root/knowledge-base` | RW git | cron `*/5 * * * *` | `/usr/local/bin/kb-autosync.sh` |
| openclaw LXC 137 | `/root/knowledge-base` | **RO git** (push disabled) | cron `*/15 * * * *` | `/usr/local/bin/kb-pull.sh` |
**openclaw read-only** через `git remote set-url --push origin DISABLED_READONLY` — любая попытка push из бота завершится ошибкой "Could not resolve host", случайно перезаписать не сможет.
### Компоненты
- **`/Users/ai/.config/nextcloud-kb/rclone.conf`** — WebDAV ремоут `kbsync:` на `https://dttb.ru/remote.php/dav/files/admin`, app password в obscured виде
@@ -77,17 +109,42 @@ GUI Nextcloud.app запускается в Aqua-session (не launchd), раб
- `.git/` **не** в Nextcloud — git и nextcloud параллельные каналы, не вложенные
### Файлы экосистемы
**На Mac:**
```
~/.config/nextcloud-kb/
├── app-password chmod 600
├── rclone.conf chmod 600
├── app-password chmod 600 (для WebDAV ручного sync.sh)
├── rclone.conf chmod 600
├── rclone-filter.lst
├── sync.sh chmod 700
├── sync.log логи sync-обёртки
├── rclone.log подробные логи rclone
── sync.lock.d/ mkdir-lock (временный)
├── sync.sh chmod 700 (WebDAV bisync — ручной + Stop-hook)
├── sync-local.sh chmod 700 (local bisync — через launchd)
├── sync.log, sync-local.log логи
── rclone.log, rclone-local.log подробные rclone логи
└── sync.lock.d/ sync-local.lock.d/ atomic locks
~/Library/LaunchAgents/ru.dttb.kb-sync-local.plist StartInterval=60s
```
**На code-server (LXC 132):**
```
/root/knowledge-base/ полный RW git-клон
/usr/local/bin/kb-autosync.sh cron-скрипт */5
/var/log/kb-autosync.log логи
/tmp/kb-autosync.lock flock
```
**На openclaw (LXC 137):**
```
/root/knowledge-base/ RO git-клон (push disabled)
/usr/local/bin/kb-pull.sh cron-скрипт */15
/var/log/kb-pull.log логи
```
### Сквозной тест 2026-04-17 (пройден)
- Mac создаёт файл → `git push` → code-server `kb-autosync.sh` fast-forward через 0-5 мин → openclaw `kb-pull.sh` ff-only через 0-15 мин ✓
- code-server создаёт файл → auto-commit + push → Mac `git pull` подтягивает ✓
- Mac удаляет файл → push → обе LXC удаляют у себя при следующем sync ✓
### Credentials Nextcloud (dttb.ru)
- URL: `https://dttb.ru`
- User: `admin` / пароль `1qaz!QAZ`

View File

@@ -0,0 +1,155 @@
---
date: 2026-04-17
type: decision
tags: [nextcloud, sync, gitea, rclone, infrastructure]
---
# Синхронизация knowledge-base: Gitea + Nextcloud через rclone bisync
## Контекст
Vault `~/knowledge-base` хранился только в Gitea (`git.dttb.ru/oleg/knowledge-base.git`). Требования к надёжности и удобству:
- доступ с мобильного (iPhone Obsidian)
- мгновенная копия между устройствами без ручного `git pull/push`
- резервирование на случай проблем с git-историей
На dttb.ru развёрнут **Nextcloud AIO 32.0.6** (VM 250, 10.0.0.230:11001, NPM на `dttb.ru`). Ещё в феврале 2026 была создана папка `/Knowledge Base/` и односторонний скрипт `sync-kb-to-nextcloud.sh` на LXC 129 (Clawdbot) — но LXC 129 с тех пор удалён, скрипт не работает.
## Варианты
1. **Оставить только Gitea** — надёжно, но мобильный доступ через obsidian-git тормозной
2. **Перенести основу в Nextcloud** — хорошо для sync, но потеря git-истории
3. **Gitea основа + Nextcloud зеркало через GUI Nextcloud.app** — классика, real-time, но GUI wizard сложно автоматизировать
4. **Gitea основа + Nextcloud зеркало через rclone bisync + hook** — CLI-only, триггерится после Claude-сессий
5. **nextcloudcmd + launchd каждые 60 сек** — пробовал, **не работает**: Qt из launchd-контекста macOS получает `Host unreachable` хотя curl/ping в том же процессе работают. Специфика macOS 26 для background-агентов, обходить не смог.
## Решение
**Вариант 4 (CLI rclone bisync + Claude Code Stop-hook)** с опциональным добавлением GUI Nextcloud.app позже.
### Архитектура
```
iPhone Obsidian / Nextcloud клиенты
↕ HTTPS WebDAV
Nextcloud dttb.ru (VM 250)
↕ Apple File Provider API (macOS 26+)
~/Library/CloudStorage/Nextcloud-admin@dttbru/Knowledge Base/
↕ rclone bisync LOCAL↔LOCAL (launchd каждые 60 сек)
~/knowledge-base/ ◄── primary workspace
│ git push/pull + obsidian-git autoPush (5 мин)
Gitea (git.dttb.ru) ◄── source of truth для серверных клиентов
├─► code-server LXC 132 /root/knowledge-base
│ cron */5: kb-autosync.sh (pull + auto-commit + push)
└─► openclaw LXC 137 /root/knowledge-base (READ-ONLY)
cron */15: kb-pull.sh (pull --ff-only only)
```
### Ключевая находка: local-to-local bisync через launchd
Первая попытка была rclone bisync ↔ WebDAV через launchd — падала с `Host unreachable` (Go из launchd-контекста macOS не может коннектиться на LAN). Обход:
1. Nextcloud.app настроен через webflow OAuth на admin@dttb.ru
2. macOS File Provider (native Apple API, не Qt) зеркалит весь `admin@dttb.ru` в `~/Library/CloudStorage/Nextcloud-admin@dttbru/`
3. rclone bisync теперь работает **между двумя локальными путями** — без network-syscalls, launchd-проблема обойдена
4. File Provider сам делает upload/download в Nextcloud (Apple-подписан, имеет полный network context)
**Задержка:** iPhone → Mac vault ≈ File Provider (10-30с) + rclone launchd (≤60с) ≈ 90 сек max.
### Расширение на серверы (2026-04-17)
| Хост | Путь | Режим | Триггер | Скрипт |
|------|------|-------|---------|--------|
| Mac | `~/knowledge-base` | RW, git + rclone+NC | Stop-hook Claude, ручной | `~/.config/nextcloud-kb/sync.sh` |
| code-server LXC 132 | `/root/knowledge-base` | RW git | cron `*/5 * * * *` | `/usr/local/bin/kb-autosync.sh` |
| openclaw LXC 137 | `/root/knowledge-base` | **RO git** (push disabled) | cron `*/15 * * * *` | `/usr/local/bin/kb-pull.sh` |
**openclaw read-only** через `git remote set-url --push origin DISABLED_READONLY` — любая попытка push из бота завершится ошибкой "Could not resolve host", случайно перезаписать не сможет.
### Компоненты
- **`/Users/ai/.config/nextcloud-kb/rclone.conf`** — WebDAV ремоут `kbsync:` на `https://dttb.ru/remote.php/dav/files/admin`, app password в obscured виде
- **`/Users/ai/.config/nextcloud-kb/rclone-filter.lst`** — исключения: `.git/**`, `.claude/worktrees/**`, `.obsidian/workspace*.json`, `.obsidian/cache/**`, `.DS_Store`, sync-метаданные
- **`/Users/ai/.config/nextcloud-kb/sync.sh`** — обёртка с atomic lock (mkdir), вызывает `rclone bisync` с retry
- **`/Users/ai/.config/nextcloud-kb/app-password`** — app password (chmod 600), получен через `POST /ocs/v2.php/core/getapppassword`
- **Hook в `~/.claude/settings.json`** — Stop-event триггер, `async: true`, запускает sync.sh если cwd в ~/knowledge-base
### Почему rclone а не nextcloudcmd
- nextcloudcmd (Qt) падает с `Host unreachable` при запуске из launchd-агента
- rclone (Go) работает в CLI, двусторонний `bisync` с state-файлами
- Проще retry-логика, log-файл, exit-коды
### Почему не nextcloudcmd + launchd-агент
Внутри launchd-процесса macOS 26:
- curl/nc/ping успешно коннектятся к 10.0.0.195:443
- Go и Qt runtime получают `EHOSTUNREACH` на тот же IP
- Не DNS, не firewall, не IPv6 — глубокая специфика network-context для background-агентов
- Решение: не запускать из launchd, а триггерить из user-session (Stop-hook = user-session)
### Для real-time sync (будущее, опционально)
GUI Nextcloud.app запускается в Aqua-session (не launchd), работает без этих проблем. Настройка через wizard, 6 кликов. На данный момент отложено.
## Последствия
### Что обновить
- [x] `credentials.md` — добавить Nextcloud creds, убрать ссылки на LXC 129/10.0.0.206
- [x] `projects/dttb/proxmox-inventory.md` — актуализировать список LXC (129, 133 больше нет)
- [x] `CLAUDE.md` (vault) — убрать упоминание LXC 129 Clawdbot если есть
- [x] `claude-memory/MEMORY.md` — обновить reference_infra, убрать LXC 133
### Что надо помнить
- Изменения локально → Nextcloud автоматом **только** после завершения Claude-сессии в `~/knowledge-base`, или ручным запуском `~/.config/nextcloud-kb/sync.sh`
- Изменения с другого устройства → подтянутся следующим запуском sync.sh (не автоматом)
- Для real-time надо доделать GUI Nextcloud.app wizard
- `.git/` **не** в Nextcloud — git и nextcloud параллельные каналы, не вложенные
### Файлы экосистемы
**На Mac:**
```
~/.config/nextcloud-kb/
├── app-password chmod 600
├── rclone.conf chmod 600
├── rclone-filter.lst
├── sync.sh chmod 700
├── sync.log логи sync-обёртки
├── rclone.log подробные логи rclone
└── sync.lock.d/ mkdir-lock (временный)
```
**На code-server (LXC 132):**
```
/root/knowledge-base/ полный RW git-клон
/usr/local/bin/kb-autosync.sh cron-скрипт */5
/var/log/kb-autosync.log логи
/tmp/kb-autosync.lock flock
```
**На openclaw (LXC 137):**
```
/root/knowledge-base/ RO git-клон (push disabled)
/usr/local/bin/kb-pull.sh cron-скрипт */15
/var/log/kb-pull.log логи
```
### Сквозной тест 2026-04-17 (пройден)
- Mac создаёт файл → `git push` → code-server `kb-autosync.sh` fast-forward через 0-5 мин → openclaw `kb-pull.sh` ff-only через 0-15 мин ✓
- code-server создаёт файл → auto-commit + push → Mac `git pull` подтягивает ✓
- Mac удаляет файл → push → обе LXC удаляют у себя при следующем sync ✓
### Credentials Nextcloud (dttb.ru)
- URL: `https://dttb.ru`
- User: `admin` / пароль `1qaz!QAZ`
- App password (для sync): хранится в `~/.config/nextcloud-kb/app-password`
- WebDAV: `https://dttb.ru/remote.php/dav/files/admin/Knowledge Base/`
- Сервер: Nextcloud AIO 32.0.6 на VM 250 (10.0.0.230:11001)
### Откат
- Остановить sync: удалить hook из `~/.claude/settings.json` + `rm -rf ~/.config/nextcloud-kb/`
- Удалить app password на сервере: User settings → Security → Devices/sessions
- Локальный vault не страдает — git remote и работает независимо

View File

@@ -1,3 +1,9 @@
---
date: 2026-04-17
type: decision
tags: [decision]
---
# 2026-04-17: Стабилизация Podkop на Переделках
## Проблема

View File

@@ -0,0 +1,124 @@
---
date: 2026-04-20
type: decision
status: ОТКАЧЕНО
tags: [decision, niikn, mmfb, network, wireguard, rollback]
---
# 2026-04-20: Обход блокировки nspd.gov.ru в НИИКН через WG-туннель к LionART
> **⚠️ СТАТУС: РЕШЕНИЕ ОТКАЧЕНО 2026-04-20 вечером.** После поднятия туннеля сотрудники НИИКН стали жаловаться на медленный интернет. Туннель удалён полностью с обеих сторон (НИИКН и LionART), OpenWrt DNS-override убран. Проблема NSPD остаётся открытой — искать другое решение. Описание ниже сохранено для референса: схема рабочая, но требует дополнительной диагностики что именно замедлило общий трафик (возможно MTU/фрагментация, перегрузка LionART, или случайное совпадение). См. задачу в spawn для вечерней работы.
## Проблема
Сотрудники НИИКН не могут открыть `https://nspd.gov.ru/` (Национальная система пространственных данных Росреестра). Возвращается страница "Запрещено" с Rule `57615a88d1ec0120b56fdce6`, Client IP `85.235.181.190`.
## Диагностика — что НЕ помогло
1. **DNS override на OpenWrt** (исключение `nspd.gov.ru` из podkop через `dnsmasq.server=/nspd.gov.ru/77.88.8.8`) — DNS возвращает реальный IP, но клиент видит блок
2. **Hosts на клиенте** (`2.63.246.71 nspd.gov.ru`) — то же самое
3. **Static route на клиенте** (`route -p add 2.63.246.0/24 → 192.168.1.1`) — то же самое
4. **Полное отключение OpenWrt + podkop-fakeip route на MikroTik** — то же самое
5. **Отключение DoH в Yandex Browser** — то же самое
## Корень проблемы
Публичный IP MikroTik НИИКН = `85.235.181.190` (диапазон `Customers_P2P_B16_WAN_NET` от MTS PJSC, AS8359, country RU). НСПД блокирует именно этот корпоративный диапазон МТС на уровне WAF — это **блокировка по IP на стороне сервера НСПД**, никакие настройки внутри НИИКН не помогут.
Подтверждение: с другого МТС-IP (`176.62.183.186`, dttb.ru) и с публичного IP LionART (`195.26.30.163`) НСПД отвечает HTTP 200.
## Решение
Поднят WireGuard site-to-site туннель **MikroTik НИИКН ↔ MikroTik LionART**. Только трафик к подсети НСПД (`2.63.246.0/24`) маршрутизируется через туннель — остальной интернет НИИКН идёт по-прежнему через МТС.
```
[Клиент НИИКН 192.168.1.x]
→ [MikroTik НИИКН 192.168.1.1, masq на wg-lionart → 10.99.99.2]
→ [WG туннель 10.99.99.0/30]
→ [MikroTik LionART 10.253.1.1, masq на ether1 → 195.26.30.163]
→ [НСПД 2.63.246.0/24] ✅ HTTP 200
```
## Конфигурация
### MikroTik LionART (`10.253.1.1`, hydropark, RouterOS 7.16.2)
```
/interface/wireguard add name=wg-niikn listen-port=51820 mtu=1420 \
comment="tunnel to NIIKN MikroTik for NSPD bypass"
/ip address add address=10.99.99.1/30 interface=wg-niikn
/interface/wireguard/peers add interface=wg-niikn \
public-key="ozex5MoF4rxnYpFyO5w44oittLehavs1YiPEq/ec4xU=" \
allowed-address=10.99.99.2/32 comment="NIIKN MikroTik"
/ip firewall filter add chain=input action=accept protocol=udp dst-port=51820 \
in-interface-list=WAN comment="WG NIIKN" place-before=0
/ip firewall filter add chain=forward action=accept in-interface=wg-niikn \
out-interface-list=WAN comment="WG NIIKN to WAN" place-before=0
/ip firewall filter add chain=forward action=accept in-interface-list=WAN \
out-interface=wg-niikn connection-state=established,related \
comment="WAN to WG NIIKN reply" place-before=0
```
- Public key LionART: `YuI6lQ1f1bF37x5dwa/JQuW30x4McO2//cl/mEWg4mE=`
- WAN: ether1-gw-telekom, публичный IP `195.26.30.163/27`
### MikroTik НИИКН (`192.168.1.1`, RouterOS 7.20.6)
```
/interface/wireguard add name=wg-lionart listen-port=51821 mtu=1420 \
comment="tunnel to LionART for NSPD bypass"
/ip address add address=10.99.99.2/30 interface=wg-lionart
/interface/wireguard/peers add interface=wg-lionart \
public-key="YuI6lQ1f1bF37x5dwa/JQuW30x4McO2//cl/mEWg4mE=" \
endpoint-address=195.26.30.163 endpoint-port=51820 \
allowed-address=10.99.99.0/30,2.63.246.0/24 \
persistent-keepalive=25s comment="LionART exit for NSPD"
/ip route add dst-address=2.63.246.0/24 gateway=10.99.99.1 \
comment="NSPD via LionART"
/ip firewall nat add chain=srcnat action=masquerade out-interface=wg-lionart \
comment="masq NSPD via LionART WG"
```
- Public key НИИКН: `ozex5MoF4rxnYpFyO5w44oittLehavs1YiPEq/ec4xU=`
## Критичные моменты
1. **Masquerade на wg-lionart на стороне НИИКН обязателен.** Без него LionART получает пакеты с source `192.168.1.x`, но conntrack/firewall не пропускает обратные ответы → SYN уходит, SYN-ACK теряется → timeout.
2. **Forward правила на LionART обязательны** — дефолтный firewall пропускает только трафик из/в LAN `10.253.1.0/24`. Трафик из `wg-niikn` в WAN нужно явно разрешить.
3. **AllowedIPs `2.63.246.0/24` на peer НИИКН** автоматически создаёт маршрут — но я добавил явный static route для надёжности (с понятным комментом).
4. NSPD не отвечает на ICMP — для проверки используй `/tool fetch` или `curl`, а не ping.
## Откат полной конфигурации
```
# На LionART
/interface/wireguard remove wg-niikn
/ip firewall filter remove [find comment~"WG NIIKN"]
# На НИИКН
/interface/wireguard remove wg-lionart
/ip route remove [find comment="NSPD via LionART"]
/ip firewall nat remove [find comment="masq NSPD via LionART WG"]
```
## Связанные изменения (временные, из той же сессии)
В процессе диагностики были сделаны изменения, **не связанные** с финальным решением — их можно откатить:
1. **MikroTik НИИКН: podkop-fakeip route disable** (`/ip route disable [find comment="podkop-fakeip"]`) — отключил маршрут `198.18.0.0/15 → 192.168.1.50`. Из-за этого WhatsApp/Telegram/Instagram через podkop сейчас не работают. Для возврата: `/ip route enable [find comment="podkop-fakeip"]`.
2. **MikroTik НИИКН: DHCP DNS изменён** на `77.88.8.8,8.8.8.8` (вместо `192.168.1.50`). Для возврата: `/ip dhcp-server network set [find] dns-server=192.168.1.50`.
3. **OpenWrt: dnsmasq override для nspd.gov.ru** — добавлен в `/etc/config/dhcp` (`server=/nspd.gov.ru/77.88.8.8`). Не мешает работе, можно оставить или удалить через UCI.
После решения с WG туннелем эти временные изменения **больше не нужны для NSPD** — можно вернуть podkop в исходное состояние.
## Долгосрочное решение
Связаться со службой поддержки Росреестра/НСПД и попросить разблокировать корпоративный IP `85.235.181.190` (МТС). Контакт: 8-800-100-34-34, https://nspd.gov.ru/feedback. Тогда WG-туннель можно будет удалить.
## Теги
`#niikn` `#mmfb` `#lionart` `#mikrotik` `#wireguard` `#nspd` `#bypass` `#fix`

View File

@@ -0,0 +1,68 @@
---
date: 2026-04-21
type: decision
tags: [decision, network, wireguard, znamenskoye, ohothozyistvo, backup-channel]
---
# 2026-04-21: Восстановление резервного WG-канала для охотхозяйства
## Контекст
Объект «Знаменское Охотхозяйство» работает на LTE через MikroTik hAP ax lite LTE6 (CGNAT), единственный канал управления — Netbird через Orange Pi R1+ LTS (OpenWrt 21.02). Нужен резервный канал на случай деградации Netbird. Ранее пробовали WG на MikroTik — ломал интернет (default route hijacking через distance=2). Физического доступа к объекту нет.
Существующий WG на Orange Pi (wg0 → VPS 89.111.140.86) числился в документации как «сломан из-за port mismatch», но на самом деле не работал по **двум** причинам:
1. Orange Pi `wg0` endpoint port: `51820` — VPS слушает `51821`.
2. VPS `/etc/wireguard/wg0.conf` пира `10.5.0.3` имел pubkey `zZ4UoWNwTxBODr8xZmoCREBL2zXJcmdcxKIPGp/xBC8=` (вероятно, старый ключ MikroTik-овского `wg-vps`), а Orange Pi шлёт от ключа `QK2SMILEfG+kRccU3QJVDZafuf108z6qPDK1XusLGVI=`.
## Варианты
1. Починить существующий WG на Orange Pi (минимум правок, WG не трогает default route на OpenWrt).
2. Поднять AmneziaWG на Orange Pi по схеме НИИКН (требует OpenWrt 22.03+, Orange Pi на 21.02 — обновление sysupgrade без физдоступа = риск окирпичивания).
3. Включить WG на MikroTik заново — известная проблема с default route, отпадает.
## Решение
**Вариант 1.** Починить WG на Orange Pi, оставить MikroTik `wg-vps` disabled.
Изменения:
- На Orange Pi: `uci set network.wg0_peer.endpoint_port='51821'``ifdown wg0 && ifup wg0`.
- На VPS: `sed` в `/etc/wireguard/wg0.conf` (бэкап `.bak-20260421-1512`) — PublicKey пира `10.5.0.3` заменён на `QK2SMILE...`. Перечитано атомарно `wg syncconf wg0 <(wg-quick strip wg0)`**другие пиры не затронуты** (10.5.0.4 Home 4.37 TiB трафика, 10.5.0.2 З-29).
Проверено:
- VPS ↔ Orange Pi (10.5.0.3): 0% loss, RTT ~40-107 мс
- VPS ↔ MikroTik (192.168.8.1): 0% loss, RTT ~40 мс
- VPS ↔ NVR (192.168.8.247): 0% loss
- DNAT публичных портов: `http://89.111.140.86:8180/` (NVR Web) → HTTP 200 за 0.22s
- Интернет на объекте не пострадал
## Последствия
### Что обновлено
- [Документация охотхозяйства](../claude-memory/znamenskoye-ohothozyistvo.md) — актуализированы разделы 2, 3, 5, 6.
- Netbird IP Orange Pi изменился: `100.70.63.67``100.70.106.227` (Connected P2P, не Relayed как писали ранее).
### Новый ключ доступа к VPS
SSH-ключ ранее был «на clawdbot LXC 129», но clawdbot больше нет (только LXC 137 openclaw). Заведён новый ключ:
- Локальный файл: `~/.ssh/vps_znam_key` (RSA-2048, сгенерирован панелью sweb.ru)
- Имя ключа в sweb.ru: `claude`
- **TODO (Олег):** сохранить приватный ключ в Bitwarden `bit.dttb.ru` как `VPS znam (89.111.140.86)` — чтобы не потерять снова.
### Резервные каналы объекта (после фикса)
| # | Канал | Путь |
|---|-------|------|
| 1 (основной) | Netbird mesh | Mac → 100.70.106.227 → 192.168.8.0/24 |
| 2 (резерв) | WG через VPS | Интернет → VPS → WG 10.5.0.1↔10.5.0.3 → 192.168.8.0/24 |
DNAT камер/NVR через VPS 89.111.140.86:8xxx теперь реально работает (до фикса транспорт был мёртв).
### Отложено (опционально)
- Второй WG-peer на VPS `:443/udp` — защита от DPI LTE-оператора, если начнёт блокировать `:51821`.
- `autossh` reverse tunnel с Orange Pi на VPS — третий канал на случай падения и Netbird, и WG.
- Обновление Orange Pi до OpenWrt 24.10 + AWG по схеме НИИКН — отложено из-за отсутствия физдоступа.
### Почему документация была неверной
В старом `znamenskoye-ohothozyistvo.md` описан только port mismatch (51820 vs 51821) — но смена порта одна handshake не восстанавливает, т.к. pubkey пира на VPS тоже не соответствовал Orange Pi. Вероятный источник путаницы — пир на VPS создавался когда WG пытались поднять на MikroTik (свой keypair), потом переключили на Orange Pi (другой keypair) и на VPS ключ не обновили.
## Теги
`#znamenskoye` `#ohothozyistvo` `#wireguard` `#openwrt` `#backup-channel` `#vps` `#fix`

View File

@@ -0,0 +1,110 @@
---
date: 2026-04-24
type: incident
tags: [niikn, vpn, security, malware, finland]
---
# Finland VPS 78.17.4.225 — инцидент XorDDoS + очистка
## Обстоятельства
- 24 Apr провайдер adminvps.ru заблокировал сервер за **14 ТБ трафика за ~11 дней** (~1.27 ТБ/день)
- Олег доплатил +8 ТБ, сервер снова в сети
- AmneziaVPN НИИКН (клиенты через OpenWrt 10.8.1.16) всё это время работал, но на фоне шёл malware
## Диагноз
Семейство **Linux/XorDDoS** (или близкий вариант). Маскировки:
- `/usr/bin/zneirjeklr` — главный бинарь, cmdline `[rcu_gp]` (под kernel thread)
- `/etc/init.d/zneirjeklr` — SysV init persistence (автогенерит systemd unit)
- `/etc/cron.hourly/gcc.sh` — backup persistence, cp из `/lib/libudev.so` в `/lib/libudev.so.6` и запуск
- `/usr/local/bin/lvm2-monitor` — под LVM monitor
- `/lib/libudev.so` + `/usr/lib/libudev.so` — под libudev
- `/tmp/*` + `/var/tmp/*` — дропперы с числовыми именами (3.2 МБ каждый)
- `/var/tmp/QvqDAQNp` — UPX-packed дроппер (14 МБ)
- cmdline `hald-runner` / `mingetty tty1` — фейковые имена процессов
## Хронология (по mtime)
| Дата | Событие |
|------|---------|
| 28 Mar 23:59 | Первый успешный `Accepted password` с 172.18.0.3 (panel-web legitimate или уже compromised) |
| 7 Apr 19:44 | Дроппер `/var/tmp/QvqDAQNp` создан |
| 13 Apr 5:54-5:59 | Массовое создание 7 дропперов в `/var/tmp/` |
| 17 Apr 17:33 | Ещё волна (EXT4 remount в dmesg) |
| 20 Apr 02:13 | `zneirjeklr.service` активирован (systemd-sysv-generator) |
| 23 Apr 14:49 | Провайдер остановил сервер (квота) |
| 24 Apr 11:40 | Олег оплатил, сервер поднялся — malware сразу запустился |
| 24 Apr 12:00-12:30 | Очистка |
## C2 инфраструктура
- 141.98.10.115:1531
- 170.168.103.27:29205
- 64.89.161.144:40778
## Точка входа
**RCE в PHP-панели AmneziaVPN (`amnezia-panel-web`)** — НЕ SSH brute-force.
Доказательство: единственные успешные `Accepted password` в auth.log — с 176.62.183.186 (Олег) и 172.18.0.3 (панель, легитимный `collect_metrics.php`). **Ни одного Accepted с внешнего malware-IP.**
Брут извне был (91.142.77.101: 67k, 91.142.78.60: 66k, 91.142.78.8: 36k попыток) — НЕ пробил.
## Что сделано
1. **Блок C2**`iptables -I OUTPUT -d <C2> -j DROP` × 3
2. **Kill + empty + chattr +i** на все 10 malware-файлов (пересоздаются но с нулевым содержимым и immutable — записаться не могут)
3. **SSH усилен:**
- Убран `PubkeyAuthentication no` из `/etc/ssh/sshd_config.d/99-cloud-init.conf` (cloud-init ставил по умолчанию — вот почему раньше входили только паролем)
- `PasswordAuthentication no` везде
- Новый root пароль `Ztey8pwWBiNNiMU09y76` (сохранён в `/root/.new_root_pw`), но по сути пароль уже не используется
4. **Docker→host SSH заблокирован:** `iptables -I INPUT -s 172.17.0.0/16 -p tcp --dport 22 -j DROP` (× 4 сети). **Важно:** это ломает `amnezia-panel/collect_metrics.php` — панель больше не получает метрики хоста. ВПН-туннели работают.
5. **fail2ban** установлен, active. Whitelist для docker сетей добавлен в `/etc/fail2ban/jail.d/docker-ignore.conf`.
6. **iptables-persistent** — правила сохранены в `/etc/iptables/rules.v4`, выживут reboot.
## Forensic артефакты (на сервере)
- `/root/forensic-20260424/zneirjeklr.bin` — копия бинарника
- `/root/forensic-20260424/1380609993.bin` — копия второй стадии
- `/root/clean-*.log` — лог очистки
- `/root/.ssh/authorized_keys.bak-20260424` — бэкап authorized_keys до дедупликации
## Что ещё надо (не сделано)
1. **Обновить/пересобрать amnezia-panel-web** — там PHP-RCE, может вернуться (текущий образ `amneziavpnphp_web` из `/opt/amneziavpnphp/docker-compose.yml`)
2. **Восстановить метрики панели** — либо положить SSH-ключ из контейнера в authorized_keys хоста, либо отключить `collect_metrics.php`
3. Мониторинг: `vnstat -d` раз в сутки, алерт при >50 ГБ/день
4. Через ~24 часа проверить `iptables -nvL OUTPUT | grep DROP` — если счётчики всё ещё растут = остался watchdog
5. Проверить другие контейнеры (amnezia-panel-db, vpn-nginx) на заражение
## Как заходить теперь
```bash
ssh -i ~/.ssh/id_ed25519 root@78.17.4.225 # только ключ
# Пароль sshpass больше не работает (PasswordAuthentication=no)
```
## Проверка через 3 часа после очистки (24 Apr ~15:30 UTC)
**Всё устойчиво:**
- Malware-процессов: 0
- Внешних подозрительных соединений: 0
- Файлы-ловушки целы (0 байт + `chattr +i`), новых дропперов в /tmp/var/tmp нет
- C2 OUTPUT DROP счётчики **не растут** (только +6 пакетов на 170.168.103.27 — доумирающие TCP-ретраи): 95 / 80 / 21
- INPUT DROP `amnezia-panel→host:22` — 10,563 пакетов (легитимный collect_metrics.php каждую минуту, безвреден)
- fail2ban: 54 IP забанены за сутки, 1211 failed отбито
- vnstat: вчера 1.77 GiB, сегодня 749 MiB (92 kbit/s) — **норма** (раньше 120 Мбит/с при заражении)
- AmneziaWG: handshake свежий, клиенты НИИКН активны, передано 2.03 GiB
**Очистка устойчива. Watchdog'ов не осталось. Сервер можно оставить в работе.**
## Хеши malware (для blocklist)
Сохранены в `/root/forensic-20260424/`:
- `zneirjeklr.bin` (114779 байт) — главный бинарь
- `1380609993.bin` (3301552 байт) — вторая стадия
## Сетевые IOC (Indicators of Compromise)
**C2 IP (заблокированы в OUTPUT):**
- 141.98.10.115:1531
- 170.168.103.27:29205
- 64.89.161.144:40778
**Brute-force источники (топ-10 за период до очистки):**
- 91.142.77.101 — 67,267 попыток
- 91.142.78.60 — 66,472
- 91.142.78.8 — 36,116
- 176.120.22.13 — 5,164
- 223.76.107.28 — 5,131
- 80.66.66.70 — 3,128
Эти IP уже автоматически попадают в fail2ban при появлении.

View File

@@ -0,0 +1,66 @@
---
date: 2026-04-28
type: decision
tags: [decision, openclaw, netbird, code-server, monitoring]
---
# 2026-04-28: NetBird watchdog на LXC 132 и 137 (фикс "бот молчит")
## Симптом
Олег пишет Максимке (openclaw, LXC 137) с 10:10 до 11:09 — **9 сообщений без ответа**. В логах gateway:
```
FailoverError: LLM request failed: network connection error
502 [kiro/claude-sonnet-4.5]: fetch failed (reset after 1s)
502 [claude/claude-sonnet-4-6]: fetch failed (reset after 5s)
502 [codex/gpt-5.4]: fetch failed (reset after 2s)
```
Все 3 модели в failover-цепочке падают с TCP-reset за 1-5 секунд.
## Корень
NetBird daemon на **LXC 132 (code-server, OmniRoute + CLIProxy)** в зомби-состоянии:
```
Management: Connected
Signal: Connected
Relays: 0/4 Available ← застряло
Nameservers: 0/0 Available
```
DNS-запросы к `1.1.1.1` через `wt0`-туннель падают мгновенно с `write: required key not available` — WireGuard handshake с пиром не завершён, ключ не загружен в ядро. Поэтому curl на `api.anthropic.com` / `api.openai.com` отвечает `HTTP 000` за 0.0001s. CLIProxy без апстрима возвращает HTTP 500 на каждый POST.
Ручной `systemctl restart netbird` сразу чинит — Relays поднимаются 4/4, DNS работает, curl Anthropic = 405, OpenAI = 401.
## Решение
Watchdog на LXC 132 и LXC 137:
- `/usr/local/bin/netbird-watchdog.sh` — проверяет `netbird status`. Если `Relays: 0/N` или `Peers count: 0/N` (при N>0 и Management=Connected) — `systemctl restart netbird`. Минимум 5 мин между рестартами (lock-файл `/run/netbird-watchdog.last-restart`).
- `netbird-watchdog.service` (oneshot) + `netbird-watchdog.timer` (каждые 2 мин).
## Деплой
```bash
for CT in 132 137; do
pct push $CT netbird-watchdog.sh /usr/local/bin/ --perms 0755
pct push $CT netbird-watchdog.service /etc/systemd/system/
pct push $CT netbird-watchdog.timer /etc/systemd/system/
pct exec $CT -- systemctl daemon-reload
pct exec $CT -- systemctl enable --now netbird-watchdog.timer
done
```
Скрипты — `snippets/netbird-watchdog/`.
## Логи
Решение пишет в journalctl с tag `netbird-watchdog`:
```bash
journalctl -t netbird-watchdog -n 20
```
Если за неделю не было ни одного срабатывания — проблема была разовой. Если срабатывает регулярно — нужно копать корень почему wireguard handshake разваливается (MTU? фрагментация UDP? провайдер режет?).

View File

@@ -0,0 +1,56 @@
---
date: 2026-04-28
type: decision
tags: [decision, niikn, network, dns, podkop]
---
# 2026-04-28: Открыть uookn.sev.gov.ru из НИИКН (DNS override)
## Проблема
Сотрудники НИИКН жалуются — не открывается `https://uookn.sev.gov.ru/` (Управление по охране объектов культурного наследия Севастополя, на Bitrix).
## Диагноз
По алгоритму [[../projects/niikn/govru-quickfix-playbook]]:
| Точка | HTTP | Real IP |
|-------|------|---------|
| Mac (Ростелеком Истра) | 200 | 213.59.161.38 |
| pve-LionART (чистый WAN) | 200 | 213.59.161.38 |
| pve-niikn vmbr0 (МТС B2B) | 200 | 213.59.161.38 |
| OpenWrt 192.168.1.50 (DNS клиентов НИИКН) | — | **198.18.1.123 (FakeIP)** |
Оба WAN отдают сайт. МТС не блочит. **Причина**`sev.gov.ru` подпадает под podkop community-list (вероятно `russia_outside`), DNS подменяется FakeIP, трафик уходит в awg0 Финляндию и не возвращается. Тот же паттерн, что `zakupki.gov.ru`.
## Решение
OpenWrt `192.168.1.50` — добавлен root-домен в dnsmasq `server=`:
```bash
ssh root@192.168.1.50
uci add_list dhcp.@dnsmasq[0].server='/sev.gov.ru/8.8.8.8'
uci commit dhcp
/etc/init.d/dnsmasq restart
```
NetBird route **НЕ требуется** (в отличие от nspd).
## Проверка
```
DNS 192.168.1.50: uookn.sev.gov.ru → 213.59.161.38
МТС vmbr0 + curl: HTTP 200, 216 KB
OpenWrt curl: HTTP 200, 216 KB
```
Клиентам НИИКН — `ipconfig /flushdns` для сброса кэша FakeIP.
## Текущий список dnsmasq override на 192.168.1.50
```
'127.0.0.42' # podkop sing-box
'/nspd.gov.ru/8.8.8.8' # + NetBird route 2.63.246.0/24
'/zakupki.gov.ru/8.8.8.8' # только DNS
'/sev.gov.ru/8.8.8.8' # только DNS — добавлено сегодня
```

View File

@@ -0,0 +1,133 @@
---
date: 2026-04-28
type: migration
tags: [rustdesk, lxc116, npm, lejianwen, must-login, isolation]
---
# RustDesk migration: OSS hbbs/hbbr → lejianwen-pro
## Цель
Закрыть дыру: техник Клиента-А не должен подключаться к машинам Клиента-Б, даже зная ID и пароль. Это задача `MUST_LOGIN=Y` на уровне `hbbs`.
## Что было
- LXC 116 `rustdeskserver` — Debian 12, 10.0.0.244 / 100.70.191.161 (NetBird)
- Установлено через ProxmoxVE community-script (нативно, не Docker):
- `hbbs` 1.1.14 — **OSS** Purslane (поддерживает только `--key`, `-r`, `--rendezvous-servers`, `ALWAYS_USE_RELAY`)
- `hbbr` 1.1.14 — OSS
- `rustdesk-api` 2.7 — **lejianwen** (это уже не OSS, но без настроек: lang=zh-CN, jwt пустой, домен 192.168.1.66 мусорный)
- Конфиг `/var/lib/rustdesk-api/conf/config.yaml` — почти дефолтный, никто не правил
- БД `rustdeskapi.db` 352K с 1 admin user + 13 peers (внутренние LAN)
- NPM Proxy Host 14 для `remot.dttb.ru` смотрел на **мёртвый 10.0.0.43:21114**, streams 30-35 на **мёртвый 10.0.0.44**, SSL force/HTTP/2/block_exploits всё off
- `https://remot.dttb.ru/_admin/` снаружи: **502 Bad Gateway** (никто никогда не пользовался web-админкой через домен)
- Peers всё равно работали: внутренние через LAN 10.0.0.244, внешние видимо через NetBird mesh / DNAT на роутере минуя NPM
## Найденная развилка
OSS `hbbs` не понимает `MUST_LOGIN`. Этот патч есть только в `lejianwen/rustdesk-server-pro` (тот же бинарь, что в docker-образе `lejianwen/rustdesk-server-s6`). Без него изоляция работает только на уровне `rustdesk-api` (адресные книги по группам), но любой клиент с правильным ключом всё равно может ходить по ID минуя API.
## Варианты
| Вариант | Действие | Плюс | Минус |
|---|---|---|---|
| A1 | Подменить только бинари hbbs/hbbr на pro, остальное оставить | Минимум потрясений, ключ/БД/api/NPM streams не трогаем | На LXC два разных способа управления (apt + override). apt-mark hold нужен |
| A2 | Оставить OSS, изоляция только через api | Ноль рисков ломки | Главное требование (изоляция по ID) не закрыто |
| A3 | Полная миграция в Docker s6 (как в исходном промте Олега) | Единый стек, проще будущие upgrades | Требует Docker, расширения rootfs LXC, миграции БД, больше точек отказа сейчас |
**Выбран: A1.** A3 — отдельной задачей через 2-4 недели когда дойдём до MySQL/HA/MCP-обёртки.
## Что сделано
### LXC 116
1. **Бэкап** `/root/rustdesk-backup-20260428-1134/` (ключи, db_v2.sqlite3, rustdeskapi.db, config.yaml.orig, systemd units, JWT, admin pw)
2. **Pro-бинари** извлечены из `lejianwen/rustdesk-server-s6:latest` через docker на Proxmox-host (на самом 10.0.0.250 docker есть, в LXC 116 — нет):
```
docker create --name rd-extract lejianwen/rustdesk-server-s6:latest
docker cp rd-extract:/usr/bin/hbbs /tmp/...
docker cp rd-extract:/usr/bin/hbbr /tmp/...
pct push 116 ...
```
3. **Подмена** через `mv`:
- `/usr/bin/hbbs.oss-1.1.14` ← старый
- `/usr/bin/hbbs` ← новый pro (поддерживает `--must-login Y`)
4. **`apt-mark hold rustdesk-server-hbbs rustdesk-server-hbbr`** — apt не перезапишет
5. **Systemd overrides:**
- `/etc/systemd/system/rustdesk-hbbs.service.d/override.conf`:
```
ExecStart=
ExecStart=/usr/bin/hbbs -k _ -r remot.dttb.ru:21117 --must-login Y
```
- `/etc/systemd/system/rustdesk-hbbr.service.d/override.conf`:
```
ExecStart=
ExecStart=/usr/bin/hbbr -k _
```
6. **`config.yaml`** правки (точечно, без пересборки):
- `lang: ru`
- `admin.title: "Remote Support Portal"`
- `app.show-swagger: 1`, `ban-threshold: 5`
- `rustdesk.id-server / relay-server: remot.dttb.ru`
- `rustdesk.api-server: https://remot.dttb.ru`
- `rustdesk.key: R0lA4r77hAGw6YRL1qG3JioVqQ0Q0fJfzkwlAGqR6jU=` (значение `id_ed25519.pub`)
- `rustdesk.key-file: /var/lib/rustdesk-server/id_ed25519.pub`
- `jwt.key: <openssl rand -base64 48>`
7. **Admin pw сменён** через CLI: `rustdesk-api reset-admin-pwd <pw>` (cd в `/var/lib/rustdesk-api/`)
### NPM (LXC 103 через API)
1. Proxy Host 14 (id 14): `forward_host: 10.0.0.244`, `ssl_forced/http2/block_exploits=true`, `caching_enabled=false`, `allow_websocket_upgrade=true`
2. **Custom Nginx Configuration** (advanced_config) добавлен с `location /ws/id` (→21118) и `/ws/relay` (→21119) — для будущей All-in-HTTPS архитектуры (клиенты за корпоративными firewall'ами через 443)
3. Stream 30 (TCP 21114) **удалён** — API не должен жить голым TCP
4. Streams 31-35 пересозданы (id 38-43) на 10.0.0.244 (PUT не работает на streams API — `additional properties` ошибка; делать DELETE+POST с минимальным body без `certificate_id`)
5. Добавлен Stream id 43: 21116/TCP (id-server) дополнительно к Stream id 39: 21116/UDP
## Подтверждения
- `sha256sum id_ed25519.pub` идентичен до/после миграции (`abfbebe9…a38c6b`) ✅
- `sha256sum id_ed25519` (приватный) идентичен ✅
- `MUST_LOGIN=Y` явно в `/var/log/rustdesk-server/hbbs.log` после рестарта
- `Key: R0lA4r77hAGw6YRL1qG3JioVqQ0Q0fJfzkwlAGqR6jU=` тот же
- `Private key comes from id_ed25519` — pro-hbbs нашёл существующий ключ, не перегенерировал
- Все 7 портов 21114-21119 слушают
- `https://remot.dttb.ru/_admin/` снаружи: **HTTP/2 200 OK** (раньше 502)
- 13 существующих peers продолжают подключаться (БД та же)
## Грабли
1. **community-script ставит OSS hbbs**, не pro. Бинарь от Purslane Ltd. Версия 1.1.14 у обоих идентична, но pro имеет дополнительный CLI-флаг `--must-login Y` и читает `MUST_LOGIN` env. Проверка через `grep -ao MUST_LOGIN /usr/bin/hbbs` (`strings` в LXC нет).
2. **Admin API не пускает через curl** даже с правильным admin-токеном из `/api/admin/login` — требует web-сессию. Юзеров и группы создавать через UI.
3. **NPM PUT на streams возвращает 400 `additional properties`** — даже если отправить только разрешённые поля. Решение: DELETE + POST с минимальным body (5 полей: incoming_port, forwarding_host, forwarding_port, tcp_forwarding, udp_forwarding). Без `certificate_id`.
4. **`ENCRYPTED_ONLY` env-переменная** не нашлась как строка в pro-бинаре hbbs. Возможно управляется через config или этого патча нет в публичном `lejianwen/rustdesk-server-s6`. MUST_LOGIN сам по себе закрывает изоляцию — шифрование RustDesk и так включено для key-серверов.
5. **NPM streams для портов 21115-21119 по факту не использовались** — peers подключались внутри LAN (10.0.0.244 напрямую) или через NetBird (100.70.191.161). Поэтому "поломанная" конфигурация NPM не мешала. Внешний DNAT на роутере dttb.ru вероятно идёт прямо на rustdesk-сервер минуя NPM (надо ещё разок проверить — или подтвердить что внешние клиенты ходят через NetBird).
## Rollback
`bash /root/rustdesk-rollback.sh` — за 30 секунд:
- mv бинари обратно (`/usr/bin/hbbs.oss-1.1.14` → `/usr/bin/hbbs`)
- удаляет systemd overrides
- восстанавливает `config.yaml.orig`
- снимает apt-mark hold
- рестартует сервисы
NPM-настройки **скриптом не откатываются** — ручной откат через UI или из `/data/database.sqlite` LXC 103.
## TODO (отдельные задачи)
- Создать клиентские группы и юзеров через web (Олег, в /_admin/)
- Протестировать изоляцию на тестовой клиентской машине
- Раскатать новый `RustDesk2.toml` на ~30-50 машин через GPO/скрипт (старые конфиги тоже работают — ключ тот же)
- Бэкап БД API + ключей по cron на ArtLeon через NetBird/rsync
- Через 2-4 недели — миграция в Docker rustdesk-server-s6 (Вариант A3), MySQL/HA, MCP-обёртка
## Связанные файлы
На LXC 116:
- `/root/rustdesk-backup-20260428-1134/` — бэкап и креды
- `/root/rustdesk-rollback.sh` — откат (chmod 700)
- `/root/RustDesk2.toml` — шаблон клиента
- `/root/rustdesk-migration-report.md` — расширенный отчёт
В kb:
- [[projects/dttb/rustdesk]] — справочник по серверу
- [[projects/dttb/credentials]] — креды (admin pw, JWT_KEY)
- [[projects/dttb/proxmox-inventory]] — LXC 116 запись обновлена

View File

@@ -0,0 +1,133 @@
---
date: 2026-04-29
type: deployment
tags: [rustdesk, deployment, installers, nextcloud, automation]
---
# RustDesk client deployment package — Nextcloud `RustDesk install/`
## Цель
Удобное развёртывание ~30-50 клиентских машин (НИИКН + клиенты) с pre-настроенным RustDesk. Клиент должен после установки сразу подключаться к `remot.dttb.ru`, без ручной настройки api/relay/key.
## Что сделано
В корне Nextcloud (`Nextcloud-admin@dttbru`) создана папка **`RustDesk install/`** с готовыми установщиками + автоматическими скриптами + конфигом.
### Структура
```
RustDesk install/ ~766 MB total
├── README.md инструкция для клиента
├── RustDesk2.toml шаблон конфига (ID/relay/api/key)
├── windows/
│ ├── rustdesk-1.4.6-x86_64.exe 23 MB - основной installer
│ ├── rustdesk-1.4.6-x86_64.msi 23 MB - MSI для GPO
│ ├── Install-Windows.ps1 PowerShell автоустановка
│ └── Install-Windows.bat wrapper, двойной клик → UAC → автоинстал
├── linux/
│ ├── rustdesk-1.4.6-x86_64.deb 22 MB
│ ├── rustdesk-1.4.6-aarch64.deb 20 MB
│ ├── rustdesk-1.4.6-x86_64.rpm 30 MB
│ ├── rustdesk-1.4.6-aarch64.rpm 29 MB
│ ├── rustdesk-1.4.6-x86_64.AppImage 81 MB - для дистрибутивов без apt/dnf
│ └── install-linux.sh bash, авто-detect arch + pkg manager
├── macos/
│ ├── rustdesk-1.4.6-aarch64.dmg 24 MB - Apple Silicon
│ ├── rustdesk-1.4.6-x86_64.dmg 31 MB - Intel
│ └── install-macos.sh bash, mount dmg + copy to /Applications
└── android/
└── rustdesk-1.4.6-universal.apk 67 MB
```
Версия RustDesk **1.4.6** (latest stable, релиз 2026-03-05). Совпадает с тем что у Олега на Mac и Windows-сервере.
## Что делает скрипт
1. **Установка** — silent через системный пакетный менеджер
2. **Остановка сервиса** перед перезаписью конфига (`Stop-Service RustDesk` / `systemctl stop rustdesk`)
3. **Копирование `RustDesk2.toml`** в правильное место:
- Windows service mode: `C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\`
- Windows user mode (fallback): `%APPDATA%\RustDesk\config\`
- Linux service: `/root/.config/rustdesk/`
- Linux user: `~/.config/rustdesk/`
- macOS: `~/Library/Preferences/com.carriez.RustDesk/`
4. **Генерация permanent password** (10 символов, случайный per-machine) через `rustdesk --password <pw>`
5. **Сохранение creds** в файл (chmod 600):
- Windows: `C:\Users\Public\rustdesk-credentials.txt` + `C:\Users\Public\Desktop\RustDesk-ID.txt`
- Linux: `/root/rustdesk-credentials.txt`
6. **Запуск сервиса**`Start-Service RustDesk` / `systemctl start rustdesk`
7. **Вывод** ID + пароля для пользователя
macOS — без auto-password (sandboxing) — пользователь устанавливает permanent password сам через UI.
## Конфиг сервера (RustDesk2.toml)
```toml
rendezvous_server = "remot.dttb.ru:21116"
nat_type = 1
serial = 1
[options]
custom-rendezvous-server = "remot.dttb.ru"
relay-server = "remot.dttb.ru"
api-server = "https://remot.dttb.ru"
key = "R0lA4r77hAGw6YRL1qG3JioVqQ0Q0fJfzkwlAGqR6jU="
allow-websocket = "Y"
verification-method = "use-permanent-password"
approve-mode = "password"
```
## Способы развёртывания
### Текущий (offline-friendly)
1. Олег делает в Nextcloud public share-link (пока не сделано — отдельная ручная задача)
2. Шлёт ссылку клиенту/технику
3. Тот скачивает свою папку → запускает скрипт → готово
### Будущее — one-liner
Положить скрипт на rustdesk-api сервер (или public path в NPM):
- `irm https://remot.dttb.ru/install/win.ps1 | iex` (Win)
- `curl -sL https://remot.dttb.ru/install/linux.sh | sudo bash` (Linux)
Скрипт автоматически качает installer с github.
### Будущее — Strategy
В админке `/_admin/` → Configuration Strategy → создать policy с настройками. Push'ит конфиг существующим клиентам автоматически. Требует чтобы клиент изначально знал api-server URL — то есть всё равно первичная установка нужна.
### Будущее — `rustdesk-licensed-XXXXXXXX.exe` trick
RustDesk при первом запуске парсит своё имя файла, если оно соответствует formату — применяет встроенный config. Требует утилиту шифрования config (rustdesk-utils 2.x от lejianwen-pro). Наш `rustdesk-utils` 1.1.14 этого не умеет — нужно скачать pro-версию отдельно или использовать веб-инструмент https://aps.lejianwen.com.
### Будущее — WinRM/SSH push для существующих машин
Уже есть NetBird-подключение к большинству Windows-клиентов (Volkkent, Glavtorg, ММФБ, Зеленоград). Можно через `Invoke-Command` или `pywinrm` развернуть скрипт удалённо без участия пользователя.
## Безопасность
- **Public link на скачивание лучше с паролем** — в установщике зашит `key=R0lA...`, кто угодно скачавший может зарегистрировать себя как peer на нашем сервере. MUST_LOGIN отбивает подключения, но heartbeat-флуд возможен.
- **Permanent password** случайный per-машина, в файле с chmod 600
- **`MUST_LOGIN=Y` на сервере** — каждый peer должен залогиниться в API после установки. Скрипт этого пока **не делает** — клиент должен залогиниться вручную в RustDesk UI (Settings → Account) или через web `/_admin/`. Автоматизация login через скрипт = отдельная задача (нужен service-token / OIDC).
## Известные ограничения
- **Windows ARM64** — не поддерживается RustDesk 1.4.6 (нет нативного installer'а). Используется x86_64 в эмуляции.
- **Android** — apk без auto-config; пользователь вручную вводит ID/relay/api/key. Автоматизация для Android = другая задача (Intent URL scheme или MDM push).
- **iOS** — RustDesk через App Store, конфиг через QR-код или Universal Link. Не покрыто текущим пакетом.
- **macOS** — без auto-permanent-password (sandboxing CLI ограничен). Пользователь делает через UI.
- **`MUST_LOGIN` post-install** — после установки клиент вынуждены вручную залогиниться. Без login peer виден как online в hbbs, но connections к нему отбрасываются.
## TODO / следующие шаги
- [ ] Олег создаёт public share-link в Nextcloud (с паролем), кладёт ссылку в `snippets/clients/`
- [ ] Подготовить **one-liner-скрипты** на сервере (NPM static path `/install/` → S3 или rustdesk-api resources/public)
- [ ] **Configuration Strategy** в админке lejianwen-api — push config existing peers
- [ ] Скачать `rustdesk-utils` 2.x (lejianwen-pro) для генерации `rustdesk-licensed-*.exe` — single-file deployment без скриптов
- [ ] **Auto-login через скрипт** — создать service-юзера в API с фиксированным password, скрипт логинится этим юзером во время install. После установки админ через `/_admin/` переносит peer в нужную группу.
- [ ] **WinRM bulk-deploy** — список существующих NetBird-managed Windows-машин + Ansible/PowerShell job по разворачиванию
## Связанные файлы
- [[projects/dttb/rustdesk]] — справочник по серверу
- [[../decisions/2026-04-28-rustdesk-lejianwen-pro-migration]] — миграция с OSS на pro
- В Nextcloud: `RustDesk install/` (этот пакет)
- На LXC 116: `/root/RustDesk2.toml` (шаблон)
- На LXC 116: `/root/rustdesk-backup-20260428-1134/admin-password.txt` (admin pw для api)

View File

@@ -0,0 +1,56 @@
---
date: 2026-04-30
type: decision
tags: [decision, niikn, network, dns, podkop]
---
# 2026-04-30: Открыть culture.gov.ru из НИИКН (DNS override)
## Проблема
Сотрудники НИИКН — не открывается `https://culture.gov.ru/` (Минкультуры РФ).
## Диагноз
По алгоритму [[../projects/niikn/govru-quickfix-playbook]]:
| Точка | HTTP | Real IP |
|-------|------|---------|
| Mac (Ростелеком Истра) | 200 | 194.190.9.31 |
| pve-niikn vmbr0 (МТС B2B) | 200 | 194.190.9.31 |
| OpenWrt 192.168.1.50 nslookup → sing-box (127.0.0.42) | — | **198.18.0.96 (FakeIP)** |
| OpenWrt curl через AWG | 000 | (Минкульт блочит зарубежные IP) |
МТС B2B не блочит, сайт живой. **Причина**`culture.gov.ru` подпадает под podkop community-list, DNS подменяется FakeIP, трафик уходит в awg0 Финляндию, оттуда Минкульт даёт Forbidden/timeout. Тот же паттерн, что `zakupki.gov.ru` и `sev.gov.ru`.
## Решение
OpenWrt `192.168.1.50` — добавлен домен в dnsmasq `server=`:
```bash
ssh root@192.168.1.50
uci add_list dhcp.@dnsmasq[0].server='/culture.gov.ru/8.8.8.8'
uci commit dhcp
/etc/init.d/dnsmasq restart
```
NetBird route **НЕ требуется**.
## Проверка
```
DNS 192.168.1.50: culture.gov.ru → 194.190.9.31, 194.190.9.32
pve-niikn curl: HTTP 200, 74 ms через МТС WAN
```
Клиентам НИИКН — `ipconfig /flushdns` для сброса кэша FakeIP.
## Текущий список dnsmasq override на 192.168.1.50
```
'127.0.0.42' # podkop sing-box
'/nspd.gov.ru/8.8.8.8' # + NetBird route 2.63.246.0/24
'/zakupki.gov.ru/8.8.8.8' # только DNS
'/sev.gov.ru/8.8.8.8' # только DNS
'/culture.gov.ru/8.8.8.8' # только DNS — добавлено сегодня
```

View File

@@ -0,0 +1,80 @@
---
date: 2026-04-30
type: decision
tags: [dttb, openwrt, adguard, podkop, dns, youtube-adblock]
hosts: [10.0.0.1]
---
# OpenWrt HomeLab (10.0.0.1): AdGuard Home в DNS-цепочке, фильтры YouTube
## Контекст
На роутере 10.0.0.1 (OpenWrt 24.10.3, Mediatek Filogic) установлен `adguardhome 0.107.57-r1`, но трафик клиентов LAN его **обходил**. dnsmasq форвардил `127.0.0.42` (sing-box подкопа), AGH слушал `127.0.0.1:5353` без клиентов. user_rules в yaml были повреждены (куски Python-листа с залипшими кавычками). Цель — реальная блокировка рекламы для всей сети, в т.ч. максимум возможного для YouTube.
## Решение — гибридная схема
```
LAN client → dnsmasq:53 → AGH:5353 → sing-box:127.0.0.42 → upstream
```
AGH ставится между dnsmasq и sing-box: блокирует ad-домены до sing-box, а sing-box продолжает делать fakeip и роутить подкоп-домены. Это отличается от двух канонических схем `podkop.net/docs/adguard/` (Схема 1: AGH на 127.0.0.10:53 как upstream подкопа; Схема 2: AGH перед подкопом для клиентов), но проще и сохраняет всю существующую логику подкопа.
## Изменения
### `/etc/adguardhome.yaml`
- `dns.upstream_dns``127.0.0.42` (sing-box, единственный)
- Добавлены фильтры:
- `HaGeZi Pro mini` — https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.mini.txt
- `BlocklistProject YouTube` — https://blocklistproject.github.io/Lists/youtube.txt
- `GoodbyeAds YouTube AdBlock` — https://raw.githubusercontent.com/jerryn70/GoodbyeAds/master/Hosts/GoodbyeAds-YouTube-AdBlock.txt
- `user_rules` очищены от мусора, оставлены работающие правила: `googlesyndication.com`, `doubleclick.net`, `youtube.com/{api/stats/watchtime,ptracking,pagead,ads,get_midroll}*`, `googlevideo.com/get_video_info*`, `pagead2.googlesyndication.com`, `static.doubleclick.net`, `stats.g.doubleclick.net`, `googleads.g.doubleclick.net`, `ads.yandex.ru`, `mc.yandex.ru`, `metrika.yandex.ru`, `yandex.ru/ads`, `*.yandex.ru/ads`, `dzen.ru/ads`, `ads.vk.com`, `vk.com/ads`, `top-fwz1.mail.ru`, `adfox.ru`
### UCI
```
uci set podkop.settings.dont_touch_dhcp='1' # подкоп больше не переписывает dhcp
uci -q delete dhcp.@dnsmasq[0].server
uci add_list dhcp.@dnsmasq[0].server='127.0.0.1#5353'
uci commit podkop && uci commit dhcp
/etc/init.d/adguardhome restart
/etc/init.d/dnsmasq restart
```
### Бэкапы (на роутере)
- `/etc/adguardhome.yaml.bak.20260430_001129`
- `/etc/config/dhcp.bak.20260430_001129`
## Верификация
| Запрос на `10.0.0.1` | Ответ | Проверяет |
|---|---|---|
| `doubleclick.net` | `0.0.0.0` | AGH режет ad-домен |
| `pagead2.googlesyndication.com` | `0.0.0.0` | YouTube ad-эндпоинт |
| `wikipedia.org` | `185.15.59.224` | обычный сайт работает |
| `youtube.com` | `198.18.1.77` | fakeip подкопа цел |
## Граничные случаи / что НЕ блокируется
DNS-блокировка убирает рекламную **телеметрию, баннеры, midroll-API** YouTube. **In-stream-ролики** в самих видео сидят на `*.googlevideo.com` (CDN видео) — DNS их разделить не может. Полная блокировка — только клиентом: uBlock Origin (Firefox/Chrome), SponsorBlock, ReVanced/NewPipe (Android), FreeTube (desktop).
## Откат
```bash
ssh root@10.0.0.1 "cp /etc/adguardhome.yaml.bak.20260430_001129 /etc/adguardhome.yaml \
&& cp /etc/config/dhcp.bak.20260430_001129 /etc/config/dhcp \
&& uci set podkop.settings.dont_touch_dhcp=0 && uci commit podkop \
&& /etc/init.d/adguardhome restart && /etc/init.d/dnsmasq restart"
```
## Запомнить (грабли)
- `127.0.0.42` и `127.0.0.53` — зарезервированы подкопом и системой, не использовать как listen для других сервисов (`podkop.net/docs/adguard/`).
- При `dont_touch_dhcp=0` подкоп при каждом start переписывает `dhcp.@dnsmasq[0].server` на `127.0.0.42`, кладя предыдущее в `podkop_server`. Любая ручная замена upstream без `dont_touch_dhcp=1` не переживёт перезапуск.
- AGH-веб: http://10.0.0.1:3000 (admin / хеш в yaml).
- SSH `root@10.0.0.1` с `1qaz!QAZ` **работает** — старая запись в `projects/dttb/openwrt-router.md` про "SSH не работает" устарела.
## Ссылки
- [[../projects/dttb/openwrt-router]] — карточка роутера
- [[2026-04-17-peredelki-podkop-stability-fix]] — справка по подкопу (схемы AGH, fakeip 198.18.0.0/15)
- https://podkop.net/docs/adguard/
- https://podkop.net/docs/dont-touch-my-dhcp/

View File

@@ -0,0 +1,192 @@
---
date: 2026-04-30
type: audit
tags: [rustdesk, security, audit, hardening]
---
# RustDesk pre-production audit + fixes
## Контекст
Перед запуском RustDesk-сервера в продакшн (для удалённого доступа клиентских организаций + личного использования) — системный аудит security, reliability, operations. Findings + примененные fixes.
## Findings & fixes
### 🔴 Critical (исправлено)
#### 1. Права на критичные файлы 644 → 600/640
**Что было:** все sensitive файлы на LXC 116 были world-readable (`-rw-r--r--`):
- `/var/lib/rustdesk-server/id_ed25519` (**приватный ключ сервера**)
- `/var/lib/rustdesk-server/id_ed25519.pub`
- `/var/lib/rustdesk-server/db_v2.sqlite3*` (hbbs БД с peers UUID)
- `/var/lib/rustdesk-api/data/rustdeskapi.db` (хеши паролей юзеров, токены сессий)
- `/var/lib/rustdesk-api/conf/config.yaml` (содержит **JWT secret** и `key`)
**Риск:** при компрометации любого non-root юзера на LXC 116 → leak приватного ключа сервера → весь парк клиентов перестаёт быть приватным; возможность подделки JWT и login as admin.
**Fix (2026-04-30):**
```bash
chmod 600 /var/lib/rustdesk-server/id_ed25519*
chmod 640 /var/lib/rustdesk-server/db_v2.sqlite3*
chmod 640 /var/lib/rustdesk-api/data/rustdeskapi.db
chmod 640 /var/lib/rustdesk-api/conf/config.yaml
```
#### 2. Нет logrotate для rustdesk-логов на 2GB-диске
**Что было:** `/var/log/rustdesk-server/hbbs.log` ~260KB и rosт каждый день. На 2GB-диске LXC 116 (где уже 55% used) логи зальют диск за пару месяцев → сервер ляжет.
**Fix (2026-04-30):** `/etc/logrotate.d/rustdesk`:
```
/var/log/rustdesk-server/*.log /var/log/rustdesk-server/*.error
/var/log/rustdesk-api/*.log /var/log/rustdesk-api/*.error {
daily
rotate 14
compress
delaycompress
notifempty
missingok
copytruncate
su root root
}
```
#### 3. Нет авто-бэкапа БД и ключей
**Что было:** одна вручную сделанная копия `/root/rustdesk-backup-20260428-1134/`. Если завтра LVM упадёт — теряем весь стейт (peers, users, ключи).
**Fix (2026-04-30):** cron daily 03:00 → `/usr/local/bin/rustdesk-backup.sh`:
- tar.gz в `/root/rustdesk-backups/rustdesk-YYYYMMDD.tar.gz`
- ключи + обе БД + config.yaml + systemd overrides
- retention 30 дней (find -mtime +30 -delete)
- chmod 600 на каждый tarball
**TODO:** доставить копии бэкапа на ArtLeon (off-site) через NetBird/rsync.
### 🟡 Medium (исправлено)
#### 4. Нет rate-limit на login → brute-force admin password
**Что было:** `https://remot.dttb.ru/api/admin/login` принимал безlimit запросы. С учётом стандартного pw `1qaz!QAZ` — кто-то с словарём найдёт его за час.
**Fix (2026-04-30):** в NPM `/data/compose/2/data/nginx/custom/http.conf`:
```nginx
limit_req_zone $binary_remote_addr zone=adminlogin:10m rate=5r/m;
limit_req_zone $binary_remote_addr zone=apilogin:10m rate=10r/m;
```
В Proxy Host 14 advanced_config:
```nginx
location = /api/admin/login {
limit_req zone=adminlogin burst=3 nodelay;
proxy_pass http://10.0.0.244:21114;
...
}
location = /api/login {
limit_req zone=apilogin burst=5 nodelay;
proxy_pass http://10.0.0.244:21114;
...
}
```
**Verified:** после 4 быстрых попыток — 503 от NPM. На уровне rustdesk-api также `ban-threshold: 5` забанит user-account на ~1 час.
**Грабли при настройке:** `limit_req_zone` нельзя класть в `server`-контекст — только `http`. Первая попытка положить в advanced_config привела к удалению NPM proxy_host/14.conf и обвалу `remot.dttb.ru`. Восстановилось через disable/enable + переноса zone в http.conf.
### 🟡 Medium (отложено)
#### 5. NC public-link без пароля + содержит RustDesk2.toml с key
**Что было:** `https://dttb.ru/s/wPm8oaiFEyz7Ywx` без пароля и без expiration. ZIP внутри содержит `key=R0lA4r77...`. Любой нашедший ссылку может зарегистрировать peer'а на нашем сервере.
**Status:** **Nextcloud-AIO сейчас лежит** (502 from NPM upstream), новую share создать не получается. Спавнен отдельный task на восстановление NC. После — пересоздать share с паролем + 30 дней expiration.
**Митigation в текущем виде:** `MUST_LOGIN=Y` отбивает входящие connections к незалогиненным peers. Кто-то регистрируется как peer — heartbeat-флуд возможен, но connections не пройдут.
#### 6. Security headers не наследуются в location /
**Что было:** HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy не появляются в response от `https://remot.dttb.ru/_admin/`.
**Корневая причина:** NPM в template для Proxy Host генерит `location /` со встроенным `add_header X-Served-By` (через include `proxy.conf`). По правилу nginx — если в location есть **хоть один** add_header, наследование от server-block отключается. Мои `add_header` в advanced_config (server-level) не применяются к location /.
**Fix-варианты (выбран wait):**
- (a) Patch NPM template `/etc/nginx/conf.d/include/proxy.conf` чтобы добавить headers — теряется при container recreate
- (b) Использовать `more_set_headers` (модуль ngx_headers_more) — нужно проверить что он есть в openresty
- (c) Override `location /` в advanced_config с явными add_header — конфликт с NPM-сгенерированным location /
- (d) **Принять как cosmetic** — TLS 1.2/1.3 + LE cert + rate-limit обеспечивают основную защиту; HSTS на server-level записан в nginx.conf (не на response).
**Status:** **отложено** как cosmetic. Если будем делать (b) или (a) — отдельной задачей.
### 🟢 Low / Informational
| Item | Status |
|---|---|
| Server header раскрывает `openresty` | Accept (мелкий fingerprinting, не критично) |
| `show-swagger: 1` в API | Accept (Олег использует для разработки) |
| TLS 1.2 + 1.3, intermediate ciphers | ✅ optimal |
| LE cert valid until 28 June 2026 | ✅ auto-renew |
| Block Common Exploits (NPM) | ✅ enabled на host 14 |
| `block_exploits: true`, `caching_enabled: false` | ✅ verified |
| `register: false` в API | ✅ закрытая система |
| `ban-threshold: 5`, `captcha-threshold: 3` | ✅ enabled |
| `MUST_LOGIN=Y` | ✅ enforced (видно в hbbs.log) |
| RustDesk peers версии | 1.4.6 (latest stable) |
| Disk LXC 116 free | 826 MB / 2 GB (55% used) — monitoring |
| RAM LXC 116 used | 105M / 512M — большой запас |
| NPM compose ports 21115-21119 | ✅ exposed после 2026-04-29 update |
## Что осталось сделать (production todo)
### Перед массовым deploy
- [ ] Восстановить Nextcloud (отдельный task)
- [ ] Создать share-link с паролем + expiration после восстановления NC
- [ ] Создать минимум 2 группы в `/_admin/` (например `НИИКН`, `Клиенты-Internal`)
- [ ] Настроить **Configuration Strategy** в админке lejianwen — push настроек существующим клиентам автоматически
- [ ] Off-site бэкап `/root/rustdesk-backups/*.tar.gz` на ArtLeon через rsync over NetBird (cron weekly)
### Полезное (не блокирует prod)
- [ ] `more_set_headers` фикс security headers
- [ ] fail2ban на NPM access logs (поверх rate-limit) — extra слой против distributed brute-force
- [ ] Monitoring: alert на падение rustdesk сервиса (через watchyourlan/zabbix/uptime-kuma)
- [ ] Auto-login клиента в API через service-token (упрощает onboarding)
- [ ] `rustdesk-utils` 2.x для single-file `rustdesk-licensed-*.exe` deployment
### Долгосрочное
- [ ] Через 1-2 месяца — миграция в Docker `lejianwen/rustdesk-server-s6` (Вариант A3)
- [ ] HA-схема на втором экземпляре (НИИКН Proxmox) с общей MySQL
- [ ] MCP-обёртка поверх Swagger API для управления из Claude Code
## Верификация
```bash
# Permissions OK
ssh root@10.0.0.250 "pct exec 116 -- ls -la /var/lib/rustdesk-server/id_ed25519"
# → -rw------- 1 root root 88 Oct 10 2025
# Logrotate OK
ssh root@10.0.0.250 "pct exec 116 -- logrotate -d /etc/logrotate.d/rustdesk"
# → "considering log /var/log/rustdesk-..."
# Auto-backup ran
ssh root@10.0.0.250 "pct exec 116 -- ls -la /root/rustdesk-backups/"
# → rustdesk-20260430.tar.gz
# Rate-limit работает
for i in {1..6}; do
curl -ks -o /dev/null -w "%{http_code} " -X POST https://remot.dttb.ru/api/admin/login \
-H "Content-Type: application/json" -d '{"username":"x","password":"y"}'
done
# → 200 200 200 200 503 503
# Сервер отвечает
curl -ksI https://remot.dttb.ru/_admin/ | head -1
# → HTTP/2 200
```
## Связанные
- [[../projects/dttb/rustdesk-runbook]] — операционный runbook (создан этим audit'ом)
- [[2026-04-28-rustdesk-lejianwen-pro-migration]] — миграция с OSS
- [[2026-04-29-rustdesk-client-deployment-package]] — пакет установки клиентов
- [[../projects/dttb/rustdesk]] — справочник

View File

@@ -0,0 +1,151 @@
---
date: 2026-05-02
type: decision
tags: [decision, apple-id, tajikistan, proxy, residential]
---
# 2026-05-02: Apple ID TJ через residential proxy (без VPS, без резидентства)
## Проблема
Нужен Apple ID с регионом **Таджикистан** (для AppStore TJ — там разрешены AmneziaVPN, Happ и другие приложения, заблокированные в RU AppStore).
Прямые пути не работают:
- **TJ-VPS** требуют KYC + резидента (паспорт TJ + ИНН). Все локальные провайдеры (Babilon-T, GlobexCamHost, Navicosoft, Hoster.tj, Serversinasia) отказывают нерезидентам, даже за крипту.
- **Международные хостеры** с TJ-нодой — Evoxt анонсировал, но `/locations` 404; реально TJ-локации почти нет ни у кого крупного.
- **Своя SIM в TJ** — требует физического присутствия (у Олега виза есть, но ехать ради Apple ID не вариант).
## Анализ
Apple проверяет регион по **GeoIP исходящего соединения** в момент регистрации. После создания Apple ID привязан к региону постоянно — IP больше не нужен. То есть VPS избыточен — нужен **TJ-IP на 1 час разово**.
### Сравнение proxy-провайдеров с TJ
| Провайдер | TJ IPs | Типы | Цена | Особенность |
|---|---|---|---|---|
| **IPRoyal** | 285 617 | residential, mobile 4G/3G | mobile от $10/день, residential ~$7/GB | Самый большой пул, надёжный |
| **Litport** | 38 656 | residential, mobile 3G/4G/5G, ISP, datacenter | по запросу | Полный набор, в т.ч. ISP |
| **Soax** | 10 800 | residential, mobile 4G/5G | от $2/GB на больших планах, trial $1.99/400MB/3 дня | Чистые IP, дешёвый trial |
| **BrightData** | премиум | residential, mobile, ISP, datacenter | дорого | Стандарт индустрии |
| **LumiProxy** | н/д | residential, mobile, ISP, datacenter | по запросу | 4G/LTE TJ |
| **Databay** | н/д | mobile 4G/5G | по запросу | Carrier-level targeting |
## Решение
Связка **IPRoyal Royal Residential pay-as-you-go + grizzlysms TJ-номер**.
Soax исключён — сайт плохо работает из RU (ISP DPI / Cloudflare anti-bot), trial не получить без VPN.
IPRoyal стабильно открывается из RU, сайт не блочат, оплата картой/PayPal/криптой.
### Шаги
1. **Купить TJ SMS-номер** на [grizzlysms.com](https://grizzlysms.com) (~$0.43, сервис Apple).
2. **Купить IPRoyal Royal Residential** [iproyal.com](https://iproyal.com) → Pay as you go, минимум **$7 за 1 GB** (хватит на 5+ регистраций):
- Sign Up → Products → Royal Residential Proxies → Pay as you go
- Оплата: Wise/foreign Mastercard / PayPal / **Crypto BTC/ETH/USDT** (крипта без KYC)
3. **Получить базовые credentials** в Dashboard → Royal Residential → Proxy List (host/port/user/pass).
- В UI устанавливать Country/Sticky **не нужно** — параметры передаются через password-модификаторы (см. шаг 4).
4. **Сформировать endpoint с TJ + sticky** через password-модификаторы IPRoyal:
```
host: geo.iproyal.com
port: 12321
user: <BASE_USER>
pass: <BASE_PASS>_country-tj_session-<любая-метка>_lifetime-30m
```
Важно: `country-tj` (lowercase ISO), не `country-Tajikistan` (последнее не работает, возвращает пустоту).
5. **Проверить IP**:
```bash
curl -x "http://USER:PASS_country-tj_session-test01_lifetime-30m@geo.iproyal.com:12321" https://ipinfo.io
```
Подтверждено 2026-05-03: вернулся `185.177.2.130`, Dushanbe, country `TJ`, ASN `AS51346 Tojiktelecom`, timezone `Asia/Dushanbe`. Apple примет такой IP.
6. **Зарегистрировать Apple ID** на [appleid.apple.com](https://appleid.apple.com):
- страна: Tajikistan
- адрес: любой реальный из Душанбе (Google Maps → жилой дом)
- телефон: TJ-номер из шага 1, SMS-код принять в grizzlysms
- **способ оплаты: «Нет / None»** (опция доступна только при регистрации через веб с TJ-IP)
7. **Войти на iPhone** с этим Apple ID. После первой авторизации IP-проверка отпадает — proxy можно отключить.
### Бюджет
~$8 разово (TJ SMS $0.43 + IPRoyal 1 GB $7 + резерв). 1 GB трафика хватает на 5-10 регистраций Apple ID.
## Подводные камни
- **Datacenter proxy не подходит** — Apple использует MaxMind + собственные блок-листы DC ASN. Только residential или mobile.
- **Регистрировать с того же IP, с которого первый раз залогинишься** — иначе риск flagging аккаунта.
- **Не входить с RU-IP в первые 24 часа** — Apple может заблокировать "fraud detection". Использовать NetBird exit-node Finland (Trance group) до первого входа на iPhone.
- **TJ-карту привязывать не нужно** — для бесплатных приложений (AmneziaVPN, Happ, Telegram alts) оплата не требуется. Если потребуется — Wise multi-currency или PayPal.
### TJ-IP сам по себе НЕДОСТАТОЧЕН
Apple палит «русского пользователя» по нескольким сигналам одновременно. Подтверждено 2026-05-03:
- **Accept-Language** — Firefox по умолчанию шлёт `ru-RU`. Apple читает → показывает «Россия» внизу страницы → отказывается слать SMS на TJ-номера. Лечится `about:config` → `intl.accept_languages` = `tg-TJ, tg, en-US, en`.
- **Cookies от прошлых посещений apple.com** — даже на новом профиле могут протекать через sync. Лечится приватным окном (Cmd+Shift+P).
- **WebRTC** — обязательно `media.peerconnection.enabled = false` + `media.peerconnection.ice.default_address_only = true`.
- **Country/Region в форме регистрации** — нужно **вручную выбрать Tajikistan**, Apple по умолчанию ставит US.
- **Footer страницы apple.com** — должно быть «Tajikistan», не «Россия»/«United States». Это критическая проверка ДО заполнения формы.
- **@icloud.com нельзя на этапе регистрации** — Apple даёт его только ПОСЛЕ создания Apple ID, в iCloud settings. Используй внешний email (proton.me лучший выбор).
### SMS-блок Apple
Grizzlysms TJ-pool **полностью забанен** Apple на текущий момент (2026-05-03): любой номер оттуда даёт «Verification codes cannot be sent to this phone number at this time», даже после успешного Country=Tajikistan + footer=Tajikistan. После 2-3 неудачных попыток Apple ставит soft-cooldown 1-2 часа на IP-сессию.
**Альтернативные SMS-сервисы для TJ Apple:**
- **5sim.net** — другой пул, проверять первым
- **sms-activate.io** — большой пул, но Apple часть знает
- **smshub.org** — премиум, реже банят
**Формат корректного TJ-номера:** `+992 9X XXX XXXX` (мобильный, операторы 90/91/92/93/95/98). Префиксы 4X/7X/8X (фиксированные) Apple не принимает.
## Альтернативы (если Soax trial не подойдёт)
- **IPRoyal pay-as-you-go** residential — без trial, но pay-as-you-go от $7/GB.
- **Litport mobile** — настоящие 4G IPs местных операторов TJ (Babilon-Mobile AS204106, TT Mobile AS43197, Tacom/Beeline AS34557).
## Альтернативный путь: покупка US Adidas-аккаунта + смена региона на TJ
Когда самостоятельная регистрация через virtual SMS не идёт (Apple блочит весь grizzlysms TJ-pool), можно купить готовый US Adidas Apple ID за 100-300 ₽ и сменить регион на TJ.
**Когда подходит:** платёжная стратегия "карта на нуле, пополнение перед покупкой" — потеря аккаунта не критична.
**Workflow:**
1. Покупка US Apple ID (массовые "Adidas" аккаунты, без payment method, 2FA через trusted devices, не SMS).
2. Проверка жизнеспособности на appleid.apple.com — не должно быть pending verification.
3. **Очистка следов продавца в правильном порядке:** смена пароля → удаление recovery contacts → удаление recovery key → удаление чужих trusted devices → смена recovery email на свой → перевыбор security questions.
4. **Пауза 24-48 часов** — проверять что продавец не пытается восстановить через forgot password.
5. **Смена региона US → TJ через Firefox с TJ-proxy** — Personal Information → Country/Region → Tajikistan → Payment Method: None.
6. На iPhone: **Настройки → текущий Apple ID → Медиа и покупки → Sign Out** (только App Store, НЕ iCloud) → войти под новым TJ-аккаунтом.
7. Когда появится TJ-карта — привязка через Payment & Shipping (на ненулевом балансе для $1 hold).
**Риски:**
- Продавец сохраняет recovery key/devices/email — может вернуть. Очистка в шаге 3 минимизирует, но не на 100%.
- Apple anti-fraud может flagнуть смену региона US → TJ + TJ residential proxy + новая карта в первый месяц — до бана аккаунта. Поэтому **не привязывать критичную TJ-карту в первый месяц**.
- Adidas-пакеты массовые → Apple периодически их банит за нарушение TOS (создание сериями).
**Когда НЕ подходит:** долгосрочное хранение Apple Cash, привязка карт с большим балансом, использование как primary iCloud (там этот US Apple ID лучше не использовать вообще, только App Store).
## Статус на 2026-05-06
**Прогресс:**
- ✅ IPRoyal Royal Residential куплен (1 GB pay-as-you-go), TJ residential подтверждён рабочим (см. [[../snippets/iproyal-gost-relay]])
- ✅ Локальный gost-relay отлажен (порт 9999 для TJ, 9998 для FI), FoxyProxy multi-port
- ✅ Firefox настроен: `intl.accept_languages = tg-TJ`, WebRTC отключён, приватное окно
- ✅ Apple footer показывает «Tajikistan» при правильной комбинации IP + locale + cookies-чистка
- ✅ US Adidas-аккаунт куплен (`hbuggle819@icloud.com`), 2FA через trusted devices, карта привязана
- ⚠️ **Сложности с virtual SMS** — grizzlysms TJ-pool забанен Apple, требуются альтернативы (5sim, smsbower) или реальная TJ SIM
- ⚠️ **Митинский радиорынок «высох»** (2026-05-04 проверено лично): продажа TJ-SIM мигрантам сократилась после ужесточения ФЗ-178. Альтернативные источники: Avito с доставкой (1500-3500 ₽), Telegram-каналы, знакомые в TJ
- 🔴 **Регион US Adidas пока не менялся на TJ** — ждём реальную TJ-SIM либо premium DID. Аккаунт пока используется только для скачивания приложений.
**Текущий план:**
1. Найти реальную TJ SIM-карту (Avito / Telegram / знакомые)
2. После получения SIM — менять регион Adidas-аккаунта на TJ через TJ-IP (gost), привязка к новой TJ-карте
3. До этого момента — US Adidas-аккаунт используется только в App Store на iPhone для скачивания заблокированных в RU приложений (по схеме [[../snippets/apple-id-us-on-russia]])
**Параллельная находка:** Google гораздо строже Apple к virtual SMS — на TJ-IP при регистрации нового @gmail сразу требует QR-верификацию через trusted device. Web-регистрация Google под TJ через grizzlysms — путь в тупик, требует Android-эмулятор или готовый купленный аккаунт.
## Связанные
- [[../README]] — индекс vault
- TODO в MEMORY был «отложено с 2026-04-23», теперь активирован.
- Решение по `snippets/clients/` для US Apple ID на RU iPhone — структурно тот же подход (proxy + foreign SMS).

View File

@@ -0,0 +1,136 @@
---
date: 2026-05-04
type: decision
status: рабочее
tags: [decision, niikn, mmfb, network, netbird, nspd, fix]
---
# 2026-05-04: NSPD из НИИКН — финальная схема через NetBird → pve-LionART
## Контекст
После отката WG-туннеля 2026-04-20 (общее замедление трафика) NSPD-bypass был на стороне NetBird Networks. Сегодня клиенты НИИКН пожаловались "не работает даже через NetBird и другие сайты тоже".
## Что нашёл
1. **Сетевая часть исправна** — netbird route `nspd-bypass` (2.63.246.0/24) активен, трейс `pve-niikn → 100.70.128.49 (pve-lionart) → 10.253.1.1 (MikroTik LionART)` работает. С `pve-niikn` `curl -k https://nspd.gov.ru/` отдаёт `HTTP:200`.
2. **Цепочка для клиентов разорвана в трёх местах:**
- OpenWrt 192.168.1.50: пропал `dnsmasq override` для `nspd.gov.ru` → podkop ловит в FakeIP `198.18.x.x` → AWG → Финляндия → блок (НСПД режет foreign IP).
- MikroTik 192.168.1.1: нет static route `2.63.246.0/24 → 192.168.1.201` (pve-niikn) → пакеты идут в default WAN → MTS WAF блок.
- pve-niikn: нет SNAT/MASQUERADE для `192.168.1.0/24 → wt0` → пакеты приходили на pve-lionart с приватным src → asymmetric routing.
3. **TLS-сертификат** NSPD выпущен `Russian Trusted Sub CA` (Минцифра, valid from 2026-01-23). Chrome/Edge без ru-trust → `ERR_CERT_AUTHORITY_INVALID`. Yandex Browser работает нативно. Попутный артефакт: `curl` из OpenWrt 24.10 на mbedTLS не парсит ASN.1 этого cert (`X509 - The name tag or value is invalid`) — но это не проблема пользователей.
## Применённый фикс
### 1. OpenWrt (192.168.1.50) — DNS-override
```bash
ssh root@192.168.1.50 # 1qaz!QAZ
uci add_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/77.88.8.8'
uci add_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/8.8.8.8'
uci commit dhcp
/etc/init.d/dnsmasq restart
rm -f /tmp/sing-box/cache.db
/etc/init.d/sing-box restart
```
Проверка: `nslookup nspd.gov.ru 127.0.0.1``2.63.246.x` (НЕ 198.18.x.x).
### 2. MikroTik НИИКН (192.168.1.1) — static route
```
/ip/route/add dst-address=2.63.246.0/24 gateway=192.168.1.201 \
comment="NSPD via NetBird->LionART"
```
### 3. pve-niikn (192.168.1.201 / 100.70.120.229) — SNAT на wt0
```bash
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wt0 \
-m comment --comment 'nspd-bypass-via-lionart' -j MASQUERADE
```
Persist через systemd unit `/etc/systemd/system/iptables-nspd-restore.service` (idempotent: `iptables -C ... || iptables -A ...`).
## Подтверждение работы
```
# tcpdump на vmbr0 при curl с OpenWrt → nspd.gov.ru:443
192.168.1.50 > 2.63.246.73:443 Flags [S] ← клиент
2.63.246.73:443 > 192.168.1.50 Flags [S.] ← НСПД отвечает!
192.168.1.50 > 2.63.246.73:443 Flags [P.] len 276 ← TLS ClientHello
2.63.246.73:443 > 192.168.1.50 Flags [.] len 1228 ← TLS ServerHello+Cert
... full data flow ...
```
## Что нужно от пользователей
- **Yandex Browser** — открывают `nspd.gov.ru` сразу (встроенно доверяет Минцифре).
- **Chrome/Edge/Firefox** — установить ru-trust сертификаты с https://www.gosuslugi.ru/crt:
- `russian_trusted_root_ca.cer` → Trusted Root Certification Authorities
- `russian_trusted_sub_ca.cer` → Intermediate Certification Authorities
PowerShell от админа (через RustDesk):
```powershell
$tmp=$env:TEMP
iwr https://gu-st.ru/content/Other/doc/russian_trusted_root_ca.cer -OutFile $tmp\r.cer
iwr https://gu-st.ru/content/Other/doc/russian_trusted_sub_ca.cer -OutFile $tmp\s.cer
Import-Certificate -FilePath $tmp\r.cer -CertStoreLocation Cert:\LocalMachine\Root
Import-Certificate -FilePath $tmp\s.cer -CertStoreLocation Cert:\LocalMachine\CA
```
## Распространение на другие гос-сайты
Тот же ru-trust cert у `culture.gov.ru`, `gosuslugi.ru`, `rosreestr.gov.ru` (последний ещё блокирует MTS-IP отдельно — нужен такой же bypass через LionART).
### 2026-05-04 — добавлены zakupki и telemost
Аналогичная схема (без TLS-cert проблем — `zakupki.gov.ru` имеет GlobalSign cert, `telemost.yandex.ru` тоже стандартный).
NetBird Routes API (`POST /api/routes`):
- `zakupki-bypass` → `95.167.245.0/24` (id `d7s61o2fadhs73bjk520`) → peer `cuisnd3l0ubs73bsbbl0` (pve-lionart)
- `telemost-bypass` → `87.250.251.0/24` (id `d7s61oafadhs73bjk750`) → тот же peer
MikroTik НИИКН:
```
/ip/route/add dst-address=95.167.245.0/24 gateway=192.168.1.201 comment="zakupki via NetBird->LionART"
/ip/route/add dst-address=87.250.251.0/24 gateway=192.168.1.201 comment="telemost via NetBird->LionART"
```
pve-niikn — добавлен **MSS clamping** для wt0 (NetBird MTU=1280, br-lan/vmbr0=1500 → большие TCP-ответы дропались):
```bash
iptables -t mangle -A FORWARD -o wt0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -t mangle -A FORWARD -i wt0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
```
Не забыть `iptables-save > /etc/iptables/rules.v4` для persist (или дополнить `iptables-nspd-restore.service`).
Известный артефакт: `lk.zakupki.gov.ru` (`94.25.27.250`) даёт TLS handshake failure даже с LionART — у него mTLS / ГОСТ-крипто-провайдер требуется. Решается локально на клиенте (КриптоПро/JaCarta), не сетевыми средствами.
## Откат
```bash
# pve-niikn
systemctl disable --now iptables-nspd-restore.service
rm /etc/systemd/system/iptables-nspd-restore.service
iptables -t nat -D POSTROUTING -s 192.168.1.0/24 -o wt0 \
-m comment --comment 'nspd-bypass-via-lionart' -j MASQUERADE
# MikroTik НИИКН
/ip/route/remove [find comment="NSPD via NetBird->LionART"]
# OpenWrt
uci -q del_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/77.88.8.8'
uci -q del_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/8.8.8.8'
uci commit dhcp
/etc/init.d/dnsmasq restart
```
## Связанные
- [decisions/2026-04-20-niikn-nspd-bypass-via-lionart.md](2026-04-20-niikn-nspd-bypass-via-lionart.md) — предыдущая попытка через WG-туннель MikroTik↔MikroTik, откачено
- [projects/niikn/openwrt-bypass.md](../projects/niikn/openwrt-bypass.md) — раздел "Исключение доменов из проксирования"
- [decisions/2026-04-28-niikn-uookn-sev-gov-fakeip-fix.md](2026-04-28-niikn-uookn-sev-gov-fakeip-fix.md) — другие gov-сайты
## Теги
`#niikn` `#mmfb` `#lionart` `#netbird` `#nspd` `#mikrotik` `#openwrt` `#fix`

View File

@@ -0,0 +1,72 @@
# 2026-05-05 — Mac dictation: Hammerspoon + Groq Whisper
## Контекст
Олег на Intel MacBook Pro (i9-9880H, 2019), нужна голосовая диктовка для русского. Все современные приложения (superwhisper PRO, VoiceInk, Spokenly Parakeet) либо требуют Apple Silicon, либо платную PRO-лицензию ($150-250). Бесплатный free-tier у superwhisper исчерпан и валидируется на их сервере (см. [feedback_superwhisper_no_license](../../.claude/projects/-Users-ai-knowledge-base/memory/feedback_superwhisper_no_license.md)).
## Решение
Свой скрипт + Hammerspoon + Groq Whisper API:
- **Hammerspoon** ловит глобальный hotkey `⌘⇧D`
- **Bash скрипт** toggle-режим: первый запуск → ffmpeg запись с микрофона; второй → стоп → POST в Groq → текст в `/tmp/groq-dictate.last`
- **Lua callback** в Hammerspoon читает файл, кладёт в pasteboard, нажимает Cmd+V через `hs.eventtap.keyStroke`
- **Groq Whisper-large-v3-turbo** — бесплатно ~14400 запросов/день, 0.5с на 4-сек запись, RU IP не блочится
## Файлы
- `~/bin/groq-dictate.sh` — скрипт записи + Groq POST + **fallback на whisper-cpp** + write to `/tmp/groq-dictate.last`
- `~/bin/dictation-doctor.sh` — health-check всех компонентов (Hammerspoon / TCC / зависимости / Groq / mic / Fn-key); запускать когда «не работает»
- `~/.hammerspoon/init.lua` — Fn (одиночное нажатие) trigger через eventtap, paste через `hs.eventtap.keyStroke`
- `~/.cache/whisper-cpp/ggml-tiny-q5_1.bin` — 31MB локальная модель для offline fallback
- Groq API key — в `reference_groq_api.md` private memory
## Финальный hotkey
**Fn (Globe) одиночное нажатие** — toggle (старт/стоп). Срабатывает быстрее ⌘⇧D, освобождает руки. Apple Dictation на двойное Fn остаётся (если не отключить «Нажатие клавиши Fn» в System Settings → Keyboard).
## Критические грабли (и фиксы)
1. **Hammerspoon Accessibility кеширует статус** — после Enable в System Settings нужен **`killall Hammerspoon && open -a Hammerspoon`**, иначе Hammerspoon продолжает показывать WARNING и hotkey не работает.
2. **`hs.hotkey.bind({"cmd","shift"}, "d", ...)`** на русской раскладке выдаёт warning `key 'd' not found in active keymap; using ANSI-standard US keyboard layout as fallback, returning '2'`. Решение: **биндить по числовому keycode**`hs.hotkey.bind({"cmd","shift"}, 2, ...)` (2 = физическая клавиша D). Так работает на любой раскладке.
3. **`osascript -e 'tell application "System Events" to keystroke "v" using command down'`** на русской раскладке вместо Cmd+V вставляет UTF-8 байты текста как символы → получается мусор типа `—В—ь—А—∞—ь—В?` для строки «Ты меня слышишь?». Решение: **никогда не использовать `keystroke` для paste**. Использовать `hs.eventtap.keyStroke({"cmd"}, "v")` напрямую из Lua (отправляет настоящий low-level KeyDown event).
4. **Toggle через PID-файл**`/tmp/groq-dictate.pid`. Если процесс упал/убит — удалить руками. Скрипт устойчив: `kill -INT` корректно закрывает .wav, ждёт до 0.5с дописать заголовок.
5. **ffmpeg avfoundation `:0`** = default mic. Если нужен другой — `ffmpeg -f avfoundation -list_devices true -i ""`.
## Стоимость
- Hammerspoon бесплатный
- Groq бесплатный (14400 req/day, ~120 минут диктовки в день — намного больше нужного)
- Итого: 0₽
## Альтернативы которые НЕ подошли
- **superwhisper** — free tier 530 сек, потом сервер бракует
- **VoiceInk** — официально Apple Silicon only, на Intel CPU крутит большую модель часами
- **Spokenly** — `cdn.spokenly.app` блокирует RU IP (3.8 KB/s), Parakeet требует Neural Engine
- **Wispr Flow** — `dl.wisprflow.com` блокирует RU IP, плюс $144/год Pro для регулярного использования
- **MacWhisper** — $59 lifetime + не пробовали (всё уже работало бесплатно)
- **OpenWhispr** — 273MB dmg в GitHub, не докачался
## Связано
- [RU-заблокированные сервисы](../notes/ru-geoblocked-services.md)
- [Groq API](../../.claude/projects/-Users-ai-knowledge-base/memory/reference_groq_api.md)
- [Superwhisper — нет PRO](../../.claude/projects/-Users-ai-knowledge-base/memory/feedback_superwhisper_no_license.md)
## Воспроизведение на новом Mac
```bash
brew install --cask hammerspoon
brew install whisper-cpp jq ffmpeg
mkdir -p ~/bin ~/.hammerspoon ~/.cache/whisper-cpp
# скопировать ~/bin/groq-dictate.sh + ~/bin/dictation-doctor.sh → chmod +x
# скопировать ~/.hammerspoon/init.lua
# скачать локальную fallback-модель (31 MB, GitHub не блочит RU)
curl -sSL -o ~/.cache/whisper-cpp/ggml-tiny-q5_1.bin \
"https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny-q5_1.bin?download=true"
open -a Hammerspoon
# Hammerspoon Preferences → Enable Accessibility → System Settings → включить
killall Hammerspoon && open -a Hammerspoon # ОБЯЗАТЕЛЬНО после grant — кеш
# System Settings → Клавиатура → Нажатие клавиши Fn → "Действие не требуется"
~/bin/dictation-doctor.sh # должно быть всё зелёное
```
Готово. **Fn → говори → Fn** — текст вставится в активное окно.

View File

@@ -0,0 +1,101 @@
---
date: 2026-05-06
type: decision
tags: [kb, openclaw, search, fts, infra, summary]
status: applied
---
# Перестройка KB-поиска и синхронизации (8 фаз за один день)
## Что было до
Запрос «OpenWRT Липки» Максимке возвращал `netbird-inventory.md`, потому что:
- слова «Липки» во всём vault'е была одна строка в табличке инвентаря,
- слово «OpenWRT» статистически перевешивали НИИКН-документы (`govru-quickfix`, `niikn-openwrt-awg-fix`),
- кросс-ссылок и aliases не было, embeddings не было,
- лаг push→бот доходил до 16 минут (cron `*/5` Mac→Gitea + cron `*/15` Gitea→openclaw).
Пользователь жаловался: «бот путает, я ему про Липки, он мне про НИИКН».
## Что сделано
| Фаза | Эффект |
|---|---|
| 1. Embeddings (ollama+bge-m3) | ⛔ откачено — openclaw 2026.5.2 при `provider: ollama` шлёт inputs целиком, ollama тратит >5 мин/запрос, undici fetch валится по headers timeout. ollama на LXC 132 готова (uptime, bge-m3 1024d), но сторона openclaw нуждается в фиксе chunking |
| 2. Webhook + auto-reindex | Gitea push→listener (HMAC SHA-256)→`kb-pull.sh``openclaw memory index`. **push→FTS: 15 мин → 50 c**. См. [[../snippets/openclaw-kb-webhook]] и [[2026-05-06-openclaw-kb-webhook-deployment]] |
| 3. objects-map.json + _index.md | Скрипт `scripts/kb-objects-map.py` парсит netbird-inventory + frontmatter и пишет JSON для бота + human-readable [[../projects/_index]]. Базовый структурный слой |
| 4. Stubs + frontmatter | Создано 6 README (`znamenskoye`, `mmfb`, `lipki` уже был, + 4 stub'а клиентских OpenWrt). Обогащён frontmatter в `niikn`, `dttb`, `glavtorg`, `krasnogorsk`, `zelenograd` с aliases для netbird-имён. **38 → 14 orphan-пиров** |
| 5.1. Слить дубли видео | Удалён `dttb/video-surveillance-report.md` (297 строк, неполная копия), canonical `videonablyudenie-znam.md` обогащён aliases |
| 5.2. Архив audit/ | 18 устаревших drift-отчётов 2026-04-* перенесены в `audit/archive/`, в active остались 7 свежих |
| 6. Recall + dreaming | `openclaw memory promote --apply`: 17/39 коротких воспоминаний переехали в долгую. `dreaming.enabled=true` (cron `0 3 * * *`). Weekly cron на promote |
| 7. Расширенный kb-audit | Скрипт `scripts/kb-objects-audit.py` пишет еженедельный отчёт с score: проверяет frontmatter, online-orphans, битые wiki-ссылки. Первый запуск — score=84 (12/12 frontmatter ✓, 3 online orphan, 26 битых wiki) |
| 8. UX бота | `memorySearch.query.minScore=0.4`, IDENTITY.md разводит двух Максимок (homelab vs НИИКН), INFRASTRUCTURE.md переписан как навигатор по vault'у |
## Метрики до / после
| Параметр | До | После |
|---|---|---|
| «OpenWRT Липки» top-1 | `netbird-inventory.md` ❌ | `projects/lipki/README.md` ✅ |
| «Антон клиент Звенигород» top-1 | ничего | `projects/lipki/README.md` ✅ |
| «AgentDVR ЧОП Знаменское» top-1 | три дубля | `videonablyudenie-znam.md` ✅ |
| «Константин Вишневый сад» top-1 | `netbird-inventory.md` | `projects/vishnevyy-sad/README.md` ✅ |
| Лаг push → видно боту | 516 мин | **~50 секунд** |
| Проектов с netbird-привязкой | 0 | **9** |
| Структурный объект-граф | нет | `objects-map.json` (34 entries) |
| Online orphan-пиров | ~30+ | **3** |
| Auto-reindex после pull | нет | есть |
| Recall promoted | 0 (mёртв 16 дней) | 17 + weekly cron |
| Dreaming | off | on (ночной cron) |
| FTS-шум audit/ | 24 файла | 7 active + 18 в archive |
## Грабли (для будущей памяти)
1. **Gitea SSRF-protection.** Без `webhook.ALLOWED_HOST_LIST` в `app.ini` Gitea silently отказывает доставлять webhook на private IP. В docker-логах: `webhook can only call allowed HTTP servers, deny '10.0.0.239'`. Listener при этом получает 0 запросов, journal пустой.
2. **`flock -n` теряет двойные push.** Если webhook прилетел во время pull/reindex — non-blocking lock молча выходит. Заменить на `flock -w 180`.
3. **openclaw 2026.5.2 ollama-провайдер игнорирует chunking.** При `provider: ollama` шлёт файлы целиком в `/api/embed`, ollama buffer растёт до 700 MB, обработка >5 мин, fetch валится. Не лечится `chunking.tokens=512`, `nonBatchConcurrency=1`, `batch.enabled=false`. Bug либо в openclaw, либо неочевидный конфиг-флаг.
4. **substring matching → false positives.** Alias `cloud` подхватывал `Cloud-NIIKN New niikn.com`. Перешли на exact-match с нормализацией `ye→e`. Aliases теперь должны содержать **полные** имена пиров как в netbird-inventory.
5. **Heredoc через ssh с backticks** — bash интерпретирует backticks как command-substitution внутри пути файла. Для записи структурных markdown'ов с inline-кодом — пушить через base64 или scp/pct push, не heredoc.
6. **`git commit` без `-a` или явного `git add`** забирает только staged. Удаление через `git rm` помечается автоматом, а modify — нет. Один коммит может оставить часть правок несинхронизированными — дополнительный коммит лечит.
## Что отложено
| Задача | Причина | Когда возвращаться |
|---|---|---|
| Векторный поиск через ollama | bug в openclaw 2026.5.2 ollama-провайдере | при апгрейде openclaw, или попробовать `provider: local` (transformers.js встроен в openclaw) |
| 14 orphan-пиров (Денис Тихая, DESKTOP-2IOQS54 Saransk, KOMPUTER, MastaNotebook, …) | нужны факты от Олега чьи это машины | по мере выяснения — добавлять в aliases подходящих проектов |
| 26 битых wiki-ссылок | автоматический фикс не всегда возможен (некоторые цели реально удалены) | semi-auto проход: показать список, для очевидных — починить, остальное — оставить TODO |
| Singleton-проекты (`projects/*.md`) без frontmatter | не критично — они top-level note'ы | при касании |
## Артефакты в vault
- [[../projects/lipki/README]], [[../projects/znamenskoye/README]], [[../projects/mmfb/README]]
- [[../projects/sergey/README]], [[../projects/benilux/README]], [[../projects/vishnevyy-sad/README]], [[../projects/openwrt-4/README]]
- [[../projects/_index]] — авто-генерированный реестр
- `audit/objects-map.json` — машинно-читаемый граф
- [[../audit/2026-05-06-objects-audit]] — первый health-check
- `scripts/kb-objects-map.py`, `scripts/kb-objects-audit.py`
- [[../snippets/openclaw-kb-webhook]]
- [[2026-05-06-openclaw-kb-webhook-deployment]]
- frontmatter добавлен в `projects/{niikn,dttb,glavtorg,krasnogorsk,zelenograd}/README.md`
## Артефакты вне vault
**LXC 137 (openclaw):**
- `/usr/local/bin/kb-pull-webhook.py` (Python listener, HMAC)
- `/etc/systemd/system/kb-pull-webhook.service`
- Обновлённый `/usr/local/bin/kb-pull.sh` (`flock -w 180`, hash-diff, auto-reindex)
- Cron `0 4 * * 1` weekly memory promote
- Config: `memorySearch.query.minScore=0.4`, `dreaming.enabled=true`, ollama-провайдер откачен (бэкап `/root/.openclaw/openclaw.json.bak.embed-2026-05-06-112441`)
- Переписаны `/root/clawd/IDENTITY.md`, `INFRASTRUCTURE.md`
**LXC 136 (Gitea):**
- `webhook.ALLOWED_HOST_LIST = 10.0.0.0/24,*.dttb.ru,private` в `/opt/gitea/data/gitea/conf/app.ini`
- Webhook id=1 на репо `oleg/knowledge-base`
**LXC 132 (code-server):**
- ollama systemd override `OLLAMA_HOST=0.0.0.0:11434, KEEP_ALIVE=24h` (для будущего возврата к embeddings)

View File

@@ -0,0 +1,78 @@
---
date: 2026-05-06
type: decision
tags: [openclaw, gitea, webhook, kb-sync, performance]
status: applied
---
# Webhook Gitea → openclaw kb-pull (Фаза 2 плана улучшения KB-поиска)
## Контекст
После публикации `projects/lipki/README.md` стало видно, что openclaw (Максимка) видит новые правки vault только через cron `*/15` — лаг до 15 минут. Это первое, что бьёт по UX («только что записал → бот всё ещё не знает»).
План улучшения KB-поиска расписан в чате с Claude Code 2026-05-06 утром, Фаза 2 — webhook + автоматический FTS-реиндекс.
## Решение
Push-канал Gitea → listener на LXC 137 → `kb-pull.sh``openclaw memory index`. Cron `*/15` оставлен как safety net.
Подробная реализация — [[../snippets/openclaw-kb-webhook]].
## Что развёрнуто
| Компонент | Где |
|---|---|
| `/usr/local/bin/kb-pull-webhook.py` | LXC 137, Python http.server, HMAC-SHA256 проверка, journal-лог |
| `/etc/systemd/system/kb-pull-webhook.service` | LXC 137, system unit, Restart=on-failure, secret в env |
| Обновлённый `/usr/local/bin/kb-pull.sh` | `flock -w 180`, hash-diff, авто `openclaw memory index` при новом HEAD |
| Webhook в Gitea (id=1, репо `oleg/knowledge-base`) | events: push, branch: main, secret в HMAC |
| `webhook.ALLOWED_HOST_LIST = 10.0.0.0/24,*.dttb.ru,private` в `app.ini` | LXC 136 (Gitea в docker), `/opt/gitea/data/gitea/conf/app.ini` |
## Метрика
End-to-end push → видно боту:
| Этап | Время |
|---|---|
| `git push` с Mac → Gitea ack | ~2 c |
| Gitea → webhook listener | ~3 c |
| listener → kb-pull.sh → git pull → новый HEAD | ~6 c |
| **Итого до видимости HEAD на 137** | **~11 c** |
| FTS reindex (875 файлов / 1791 chunk) | +38 c |
| **Итого до видимости в `openclaw memory search`** | **~50 c** |
Было: до 15 минут (cron */15) + до 38 c reindex (если бы он раньше был) = до **~16 минут**.
Улучшение: **×20 латентности до видимости HEAD, ×16 до полного FTS**.
## Грабли (для будущей памяти)
1. **Gitea SSRF-protection.** Без `ALLOWED_HOST_LIST` Gitea silently отказывает доставлять webhook на private IP. Test delivery возвращает `204`, но в Gitea log: `webhook can only call allowed HTTP servers, deny '10.0.0.239'`. Listener при этом не видит ничего — пустой journal. Это была первая причина почему ничего не работало.
2. **`flock -n` теряет вторую серию push'ов.** Если webhook прилетел во время уже идущего pull/reindex (быстрый двойной push) — non-blocking flock молча выходит. Надо `-w 180` (ждать в очереди до 3 мин).
3. **sed по строке с `||` ломается, если разделитель `|`.** `sed -i 's|flock -n|flock -w 180|'` падает с `unknown option to s`. Использовать `#` или другой разделитель — `sed -i 's#flock -n#flock -w 180#'`.
4. **Listener `log_message: pass` гасит **все** логи http.server.** Если хочется видеть приём POST — переопределить как `sys.stderr.write(...)`. Иначе debug невозможен.
## Альтернативы, которые отвергнуты
- **Полностью убрать cron**: рискованно — если listener умер и не заметили, vault зависнет. Cron `*/15` ничего не стоит и страхует.
- **Webhook напрямую через NPM/публичный URL**: лишний хоп, нужен HTTPS, всё в LAN — не нужно.
- **iptables на 18790**: HMAC-secret уже отсекает левые запросы. Homelab trusted. Не делал.
## Откат
См. секцию «Откат» в [[../snippets/openclaw-kb-webhook]]. Один rm-рецепт + удаление webhook через Gitea API.
## Что дальше
Фаза 1 плана (embeddings ollama × bge-m3) — пока **отложена**. При попытке развёртывания openclaw 2026.5.2 со всеми правильными config-полями (`provider=ollama`, `remote.baseUrl`, `model=bge-m3`, `chunking.tokens=512`) **игнорирует chunking** и шлёт в `/api/embed` файлы целиком — output buffer ollama растёт до 700+ MB, обработка >5 мин, undici fetch падает по дефолтному 5-min Headers Timeout. Конфигурация откачена, состояние FTS-only сохранено.
Возможные пути возврата к векторному поиску:
- `provider: local` (transformers.js встроенный) — попробовать без сетевого хопа
- Ждать openclaw 2026.5.3+ с фиксом chunking
- GitHub Copilot embeddings (требует токен)
Следующая фаза по плану — **Фаза 3** (`audit/objects-map.json` + `projects/_index.md`) или **Фаза 5.1** (слить дубли видеонаблюдения).

View File

@@ -0,0 +1,119 @@
---
date: 2026-05-06
type: decision
tags: [decision, openclaw, omniroute, claude, opus, cliproxy, max-plan]
---
# 2026-05-06: openclaw перешёл на Claude Opus 4.7 через Max-подписку (cc/* в OmniRoute)
## Контекст
Искали стабильный источник Claude Opus 4.6/4.7 для openclaw — обсуждали построение Workspace-фарма на новом домене с пулом аккаунтов под Antigravity. Перед тем как затевать фарм ($12/домен + время на регистрации + риск массового бана), проверили что фактически работает в текущей OmniRoute.
## Что обнаружили в OmniRoute (10.0.0.179:20128)
В каталоге **17 моделей с opus в id**, но реально пингуются только три:
| Model ID | Источник | Статус |
|---|---|---|
| **`cc/claude-opus-4-7`** | Claude Code OAuth (Max-подписка Олега) | ✅ Работает |
| `cc/claude-opus-4-6` | то же | ✅ Работает |
| `claude/claude-opus-4-7` | прямой Anthropic API | ✅ Работает (платный per-token) |
| `gh/claude-opus-4.6` | GitHub Copilot integrator MS | ❌ MS убрала Opus 4.6 из integrator scope, отдаёт «model not available» |
| `gh/claude-opus-4.7` | то же | ❌ ID mismatch: OmniRoute шлёт `4.7`, MS ждёт `4-7` (баг mapping в текущей версии) |
| `kr/claude-opus-4.6` / `4.7` | Kiro/AWS | ❌ Kiro Opus не выдаёт, только Sonnet |
| `kiro/claude-opus-*` | то же | ❌ |
| `kc/anthropic/claude-opus-4.7` | KiloCode | ❌ Empty response |
| `kilocode/anthropic/claude-opus-4.7` | то же | ❌ |
| `antigravity/claude-opus-4-6-thinking` | Google Antigravity | ❌ «Missing Google projectId — reconnect OAuth in Providers → Antigravity» |
## Решение
**Workspace-фарм для Antigravity не нужен.** У Олега уже есть рабочий Opus 4.7 через **`cc/claude-opus-4-7`** — это его собственная Max-подписка Anthropic, проксированная через CLIProxy в OmniRoute. Лучше любого фарма потому что:
- Нет per-token биллинга, фиксированная стоимость Max ($200/мес за Max20x)
- Не нужны множественные аккаунты, recovery emails, virtual cards
- Один источник = один ключ = простая интеграция
- Нет риска массового бана как у фарм-аккаунтов
- Самая свежая модель Opus 4.7 (новее чем 4.6 которая в фармовых Antigravity)
### Изменения в `/root/.openclaw/openclaw.json` (LXC 137)
**Было:**
```json
"agents.defaults.model": {
"primary": "omniroute/kr/claude-sonnet-4.5",
"fallbacks": [
"omniroute/cc/claude-sonnet-4-6",
"omniroute/cx/gpt-5.4"
]
}
```
**Стало:**
```json
"agents.defaults.model": {
"primary": "omniroute/cc/claude-opus-4-7",
"fallbacks": [
"omniroute/cc/claude-sonnet-4-6",
"omniroute/kr/claude-sonnet-4.5",
"omniroute/cx/gpt-5.4"
]
}
```
Также добавлена запись в `models.providers.omniroute.models[]`:
```json
{
"id": "cc/claude-opus-4-7",
"name": "Claude Opus 4.7 (CLIProxy/Max)",
"reasoning": false,
"input": ["text", "image"],
"contextWindow": 200000,
"maxTokens": 8192
}
```
Без этой записи openclaw fallback'нет на следующий — модель должна быть в каталоге провайдера.
### Применение
OpenClaw подхватил изменения **через hot-reload без рестарта** (видно в журнале: `[reload] config hot reload applied`). После я ещё раз сделал `systemctl --user restart openclaw-gateway.service` для чистоты, но это было необязательно.
В логах после старта:
```
[gateway] agent model: omniroute/cc/claude-opus-4-7
[gateway] http server listening (7 plugins: ..., telegram; 8.6s)
[telegram] [default] starting provider (@maxim_dttb_bot)
[gateway] ready
```
## Бэкап и rollback
Автобэкап перед изменениями: `/root/.openclaw/openclaw.json.bak.opus47-20260506-090832`
Rollback одной командой:
```bash
sshpass -p '1qaz!QAZ' ssh root@10.0.0.250 "pct exec 137 -- bash -c '
cp /root/.openclaw/openclaw.json.bak.opus47-20260506-090832 /root/.openclaw/openclaw.json
XDG_RUNTIME_DIR=/run/user/0 systemctl --user restart openclaw-gateway.service
'"
```
## Известные риски и мониторинг
1. **Max-подписка fair-use лимиты** — Anthropic размывает по нагрузке, точных цифр нет. Когда упрёмся — openclaw сам перейдёт на `cc/claude-sonnet-4-6` (видно в логах `model fallback decision`).
2. **CLIProxy OAuth refresh** — может протухнуть. Мониторинг: `journalctl --user -u openclaw-gateway -f` на LXC 137. При ошибке 401 от Anthropic API → переподключить Claude Code OAuth в OmniRoute (Dashboard → Providers → Claude → Reconnect).
3. **Скорость** — Opus 4.7 в среднем 2-5 сек медленнее Sonnet 4.5. Для интерактива в Telegram это норма.
## Параллельные находки
- **Antigravity** требует OAuth re-connect. По заметке `feedback_antigravity_onboarding.md`: открыть [antigravity.google](https://antigravity.google), залогиниться, создать Cloud Code project → projectId подтянется → `antigravity/claude-opus-4-6-thinking` оживёт. Сейчас не критично.
- **`Unknown model: cx/gpt-5.4`** — каждые 30 минут в логах ошибка. Health-check тыкается в модель которой нет в каталоге `omniroute.models[]` openclaw. Не блокер — failover работает. Решение: либо добавить `cx/gpt-5.4` в каталог openclaw, либо убрать из health-check'ов.
## Связанные
- [[../claude-memory/omniroute]] — OmniRoute setup, провайдеры, версии
- [[../projects/dttb/openclaw]] — справочник по openclaw
- [[../snippets/clawdbot-cliproxy-config]] — старый шаблон CLIProxy
- [[../snippets/omniroute-models-audit]] — шаблон smoke-тестов и парсинга ошибок (использовался при этом аудите)

View File

@@ -0,0 +1,90 @@
---
date: 2026-05-07
type: decision
tags: [buzharovo, server1c, 1c, troubleshooting]
---
# Бужарово 1С сервер — rmngr-loop после грязного ребута: рецепт
## Контекст
07.05.2026 утром локальные пользователи в Бужарово начали жаловаться на резкое замедление 1С. NetBird и удалённый доступ ни при чём — тормозило в локальной сети офиса.
Сервер: `Server1C` (Win 2012 R2, 100.70.75.103 / 185.13.47.2), 1С 8.3.27.1606, MSSQL.
## Что нашли
Сегодня в **09:05 сервер ушёл в crash**:
- `System / Kernel-Power Event 41` (Critical): "rebooted without cleanly shutting down — system stopped responding, crashed, or lost power"
- `System / EventLog 6008`: "previous shutdown was unexpected"
После загрузки:
- `rmngr.exe` (менеджер кластера 1С) держит **~1.7 ядра постоянно** в idle (норма <2% одного ядра).
- `rphost`, `sqlservr`, диски (avg sec/write 1.6 ms, queue 0.03), память (5/64 GB) — **в норме**.
- `rac.exe localhost:1540 cluster list` → "ошибка соединения с сервером", exit -1 — **admin-канал rmngr повис**, кластером невозможно управлять извне.
- `netbird.exe` параллельно жжёт 1.4 ядра — побочный reconnect-loop после crash, после ребута сам успокоился.
## Что не помогло
**Полный ребут сервера** (через `Restart-Computer`) — НЕ решает проблему. На свежезагруженном сервере с uptime=37 секунд rmngr опять на 178% одного ядра. То есть проблема воспроизводится при каждом первом запуске агента после crash.
## Что помогло
```powershell
Restart-Service -Name '1C:Enterprise 8.3 Server Agent (x86-64)' -Force
```
После рестарта службы (не сервера!):
| Процесс | До рестарта | После рестарта |
|---|---|---|
| rmngr | 178% ядра | 3% ядра |
| rphost | 19% | 1% |
| ragent | 0% | 1% |
Все клиенты в этот момент вылетают — нужно предупредить за 2-3 минуты. Перезаход штатный.
## Побочный эффект
После рестарта остался орфан-процесс старого `ragent` от прошлого запуска (не слушает 1540, висит в памяти). Можно безопасно прибить:
```powershell
Get-Process ragent | Where-Object { $_.Id -ne (Get-NetTCPConnection -LocalPort 1540).OwningProcess } | Stop-Process -Force
```
## Корневая причина — открыта
Почему `rmngr` зацикливается после первого запуска ragent — точно не выяснено. Гипотезы:
1. Повреждённый кэш кластера `C:\Program Files\1cv8\srvinfo\reg_*\` после crash.
2. Регресс в 8.3.27.1606 при восстановлении сеансов.
3. Disabled-служба `RagentServer_8327` (старый дубликат) что-то мешает в реестре при первом старте.
Если повторится — смотреть `C:\Program Files\1cv8\srvinfo\reg_*\1Cv8FTLog\` и `1Cv8Log` на ошибки.
## Что сделать долгосрочно
В кластере 1С сейчас **один rphost на всех локальных пользователей** — бутылочное горлышко. Через консоль администрирования сервера 1С увеличить количество рабочих процессов: 1 rphost на 8-12 сеансов. Это отдельная задача, не на горячую.
## Команды диагностики (для повтора)
WinRM-сессия с Mac:
```python
import winrm
s = winrm.Session('http://100.70.75.103:5985/wsman',
auth=('dttb','1qaz!QAZ'),
transport='basic')
```
Дельта CPU за 5 сек по процессам:
```powershell
$names='rmngr','rphost','netbird','sqlservr','ragent'
$first=@{}; $last=@{}
Get-Process | ?{$names -contains $_.Name} | %{ $first[$_.Name]=$_.CPU }
Start-Sleep 5
Get-Process | ?{$names -contains $_.Name} | %{ $last[$_.Name]=$_.CPU }
foreach($n in $names){ "$n delta=$($last[$n]-$first[$n])s" }
```
Если у rmngr дельта >50 за 5 секунд — диагноз "rmngr-loop" подтверждён, делать рестарт службы.
См. также [[projects/buzharovo/server1c]].

View File

@@ -0,0 +1,75 @@
---
date: 2026-05-08
type: decision
tags: [decision, buzharovo, 1c, backup, mssql, effector-saver]
---
# 2026-05-08: Бэкап Бужарово 1С — переход с Effector Saver DT на native MS SQL Backup
## Контекст
Вечером 2026-05-08, после починки rmngr-loop, регулярная задача `Бэкап 1Cv8` в Effector Saver Free 4.8/2 на `server1c.netbird.cloud` (Win 2012 R2, MSSQL 2012 SP4, 1С 8.3.27.1606) **отказывалась завершаться успешно**. Шесть подряд запусков (19:51 → 22:21) падали с одной и той же связкой ошибок:
1. `HRESULT=800401F3``V83.ComConnector` не зарегистрирован → Olег зарегистрировал через UI Effector Saver, переключился на 64-bit
2. `HRESULT=80004005` — "Администратор кластера не аутентифицирован" — у кластера 1С есть проверка авторизации, но **в кластере нет ни одного admin'а**, а добавить нельзя:
- В Серверной консоли 1С: `Локальный кластер → Администраторы` показывает количество=0, форма "Новый администратор" заполнена, но при OK **просит логин/пароль и не принимает agent-уровневый admin** (создан Olегом отдельно)
- Через COM `V83.COMConnector`: `AuthenticateAgent('admin', '1qaz!QAZ')` проходит, но `RegClusterAdmin` падает "пользователь не выполнил аутентификацию для требуемой операции" (chicken-and-egg: для создания первого cluster admin нужен уже cluster admin)
- Через `rac` с `--agent-user`: cluster operations не принимают agent-уровневую аутентификацию (design choice 1С)
3. `Ошибка исключительной блокировки информационной базы` — даже без cluster admin'а Effector Saver продолжает выгрузку, но не может получить эксклюзив, потому что в БД активные сессии. Особенно "вечная" сессия `КулябинПИ sid=4514, начат 12:55:42` — после моего рестарта службы 1С в 19:30 и последующих SQL `KILL` сессий, она **раз за разом возвращается** (вероятно, реально открытый где-то тонкий клиент Павла Ивановича + persistent state в `1CV8Clst.lst`).
## Что пробовали и почему не сработало
| Попытка | Результат |
|---|---|
| `regsvr32` x64 `comcntr.dll` | ✅ COM зарегистрирован, переключение Effector Saver на 64-bit убрало `800401F3` |
| `Restart-Service '1C:Enterprise 8.3 Server Agent'` | ✅ rmngr вылечен, но session 4514 в реестре кластера **persists** между рестартами |
| `KILL` SQL-сессий через `sa/Qwer1122334400` | ✅ временно (sess=0, locks=0), но 1С rphost восстанавливает соединения за 1-2 мин и сессия 4514 reanimates |
| `rac cluster admin register` без auth | ❌ "оператор не существует" |
| `RegClusterAdmin` через COM с `AuthenticateAgent` | ❌ "пользователь не аутентифицирован для требуемой операции" |
| GUI Серверной консоли 1С — добавить cluster admin | ❌ форма не сохраняет, требует cluster auth (которой нет) |
Тупик: **в кластере БД 1С нет cluster admin'а, и зарегистрировать первого нельзя ни через GUI, ни через rac, ни через COM.** Возможный единственный путь — обнулить `srvinfo\reg_1541\1CV8Clst.lst` целиком (потеря и админов, и регистрации ИБ — нужна перерегистрация ИБ с SQL params; рискованно).
## Решение: native MS SQL Backup
Effector Saver делает **DT-выгрузку через 1С Конфигуратор** (`1cv8.exe DESIGNER /DumpIB`), которая требует эксклюзив на ИБ. Это исторический способ для **файловых** ИБ. Для **клиент-серверных** ИБ на MS SQL правильный путь — **`BACKUP DATABASE` на уровне SQL Server**:
-**Online backup** — снимает копию во время работы, не требует эксклюзива
-Не зависит от 1С-кластера, cluster admin'а, активных сессий
-С `WITH COMPRESSION` файл сжимается ~3:1 (3.8 GB → 1.1 GB)
- ✅ Быстрее — у нас 2 секунды на 3.8 GB БД
- ✅ Восстанавливается одним запросом `RESTORE DATABASE`
Реализация:
```sql
BACKUP DATABASE [RitmUl]
TO DISK = N'C:\backup\RitmUl_<ts>.bak'
WITH FORMAT, INIT, NAME = N'RitmUl-Full',
SKIP, NOREWIND, NOUNLOAD, COMPRESSION, COPY_ONLY,
STATS = 5
```
`COPY_ONLY` — чтобы наш бэкап не ломал log chain если потом настроят differential/log backups.
Запускается через WinRM `python3 + System.Data.SqlClient` с LXC 139 `severny-les` (бот). Storage: `C:\backup\` на server1c (374 GB свободно).
## Артефакт
- **Первый успешный бэкап 2026-05-08:** `C:\backup\RitmUl_2026-05-08_2225.bak` (1105 MB)
- **Скрипт:** `/root/clawd/scripts/sql_native_backup.py` на LXC 139
## TODO (после возвращения Olега из Египта)
1. **Автоматизировать** — добавить cron на LXC 139 `severny-les`: каждый день в 03:00 МСК запускать `sql_native_backup.py`, ротировать (хранить N дней). Алерт в Telegram-группу при сбое.
2. **Ротация и трансфер** — настроить копирование `.bak` файлов на внешний носитель (Nextcloud / S3 / Gitea-LFS).
3. **Тест восстановления** — раз в N дней автоматически развернуть бэкап в тестовую БД и проверить целостность.
4. **Effector Saver** оставить как есть, не чинить (чинить cluster admin = разбирать `1CV8Clst.lst` бинарник, риск убить ИБ). Можно отключить регулярную задачу `Бэкап 1Cv8` в Effector Saver чтобы не плодились алерты "ошибка".
5. **TODO документировать** SQL creds в `projects/dttb/credentials.md` (см. блок Бужарово).
## Связанные
- [[projects/buzharovo/server1c]] — обновлён с SQL backup как новый канон
- [[projects/buzharovo/severny-les-bot]] — бот теперь умеет бэкапить через WinRM+SQL
- [[decisions/2026-05-07-buzharovo-1c-rmngr-loop-after-crash]] — про rmngr (отдельная история, починена)

View File

@@ -0,0 +1,77 @@
---
date: 2026-05-08
type: decision
tags: [decision, buzharovo, bot, openclaw, watchdog, telegram]
---
# 2026-05-08: Северный лес — отдельный AI-ассистент + watchdog для server1c (Бужарово)
## Контекст
Олег уезжает в отпуск в Египет 2026-05-09 → 2026-05-22. На server1c (Бужарово, VDS 185.13.47.2 / NetBird 100.70.75.103) недавно (2026-05-07) был rmngr-loop, который лечится только `Restart-Service '1C:Enterprise 8.3 Server Agent (x86-64)' -Force` — ребут не помогает (см. [[decisions/2026-05-07-buzharovo-1c-rmngr-loop-after-crash]]).
Пока Олег в отпуске, нужно:
1. Чтобы кто-то узнавал когда сервер упал (Telegram-группа руководящего состава Северного леса);
2. Чтобы можно было дёрнуть восстановительное действие (`/approve restart_1c`) не дожидаясь возвращения Олега из Египта.
Через ~2 недели (после Египта) планируется миграция server1c с VDS на собственный сервер. Бот должен работать **до и после** миграции — поэтому он не на самом server1c, а на dttb-Proxmox через NetBird.
## Развилка: clawdbot vs openclaw vs другой watchdog
Рассматривались три варианта:
| Вариант | Плюсы | Минусы |
|---|---|---|
| **clawdbot** (как у [[projects/niikn/clawdbot-niikn|Максимки-Мауля]]) | Проверенный рецепт, проще | Старый стек, не обновляется. exec-approvals самописные. |
| **openclaw** (свежий стек 137) | Встроенный `exec-approvals.json` whitelist для shell-команд. Plugins, skills, делегирование на Opus 4.7 через Max. Свежий, активная разработка. | Жёсткая schema, есть тонкости (bonjour, IPv6, FakeIP DNS) — но они уже разобраны на 137. |
| **Голый watchdog без AI** | Минимум зависимостей. | Нет диагностики "почему упало". Невозможно дёрнуть `/restart_1c` через `/approve` — только ручной WinRM. |
**Решение:** **openclaw** — встроенный whitelist для shell-команд (`exec-approvals.json`) — это прямо то что нужно для `/approve` flow. Плюс Опус 4.7 через Max.
## Архитектура
**Изоляция от Максимки (LXC 137):** не подвешиваем как доп.канал на 137 — если openclaw на 137 упадёт (а это бывает: bonjour, FakeIP, Kiro 402), упадут и алерты Бужарово. Для критичной мониторинг-задачи нужен **отдельный** инстанс.
**Хост:** новый LXC 139 на dttb (10.0.0.240, NetBird 100.70.212.78, Ubuntu 24.04, 2c/4GB/10GB).
**Два слоя независимых:**
1. **buzharovo-watchdog** — bash + curl→TG bot API напрямую, systemd timer 60s. **Не зависит от openclaw.** Если AI-часть упала, алерт всё равно дойдёт.
2. **openclaw 2026.5.7** — AI-помощник для диагностики и `/approve`-action'ов через WinRM.
**Алерт-уровни:**
- `OK` — всё доступно;
- `WARNING` — часть проверок упала;
- `WARNING_NETBIRD` — NetBird до server1c лежит, публично сервер виден;
- `CRITICAL` — сервер не отвечает ни публично, ни через NetBird.
Антиспам: алерт шлётся **только при смене уровня**, состояние в `/var/lib/severny-les/state.json`.
**WinRM-actions с подтверждением:**
- read-only без approval (`/status`, `/check_1c`, `/check_rmngr`);
- destructive с обязательным `/approve` от Олега `1292155421` (`/restart_1c`, `/kill_orphan_ragent`);
- ребута сервера НЕ даём (по опыту 2026-05-07 не помогает rmngr-loop).
## Превентивные правки на старте (уроки 137)
Все три "ловушки openclaw" пропатчены сразу:
1. `plugins.entries.bonjour.enabled = false` — против mDNS crash-loop (см. [[projects/dttb/openclaw#Crash-loop-каждые-40-сек]]).
2. `pct set 139 --nameserver '1.1.1.1 8.8.8.8'` + правка `/etc/resolv.conf` — против FakeIP DNS от 10.0.0.1.
3. `NODE_OPTIONS=--dns-result-order=ipv4first` в systemd unit — против IPv6-сбоев Telegram API.
systemd unit для openclaw — **system-level** (`/etc/systemd/system/openclaw-gateway.service`), а не `--user` как на 137. В LXC без user-session `systemctl --user` не работает (`Failed to connect to bus`).
## Что осталось сделать после возвращения Олега
1. **NetBird ACL** `severny-les``server1c` (порт 5985 TCP минимум) — без него WinRM-actions не работают, watchdog мониторит только публичные проверки.
2. **Добавить @bz_sl_bot в TG-группу** руководящего состава, узнать `chat_id`, обновить `/etc/severny-les/watchdog.env` `BZ_TG_CHAT` и `openclaw.json` `groupAllowFrom`.
3. После миграции server1c на свой сервер — обновить IP в `/root/clawd/INFRASTRUCTURE.md` и в `buzharovo-watchdog.sh`.
## Артефакты
- LXC 139 `severny-les` (10.0.0.240)
- TG bot `@bz_sl_bot` (token `8322860033:...`)
- Справочник: [[projects/buzharovo/severny-les-bot]]
- Persona: `/root/clawd/{IDENTITY,INFRASTRUCTURE,USER,SOUL,TOOLS,MEMORY,HEARTBEAT}.md`
- Скрипты: `/root/clawd/scripts/check_buzharovo.sh`, `winrm_lib.py`, `check_1c_service.py`, `check_rmngr_cpu.py`, `restart_1c_agent.py`, `kill_orphan_ragent.py`, `heartbeat.sh`
- Watchdog: `/usr/local/bin/buzharovo-watchdog.sh` + `.service` + `.timer` (60s); `netbird-watchdog` clone с 137 (2 мин)
- Whitelist: `/root/.openclaw/exec-approvals.json`

View File

@@ -0,0 +1,85 @@
---
date: 2026-05-14
type: decision
tags: [decision, buzharovo, watchdog, netbird, monitoring, openclaw]
---
# 2026-05-14: Watchdog Бужарово — только публичный канал, NetBird вынесен из alert level
## Контекст
Олег в Египте, прислал что бот "сыпал ошибками вчера, попросил отключить мониторинг". Разведка:
1. **Все сервисы на LXC 139 живы** (`openclaw-gateway`, `buzharovo-watchdog.timer`, `netbird-watchdog.timer`, `netbird.service``active+enabled`). Олег ничего не отключал.
2. **Watchdog v1 правильно держал `WARNING_NETBIRD`** (последний алерт 13 мая ~19:32 МСК), антиспам корректный — повторных алертов не слал.
3. **Истинный источник "ошибок"**`openclaw primary model = omniroute/cc/claude-opus-4-7` упёрся в лимит Max-подписки:
```
omniroute (cc/claude-opus-4-7) returned a billing error — your API key has run out of credits
400 [400]: You're out of extra usage. Add more at claude.ai/settings/usage and keep going.
```
Каждое сообщение в боте + каждое ночное `memory-core dreaming` (cron 03:00) → billing 400 → failover на `kr/claude-sonnet-4.5`. На клиенте часть запросов могла отдаться с ошибкой раньше чем failover отработал.
4. **Server1C NetBird daemon (Windows)** регулярно flap'ает, `last_seen=2026-05-13T08:24:26` — > 25 часов вне mesh, хотя сервер сам публично жив (ping + RDP 3389 OK).
## Решения
### Фикс 1: primary model → free Sonnet 4.5
`/root/.openclaw/openclaw.json`:
```json
{
"primary": "omniroute/kr/claude-sonnet-4.5",
"fallbacks": [
"omniroute/cc/claude-sonnet-4-6",
"omniroute/gh/claude-sonnet-4.5",
"omniroute/cc/claude-opus-4-7"
]
}
```
Hot-reload подхватился. Backup конфига — `/root/.openclaw/openclaw.json.bak.opus-billing-<ts>`.
**Возврат на Opus как primary — только после пополнения Max** или подключения второго конектора в OmniRoute.
### Фикс 2: watchdog v2 — только публичный канал
Переписан `/usr/local/bin/buzharovo-watchdog.sh`. Логика alert-level **больше не учитывает NetBird-проверки**:
- `OK` — `ping 185.13.47.2` ✓ + `TCP 3389` (RDP) ✓
- `DEGRADED` — один из публичных упал
- `CRITICAL` — оба публичных упали
NetBird-уровень (`ping 100.70.75.103` + `TCP 5985`) **только логируется** в `state.json` (`ping_nb`, `winrm_nb`), но не меняет level и не порождает алерт.
При первом алерте в новую сессию (prev_level=INIT) добавляется пометка:
> _NetBird до сервера сейчас лежит — это известная регулярная проблема со стороны Windows-сервера, не влияет на работу 1С для пользователей. Watchdog проверяет только публичный канал._
**Почему так:** NetBird daemon на Server1C (Windows 2012 R2) теряет mesh-сессию регулярно (memory `feedback_netbird_watchdog`). Лечится `Restart-Service netbird` через RDP — но это ручная операция, и поток алертов из-за этого был шумом, а не сигналом. Сервер для пользователей в Бужарово при этом работает — 1С локально доступна.
**Что теряем:** WinRM-actions (`check_1c_service.py`, `check_rmngr_cpu.py`, `restart_1c_agent.py`, `sql_native_backup.py`) идут через NetBird (`100.70.75.103:5985`). Когда NetBird падает — эти actions недоступны. Бот в группе об этом честно скажет: "Не могу проверить состояние службы 1С — туннель до сервера временно лежит". Восстанавливается после `Restart-Service netbird` на server1c через RDP.
**Что НЕ теряем:** алерты о реально критичных событиях (сервер физически лёг публично, сеть провайдера упала, RDP закрылся).
## Деплой
```bash
pct push 139 wd.sh /usr/local/bin/buzharovo-watchdog.sh
chmod +x /usr/local/bin/buzharovo-watchdog.sh
chown root:root /usr/local/bin/buzharovo-watchdog.sh
echo "{}" > /var/lib/severny-les/state.json # force re-evaluate
# Manual run → level=OK, alert "Мониторинг включён" ушёл в группу
```
## Обновления в vault и persona
- `/root/clawd/MEMORY.md` на LXC 139 — добавлены уроки про Opus billing + watchdog v2
- [[projects/buzharovo/severny-les-bot]] — обновить ссылку на watchdog v2 (TODO)
- Этот decision-файл
## NetBird route 10.0.0.0/24 — попутно
Существующий route `Dom` (`cud7q73l0ubs73dr3gc0`) advertised через peer `pve 100.70.121.235 (Эстония)`, **disconnected**. Переключил routing peer на **`openclaw` (`d79s9g2fadhs739mihkg`)** через PUT `/api/routes/cud7q73l0ubs73dr3gc0`. Mac получил доступ к 10.0.0.0/24 через NetBird → openclaw → LAN.
## TODO (опционально, не сейчас)
- **Reverse SSH-туннель** server1c → severny-les для WinRM-actions без зависимости от NetBird. Server1C сам делает outbound SSH → LXC 139 пробрасывает 127.0.0.1:55985 → server1c:5985. WinRM-скрипты целятся в `localhost:55985`. Решает проблему "NetBird лёг — WinRM недоступен".
- **HTTPS WinRM (5986)** публично с certificate-pin'ом — альтернатива через интернет, но требует настройки SSL и хорошего firewall.
- **Ночной cron sql_native_backup.py** — автоматизация ежедневных бэкапов БД (TODO от 2026-05-08, см. соответствующий decision).

View File

@@ -1 +1,14 @@
# Решения
<!-- kb-auto-index -->
## Навигация
- [[decisions/2026-02-26-clawdbot-129-cliproxy-fix]]
- [[decisions/2026-03-03-mailserver-setup-scenario]]
- [[decisions/2026-03-04-matrix-niikn-setup]]
- [[decisions/2026-04-14-niikn-openwrt-awg-fix]]
- [[decisions/2026-04-14-openclaw-claude-code-pipeline]]
- [[decisions/2026-04-16-unifi-migration-peredelki]]
- [[decisions/2026-04-17-code-server-upgrade]]
- [[decisions/2026-04-17-nextcloud-sync-schema]]
- [[decisions/2026-04-17-peredelki-podkop-stability-fix]]

View File

@@ -1,3 +1,9 @@
---
date: 2026-02-26
type: note
tags: [note, bot]
---
# Сессия Claude Code: починка clawdbot + видеоархив ЧОП
**Дата:** 2026-02-26

View File

@@ -1,3 +1,9 @@
---
date: 2026-02-26
type: note
tags: [note]
---
# 📝 Полный лог сессии 26.02.2026
**Дата:** 2026-02-26 (15:30 — 22:05 МСК)

View File

@@ -1,3 +1,9 @@
---
date: 2026-02-26
type: note
tags: [note]
---
# Настройка единой базы знаний
**Дата:** 2026-02-26

View File

@@ -1,3 +1,9 @@
---
date: 2026-02-26
type: note
tags: [note]
---
# 📊 Итог сессии 26.02.2026
## Проект "Единая база знаний" — запущен и работает

View File

@@ -1 +1,10 @@
# Заметки
<!-- kb-auto-index -->
## Навигация
- [[notes/2026-02-26-claude-code-session-clawdbot-fix]]
- [[notes/2026-02-26-full-session-log]]
- [[notes/2026-02-26-knowledge-base-setup]]
- [[notes/2026-02-26-session-summary]]
- [[notes/karpathy-method]]

View File

@@ -0,0 +1,23 @@
---
date: 2026-04-17
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T20:23:09.680Z
messages: 26
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Тестирую session-saver на текущей сессии и обновляю Stop-hook.
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 26 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,33 @@
---
date: 2026-04-17
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T20:25:06.155Z
messages: 26
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
## Готово — оба компонента интеграции работают
### 1. Терминал внутри Obsidian ✓
Плагин `terminal` v3.23.0 установлен в `.obsidian/plugins/terminal/`, активирован в `community-plugins.json`, Obsidian перезапущен.
**Как пользоваться:**
- `Cmd+P`**«Terminal: Open terminal in...»** → выбрать *External* (кит + shell) / *Integrated* (внутри панели) / *Developer console*
- Integrated — терминал-панель справа/снизу
- Запускаешь там `claude` — чат параллельно с заметками
- Можно открыть несколько:
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 26 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,35 @@
---
date: 2026-04-17
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T20:27:16.829Z
messages: 27
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Лог-стрим openclaw запущен в фоне. Отправляй в Telegram `@maxim_dttb_bot` тестовое сообщение — **любое из этих**:
### Вариант A — явный триггер делегации
```
Максимка, через опус прочитай decisions/2026-04-17-nextcloud-sync-schema.md и расскажи одним абзацем что ключевого
```
### Вариант B — тихий ресёрч (без делегации)
```
Максимка, какие сейчас активные LXC на Proxmox по последнему inventory?
```
Вариант **A** проверяет **полную цепочку делегации**: openclaw → wrapper → SSH Proxmox → pct ex
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 27 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,34 @@
---
date: 2026-04-17
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T20:29:24.787Z
messages: 28
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
**Полезная диагностика.** Ответ ты получил **хороший и точный** (бот прочитал decision-файл и правильно суммировал). **Но пришёл он не через opus-делегацию**, а через бесплатную модель:
## Что показали логи
```
20:27:35 [telegram:direct:1292155421] бот получил твоё сообщение
20:27:35 попробовал kr/claude-sonnet-4.5 → Unknown model
20:27:35 fallback → zai/kr/claude-sonnet-4.5 (Sonnet 4.5 через другой провайдер)
20:28:01 candidate_succeeded — ответ получен (через 26 сек)
```
Бот ответил **с
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 28 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,33 @@
---
date: 2026-04-17
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T20:34:54.866Z
messages: 29
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Покопался глубоко. Честная диагностика:
## Что нашёл
1. **Openclaw — компилированный npm-пакет** (`/usr/lib/node_modules/openclaw/dist/*.js` — всё минифицировано). Исходников нет, патчить bot-handler не получится без reverse-engineering.
2. **CLIProxy-провайдер с Opus уже настроен** в `~/.openclaw/agents/main/agent/models.json`:
```
cliproxy/claude-opus-4-6 → http://10.0.0.179:8317/v1 (CLIProxy на code-server)
```
То есть openclaw **знает** как дёргать Opus, просто не использует п
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 29 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,31 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:19:38.539Z
messages: 30
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Коротко какие есть реальные способы самообучения/актуализации, и моя рекомендация.
## Уровни автоматизации от безопасного к радикальному
### 1. **Weekly audit-скрипт (drift detection)** — safest, зеро риска
Cron на code-server раз в неделю:
- снимает живое состояние (`pct list`, `qm list`, NPM API, DNS записи, `netstat` на хостах)
- сравнивает с `proxmox-inventory.md`, `npm-proxy-hosts.md`, `network-topology.md`
- пишет diff в `audit/2026-04-18-drift.md` (новые/удалённые LXC, изменившиеся IP,
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 30 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,42 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:27:10.615Z
messages: 31
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
## Всё собрано и работает
### Что построили
```
воскр 06:00 на code-server (LXC 132, крон)
kb-audit.py (чистые факты, без LLM)
• pct list + qm list → сравнение с proxmox-inventory.md
• парсит и таблицы, и секцию «🗑️ Удалённые»
→ audit/2026-04-DD-drift.md
kb-audit-propose.sh (Opus 4.7 через Max OAuth)
• drift-отчёт + текущий inventory → claude -p
• --permission-mode plan (только предлагает)
→ audit/2026-04-DD-proposed.md
kb-autosync.sh (каждые 5 ми
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 31 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,31 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:30:31.063Z
messages: 32
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
## Одной фразой
Твоя база знаний теперь живёт одновременно в пяти местах, синхронизируется сама, а раз в неделю она сама себя проверяет и предлагает что исправить.
## Где она живёт
1. **Mac** — папка `~/knowledge-base`. Главное место где ты пишешь.
2. **Nextcloud на dttb.ru** — копия для iPhone (смотришь заметки с телефона через Obsidian).
3. **Gitea (git.dttb.ru)** — «библиотека» с историей: видно кто что правил, можно откатиться.
4. **Code-server** — там же есть копия, можно редактировать че
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 32 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,34 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:36:21.388Z
messages: 33
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
## Честный результат поиска
В марте 2026 Karpathy на GitHub был активен **только** в двух репах:
| Репо | Тема |
|---|---|
| `karpathy/nanochat` | LLM training framework |
| `karpathy/autoresearch` | AI-агенты сами дообучают модели через эксперименты с `train.py` |
**Ни в одном — ничего про Obsidian, Claude Code, knowledge management или personal workflow.**
В issue-ах `nanochat` с 2026-03-01 (30 шт) — ноль совпадений по ключевым словам «obsidian / claude code / vault / note / knowledge / ag
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 33 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,39 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:38:56.200Z
messages: 34
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
**Нашёл — это `autoresearch`, именно то что ты имел в виду.**
## Как там работает «самообучение»
Вот вся суть одной страницы:
```
У агента есть доступ к:
- train.py ← только это редактирует
- prepare.py ← трогать нельзя (утилиты)
- program.md ← инструкция что улучшать
- val_bpb ← метрика (меньше = лучше)
Цикл на всю ночь (≥100 раз):
1. Меняет train.py (архитектура, batch size, optimizer...)
2. git commit на ветку autoresearch/DATE
3. uv run train.py > run.log (ровно 5 минут)
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 34 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,35 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:45:01.480Z
messages: 35
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
## Готово — уровень 3 (karpathy-style)
### Как это теперь работает
```
воскр 06:00 на code-server:
├─ kb-audit.py — фактовый diff → audit/DATE-drift.md
├─ kb-audit-apply.py — APPLIES safe структурные правки автоматом
│ • новый VMID в stopped → добавить строку
│ • missing VMID → в секцию 🗑️ с датой
│ • commit как `kb-audit-bot <kb-audit@dttb.ru>`
│ • git push (код и
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 35 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,33 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:47:56.459Z
messages: 36
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Реальные слабые места в порядке ценности:
## Что бы я улучшил
### 1. **Расширить audit на NPM + DNS + Credentials** (средне)
Сейчас audit проверяет только Proxmox VM/LXC. Но `npm-proxy-hosts.md` и `credentials.md` тоже дрейфуют:
- NPM API → сверить с таблицей доменов
- DNS A-записи Spaceweb → сверить с backend-IP в NPM
- Credentials → пингануть каждый URL, проверить не сменились ли пароли (по 401/403)
**Ценность:** тот же механизм что для inventory, но покрывает сеть и авторизации. Раз в неде
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 36 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,38 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:51:46.864Z
messages: 37
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
## Самый простой путь
1. В Obsidian нажми **`Cmd+P`**
2. Набери **`terminal`**
3. Выбери **«Terminal: Open terminal in vault root»** → **Integrated**
Откроется терминал-панель снизу/справа в том же окне Obsidian, уже в `~/knowledge-base`.
4. Набери **`claude`** и Enter
Всё. Claude Code запущен в том же окне, слева — заметки vault, справа/снизу — чат.
## Горячие клавиши
Можно назначить хоткей чтобы не лазить в Command Palette каждый раз:
- **Settings → Hotkeys** → найти `Terminal: Open inte
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 37 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,32 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:54:06.760Z
messages: 37
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Выбирай **Integrated** (уже подсвечен синим) и жми **Enter**.
Откроется терминал прямо в окне Obsidian — снизу или справа. Там набирай `claude` — и погнали.
Три варианта которые видишь:
- **External** — открывает внешний Terminal.app (отдельное окно)
- **Integrated** ← **этот, внутри Obsidian**
- **Developer console** — только для отладки самого Obsidian, не нужен
Кстати на графе вижу что уже создана заметка от сегодняшней сессии — `2026-04-17-nextcl...` — session-saver работает.
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 37 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,41 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T21:57:23.108Z
messages: 38
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Просто в том же окне Claude набери:
```
/login
```
Откроется браузер с авторизацией Claude — жми **Continue with Claude / Use Max subscription**. После авторизации вернись в терминал, Claude подхватит токен и работает.
## Почему так получилось
У тебя в `~/.claude/settings.json` прописано:
```json
"apiBaseUrl": "http://localhost:8317",
"apiKey": "sk-cliproxyapi-local",
```
Это настройки для **CLIProxy** который раньше крутился на Mac. CLIProxy на Маке сейчас не запущен → 401.
## Если `/logi
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 38 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,31 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T22:01:33.415Z
messages: 39
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Готово — обе строки убраны, JSON валиден, остальные настройки (permissions, hooks, marketplaces) целы.
## Теперь в открытом Claude в Obsidian
1. Выйди из сессии: **`/exit`** или **`Ctrl+C`**
2. Запусти заново: **`claude`**
3. Если снова 401 — набери **`/login`**, в браузере **Continue with Claude**, разреши доступ
После этого пойдёт через твою Max-подписку (Opus 4.7 xhigh как в баннере).
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 39 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,33 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T22:04:41.652Z
messages: 41
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Нашёл причину. В env shell'а Obsidian-terminal'а висит:
```
CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST=1
CLAUDE_INTERNAL_FC_OVERRIDES={"tengu_ccr_bridge":true}
CLAUDE_CODE_ENTRYPOINT=claude-desktop
```
Эти переменные значат: «**auth-токеном управляет host-приложение** (Claude Desktop)». `/login` внутри CLI успешно сохраняет токен, но сам CLI его **не использует** — ждёт auth от родителя. Родитель (Claude Desktop) этот токен не передаёт в терминал Obsidian.
Откуда это — **Obsidian был запущен из Cla
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 41 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,34 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T22:06:00.315Z
messages: 41
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Готово. План на завтра в `daily/2026-04-19.md`, уехал в Gitea → автоматом синкнется на code-server, openclaw, Nextcloud и iPhone.
## Что увидишь завтра утром
Откроешь Obsidian → Daily Notes → `2026-04-19.md` → чеклист:
1. **🔧 Блокер:** починить env-переменные (чтобы `claude` в Obsidian-terminal работал)
2. **⭐ Топ-3 улучшения:**
- Консолидация MEMORY.md (5 мин)
- Расширить audit на NPM/DNS/Credentials (час)
- KB health + level 4 agent loop (день) — главное, самое karpathy-style
3. **
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 41 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,33 @@
---
date: 2026-04-18
type: claude-session
session_id: e2efd10b-e06b-4d4a-a11e-0dff4d928bc3
started: 2026-04-16T22:27:27.766Z
ended: 2026-04-17T22:08:20.025Z
messages: 42
tools: [Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait]
tags: [claude, session]
---
# https://github.com/CursorTouch/MacOS-MCP настрой
## Запрос
https://github.com/CursorTouch/MacOS-MCP настрой
## Итог (последний ответ Claude, до 500 симв.)
Обе проверки прошли:
- проблемные `CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST` и ко. — убраны
- **живой OAuth-токен** `CLAUDE_CODE_OAUTH_TOKEN=sk-ant-oat01-...` — остался
## Теперь в Obsidian
1. Закрой текущий терминал в Obsidian (крестик на панели)
2. Открой новый: **`Cmd+P`** → `Terminal: Open integrated terminal in vault root`
3. Набери `claude`**должен стартануть без 401** (использует оставшийся OAuth-токен напрямую)
Если вдруг снова 401 — `/login` один раз, потом больше не понадобится (токе
---
*Автосохранено из session [`e2efd10b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/e2efd10b-e06b-4d4a-a11e-0dff4d928bc3.jsonl) — 42 сообщ., тулы: Bash, Edit, Glob, Grep, Read, Skill, TodoWrite, ToolSearch, WebFetch, Write, mcp__macos-mcp__App, mcp__macos-mcp__Shell, mcp__macos-mcp__Snapshot, mcp__macos-mcp__Wait*

View File

@@ -0,0 +1,54 @@
---
date: 2026-04-18
type: claude-session
session_id: a39df94b-f167-4eed-80b5-f3b9bb785f31
started: 2026-04-17T22:10:17.807Z
ended: 2026-04-17T22:12:06.709Z
messages: 2
tools: [Bash, Edit, Read, Write]
tags: [claude, session]
---
# ai@MacBookPro knowledge-base % claude
## Запрос
ai@MacBookPro knowledge-base % claude
Claude Code v2.1.112
▐▛███▜▌ Sonnet 4.6 with high effort · Claude API
▝▜█████▛▘ ~/knowledge-base
▘▘ ▝▝ Welcome to Opus 4.7 xhigh! · /effort to tune speed vs…
gjh
⎿ Please run /login · API Error: 401 {"type":"error","error":{"typ
e":"authentication_error","message":"Invalid authentication
credentials"},"request_id":"req_011CaA7AEdYiUvasBEZWaRua"}
/login
─────────────────────────────────────────────────────────────────────
Login
Claude Code v2.1.112
▐▛███▜▌ Sonnet 4.6 with high effort · Claude API
▝▜█████▛▘ ~/knowledge-base
▘▘ ▝▝ Welcome to Opus 4.7 xhigh! · /effort to tune speed vs…
gjh
⎿ Please run /login · API Error: 401 {"type":"error","error":{"typ
e":"authentication_error","message":"Invalid authentication
credentials"},"request_id":"req_011CaA7AEdYiUvasBEZWaRua"}
/login
⎿ Login successful
gh
⎿ Please run /login · API Error: 401 {"type":"error","error":{"typ
e":"authentication_error","message":"Invalid authentication
credentials"},"request_id":"req_011CaA7C5zweQF5p3yLq6buC"}
## Итог (последний ответ Claude, до 500 симв.)
Добавил unset в `~/.zshenv` и записал паттерн в память. Открой новый терминал и запусти `claude` — 401 должен уйти.
---
*Автосохранено из session [`a39df94b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/a39df94b-f167-4eed-80b5-f3b9bb785f31.jsonl) — 2 сообщ., тулы: Bash, Edit, Read, Write*

View File

@@ -0,0 +1,54 @@
---
date: 2026-04-18
type: claude-session
session_id: a39df94b-f167-4eed-80b5-f3b9bb785f31
started: 2026-04-17T22:10:17.807Z
ended: 2026-04-17T22:12:52.504Z
messages: 3
tools: [Bash, Edit, Read, Write]
tags: [claude, session]
---
# ai@MacBookPro knowledge-base % claude
## Запрос
ai@MacBookPro knowledge-base % claude
Claude Code v2.1.112
▐▛███▜▌ Sonnet 4.6 with high effort · Claude API
▝▜█████▛▘ ~/knowledge-base
▘▘ ▝▝ Welcome to Opus 4.7 xhigh! · /effort to tune speed vs…
gjh
⎿ Please run /login · API Error: 401 {"type":"error","error":{"typ
e":"authentication_error","message":"Invalid authentication
credentials"},"request_id":"req_011CaA7AEdYiUvasBEZWaRua"}
/login
─────────────────────────────────────────────────────────────────────
Login
Claude Code v2.1.112
▐▛███▜▌ Sonnet 4.6 with high effort · Claude API
▝▜█████▛▘ ~/knowledge-base
▘▘ ▝▝ Welcome to Opus 4.7 xhigh! · /effort to tune speed vs…
gjh
⎿ Please run /login · API Error: 401 {"type":"error","error":{"typ
e":"authentication_error","message":"Invalid authentication
credentials"},"request_id":"req_011CaA7AEdYiUvasBEZWaRua"}
/login
⎿ Login successful
gh
⎿ Please run /login · API Error: 401 {"type":"error","error":{"typ
e":"authentication_error","message":"Invalid authentication
credentials"},"request_id":"req_011CaA7C5zweQF5p3yLq6buC"}
## Итог (последний ответ Claude, до 500 симв.)
Добавил unset в `~/.zshenv` и записал паттерн в память. Открой новый терминал и запусти `claude` — 401 должен уйти.
---
*Автосохранено из session [`a39df94b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/a39df94b-f167-4eed-80b5-f3b9bb785f31.jsonl) — 3 сообщ., тулы: Bash, Edit, Read, Write*

View File

@@ -0,0 +1,54 @@
---
date: 2026-04-18
type: claude-session
session_id: a39df94b-f167-4eed-80b5-f3b9bb785f31
started: 2026-04-17T22:10:17.807Z
ended: 2026-04-17T22:15:22.968Z
messages: 4
tools: [Bash, Edit, Read, Write]
tags: [claude, session]
---
# ai@MacBookPro knowledge-base % claude
## Запрос
ai@MacBookPro knowledge-base % claude
Claude Code v2.1.112
▐▛███▜▌ Sonnet 4.6 with high effort · Claude API
▝▜█████▛▘ ~/knowledge-base
▘▘ ▝▝ Welcome to Opus 4.7 xhigh! · /effort to tune speed vs…
gjh
⎿ Please run /login · API Error: 401 {"type":"error","error":{"typ
e":"authentication_error","message":"Invalid authentication
credentials"},"request_id":"req_011CaA7AEdYiUvasBEZWaRua"}
/login
─────────────────────────────────────────────────────────────────────
Login
Claude Code v2.1.112
▐▛███▜▌ Sonnet 4.6 with high effort · Claude API
▝▜█████▛▘ ~/knowledge-base
▘▘ ▝▝ Welcome to Opus 4.7 xhigh! · /effort to tune speed vs…
gjh
⎿ Please run /login · API Error: 401 {"type":"error","error":{"typ
e":"authentication_error","message":"Invalid authentication
credentials"},"request_id":"req_011CaA7AEdYiUvasBEZWaRua"}
/login
⎿ Login successful
gh
⎿ Please run /login · API Error: 401 {"type":"error","error":{"typ
e":"authentication_error","message":"Invalid authentication
credentials"},"request_id":"req_011CaA7C5zweQF5p3yLq6buC"}
## Итог (последний ответ Claude, до 500 симв.)
Теперь открой **новый** терминал (Cmd+N или новое окно Terminal.app) и запусти `claude` — пойдёт в Keychain, где лежит свежий токен с Max-подпиской.
---
*Автосохранено из session [`a39df94b`](file:///Users/ai/.claude/projects/-Users-ai-knowledge-base/a39df94b-f167-4eed-80b5-f3b9bb785f31.jsonl) — 4 сообщ., тулы: Bash, Edit, Read, Write*

Some files were not shown because too many files have changed in this diff Show More