OPS

Deploy & Ops

systemd · Docker · monitoring · checklist

Stack — Qué Corre Dónde

 ┌─────────────────────────────────────────────────────┐
 │              RPi 3B — Yocto Poky 4.3.4              │
 │              └─ Docker (Bookworm container)          │
 │                                                      │
 │  systemd                                             │
 │  ├── murmurd.service      (:64738)  ← ya existente  │
 │  ├── go2rtc.service       (:1984)   ← NUEVO         │
 │  └── oasis.service        (:3000)   ← ya existente  │
 │       └── audio-bridge    (interno)                  │
 │       └── node-datachannel (interno)                 │
 └─────────────────────────────────────────────────────┘

go2rtc.service (NUEVO)

# /etc/systemd/system/go2rtc.service [Unit] Description=go2rtc media server After=network.target [Service] Type=simple User=video ExecStart=/usr/local/bin/go2rtc \ -config /etc/go2rtc/go2rtc.yaml Restart=on-failure RestartSec=5 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
sudo systemctl daemon-reload sudo systemctl enable --now go2rtc.service
Añadir After=go2rtc.service mumble-server.service en oasis.service para que el proxy arranque tras los upstreams.

Docker — Integración

# docker-compose.yml (fragmento) services: snh: image: snh-bookworm:latest devices: - /dev/video0:/dev/video0 # cámara ports: - "3000:3000" # Oasis (único puerto público) volumes: - mumble-data:/var/lib/mumble - ./go2rtc.yaml:/etc/go2rtc/go2rtc.yaml:ro
No exponer :1984 ni :64738 en ports. Solo :3000 sale al exterior.

Pre-Flight Checklist

#CheckComandoEsperado
1Cámara detectadav4l2-ctl --list-devices/dev/video0
2User en grupo videogroups"video"
3go2rtc binariowhich go2rtc/usr/local/bin/go2rtc
4go2rtc.yaml válidogo2rtc -config ... (no crash)Listening on :1984
5MJPEG streamcurl -I localhost:1984/api/frame.mjpeg?src=solar-cam200 + multipart
6HLS playlistcurl -s localhost:1984/api/stream.m3u8?src=solar-cam | head#EXTM3U
7Snapshotcurl -o snap.jpg localhost:1984/api/frame.jpeg?src=solar-camJPEG válido
8murmurd activoss -tlnp | grep 64738LISTEN
9Oasis activocurl -I localhost:3000200
10Proxy videocurl -I localhost:3000/video200 + multipart
11Proxy HLScurl -I localhost:3000/video.m3u8200
12RAM availablefree -m | awk '/Mem/{print $7}'> 150 MB

Health Check Script

#!/bin/bash — /usr/local/bin/snh-health.sh # Video: go2rtc alive? curl -sf http://127.0.0.1:1984/api/streams > /dev/null \ || systemctl restart go2rtc.service # Audio: murmurd alive? ss -tlnp | grep -q :64738 \ || systemctl restart mumble-server.service # Oasis alive? curl -sf http://127.0.0.1:3000/ > /dev/null \ || systemctl restart oasis.service # RAM check FREE_MB=$(free -m | awk '/^Mem:/{print $7}') [ "$FREE_MB" -lt 100 ] && \ logger -t snh-health -p warning "LOW RAM: ${FREE_MB}MB"
# crontab */5 * * * * /usr/local/bin/snh-health.sh 2>&1 | logger -t snh-health

Boot Order

  [kernel modules]  (bcm2835-v4l2 si CSI)
       ▼
  [murmurd]  ← sin deps nuevas
       │
  [go2rtc]   ← After=network.target
       │
  [oasis]    ← After=go2rtc.service mumble-server.service
       ├── audio-bridge
       └── node-datachannel

Logs — Comandos Útiles

journalctl -u go2rtc -f --no-pager journalctl -u mumble-server -f --no-pager journalctl -u oasis -f --no-pager journalctl -t snh-health --since "1 hour ago" free -m && ps aux --sort=-%mem | head -10

Keywords

systemd ExecStart Docker go2rtc.yaml health check journalctl crontab Yocto Bookworm free -m