diff --git a/docker-compose.yml b/docker-compose.yml index 1283b87..287aaca 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -50,8 +50,9 @@ services: - media:/app/media - temp:/app/temp - disc:/dev/disc - - cdrom:/dev/cdrom - - dvd:/dev/dvd + - /dev/cdrom:/dev/cdrom:ro + - /dev/dvd:/dev/dvd:ro + - /dev/sr0:/dev/sr0:ro networks: - rippy-net depends_on: @@ -63,6 +64,12 @@ services: - /app/tmp - /run - /tmp + cap_add: + - SYS_ADMIN + devices: + - /dev/sr0:/dev/sr0:r + - /dev/cdrom:/dev/cdrom:r + - /dev/dvd:/dev/dvd:r ui: build: diff --git a/docker/worker/Dockerfile b/docker/worker/Dockerfile index 2ef6b6a..1946820 100644 --- a/docker/worker/Dockerfile +++ b/docker/worker/Dockerfile @@ -5,6 +5,8 @@ WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends \ gcc \ makepkg \ + isoinfo \ + udev \ && rm -rf /var/lib/apt/lists/* COPY docker/worker/requirements.txt . diff --git a/docker/worker/requirements.txt b/docker/worker/requirements.txt index 099916b..1948471 100644 --- a/docker/worker/requirements.txt +++ b/docker/worker/requirements.txt @@ -3,3 +3,4 @@ redis==5.0.4 requests==2.32.3 sqlalchemy==2.0.32 psycopg2-binary==2.9.9 +pyudev==0.24.2 diff --git a/udev/99-disc-ripper.rules b/udev/99-disc-ripper.rules index 861d0d6..928926d 100644 --- a/udev/99-disc-ripper.rules +++ b/udev/99-disc-ripper.rules @@ -2,7 +2,7 @@ # Diese Datei muss nach /etc/udev/rules.d/ kopiert werden # CD/DVD/Blu-ray Einwurf-Ereignis -ACTION=="add", SUBSYSTEM=="block", KERNEL=="sr*", ENV{ID_TYPE}=="cd", SYMLINK+="disc/%E{ID_SERIAL}", RUN+="/app/udev_daemon.py add %k" +ACTION=="add", SUBSYSTEM=="block", KERNEL=="sr*", ENV{ID_TYPE}=="cd", SYMLINK+="disc/%E{ID_SERIAL}", RUN+="/app/udev/udev_daemon.py add %k" # CD/DVD/Blu-ray Auswurf-Ereignis -ACTION=="remove", SUBSYSTEM=="block", KERNEL=="sr*", ENV{ID_TYPE}=="cd", RUN+="/app/udev_daemon.py remove %k" +ACTION=="remove", SUBSYSTEM=="block", KERNEL=="sr*", ENV{ID_TYPE}=="cd", RUN+="/app/udev/udev_daemon.py remove %k" diff --git a/udev/README.md b/udev/README.md new file mode 100644 index 0000000..5ec9364 --- /dev/null +++ b/udev/README.md @@ -0,0 +1,52 @@ +# Rippy udev-Setup + +## Problem +Rippy findet kein Laufwerk, obwohl eines am Host angeschlossen ist. + +## Ursache +Die `docker-compose.yml` nutzte anonyme Volumes für `/dev/disc`, `/dev/cdrom`, `/dev/dvd`: +```yaml +volumes: + - disc:/dev/disc # ❌ Anonymes Volume, leer +``` + +## Lösung +Direkte Mounts vom Host in den Worker-Container: + +### 1. docker-compose.yml anpassen +```yaml +volumes: + - /dev/cdrom:/dev/cdrom:ro + - /dev/dvd:/dev/dvd:ro + - /dev/sr0:/dev/sr0:ro + - disc:/dev/disc # ✅ Shared-Mount für udev-Symlinks +``` + +### 2. Worker-Dockerfile erweitern +- `isoinfo` für Disc-Typ-Erkennung +- `udev` für Geräteverwaltung + +### 3. udev-Regel installieren +Kopiere `99-disc-ripper.rules` nach `/etc/udev/rules.d/` + +### 4. udev-Daemon ausführen +Der Daemon (`udev_daemon.py`) läuft im Worker-Container und erstellt Symlinks mit UUID/Serial. + +## Installation auf Arcane VM + +```bash +cd /path/to/rippy/udev +bash install-arcane.sh +``` + +## Testen +1. Leg eine CD/DVD ein +2. Logs prüfen: `docker logs -f rippy-worker` +3. Symlinks: `docker exec rippy-worker ls -la /dev/disc` +4. Devices: `docker exec rippy-worker ls -la /dev/cdrom /dev/dvd /dev/sr0` + +## Dateien +- `99-disc-ripper.rules` — udev-Regel für Einwurf/Auswurf +- `udev_daemon.py` — Daemon für Disc-Erkennung +- `rippy-udev.service` — systemd-Service (optional) +- `install-arcane.sh` — Installations-Skript für Arcane VM \ No newline at end of file diff --git a/udev/install-arcane.sh b/udev/install-arcane.sh new file mode 100644 index 0000000..0dd3546 --- /dev/null +++ b/udev/install-arcane.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Installations-Skript für Arcane VM (Debian 12) +# Auf der Arcane VM ausführen + +set -e + +echo "=== Rippy udev-Setup für Arcane VM ===" + +# 1. udev-Regel installieren +echo "Installiere udev-Regel..." +cp 99-disc-ripper.rules /etc/udev/rules.d/ +echo "✅ /etc/udev/rules.d/99-disc-ripper.rules installiert" + +# 2. udev-Daemon in Worker-Container kopieren +echo "Kopiere udev-Daemon in Worker-Container..." +docker cp udev_daemon.py rippy-worker:/app/udev/ +docker cp 99-disc-ripper.rules rippy-worker:/etc/udev/rules.d/ +docker cp rippy-udev.service rippy-worker:/etc/systemd/system/ +echo "✅ udev-Daemon und Regeln in Container kopiert" + +# 3. udev-Regel neu laden (im Host) +echo "Lade udev-Regeln im Host neu..." +sudo udevadm control --reload-rules +sudo udevadm trigger --subsystem-match=block +echo "✅ udev-Regeln im Host neu geladen" + +# 4. udev-Regel in Container neu laden +echo "Lade udev-Regeln im Container neu..." +docker exec -i rippy-worker udevadm control --reload-rules +docker exec -i rippy-worker udevadm trigger --subsystem-match=block +echo "✅ udev-Regeln im Container neu geladen" + +# 5. Service aktivieren (optional - wenn im Container als systemd läuft) +if docker exec -i rippy-worker which systemctl > /dev/null 2>&1; then + echo "Aktiviere systemd-Service..." + docker exec -i rippy-worker systemctl daemon-reload + docker exec -i rippy-worker systemctl enable rippy-udev + echo "✅ systemd-Service aktiviert" +fi + +echo "=== Setup abgeschlossen ===" +echo "" +echo "Testen:" +echo " 1. Leg eine CD/DVD ein" +echo " 2. Logs prüfen: docker logs -f rippy-worker" +echo " 3. Symlinks: docker exec rippy-worker ls -la /dev/disc" +echo " 4. Devices: docker exec rippy-worker ls -la /dev/cdrom /dev/dvd /dev/sr0" +echo "" +echo "Hinweis: /dev/disc ist ein Shared-Mount, der udev-Daemon erstellt Symlinks" +echo " mit UUID/Serial für jedes erkannte Laufwerk." diff --git a/udev/install-udev.sh b/udev/install-udev.sh new file mode 100644 index 0000000..b02257f --- /dev/null +++ b/udev/install-udev.sh @@ -0,0 +1,43 @@ +#!/bin/bash +# Installations-Skript für Rippy udev-Regel + Service +# Auf dem Host (Arcane VM / Proxmox LXC) ausführen + +set -e + +echo "=== Rippy udev-Setup ===" + +# Prüfen ob wir root sind +if [ "$EUID" -ne 0 ]; then + echo "❌ Bitte als root ausführen (sudo bash install-udev.sh)" + exit 1 +fi + +# 1. udev-Regel installieren +echo "Installiere udev-Regel..." +cp 99-disc-ripper.rules /etc/udev/rules.d/ +echo "✅ /etc/udev/rules.d/99-disc-ripper.rules installiert" + +# 2. udev-Daemon in den Container kopieren +echo "Kopiere udev-Daemon in Worker-Container..." +docker cp udev_daemon.py rippy-worker:/app/udev/ +docker cp 99-disc-ripper.rules rippy-worker:/etc/udev/rules.d/ +docker cp rippy-udev.service rippy-worker:/etc/systemd/system/ +echo "✅ udev-Daemon und Regeln in Container kopiert" + +# 3. udev-Regel neu laden +echo "Lade udev-Regeln neu..." +sudo udevadm control --reload-rules +sudo udevadm trigger --subsystem-match=block +echo "✅ udev-Regeln neu geladen" + +# 4. Service aktivieren (optional - wenn im Container als systemd läuft) +if docker exec -i rippy-worker which systemctl > /dev/null 2>&1; then + echo "Aktiviere systemd-Service..." + docker exec -i rippy-worker systemctl daemon-reload + docker exec -i rippy-worker systemctl enable rippy-udev + echo "✅ systemd-Service aktiviert" +fi + +echo "=== Setup abgeschlossen ===" +echo "Teste Disc-Einwurf: Leg eine CD/DVD ein" +echo "Prüfe Logs: docker logs -f rippy-worker" diff --git a/udev/rippy-udev.service b/udev/rippy-udev.service new file mode 100644 index 0000000..c6bc4db --- /dev/null +++ b/udev/rippy-udev.service @@ -0,0 +1,29 @@ +# systemd-Service für Rippy udev-Daemon +# Diese Datei muss nach /etc/systemd/system/rippy-udev.service kopiert werden + +[Unit] +Description=Rippy Disc Detection Daemon +After=dev-disc.device +Requires=dev-disc.device + +[Service] +Type=simple +ExecStart=/usr/bin/python3 /app/udev_daemon.py +Restart=always +RestartSec=5 +WorkingDirectory=/app +User=root +Group=root + +# Environment +Environment=REDIS_URL=redis://redis:6379/0 +Environment=PATH=/usr/local/bin:/usr/bin:/bin + +# Security Hardening +NoNewPrivileges=yes +ProtectSystem=strict +ProtectHome=read-only +PrivateTmp=yes + +[Install] +WantedBy=multi-user.target