Claude: WebSocket
This commit is contained in:
@@ -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"
|
||||
# ────────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user