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)
[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
services:
snh:
image: snh-bookworm:latest
devices:
- /dev/video0:/dev/video0
ports:
- "3000:3000"
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
| # | Check | Comando | Esperado |
| 1 | Cámara detectada | v4l2-ctl --list-devices | /dev/video0 |
| 2 | User en grupo video | groups | "video" |
| 3 | go2rtc binario | which go2rtc | /usr/local/bin/go2rtc |
| 4 | go2rtc.yaml válido | go2rtc -config ... (no crash) | Listening on :1984 |
| 5 | MJPEG stream | curl -I localhost:1984/api/frame.mjpeg?src=solar-cam | 200 + multipart |
| 6 | HLS playlist | curl -s localhost:1984/api/stream.m3u8?src=solar-cam | head | #EXTM3U |
| 7 | Snapshot | curl -o snap.jpg localhost:1984/api/frame.jpeg?src=solar-cam | JPEG válido |
| 8 | murmurd activo | ss -tlnp | grep 64738 | LISTEN |
| 9 | Oasis activo | curl -I localhost:3000 | 200 |
| 10 | Proxy video | curl -I localhost:3000/video | 200 + multipart |
| 11 | Proxy HLS | curl -I localhost:3000/video.m3u8 | 200 |
| 12 | RAM available | free -m | awk '/Mem/{print $7}' | > 150 MB |
Health Check Script
curl -sf http://127.0.0.1:1984/api/streams > /dev/null \
|| systemctl restart go2rtc.service
ss -tlnp | grep -q :64738 \
|| systemctl restart mumble-server.service
curl -sf http://127.0.0.1:3000/ > /dev/null \
|| systemctl restart oasis.service
FREE_MB=$(free -m | awk '/^Mem:/{print $7}')
[ "$FREE_MB" -lt 100 ] && \
logger -t snh-health -p warning "LOW RAM: ${FREE_MB}MB"
*/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