99 lines
4.4 KiB
YAML
99 lines
4.4 KiB
YAML
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://<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:
|
||
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"
|
||
# ────────────────────────────────────────────────────────────────────────────────
|