Липки: карточка объекта (клиент Антон, 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:
95
projects/lipki/README.md
Normal file
95
projects/lipki/README.md
Normal 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`, `Звенигород`, `Звенигородский район`, `посёлок Липки` — повторено явно, чтобы полнотекстовый поиск Максимки гарантированно цеплял этот файл при любом написании.
|
||||||
148
snippets/openclaw-kb-webhook.md
Normal file
148
snippets/openclaw-kb-webhook.md
Normal 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`.
|
||||||
Reference in New Issue
Block a user