diff --git a/projects/lipki/README.md b/projects/lipki/README.md new file mode 100644 index 0000000..f083006 --- /dev/null +++ b/projects/lipki/README.md @@ -0,0 +1,95 @@ +--- +date: 2026-05-06 +type: project +status: active +tags: [object, openwrt, cudy, zvenigorod, netbird, residential, client] +aliases: [Липки, Lipki, OpenWrt_Lipki, Звенигород, PSP_Network, Антон] +--- + +# Липки + +Посёлок в **Звенигородском районе** (Московская обл.). Резидентский объект **Антона** — Wi-Fi mesh, Ajax-сигнализация, OpenWrt-роутер. Имя в DHCP (`MBP-Anthony`) — его MacBook. Снято с роутера 2026-05-06. + +## Роутер + +| Параметр | Значение | +|---|---| +| Hostname | `OpenWrt_Lipki` | +| Модель | **Cudy TR3000 v1** (mediatek/filogic, aarch64_cortex-a53) | +| OpenWrt | 24.10.3 r28872-daca7c049b | +| SSH / LuCI | root / `1qaz!QAZ` (тот же, что на homelab) | +| Доступ | через NetBird (`100.70.35.234`) — relay через Helsinki | + +## Сеть + +| Слой | Значение | +|---|---| +| WAN | DHCP на `eth0`, **белый IPv4 `5.101.135.71`**, без CGNAT | +| LAN | `192.168.1.0/24`, шлюз `192.168.1.1`, DHCP `.2–.254`, lease 12 ч | +| Wi-Fi 2.4 ГГц | SSID **`PSP_Network`** (ch 6, HT20) | +| Wi-Fi 5 ГГц | SSID **`OpenWrt`** (ch 40, HE80) — дефолтное имя, стоит переименовать | +| NetBird | `100.70.35.234`, agent 0.59.13, группы `All` + `OpenWRT VPN` | +| Locality в NetBird | Istra _(NetBird определяет по WAN-IP/AS — реальный адрес в Звенигородском районе)_ | + +WAN — белый IP, прямой DNAT возможен без хаба `swtest.ru`. + +## Клиенты (DHCP, 12 устройств на 2026-05-06 14:00) + +| IP | Имя | Что | +|---|---|---| +| .14 | `HP8ADD66` | принтер HP | +| .31 | _безымянный_ | ? | +| .80 | _безымянный_ | ? | +| .81 | _безымянный_ | ? | +| .137 | `Redmi-Note-13-Pro-5G` | телефон | +| .164 | `deco-P9` | TP-Link Deco P9 (mesh-точка) | +| .181 | `Domasniinoteatr` | домашний кинотеатр (Smart TV / медиаплеер) | +| .191 | `Ajax-001399A3` | хаб Ajax (охранная сигнализация) | +| .209 | _безымянный_ | ? | +| .234 | `MBP-Anthony` | MacBook Pro Антона (владельца) | +| .243 | _безымянный_ | ? | +| .244 | _безымянный_ | ? | + +По составу (Ajax, mesh, MacBook, ТВ, принтер) — **жилой дом**, не офис. + +## Источники + +- [[../dttb/netbird-inventory]] — реестр NetBird-пиров +- Снято напрямую: `ssh root@100.70.35.234` через LXC 132 (NetBird wt0) + +## Владелец + +**Антон** — клиент. Точный адрес в посёлке и телефон/мессенджер пока не зафиксированы. + +## Открытые вопросы + +- [ ] Точный адрес в посёлке Липки + контакт Антона (телефон / Telegram) +- [ ] Провайдер интернета (whois `5.101.135.71` — фоновое) +- [ ] Переименовать SSID `OpenWrt` → что-то осмысленное + +## Связанные + +- [[../znamenskoye/]] — соседний «куст» в Истре, **не путать** +- [[../../claude-memory/znamenskoye-ohothozyistvo]] — соседний OpenWrt 100.70.63.67 (Охотхозяйство) +- [[../dttb/openwrt-router]] — homelab-роутер, тот же стек (OpenWrt 24.10.3, 1qaz!QAZ) + +## Открытые вопросы + +- [ ] Точный адрес в посёлке Липки и контактное лицо +- [ ] Чей объект (личный / клиент / семья / часть Знаменского?) +- [ ] Провайдер интернета, CGNAT или белый IP +- [ ] Что обслуживает роутер (камеры / IoT / рабочие места) +- [ ] LAN-подсеть и DHCP-диапазон +- [ ] Пароль/ключ доступа на сам OpenWrt +- [ ] Есть ли DNAT через VPS-хаб или доступ только через NetBird +- [ ] Почему отдельный объект, не часть [[../znamenskoye/]] + +## Связанные + +- [[../znamenskoye/]] — другой объект-«куст» в Истре, **не путать** +- [[../../claude-memory/znamenskoye-ohothozyistvo]] — соседний OpenWrt 100.70.63.67 (Охотхозяйство) +- [[../dttb/netbird-inventory]] — единственный пока источник по Липкам + +## Aliases для FTS + +`Липки`, `Lipki`, `OpenWrt_Lipki`, `100.70.35.234`, `5.101.135.71`, `Cudy TR3000`, `PSP_Network`, `Звенигород`, `Звенигородский район`, `посёлок Липки` — повторено явно, чтобы полнотекстовый поиск Максимки гарантированно цеплял этот файл при любом написании. diff --git a/snippets/openclaw-kb-webhook.md b/snippets/openclaw-kb-webhook.md new file mode 100644 index 0000000..217d424 --- /dev/null +++ b/snippets/openclaw-kb-webhook.md @@ -0,0 +1,148 @@ +--- +date: 2026-05-06 +type: snippet +tags: [openclaw, gitea, webhook, kb-sync] +--- + +# Webhook Gitea → kb-pull на LXC 137 (Максимка) + +Сократить лаг Mac → openclaw FTS с **до 15 мин** (cron `*/15`) до **<5 секунд** через push-webhook от Gitea. + +Cron оставляем как safety net — он почти ничего не стоит и спасает, если listener умер. + +## Архитектура + +``` +Mac git push ──► Gitea (LXC 136, 10.0.0.189) + │ + │ HTTP POST (push event) + ▼ + LXC 137 :18790 kb-pull-webhook (systemd) + │ + └─► /usr/local/bin/kb-pull.sh (тот же что в cron) +``` + +## 1. Listener `/usr/local/bin/kb-pull-webhook.py` + +```python +#!/usr/bin/env python3 +"""Слушает Gitea webhook, дёргает kb-pull.sh.""" +import hmac, hashlib, http.server, os, subprocess + +SECRET = os.environ.get('GITEA_WEBHOOK_SECRET', '').encode() +PULL = '/usr/local/bin/kb-pull.sh' + +class H(http.server.BaseHTTPRequestHandler): + def do_POST(self): + n = int(self.headers.get('Content-Length', 0) or 0) + body = self.rfile.read(n) + if SECRET: + sig = self.headers.get('X-Gitea-Signature', '') + mac = hmac.new(SECRET, body, hashlib.sha256).hexdigest() + if not hmac.compare_digest(sig, mac): + self.send_error(401); return + subprocess.Popen([PULL], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + self.send_response(202); self.end_headers() + self.wfile.write(b'queued\n') + def do_GET(self): # health-check + self.send_response(200); self.end_headers() + self.wfile.write(b'ok\n') + def log_message(self, fmt, *a): # без спама в journal + pass + +if __name__ == '__main__': + port = int(os.environ.get('PORT', '18790')) + http.server.HTTPServer(('0.0.0.0', port), H).serve_forever() +``` + +```bash +chmod +x /usr/local/bin/kb-pull-webhook.py +``` + +## 2. systemd unit `/etc/systemd/system/kb-pull-webhook.service` + +```ini +[Unit] +Description=KB pull webhook listener (Gitea -> kb-pull.sh) +After=network-online.target + +[Service] +Type=simple +Environment=GITEA_WEBHOOK_SECRET=CHANGE_ME_LONG_RANDOM +Environment=PORT=18790 +ExecStart=/usr/bin/python3 /usr/local/bin/kb-pull-webhook.py +Restart=on-failure +RestartSec=5 +# Минимальные права — listener не пишет в /root, только запускает kb-pull.sh +NoNewPrivileges=yes +PrivateTmp=yes + +[Install] +WantedBy=multi-user.target +``` + +```bash +systemctl daemon-reload +systemctl enable --now kb-pull-webhook.service +systemctl status kb-pull-webhook.service +ss -ltnp | grep 18790 +``` + +Сгенерировать секрет: +```bash +openssl rand -hex 32 +``` + +## 3. Webhook в Gitea UI + +`git.dttb.ru` → репо `oleg/knowledge-base` → **Settings → Webhooks → Add Webhook → Gitea** + +| Поле | Значение | +|---|---| +| Target URL | `http://10.0.0.239:18790/` | +| HTTP Method | POST | +| Content Type | `application/json` | +| Secret | тот же, что в systemd unit | +| Trigger On | Push Events | +| Branch filter | `main` | +| Active | ✓ | + +Жмём **Test Delivery** — должно прилететь `202 queued`. + +## 4. Опционально: ограничить порт по источнику + +Listener слушает на `0.0.0.0`. Если хочется — закрыть всё кроме Gitea LXC 136: + +```bash +iptables -A INPUT -p tcp --dport 18790 -s 10.0.0.189 -j ACCEPT +iptables -A INPUT -p tcp --dport 18790 -j DROP +# или через nftables / netbird ACL — на вкус +``` + +## 5. Проверка end-to-end + +```bash +# на Mac +cd ~/knowledge-base +date >> /tmp/test && git add -A && git commit -m "webhook test" && git push + +# на LXC 137 — должна появиться свежая строка +pct exec 137 -- tail -3 /var/log/kb-pull.log +``` + +## Откат + +```bash +systemctl disable --now kb-pull-webhook.service +rm /etc/systemd/system/kb-pull-webhook.service +rm /usr/local/bin/kb-pull-webhook.py +# в Gitea — деактивировать webhook +``` + +Cron `*/15` остаётся живым — KB продолжит синкаться по таймеру. + +## Замечания + +- **`openclaw memory` не переиндексируется автоматически** после `kb-pull`. Бот видит markdown сразу (он читает из FS), но FTS-индекс в `~/.openclaw/memory/main.sqlite` обновляется при следующем reindex-цикле. Если нужно ускорить — после pull можно дёргать `openclaw memory rebuild --incremental` (проверить наличие команды в текущей версии). Это уже отдельный шаг — добавить в `kb-pull.sh` после успешного `git pull`. +- На LXC 137 `kb-pull.sh` — простой ff-only с авто-reset при divergence. Webhook на нём ничего не ломает: тот же скрипт, та же блокировка `/tmp/kb-pull.lock`.