name: approbotwebcam # ════════════════════════════════════════════════════════════════════════════ # FINALER WebRTC-AUFBAU – go2rtc (Streaming) + Node.js (Viewer/Proxy/API) # ════════════════════════════════════════════════════════════════════════════ # # Portainer: Stack → Web editor → dieses YAML einfügen → Deploy. # Vorher in Portainer → "Environment variables": # 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+Signaling) · UDP 8555 (WebRTC-Media) # Port 1984 (go2rtc) NICHT nach aussen – läuft nur intern via localhost. # # Zugriff: # Viewer: http://:8444/ # Snapshot (Homing) http://:8444/api/snapshot/cam0 # Hi-Res Snapshot http://:8444/api/snapshot/cam0/hires # go2rtc-Debug-UI http://:1984/ (nur intern/LAN) # ════════════════════════════════════════════════════════════════════════════ configs: go2rtc_yaml: content: | streams: # 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 api: listen: ":1984" origin: "*" log: level: info services: # ── go2rtc: Kamera-Capture · MJPEG-Passthrough · 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) ────────────── # 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 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 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 # ── 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" # ────────────────────────────────────────────────────────────────────────────────