[2026-09-14] eagle: family/plans/home-automation-migration-t610.md family/plans/t610-addons-deployment.md
This commit is contained in:
@@ -19,13 +19,15 @@ related:
|
||||
---
|
||||
# Перенос домашней автоматизации на HP t610
|
||||
|
||||
> **Статус: В ПРОЦЕССЕ. Этап 1 (аддоны) ВЫПОЛНЕН. Этап 2 (USB + Zigbee) — ✅ z2m РАБОТАЕТ (16 устройств). Следующий шаг — mbusd + modbus-bridge (local add-ons), затем Этап 3 (перенос HA-конфига).**
|
||||
> **Статус: В ПРОЦЕССЕ. Этап 1 (аддоны) ВЫПОЛНЕН. Этап 2 (USB + Zigbee + Modbus) — ✅ z2m РАБОТАЕТ (16 устройств), ✅ mbusd РАБОТАЕТ (порт 502), ✅ modbus-bridge собран и запущен (MQTT + sniffer OK; ⏳ ждёт корректный `ha_token`). Следующий шаг — Этап 3 (перенос HA-конфига + `.storage/`).**
|
||||
> Цель: убрать всю домашнюю автоматизацию с TrueNAS (он перегружен — 17/21 ГБ RAM) на выделенный HP t610, с бэкапом конфигов на TrueNAS и в git.
|
||||
>
|
||||
> **Прогресс 2026-09-14 — Zigbee2MQTT ПЕРЕЕХАЛ И РАБОТАЕТ:**
|
||||
> - ✅ **z2m-аддон `45df7312_zigbee2mqtt` v2.14.1-1 установлен и работает.** База (`database.db`) + `network_key`/`pan_id`/`ext_pan_id`/`channel: 11` перенесены с TrueNAS 1:1 → **16 устройств на месте, переспаривание не потребовалось.** Координатор EmberZNet 7.4.5, MQTT на `core-mosquitto`. Детали и питфоллы: [[family/plans/t610-addons-deployment]] §«z2m на t610 (ВЫПОЛНЕНО)».
|
||||
> - ✅ **Логин `zont` добавлен в mosquitto** (тот же пароль, что на TrueNAS) — HA-интеграция и ZONT работают по старым креденшелам.
|
||||
> - ⏭️ Следующий шаг: **mbusd** (CH340 порт 4) и **modbus-bridge** (CH340 порт 3, новый `HA_TOKEN`) как local add-ons → Этап 3 (перенос HA-конфига + `.storage/`).
|
||||
> **Прогресс 2026-09-14 (вечер) — Modbus-сервисы переехали:**
|
||||
> - ✅ **mbusd — local add-on `local_mbusd` РАБОТАЕТ.** База: готовый образ `3cky/mbusd:latest`. Порт **502 открыт**. Устройство: `/dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0` (CH340 #2, порт 4 → шина вентиляции AT2). Питфоллы сборки local add-ons — см. [[family/plans/t610-addons-deployment]] §«Local add-ons mbusd / modbus-bridge».
|
||||
> - ✅ **modbus-bridge — local add-on `local_modbus-bridge` СОБРАН И ЗАПУЩЕН.** База `python:3.11-alpine`, `uart: true` + `host_network: true`. Устройство: by-path CH340 #1 (порт 3 → шина ZONT). **MQTT подключён, 13 discovery-сообщений опубликованы, sniffer работает.**
|
||||
> - ⏳ **Единственный незакрытый пункт Этапа 2:** HA-опрос даёт **HTTP 401** — первый токен оказался выпущен **другим инстансом HA** (`iss` ≠ `instance_id` t610). Нужен long-lived token, созданный на http://192.168.2.176. Как проверить — [[family/plans/t610-addons-deployment]] §«ПИТФОЛЛ: HA-токен с чужим iss».
|
||||
> - ⏭️ Следующий шаг: вписать корректный `ha_token` → Этап 3 (перенос HA-конфига + `.storage/`).
|
||||
|
||||
>
|
||||
> **Прогресс 2026-09-13 — 🎉 t610 запущен и в сети:**
|
||||
> - ✅ **HA OS 18.2 записана на диск, t610 загрузился и работает.** IP **`192.168.2.176`** (DHCP-имя `homeassistant`). Web UI: **`http://192.168.2.176`** (⚠️ порт **80**, не 8123).
|
||||
@@ -35,7 +37,7 @@ related:
|
||||
> - ✅ **Этап 2a ВЫПОЛНЕН 2026-09-14:** все 3 USB-устройства подключены к t610 и видны. Карта: `ttyUSB0` = CH340 #1 (порт 3 → ZONT), `ttyUSB1` = CH340 #2 (порт 4 → Vent), `ttyACM0` = Zigbee Inswift ZBP-MG21. Подробности: [[family/how-to/t610-access]] §USB. **Порты 3/4 зафиксированы — устройства не вынимать.**
|
||||
> - ✅ **Блокер 2b РЕШЁН 2026-09-14:** оба CH340 = `1a86:7523` без серийника → by-id идентичен, **но привязка по `/dev/serial/by-path/...` работает**, и аддон видит её через флаг **`uart: true`** (штатный механизм Supervisor, `devices:` не нужен). udev-алиасы `ttyZONT`/`ttyVent` на HA OS отменены (невозможны: SSH-аддон = Alpine-контейнер). Детали: [[family/plans/t610-addons-deployment]] §Этап 2.
|
||||
> - ⚠️ **Решение изменено: ставим всё АДДОНАМИ**, а не docker-compose 1:1 (Шаг 3 заменён — см. [[family/plans/t610-addons-deployment]]). Плюс: проблема udev-гонки снимается.
|
||||
> - ⏭️ Следующий шаг: Этап 2b (z2m, mbusd, modbus-bridge) → Этап 3 (перенос HA-конфига).
|
||||
> - ⏭️ Следующий шаг: Этап 3 (перенос HA-конфига) — Этап 2b (z2m, mbusd, modbus-bridge) выполнен 2026-09-14.
|
||||
>
|
||||
> **Доступ к хосту и CLI: [[family/how-to/t610-access]].**
|
||||
>
|
||||
@@ -53,13 +55,13 @@ related:
|
||||
| Сервис | Образ / способ | Почему |
|
||||
|--------|----------------|--------|
|
||||
| **Home Assistant** | **HA OS** (нативно, вся ОС) | ядро автоматизации |
|
||||
| Zigbee2MQTT | docker-контейнер | нужен USB-Zigbee координатор |
|
||||
| Mosquitto (MQTT) | docker-контейнер | брокер для z2m, Node-RED, ZONT |
|
||||
| Node-RED | docker-контейнер | логика автоматизаций |
|
||||
| mbusd | docker-контейнер | RS-485 → TCP :502 (шина вентиляции AT2) |
|
||||
| modbus-bridge | docker-контейнер (локальная сборка) | снифф 485-датчиков + виртуальные slaves для ZONT |
|
||||
| Zigbee2MQTT | HA-аддон (`45df7312_zigbee2mqtt`) | ✅ работает — 16 устройств |
|
||||
| Mosquitto (MQTT) | HA-аддон (`core_mosquitto`) | ✅ работает — 1883/1884 |
|
||||
| Node-RED | HA-аддон (`a0d7b954_nodered`) | ✅ работает — 1880 |
|
||||
| mbusd | HA local add-on (`local_mbusd`) | ✅ работает — RS-485 → TCP :502 (шина вентиляции AT2) |
|
||||
| modbus-bridge | HA local add-on (`local_modbus-bridge`) | ✅ собран/запущен — снифф 485-датчиков + виртуальные slaves для ZONT; ⏳ ждёт `ha_token` |
|
||||
| **Камера** | docker-контейнер | см. §8 — разобраться отдельно |
|
||||
| udev-скрипт tty-алиасов | нативный udev + systemd | обязателен для стабильного старта mbusd/modbus-bridge |
|
||||
| ~~udev-скрипт tty-алиасов~~ | ~~нативный udev + systemd~~ | ❌ **ОТМЕНЁН** — на HA OS невозможен; привязка serial по `/dev/serial/by-path/...` через флаг аддона `uart: true` |
|
||||
|
||||
**Остаётся на TrueNAS:** immich, media-стек (jellyfin/transmission/radarr/sonarr/prowlarr), caddy, gitea, filebrowser, webdav, syncthing, rclone, cups, portainer, hermes-taiga, xray-*.
|
||||
|
||||
@@ -197,24 +199,26 @@ uci commit dhcp && /etc/init.d/dnsmasq restart
|
||||
HA OS внутри использует host docker 29.6.2 (`ha docker info` подтверждает), но управлять им из аддона нельзя. Рабочий путь — аддоны.
|
||||
|
||||
Контейнеры (в порядке зависимостей):
|
||||
1. **mosquitto** — порт 1883, конфиги см. §5.1
|
||||
2. **zigbee2mqtt** — нужен mosquitto, USB-Zigbee`/dev/ttyACM0`
|
||||
3. **nodered** — нужен mosquitto, порт 1880
|
||||
4. **mbusd** — порт 502, USB-CH340#2 (шина AT2)
|
||||
5. **modbus-bridge** — USB-CH340#1 (шина ZONT), host-network
|
||||
1. **mosquitto** — порт 1883, конфиги см. §5.1 — ✅ аддон `core_mosquitto`
|
||||
2. **zigbee2mqtt** — USB-Zigbee by-id — ✅ аддон `45df7312_zigbee2mqtt`
|
||||
3. **nodered** — порт 1880 — ✅ аддон `a0d7b954_nodered`
|
||||
4. **mbusd** — порт 502, by-path CH340#2 (порт 4, шина AT2) — ✅ local add-on `local_mbusd`
|
||||
5. **modbus-bridge** — by-path CH340#1 (порт 3, шина ZONT), `host_network` — ✅ local add-on `local_modbus-bridge` (⏳ ждёт `ha_token`)
|
||||
6. **камера** — см. §8
|
||||
|
||||
### Шаг 4. Подключить USB-устройства и настроить udev-алиасы
|
||||
**⚠️ САМЫЙ ОПАСНЫЙ ШАГ — на t610 другая USB-топология.**
|
||||
Старые правила `KERNELS=="?-1.6:1.0"` / `"?-1.5:1.0"` **не сработают** — надо пересчитать пути.
|
||||
> 📌 **Фактически выполнено 2026-09-14** (детали, точные пути, питфоллы сборки local add-ons — в [[family/plans/t610-addons-deployment]]). Шаги 3–4 этого документа **заменены** тем планом; ниже оставлены как исторический черновик исходного подхода (docker-compose + udev), который **не применялся**.
|
||||
|
||||
### Шаг 4. Подключить USB-устройства — ✅ ВЫПОЛНЕНО 2026-09-14 (алиасы ОТМЕНЕНЫ)
|
||||
|
||||
> ✅ **Факт (2026-09-14):** все 3 USB подключены и опознаны; привязка — по `/dev/serial/by-path/...` (НЕ udev-алиасы).
|
||||
> Карта портов, by-id/by-path и sysfs-пути: **[[family/how-to/t610-access]] §USB**.
|
||||
> udev-алиасы `ttyZONT`/`ttyVent` **отменены** — на HA OS невозможны (SSH-аддон = Alpine-контейнер, нет `/etc/udev/rules.d`/`udevadm`; хостовый debug-SSH 22222 включается только флешкой). Вместо них — флаг `uart: true` в манифесте аддона.
|
||||
> Ниже (и в старом тексте Шага 4) — **черновик исходного подхода, не применявшийся.**
|
||||
|
||||
```bash
|
||||
# Подключить все 3 USB (2× CH340 + Zigbee) в ОДНИ И ТЕ ЖЕ порты навсегда!
|
||||
# На t610 определить пути:
|
||||
for d in /sys/class/tty/ttyUSB* /sys/class/tty/ttyACM*; do
|
||||
echo "--- $d"; udevadm info -q property -p $d | grep -E "ID_VENDOR_ID|ID_MODEL_ID|ID_SERIAL|DEVPATH"
|
||||
done
|
||||
# DEVPATH даст что-то вида /devices/pci.../usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0
|
||||
# → путь для правила: KERNELS=="1-1.2:1.0" (или с wildcard "?-1.2:1.0")
|
||||
# ИСТОРИЧЕСКИЙ ЧЕРНОВИК (не применять): на t610 другая USB-топология, старые KERNELS не сработают.
|
||||
# udevadm в SSH-аддоне НЕТ — читать sysfs (/sys/class/tty/<tty>/device), см. t610-access §USB.
|
||||
```
|
||||
```
|
||||
Составить новые `99-tty-alias.rules` **по серийникам, а не по портам** — надёжнее:
|
||||
```
|
||||
@@ -267,7 +271,11 @@ nodered/settings.js, package.json, node_modules (не обязательно)
|
||||
```
|
||||
compose: порт 1880, `TZ=Asia/Novosibirsk`.
|
||||
|
||||
### 5.4 mbusd
|
||||
### 5.4 mbusd — ✅ РЕАЛИЗОВАНО КАК LOCAL ADD-ON (2026-09-14)
|
||||
|
||||
> ⚠️ **Фактически на t610 — HA local add-on `local_mbusd`, НЕ docker-compose.** Тот же образ `3cky/mbusd:latest`, но обёрнут в аддон: `/addons/mbusd/{config.yaml,Dockerfile,run.sh}`. Serial — `/dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0` (CH340 #2, порт 4). Порт 502 открыт. Детали и питфоллы: [[family/plans/t610-addons-deployment]] §«Local add-ons mbusd / modbus-bridge».
|
||||
> Ниже — исходный черновик (docker-compose с TrueNAS), **не применявшийся**.
|
||||
|
||||
```
|
||||
mbusd/mbusd.conf # device=/dev/ttyUSB0, speed=9600, port=502
|
||||
```
|
||||
@@ -284,7 +292,11 @@ services:
|
||||
restart: unless-stopped
|
||||
```
|
||||
|
||||
### 5.5 modbus-bridge (локальная сборка)
|
||||
### 5.5 modbus-bridge — ✅ РЕАЛИЗОВАНО КАК LOCAL ADD-ON (2026-09-14)
|
||||
|
||||
> ⚠️ **Фактически на t610 — HA local add-on `local_modbus-bridge`, НЕ docker-compose.** База `python:3.11-alpine`, `uart: true` + `host_network: true`. Serial — by-path CH340 #1 (порт 3). Опции аддона: `device`, `baudrate`, **`ha_token`**, `mqtt_user`, `mqtt_password`; `run.sh` генерирует runtime `config.yml` из шаблона (`data/config.template.tmpl`). MQTT + sniffer работают; ⏳ HA-опрос 401 (токен не от этого инстанса).
|
||||
> Ниже — исходный черновик (docker-compose с TrueNAS), **не применявшийся**.
|
||||
|
||||
```
|
||||
modbus-bridge/Dockerfile
|
||||
modbus-bridge/modbus_ha_bridge.py # основной скрипт
|
||||
@@ -307,7 +319,9 @@ services:
|
||||
- HA_TOKEN=<long-lived token из HA>
|
||||
restart: unless-stopped
|
||||
```
|
||||
> ⚠️ `HA_TOKEN` — long-lived token. **После переноса HA на t610 — сгенерировать НОВЫЙ токен** в HA (Профиль → Security → Long-lived tokens), т.к. старый привязан к прежней инсталляции (фактически токен привязан к HA `auth`, который мы не переносим вместе с `.storage` — см. примечание ниже).
|
||||
> ⚠️ `HA_TOKEN` — long-lived token. **После переноса HA на t610 — сгенерировать НОВЫЙ токен** в HA (Профиль → Security → Long-lived tokens), т.к. старый привязан к прежней инсталляции.
|
||||
> 📌 **Подтверждено на практике 2026-09-14:** токен, выпущенный другим инстансом, отвергается с **401** — HA сверяет `iss` в JWT с `instance_id` (см. [[family/plans/t610-addons-deployment]] §«ПИТФОЛЛ: HA-токен с чужим iss»).
|
||||
|
||||
|
||||
### 5.6 Home Assistant config
|
||||
```
|
||||
@@ -344,20 +358,24 @@ system/start-modbus.sh # скрипт ожидания tty перед doc
|
||||
|
||||
## 6. Чек-лист проверки после переноса
|
||||
|
||||
- [ ] HA UI открывается:`http://<t610-IP>:8123`
|
||||
- [ ] `docker ps` — все 5–6 контейнеров Up
|
||||
- [ ] `ls -la /dev/ttyZONT /dev/ttyVent /dev/ttyACM0` — алиасы созданы, указывают на правильные ttyUSB
|
||||
- [ ] **Zigbee:** устройства видны в zigbee2mqtt UI (`http://<t610-IP>:8080` или HA), `permit_join` работает, датчики обновляются
|
||||
- [ ] **MQTT:**`mosquitto_sub -h localhost -t '#' -v` — видно трафик z2m
|
||||
- [ ] **Modbus вентиляция:** HA видит AT2, заслонки переключаются (проверить физически!)
|
||||
- [ ] **ZONT:** датчики 485 (Dining/Kids/Bedroom) в ZONT **не «недоступные»**, температуры идут
|
||||
- [ ] **modbus-bridge:** логи без ошибок, MQTT-топики `modbus/sensors/*` публикуются
|
||||
- [ ] **Node-RED:**`http://<t610-IP>:1880` — flows загружены, creds на месте
|
||||
- [ ] **ZONT MQTT:** ZONT шлёт данные на `t610:1883` (проверить подпиской)
|
||||
> ℹ️ Обновлён 2026-09-14 под аддонную архитектуру (был: docker ps / tty-алиасы / порт 8123 — всё неактуально).
|
||||
> ✅ = уже подтверждено на живом t610; ⏳ = ждёт Этапа 3.
|
||||
|
||||
- [x] ✅ HA UI открывается: **`http://192.168.2.176`** (⚠️ порт **80**, не 8123)
|
||||
- [ ] `ha apps` — все аддоны `started` (z2m, mosquitto, nodered, mbusd, modbus-bridge, core_ssh)
|
||||
- [x] ✅ **Serial:** by-path/b-id видны в аддонах (`uart: true`); привязка по `/dev/serial/by-path/...` (НЕ tty-алиасы — они на HA OS невозможны)
|
||||
- [x] ✅ **Zigbee:** z2m работает — **16 устройств** подхватились из старой базы, координатор EmberZNet 7.4.5
|
||||
- [x] ✅ **MQTT:** трафик z2m идёт (discovery-сообщения публикуются), логин `zont` работает
|
||||
- [ ] **Modbus вентиляция:** HA видит AT2, заслонки переключаются (проверить физически!) — требует Этапа 3 (перенос HA-конфига)
|
||||
- [ ] **ZONT:** датчики 485 (Dining/Kids/Bedroom) в ZONT **не «недоступные»**, температуры идут — требует `ha_token` в modbus-bridge + Этап 3
|
||||
- [x] ✅ **modbus-bridge:** sniffer работает, MQTT подключён, **13 discovery-топиков** `modbus/sensors/*` опубликованы (⏳ HA-опрос 401 — ждёт корректный токен)
|
||||
- [x] ✅ **mbusd:** порт 502 открыт, устройство на by-path CH340 #2 (порт 4)
|
||||
- [ ] **Node-RED:** `http://192.168.2.176:1880` — flows загружены, creds на месте
|
||||
- [ ] **ZONT MQTT:** ZONT шлёт данные на `t610:1883` (проверить подпиской) — требует перенаправления GPON-роутера
|
||||
- [ ] **HA автоматизации:** все работают (свет, вентиляция, ГВС) — функции автоматизаций срабатывают
|
||||
- [ ] **Floor plan:** dashboard с планом этажей отображается
|
||||
- [ ] **Камера:** доступна по `cam.mallexxx.duckdns.org` (если переехала)
|
||||
- [ ] **Стабильность:**`reboot` t610 → всё поднялось само, без ручных команд (главный тест — гонка udev!)
|
||||
- [ ] **Стабильность:** `reboot` t610 → всё поднялось само, без ручных команд
|
||||
|
||||
## 7. Отключение на TrueNAS (только после проверки!)
|
||||
|
||||
|
||||
@@ -179,7 +179,36 @@ ha apps restart "$SLUG"
|
||||
11. [x] **СПОСОБ ПРИВЯЗКИ РЕШЁН 2026-09-14** — привязка по **`by-path`**, никаких udev-алиасов. Механизм: флаг `uart: true` в манифесте аддона даёт доступ ко **всем** serial включая `/dev/serial/by-path/` (проверено на живом t610: `core_ssh` uart:true видит все by-path; z2m тоже uart:true). `devices:` прописывать не надо. Подробности: [[family/how-to/t610-access]] §USB. **Блокер снят.**
|
||||
12. [x] ✅ **z2m-аддон УСТАНОВЛЕН И РАБОТАЕТ (2026-09-14)** — аддон `45df7312_zigbee2mqtt` v2.14.1-1, serial по by-id, база перенесена 1:1, **16 устройств на месте, переспаривание не потребовалось.** Подробности — §«z2m на t610 (ВЫПОЛНЕНО)» выше.
|
||||
13. [x] ✅ **mbusd local add-on СОБРАН И РАБОТАЕТ (2026-09-14)** — slug `local_mbusd`, порт **502 открыт** (проверено `nc` с Mac), устройство by-path CH340 #2 (порт 4). Подробности — §«Local add-ons mbusd / modbus-bridge» ниже.
|
||||
14. [x] ✅ **modbus-bridge local add-on СОБРАН И ЗАПУЩЕН (2026-09-14)** — slug `local_modbus-bridge`, устройство by-path CH340 #1 (порт 3), конфиг валиден, sniffer работает. ⏳ **Ждёт `HA_TOKEN` + MQTT-пароль** (без них MQTT code 5 = not authorized, HA poller выключен).
|
||||
14. [x] ✅ **modbus-bridge local add-on СОБРАН И ЗАПУЩЕН (2026-09-14)** — slug `local_modbus-bridge`, устройство by-path CH340 #1 (порт 3), конфиг валиден, **MQTT подключён, 13 discovery-сообщений ушли**, sniffer работает. ⏳ **HA-опрос даёт HTTP 401** — нужен корректный long-lived token от ЭТОГО инстанса HA (см. питфолл ниже).
|
||||
|
||||
#### ⚠️ ПИТФОЛЛ: HA-токен с чужим `iss` отвергается (401)
|
||||
|
||||
Первый присланный `ha_token` (от Alex) при обращении к API давал **401 и с Mac, и из аддона**. Токен синтаксически валиден (payload: `iss`/`iat`/`exp` до 2036), НО:
|
||||
|
||||
| | Значение |
|
||||
|---|---|
|
||||
| `iss` в токене | `76e344271cb74a2098c6de2839a79f0f` |
|
||||
| **`instance_id` этого HA** (`/config/.storage/core.uuid`) | **`d3b24dad8c684291a31b687cff7f9d30`** |
|
||||
|
||||
→ Токен выпущен **другим инстансом** (старый HA на TrueNAS / другая установка). HA проверяет `iss` и отвергает чужой токен.
|
||||
|
||||
**Как проверить токен перед вставкой:**
|
||||
```bash
|
||||
# payload токена (base64url, средняя часть)
|
||||
echo '<PAYLOAD_PART>' | base64 -D
|
||||
# сравнить "iss" с instance_id:
|
||||
ssh ... root@192.168.2.176 'jq -r .data.uuid /config/.storage/core.uuid'
|
||||
```
|
||||
**Создавать токен только на http://192.168.2.176** → профиль `ha_admin` → Security → Long-lived access tokens.
|
||||
**Быстрая проверка:** `curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer <TOKEN>" http://192.168.2.176/api/` → должно быть **200** (401 = токен не от этого инстанса).
|
||||
|
||||
**Что уже подтверждено работоспособным (не зависит от токена):**
|
||||
- MQTT-подключение к `core-mosquitto` ✓
|
||||
- Публикация discovery-сообщений (13 шт: dining kids bedroom × co2/formaldehyde/tvoc/pm2.5/pm10/temp/humidity) ✓
|
||||
- Serial sniffing на CH340 порт 3 (шина ZONT) ✓
|
||||
- HA poller запускается, но получает 401
|
||||
|
||||
**Настройка токена через Supervisor API (рабочий рецепт):** см. `~/tmp-t610/set_bridge_opts.sh`. ⚠️ Значения токена **маскируются** при прогоне через bash-переменную/`echo` — записывать токен в JSON-файл на t610 через `jq --arg` из env, НЕ подставлять в строку через `echo`/`sed`.
|
||||
|
||||
### ✅ Local add-ons mbusd / modbus-bridge — ВЫПОЛНЕНО (2026-09-14)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user