1. Ordnerstruktur anlegen
# Hauptordner für Soundboard-Dateien
sudo mkdir -p /var/soundboard
sudo chown [USER]:www-data /var/soundboard
sudo chmod 775 /var/soundboard
sudo chmod g+s /var/soundboard
# Queue-Datei
sudo touch /var/soundboard/queue
sudo chown [USER]:www-data /var/soundboard/queue
sudo chmod 664 /var/soundboard/queue
# Ordner für MP3-Dateien im Home-Verzeichnis des Users
mkdir -p ~/Sounds
# MP3-Dateien hier ablegen, z.B. AbDa.mp3, HauAb.mp3 etc.
Das
g+sauf/var/soundboardsorgt dafür, dass neue Dateien automatisch die Gruppe www-data erhalten.
2. Daemon-Skript erstellen
Erstelle das Daemon-Skript, das die Queue überwacht und die Sounds abspielt:
sudo nano /usr/local/bin/soundboard-daemon.sh
Inhalt:
#!/bin/bash
QUEUE=/var/soundboard/queue
SOUND_DIR=/home/[USER]/Sounds
LOG=/var/soundboard/daemon.log
# PipeWire/ALSA für systemd User Service verfügbar machen
export XDG_RUNTIME_DIR=/run/user/1000
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
echo "Daemon gestartet: $(date)" >> "$LOG"
while true; do
if [ -s "$QUEUE" ]; then
SOUND=$(head -n 1 "$QUEUE")
sed -i '1d' "$QUEUE"
FILE="$SOUND_DIR/$SOUND.mp3"
echo "Eingang: $SOUND → Datei: $FILE" >> "$LOG"
if [ -f "$FILE" ]; then
echo "Starte ffplay..." >> "$LOG"
/usr/bin/ffplay -nodisp -autoexit -loglevel quiet "$FILE"
echo "ffplay beendet" >> "$LOG"
else
echo "FEHLER: Datei nicht gefunden" >> "$LOG"
fi
fi
sleep 0.1
done
sudo chmod +x /usr/local/bin/soundboard-daemon.sh
3. Systemd User Service für den Daemon
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/soundboard.service
Inhalt:
[Unit]
Description=Soundboard Daemon
[Service]
ExecStart=/usr/local/bin/soundboard-daemon.sh
Restart=always
[Install]
WantedBy=default.target
# Daemon registrieren und starten
systemctl --user daemon-reload
systemctl --user enable --now soundboard.service
# Status prüfen
systemctl --user status soundboard.service
4. Webinterface (PHP)
/var/www/html/index.php:
<?php
$queue_file = '/var/soundboard/queue';
if (isset($_GET['run'])) {
$sound = preg_replace('/[^a-zA-Z0-9_-]/', '', $_GET['run']); // sanitizen
if (is_writable($queue_file)) {
file_put_contents($queue_file, $sound."\n", FILE_APPEND);
$log_entry = "[Webinterface] Button '$sound' → in Queue geschrieben\n";
file_put_contents('/var/soundboard/daemon.log', $log_entry, FILE_APPEND);
} else {
$log_entry = "[Webinterface] FEHLER: Queue nicht beschreibbar für '$sound'\n";
file_put_contents('/var/soundboard/daemon.log', $log_entry, FILE_APPEND);
}
// Reload verhindern, dass Browser beim Refresh erneut schreibt
header("Location: ".$_SERVER['PHP_SELF']);
exit;
}
// Buttons alphabetisch
$buttons = [
'AbDa', 'Baff', 'GehDaWeg', 'GIGA_AbDa', 'GIGA_HauAb', 'GIGA_RunterDa', 'GIGA_SeiLeise', 'HauAb', 'Rlps', 'Fart'
];
// Mapping für die Anzeige
$names = [
'Baff' => 'Furz',
'Rlps' => 'Rülps'
];
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Soundboard</title>
<style>
body { font-family: sans-serif; background:#f0f0f0; }
.container { max-width:600px; margin:50px auto; text-align:center; }
button { margin:5px; padding:10px 20px; font-size:16px; }
</style>
</head>
<body>
<div class="container">
<h1>Soundboard</h1>
<form method="get">
<?php
sort($buttons);
foreach ($buttons as $b) {
$label = $names[$b] ?? $b;
echo "<button type='submit' name='run' value='$b'>$label</button>";
}
?>
</form>
</div>
</body>
</html>
Achte darauf, dass
www-dataSchreibrechte auf/var/soundboard/queuehat, damit PHP die Sounds in die Queue schreiben kann.
5. Testen
- Starte den Daemon:
systemctl --user start soundboard.service
- Prüfe das Log:
tail -f /var/soundboard/daemon.log
- Öffne das Webinterface im Browser:
http://localhost/index.php
- Drücke einen Button → sollte im Log erscheinen und der Sound abgespielt werden.
6. Rechte-Check
ls -ld /var/soundboard
ls -l /var/soundboard/queue
- Ordner:
[USER]:www-data 775 - Queue:
[USER]:www-data 664
Damit kann [USER] (Daemon) lesen und www-data (PHP) schreiben.