- Add direct device mounts (cdrom, dvd, sr0) to worker - Add SYS_ADMIN capability for udev access - Install isoinfo and udev in worker container - Add pyudev for device monitoring - Update udev rules with correct paths
This commit is contained in:
+9
-2
@@ -50,8 +50,9 @@ services:
|
|||||||
- media:/app/media
|
- media:/app/media
|
||||||
- temp:/app/temp
|
- temp:/app/temp
|
||||||
- disc:/dev/disc
|
- disc:/dev/disc
|
||||||
- cdrom:/dev/cdrom
|
- /dev/cdrom:/dev/cdrom:ro
|
||||||
- dvd:/dev/dvd
|
- /dev/dvd:/dev/dvd:ro
|
||||||
|
- /dev/sr0:/dev/sr0:ro
|
||||||
networks:
|
networks:
|
||||||
- rippy-net
|
- rippy-net
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -63,6 +64,12 @@ services:
|
|||||||
- /app/tmp
|
- /app/tmp
|
||||||
- /run
|
- /run
|
||||||
- /tmp
|
- /tmp
|
||||||
|
cap_add:
|
||||||
|
- SYS_ADMIN
|
||||||
|
devices:
|
||||||
|
- /dev/sr0:/dev/sr0:r
|
||||||
|
- /dev/cdrom:/dev/cdrom:r
|
||||||
|
- /dev/dvd:/dev/dvd:r
|
||||||
|
|
||||||
ui:
|
ui:
|
||||||
build:
|
build:
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ WORKDIR /app
|
|||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
gcc \
|
gcc \
|
||||||
makepkg \
|
makepkg \
|
||||||
|
isoinfo \
|
||||||
|
udev \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
COPY docker/worker/requirements.txt .
|
COPY docker/worker/requirements.txt .
|
||||||
|
|||||||
@@ -3,3 +3,4 @@ redis==5.0.4
|
|||||||
requests==2.32.3
|
requests==2.32.3
|
||||||
sqlalchemy==2.0.32
|
sqlalchemy==2.0.32
|
||||||
psycopg2-binary==2.9.9
|
psycopg2-binary==2.9.9
|
||||||
|
pyudev==0.24.2
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# Diese Datei muss nach /etc/udev/rules.d/ kopiert werden
|
# Diese Datei muss nach /etc/udev/rules.d/ kopiert werden
|
||||||
|
|
||||||
# CD/DVD/Blu-ray Einwurf-Ereignis
|
# 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
|
# 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"
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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."
|
||||||
@@ -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"
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user