Files
go-service/docs/operations.md
2026-07-17 15:57:05 +03:00

13 KiB
Raw Permalink Blame History

Руководство администратора

Установка, настройка и обслуживание GPIO Monitor на Raspberry Pi.

Аудитория: администраторы и операторы.

Содержание

Требования

  • Raspberry Pi (целевая платформа — ARM64, Raspberry Pi OS Bookworm);
  • C-программа захвата gpio-interrupt (WiringPi) на устройстве — поставляется отдельно, в репозитории её нет;
  • alsa-utils (arecord) — для монитора уровня звука;
  • 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; итоговый файл: build/gpio-monitor-server_<база>-build<N>_arm64.deb, где N — число git-коммитов (например gpio-monitor-server_1.0.0-build83_arm64.deb).

sudo dpkg -i build/gpio-monitor-server_1.0.0-build83_arm64.deb

Пакет при установке (debian/preinst, 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 запускает сервер с параметрами -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).

Управление:

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. Зависимости и сборка

sudo apt update
sudo apt install -y golang git build-essential wiringpi nodejs npm alsa-utils
git clone <your-repo> && cd golang
make init && make build     # подробности — development.md

2. Канал данных: systemd socket-activation

FIFO /tmp/gpio_pipe и программу захвата запускает systemd (scripts/monitor-gpio.socket, scripts/monitor-gpio.service): socket-юнит создаёт FIFO, service-юнит направляет stdout gpio-interrupt в него.

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 (запуск собранного бинарника от обычного пользователя). Поправьте WorkingDirectory и путь в ExecStart под своё расположение проекта, затем:

sudo cp scripts/go2monitor.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now go2monitor.service

Либо запустите вручную:

./build/gpio-monitor-server -pipe /tmp/gpio_pipe -retention-hours=72 -retention-mb=2000

4. Проверка

sudo systemctl status monitor-gpio.service
curl http://localhost:8080/api/health

Дашборд: http://<IP>:8080/ (редирект на dashboard.html), просмотр истории: http://<IP>:8080/logs.html.

Параметры командной строки

Полный список флагов gpio-monitor-server (источник — 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:

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

Ограничить доступ:

# Только локальная сеть
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): поток cam_mjpeg — MJPEG 640×480 15 fps с /dev/video0 через ffmpeg, API на порту 1984 (также RTSP :8554, WebRTC :8555).

./scripts/go2rtc -config scripts/go2rtc.yaml

Проверка: http://<IP>:1984 (встроенный интерфейс go2rtc), http://<IP>:1984/api/stream.mjpeg?src=cam_mjpeg (прямой поток). Go-сервер проксирует этот поток на /api/cam.

Микрофон

Уровень звука снимается через arecord (пакет alsa-utils); USB-микрофон находится автоматически. Проверка:

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 <user>). При физическом отвале микрофона сервер сам пытается восстановить захват каждые 5 секунд.

Логи: где лежат и как смотреть

Пути зависят от режима (подробно — 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

Просмотр:

# Пакетная установка — утилита 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. Сервер запущен?
    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. Логи:
    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 <user>.

Камера не показывает

  1. go2rtc запущен и отвечает: curl http://localhost:1984/api/streams;
  2. /dev/video0 существует;
  3. /api/stream возвращает available: true. Учтите: проверка доступности всегда идёт на localhost:1984 независимо от -camera-url (см. api.md).