# Руководство администратора Установка, настройка и обслуживание GPIO Monitor на Raspberry Pi. **Аудитория:** администраторы и операторы. ## Содержание - [Требования](#требования) - [Установка из deb-пакета](#установка-из-deb-пакета) - [Ручная установка](#ручная-установка) - [Параметры командной строки](#параметры-командной-строки) - [Firewall (nftables)](#firewall-nftables) - [Wi-Fi Access Point](#wi-fi-access-point) - [Камера (go2rtc)](#камера-go2rtc) - [Микрофон](#микрофон) - [Логи: где лежат и как смотреть](#логи-где-лежат-и-как-смотреть) - [Диагностика проблем](#диагностика-проблем) ## Требования - Raspberry Pi (целевая платформа — ARM64, Raspberry Pi OS Bookworm); - C-программа захвата `gpio-interrupt` (WiringPi) на устройстве — поставляется отдельно, в репозитории её нет; - `alsa-utils` (`arecord`) — для монитора уровня звука; - go2rtc — для видеопотока камеры (бинарник в [scripts/go2rtc](../scripts/go2rtc)); - systemd. Назначение GPIO-пинов: ``` WR/STROBE = GPIO27 DATA BUS: D0 = GPIO21 D4 = GPIO25 D1 = GPIO7 D5 = GPIO24 D2 = GPIO6 D6 = GPIO23 D3 = GPIO5 D7 = GPIO22 ``` ## Установка из deb-пакета Рекомендуемый способ развёртывания. Сборка пакета — см. [development.md](development.md#сборка-deb-пакета); итоговый файл: `build/gpio-monitor-server_<база>-build_arm64.deb`, где `N` — число git-коммитов (например `gpio-monitor-server_1.0.0-build83_arm64.deb`). ```bash sudo dpkg -i build/gpio-monitor-server_1.0.0-build83_arm64.deb ``` Пакет при установке ([debian/preinst](../debian/preinst), [debian/postinst](../debian/postinst)): - создаёт системного пользователя `gpio-monitor` (группы `gpio`, `dialout`) и каталоги `/var/log/gpio-monitoring`, `/var/lib/gpio-monitoring`, `/opt/gpio-monitoring/web`; - ставит бинарник в `/usr/bin/gpio-monitor-server` и утилиту `gpio-logs` в `/usr/bin/gpio-logs`; - кладёт unit `gpio-monitor-server.service` в `/etc/systemd/system/` и справочный конфиг в `/etc/gpio-monitoring/config`; - включает и **сразу запускает** сервис. Unit [debian/gpio-monitor-server.service](../debian/gpio-monitor-server.service) запускает сервер с параметрами `-retention-hours=72 -retention-mb=2000 -retention-interval=60 -rotation-check-interval=1 -buffer-size=10240 -human-log-interval=5` (обратите внимание: retention здесь 72 часа, а не встроенные по умолчанию 48). Чтобы изменить параметры, отредактируйте `ExecStart` в unit-файле и выполните `sudo systemctl daemon-reload && sudo systemctl restart gpio-monitor-server`. > Файл `/etc/gpio-monitoring/config` — справочный: сервис его **не читает**, параметры берутся только из `ExecStart` (см. [tech-debt.md](tech-debt.md#пакеты-internal)). Управление: ```bash sudo systemctl status gpio-monitor-server sudo systemctl restart gpio-monitor-server gpio-logs -f # журнал сервиса ``` Удаление: `sudo apt remove gpio-monitor-server`; полная очистка с логами и пользователем: `sudo apt purge gpio-monitor-server`. ## Ручная установка ### 1. Зависимости и сборка ```bash sudo apt update sudo apt install -y golang git build-essential wiringpi nodejs npm alsa-utils git clone && cd golang make init && make build # подробности — development.md ``` ### 2. Канал данных: systemd socket-activation FIFO `/tmp/gpio_pipe` и программу захвата запускает systemd ([scripts/monitor-gpio.socket](../scripts/monitor-gpio.socket), [scripts/monitor-gpio.service](../scripts/monitor-gpio.service)): socket-юнит создаёт FIFO, service-юнит направляет stdout `gpio-interrupt` в него. ```bash sudo cp scripts/monitor-gpio.service scripts/monitor-gpio.socket /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable monitor-gpio.socket monitor-gpio.service sudo systemctl start monitor-gpio.service ``` > Пути в `monitor-gpio.service` (`/home/user/WiringPi/examples/gpio-interrupt`) и владелец FIFO в `monitor-gpio.socket` (`SocketUser=user`) заданы под конкретное устройство — проверьте их перед установкой. ### 3. Go-сервер как сервис Шаблон — [scripts/go2monitor.service](../scripts/go2monitor.service) (запуск собранного бинарника от обычного пользователя). Поправьте `WorkingDirectory` и путь в `ExecStart` под своё расположение проекта, затем: ```bash sudo cp scripts/go2monitor.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now go2monitor.service ``` Либо запустите вручную: ```bash ./build/gpio-monitor-server -pipe /tmp/gpio_pipe -retention-hours=72 -retention-mb=2000 ``` ### 4. Проверка ```bash sudo systemctl status monitor-gpio.service curl http://localhost:8080/api/health ``` Дашборд: `http://:8080/` (редирект на `dashboard.html`), просмотр истории: `http://:8080/logs.html`. ## Параметры командной строки Полный список флагов `gpio-monitor-server` (источник — [cmd/server/main.go](../cmd/server/main.go)): | Параметр | По умолчанию | Описание | |---|---|---| | `-pipe` | `/tmp/gpio_pipe` | Путь к FIFO pipe | | `-port` | `:8080` | Адрес/порт веб-сервера | | `-retention-hours` | `48` | Часы хранения `.bin`-логов (0 = отключено) | | `-retention-mb` | `5000` | Максимальный суммарный размер `.bin`-логов, МБ (0 = отключено) | | `-retention-interval` | `15` | Интервал проверки retention, мин | | `-rotation-check-interval` | `1` | Интервал проверки ротации, мин | | `-buffer-size` | `10240` | Размер кольцевого буфера, элементов | | `-silence-5min` | `5` | Порог тишины для события `ТИШИНА_5МИН`, мин | | `-silence-10min` | `10` | Порог тишины для события `ТИШИНА_10МИН`, мин | | `-watchdog-interval` | `1` | Интервал проверки watchdog, мин | | `-alert-cooldown` | `10` | Анти-спам между одинаковыми алертами, сек | | `-human-log-interval` | `5` | Интервал записи human-логов, сек | | `-camera-url` | `http://127.0.0.1:1984/api/stream.mjpeg?src=cam_mjpeg` | URL MJPEG-потока для прокси `/api/cam` | ## Firewall (nftables) На Raspberry Pi OS Bookworm по умолчанию активен nftables, блокирующий входящие порты, кроме SSH (22). Разрешить порт 8080: ```bash sudo nft add rule inet filter input tcp dport 8080 accept # Проверить и сохранить sudo nft list ruleset sudo nft list ruleset | sudo tee /etc/nftables.conf > /dev/null sudo systemctl enable nftables sudo systemctl restart nftables ``` Ограничить доступ: ```bash # Только локальная сеть sudo nft add rule inet filter input ip saddr 10.1.1.0/24 tcp dport 8080 accept # Только конкретный IP sudo nft add rule inet filter input ip saddr 192.168.1.100 tcp dport 8080 accept # Только через Wi-Fi AP sudo nft add rule inet filter input iifname "wlan0" tcp dport 8080 accept ``` ## Wi-Fi Access Point Raspberry Pi может работать точкой доступа: - SSID: `fix_me`, IP устройства: `192.168.77.1`; - подключение: `ssh user@192.168.77.1`; - дашборд: `http://192.168.77.1:8080`. ## Камера (go2rtc) Видеопоток отдаёт go2rtc (конфиг — [scripts/go2rtc.yaml](../scripts/go2rtc.yaml)): поток `cam_mjpeg` — MJPEG 640×480 15 fps с `/dev/video0` через ffmpeg, API на порту `1984` (также RTSP `:8554`, WebRTC `:8555`). ```bash ./scripts/go2rtc -config scripts/go2rtc.yaml ``` Проверка: `http://:1984` (встроенный интерфейс go2rtc), `http://:1984/api/stream.mjpeg?src=cam_mjpeg` (прямой поток). Go-сервер проксирует этот поток на `/api/cam`. ## Микрофон Уровень звука снимается через `arecord` (пакет `alsa-utils`); USB-микрофон находится автоматически. Проверка: ```bash arecord -l # **** List of CAPTURE Hardware Devices **** # card 3: Device [USB PnP Sound Device], device 0: USB Audio [USB Audio] ``` Если список пуст — микрофон не определился; сервер при этом работает нормально, но `/api/health` отдаёт `sound_level: 0`. Пользователь, от которого запущен сервис, должен состоять в группе `audio` (`sudo usermod -aG audio `). При физическом отвале микрофона сервер сам пытается восстановить захват каждые 5 секунд. ## Логи: где лежат и как смотреть Пути зависят от режима (подробно — [data-formats.md](data-formats.md#пути-хранения)): | Файл | Пакетная установка | Ручной запуск (dev) | |---|---|---| | Бинарные данные `gpio-*.bin` | `/var/log/gpio-monitoring/data/` | `~/.local/share/gpio-monitoring/logs/data/` | | События | `/var/log/gpio-monitoring/events.log`, `events_human.log` | `~/.local/share/gpio-monitoring/logs/...` | | GPIO human-лог | `/var/log/gpio-monitoring/gpio_human.log` | `~/.local/share/gpio-monitoring/logs/gpio_human.log` | | Журнал сервиса | `journalctl -u gpio-monitor-server` | stdout | Просмотр: ```bash # Пакетная установка — утилита gpio-logs: gpio-logs -f # журнал сервиса (journalctl) gpio-logs -e # события gpio-logs -g # GPIO human-лог gpio-logs -d # сырые бинарные данные (xxd) # Dev-режим: ./scripts/view_logs.sh # сводная статистика логов ``` Место на диске контролируется retention (см. флаги `-retention-*`); при значениях по умолчанию deb-юнита — не более 2000 МБ и 72 часов бинарных данных. ## Диагностика проблем ### Dashboard не открывается 1. Сервер запущен? ```bash ps aux | grep gpio-monitor-server sudo systemctl status gpio-monitor-server # или go2monitor / monitor-gpio при ручной установке ``` 2. Firewall: `sudo nft list ruleset | grep 8080` 3. Сервер слушает нужный интерфейс: `sudo ss -tlnp | grep 8080` (должно быть `*:8080` или `0.0.0.0:8080`) 4. Маршрутизация: `ip route show` 5. Логи: ```bash sudo journalctl -u gpio-monitor-server -f sudo tail -f /var/log/gpio-monitoring/events_human.log # пакетная установка tail -f ~/.local/share/gpio-monitoring/logs/events_human.log # dev-режим ``` 6. FIFO существует: `ls -la /tmp/gpio_pipe` ### Статус «Нет связи» на дашборде Данные не поступают дольше 15 секунд. Проверьте цепочку: `monitor-gpio.service` запущен → FIFO существует → в `events_human.log` нет свежих `PIPE_НЕ_НАЙДЕН`/`PIPE_ОТКЛЮЧЕН` → события `ТИШИНА_5МИН` укажут, что pipe жив, но данных нет (проблема на стороне захвата/шины). ### Индикатор «🔊 ЗВУК» не реагирует 1. `which arecord && arecord -l` — arecord установлен и видит микрофон; 2. в журнале сервера при старте нет строки `Аудио-монитор не запущен (микрофон недоступен?)`; 3. пользователь сервиса в группе `audio`: `groups `. ### Камера не показывает 1. go2rtc запущен и отвечает: `curl http://localhost:1984/api/streams`; 2. `/dev/video0` существует; 3. `/api/stream` возвращает `available: true`. Учтите: проверка доступности всегда идёт на `localhost:1984` независимо от `-camera-url` (см. [api.md](api.md#известные-особенности)).