Umbau mit cameraSwitch

This commit is contained in:
chk
2026-06-05 06:36:48 +02:00
parent 0ea475d6b6
commit 8c8c769e22
10 changed files with 641 additions and 839 deletions

View File

@@ -1,73 +1,42 @@
name: approbotwebcam
# ════════════════════════════════════════════════════════════════════════════
# MJPEG-AUFBAU go2rtc (Streaming) + Node.js (Viewer/Proxy/API)
# NODE-MJPEG-SCHALTER ein Node-Container besitzt die Kameras selbst
# ════════════════════════════════════════════════════════════════════════════
#
# Portainer: Stack → Web editor → dieses YAML einfügen → Deploy.
# Vorher in Portainer → "Environment variables":
# Node startet pro Kamera EINEN FFmpeg (640 MJPEG passthrough) und verteilt den
# Stream als multipart/x-mixed-replace an die Browser (<img>). Für HD-Snapshots
# stoppt der Schalter den Live-FFmpeg sauber (Prozess-close = Gerät frei),
# greift 1280×960, schaltet zurück. go2rtc wird NICHT mehr gebraucht.
#
# Warum so: go2rtcs API konnte nicht zuverlässig melden, wann FFmpeg das Gerät
# freigibt → Race (zwei Encoder auf /dev/videoN = ~108% CPU). Wenn Node FFmpeg
# selbst startet, ist dessen 'close'-Event der harte Beweis „Gerät frei".
# Siehe doc/09_Bug_reports.md.
#
# Portainer: Stack → Web editor → dieses YAML → Deploy.
# APP_PATH = /absoluter/pfad/zum/appRobotWebcam (Code muss dort liegen)
#
# WICHTIG: Vor jedem Redeploy sicherstellen, dass server.js / public/ / src/
# auf dem Server unter APP_PATH aktuell sind (Synology-Sync abwarten).
#
# Firewall (Internet): TCP 8444 (Viewer+API)
# Port 1984 (go2rtc) NICHT nach aussen läuft nur intern via localhost.
# UDP 8555 (WebRTC) wird NICHT verwendet Viewer läuft im MJPEG-Modus.
# Firewall (Internet): TCP 8444 (Viewer + Stream + API). Sonst nichts mehr.
#
# Zugriff:
# Viewer: http://<host>:8444/
# Snapshot (Homing) http://<host>:8444/api/snapshot/cam0
# go2rtc-Debug-UI http://<host>:1984/ (nur intern/LAN)
# Viewer: http://<host>:8444/
# Live-Stream: http://<host>:8444/api/stream/cam0
# Snapshot (Homing): http://<host>:8444/api/snapshot/cam0 (+ /hires)
#
# ROLLBACK auf den alten go2rtc-Aufbau: git checkout <commit> -- docker-compose.yaml
# server.js public/ src/ (der go2rtc-Stand liegt in der Git-Historie).
# ════════════════════════════════════════════════════════════════════════════
configs:
go2rtc_yaml:
content: |
streams:
# 640x480 MJPEG, Re-Encode in go2rtc (~50% CPU für 2 Kameras mit Clients).
# Viewer läuft im MJPEG-Modus (MODE='mjpeg' in viewer.js) → keine Freezes, ~200ms.
# NICHT #video=copy: am 2026-06-04 getestet → CPU 50% → 107% (schlechter). Verworfen.
cam0: "ffmpeg:device?video=/dev/video0&input_format=mjpeg&video_size=640x480&framerate=30#video=mjpeg"
cam1: "ffmpeg:device?video=/dev/video2&input_format=mjpeg&video_size=640x480&framerate=30#video=mjpeg"
# Phase-2 Hi-Res: on-demand (dormant bis erster Consumer). #video=copy auf dieser
# Kamera defekt (04_*), daher #video=mjpeg. Nur ~1-2s aktiv pro Grab.
# Rollback: diese beiden Zeilen entfernen + Redeploy.
cam0_hires: "ffmpeg:device?video=/dev/video0&input_format=mjpeg&video_size=1280x960&framerate=15#video=mjpeg"
cam1_hires: "ffmpeg:device?video=/dev/video2&input_format=mjpeg&video_size=1280x960&framerate=15#video=mjpeg"
webrtc:
listen: ":8555"
candidates:
- stun:8555
api:
listen: ":1984"
origin: "*"
log:
level: info
services:
# ── go2rtc: Kamera-Capture · MJPEG Re-Encode · Streaming ──────────────────
go2rtc:
image: ghcr.io/alexxit/go2rtc
container_name: AppRobotGo2RTC
restart: unless-stopped
network_mode: host
devices:
- /dev/video0:/dev/video0
- /dev/video2:/dev/video2
group_add:
- video
configs:
- source: go2rtc_yaml
target: /config/go2rtc.yaml
# ── webcam: Node.js (Viewer · /api/ws-Proxy · Snapshot-API) ──────────────
webcam:
build:
context: /tmp
dockerfile_inline: |
FROM node:lts-bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends ffmpeg \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /usr/src/app
EXPOSE 8444
image: approbotwebcam:latest
@@ -77,19 +46,27 @@ services:
command: sh -c "npm install --omit=dev && node server.js"
volumes:
- ${APP_PATH:-.}:/usr/src/app
devices:
- /dev/video0:/dev/video0
- /dev/video2:/dev/video2
group_add:
- video
environment:
- NODE_ENV=production
- PORT=8444
- GO2RTC_URL=http://localhost:1984
depends_on:
- go2rtc
# Optional: Geräte/Auflösung überschreiben (sonst Auto-Detect + Defaults)
# - DEV0=/dev/video0
# - DEV1=/dev/video2
# - LIVE_SIZE=640x480
# - LIVE_FPS=30
# - HIRES_SIZE=1280x960
# - HIRES_FPS=15
# ── FALLBACK ──────────────────────────────────────────────────────────────────
# Meckert Portainer beim Deploy über "configs content" (sehr alte Compose-Version)?
# → den configs-Block oben löschen und stattdessen beim go2rtc-Service mounten:
# volumes:
# - ${APP_PATH:-.}/go2rtc.yaml:/config/go2rtc.yaml:ro
#
# Bleibt eine Kamera schwarz? → in der Config oben die Quelle ersetzen durch die
# simple, bestätigte Form (ohne Auflösung): "ffmpeg:/dev/video0#video=mjpeg"
# ── Hinweise ────────────────────────────────────────────────────────────────────
# • Bleibt eine Kamera schwarz? Geräte prüfen: v4l2-ctl --list-devices
# und ob 640x480 bzw. 1280x960 als MJPEG nativ angeboten werden:
# v4l2-ctl --list-formats-ext -d /dev/video0
# Nur MJPEG-native Auflösungen bleiben CPU-arm (YUYV → Software-Encode = teuer).
# • Meckert Portainer über sehr alte Compose-Syntax (dockerfile_inline)? Dann
# Compose/Docker-Engine aktualisieren dieser Aufbau braucht Compose v2.
# ────────────────────────────────────────────────────────────────────────────────