#!/usr/bin/env bash # # Erzeugt docker-compose.override.yml mit den optischen Laufwerken DIESES Hosts. # # ## Warum es das gibt (Vorfall 28.08.2026) # # In docker-compose.yml stand: # # devices: # - ${OPTICAL_SR:-/dev/sr0}:/dev/sr0 # # Das ist eine STARTBEDINGUNG. Fehlt das Laufwerk, startet der Container nicht: # # Error response from daemon: error gathering device information while # adding custom device "/dev/sr0": no such file or directory # # Genau das ist passiert, als das USB-Laufwerk von der VM abgezogen wurde: Ein # ganz normaler Deploy legte api, worker UND ui still — obwohl keiner der drei # ein Laufwerk zum Starten braucht. Rippy war unten, und die Meldung stand # mitten im Build-Rauschen. # # Der Widerspruch war schon vorher da: `install.sh` sagt bei fehlendem Laufwerk # ausdrücklich „die Installation läuft trotzdem durch; diese Maschine dient dann # als reine KOMPRIMIER-Maschine" — die Compose-Datei sah das anders. Eine # Maschine ohne Laufwerk ist ein vorgesehener Betriebsfall (der Windows-Worker # und der GPU-Encoder sind genau das). # # Seither steht in docker-compose.yml KEIN devices-Block mehr. Was dieser Host # wirklich hat, landet in docker-compose.override.yml — die zieht Compose von # allein dazu (`docker compose up` braucht keinen extra Schalter), und sie ist # gitignored, weil die Geräteknoten je Rechner anders heißen. # # Aufruf: ./deploy/geraete-override.sh [zielverzeichnis] # (ohne Argument: das aktuelle Verzeichnis) # set -u ZIEL="${1:-.}" DATEI="$ZIEL/docker-compose.override.yml" # MakeMKV spricht Laufwerke über die SCSI-Generic-Schicht an und braucht deshalb # ZWEI Knoten: /dev/srN und den passenden /dev/sgM. Welche sg-Nummer dazugehört, # ist je Host anders — sie wird über die SCSI-Adresse ermittelt statt geraten. # Beide Knoten zeigen in /sys auf dasselbe Geräteverzeichnis (z. B. 3:0:0:0). # (Dieselbe Herleitung wie in install.sh, Prüfung 2/5.) SR="" SG="" LAUFWERK="" for srpfad in /sys/block/sr*; do [ -e "$srpfad" ] || continue srname=$(basename "$srpfad") adresse=$(basename "$(readlink -f "$srpfad/device" 2>/dev/null)" 2>/dev/null) [ -n "$adresse" ] || continue for sgpfad in /sys/class/scsi_generic/sg*; do [ -e "$sgpfad" ] || continue if [ "$(basename "$(readlink -f "$sgpfad/device" 2>/dev/null)" 2>/dev/null)" = "$adresse" ]; then SR="/dev/$srname" SG="/dev/$(basename "$sgpfad")" LAUFWERK="$(cat "$srpfad/device/vendor" 2>/dev/null) $(cat "$srpfad/device/model" 2>/dev/null)" break 2 fi done done kopf() { cat < "$DATEI" echo "Kein optisches Laufwerk gefunden — $DATEI ohne Geräte geschrieben." echo "Rippy startet und kann komprimieren; Rippen geht erst mit Laufwerk." exit 0 fi { kopf echo "#" echo "# Gefunden: $(echo "$LAUFWERK" | tr -s ' ')" echo "# $SR + $SG (über die SCSI-Adresse abgeglichen, nicht geraten)" cat < "$DATEI" echo "Laufwerk gefunden: $(echo "$LAUFWERK" | tr -s ' ')" echo " $SR + $SG -> $DATEI"