fix(worker): mount host devices for disc detection
Ampel / ampel (push) Failing after 30s

- 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:
Hitonabi
2026-07-23 12:15:55 +02:00
parent 9c010d2dc5
commit 61af353559
8 changed files with 188 additions and 4 deletions
+2 -2
View File
@@ -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"
+52
View File
@@ -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
+50
View File
@@ -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."
+43
View File
@@ -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"
+29
View File
@@ -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