Липки: карточка объекта (клиент Антон, 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>
This commit is contained in:
dttb
2026-05-06 14:03:36 +03:00
parent bf845e2dcb
commit 80fd8ca7bf
2 changed files with 243 additions and 0 deletions

95
projects/lipki/README.md Normal file
View File

@@ -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`, `Звенигород`, `Звенигородский район`, `посёлок Липки` — повторено явно, чтобы полнотекстовый поиск Максимки гарантированно цеплял этот файл при любом написании.

View File

@@ -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`.