Claude: WebSocket

This commit is contained in:
chk
2026-06-04 15:06:45 +02:00
parent 118441995d
commit 306aacac80
4 changed files with 378 additions and 52 deletions

View File

@@ -17,73 +17,69 @@ name: approbotwebcam
# Zugriff:
# Viewer: http://<host>:8444/
# Snapshot (Homing) http://<host>:8444/api/snapshot/cam0
# Hi-Res Snapshot http://<host>:8444/api/snapshot/cam0/hires
# go2rtc-Debug-UI http://<host>:1984/ (nur intern/LAN)
# ════════════════════════════════════════════════════════════════════════════
configs:
go2rtc_yaml:
# Komplette go2rtc-Config eingebettet keine separate Datei nötig.
content: |
streams:
# MJPEG-Passthrough: Kamera liefert MJPEG nativ → go2rtc reicht es 1:1 durch.
# Kein Encoding, kein libx264, kein VAAPI → CPU <5%, keine Freezes.
# Latenz ~200ms (vs. 130ms bei H.264) — für Roboter-Überwachung ausreichend.
# Hinweis: go2rtc's #hardware funktioniert NICHT mit MJPEG-Kamera-Input
# (hwupload benötigt VAAPI-Decoder auf Input-Seite, MJPEG läuft Software).
# 640x480 @ 30fps stabiler Live-Stream, <5% CPU, ~200ms Latenz.
# Hi-Res-Snapshots über /api/snapshot/cam{n}/hires (Node.js Blackout-Methode).
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"
webrtc:
listen: ":8555"
candidates:
# stun:8555 → go2rtc erkennt die öffentliche IP automatisch (für Internet).
# Falls das nicht klappt: feste IP/Domain eintragen, z.B.
# - robot.example.com:8555
- stun:8555
api:
listen: ":1984"
# origin "*" erlaubt das WebSocket-Signaling vom Viewer (Port 8444 = anderer Origin).
# Ohne diese Zeile blockt go2rtc den WS mit "request origin not allowed".
# LAN: unkritisch. Internet: Caddy davor schränkt den Zugriff wieder ein.
origin: "*"
log:
level: info
# On-demand bestätigt: go2rtc startet Encoder erst bei erstem Client (0% CPU ohne Client).
services:
# ── go2rtc: Kamera-Capture · H.264-Encoding · WebRTC ──────────────────────
# ── go2rtc: Kamera-Capture · MJPEG-Passthrough · Streaming ────────────────
go2rtc:
image: ghcr.io/alexxit/go2rtc
container_name: AppRobotGo2RTC
restart: unless-stopped
network_mode: host # echte Host-IP als WebRTC-ICE-Kandidat
network_mode: host
devices:
- /dev/video0:/dev/video0
- /dev/video2:/dev/video2
# /dev/dri nicht mehr nötig: MJPEG-Passthrough braucht keine GPU
group_add:
- video
# render-Gruppe NICHT hier setzen — existiert im Container-Image nicht → 500-Fehler.
# /dev/dri-Zugriff funktioniert via devices: + Container läuft als root.
configs:
- source: go2rtc_yaml
target: /config/go2rtc.yaml
# ── webcam: Node.js (Viewer · /api/ws-Proxy · Snapshot-API) ──────────────
# ffmpeg ist im Image damit der /hires-Endpunkt direkt auf das Gerät zugreifen
# kann, wenn go2rtc den Stream kurz freigibt (Blackout-Snapshot-Methode).
webcam:
build:
context: /tmp # Leerer Build-Context Code kommt per Bind-Mount
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
container_name: AppRobotWebcam
restart: unless-stopped
network_mode: host # erreicht go2rtc via localhost:1984
network_mode: host
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
@@ -98,5 +94,5 @@ services:
# - ${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=h264#video=mjpeg"
# simple, bestätigte Form (ohne Auflösung): "ffmpeg:/dev/video0#video=mjpeg"
# ────────────────────────────────────────────────────────────────────────────────