name: approbotwebcam # ── Portainer Web-Editor: dieses YAML einfügen, dann Deploy ───────────────── # # Voraussetzungen: # 1. Code auf dem Server (git clone / Synology Drive sync) # 2. go2rtc.yaml muss im selben Verzeichnis liegen wie dieses File # 3. In Portainer → "Environment variables": # APP_PATH = /absoluter/pfad/zum/appRobotWebcam # # Firewall: genau zwei Ports freigeben: # TCP 8444 → HTTP (Viewer · Snapshot-API · WebRTC-Signaling) # UDP 8555 → WebRTC Media (go2rtc direkt, kann nicht proxiert werden) # # network_mode: host → beide Container teilen den Host-Netzwerk-Stack. # Das ist für WebRTC entscheidend: go2rtc bekommt die echte Host-IP als # ICE-Kandidat, nicht eine Docker-interne 172.x-Adresse. # ───────────────────────────────────────────────────────────────────────────── services: # ── go2rtc: Kamera-Capture + H.264-Encoding + WebRTC ────────────────────── 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 volumes: # go2rtc.yaml liegt im selben Verzeichnis wie docker-compose.yaml - ${APP_PATH:-.}/go2rtc.yaml:/config/go2rtc.yaml:ro # ── webcam: Node.js (Viewer · Snapshot-Proxy · WebRTC-Signaling-Proxy) ─── webcam: build: context: /tmp # Leerer Build-Context – Code kommt per Bind-Mount dockerfile_inline: | FROM node:lts-bookworm-slim WORKDIR /usr/src/app EXPOSE 8444 image: approbotwebcam:latest container_name: AppRobotWebcam restart: unless-stopped network_mode: host command: sh -c "npm install && node server.js" volumes: - ${APP_PATH:-.}:/usr/src/app environment: - NODE_ENV=production - PORT=8444 - GO2RTC_URL=http://localhost:1984