- JavaScript 99.5%
- Dockerfile 0.5%
| docker-compose.yml | ||
| Dockerfile | ||
| README.md | ||
| server.js | ||
WoL-Web
Wake-on-LAN per WebUI — als Docker-Container mit eigener IP im LAN (macvlan). Schlicht, mobil-optimiert, ohne npm-Abhängigkeiten (nur Node-Core).
Was es tut
- Geräte (Name + MAC) über die WebUI hinterlegen, per Knopfdruck aufwecken
- Magic Packets gehen aus dem LAN heraus per UDP-Broadcast an Port 9 — dadurch umgehen sie alle Probleme, die WLAN-Clients haben (Client-Isolation, App-Berechtigungen, VPN)
- Geräteliste als JSON im Volume: exportieren, importieren, automatisch sichern
Features
| Feature | Wo |
|---|---|
| Gerät anlegen / löschen | + bzw. 🗑 in der Geräteliste |
| Aufwecken | Button pro Gerät |
| Export (JSON-Download) | Menü ☰ |
| Import (mischen oder ersetzen) | Menü ☰ |
| Backup-Scheduler (aus/stündlich/6h/täglich/wöchentlich) | Menü ☰ |
| Backups wiederherstellen / herunterladen / löschen | Menü ☰ |
| WebUI-Port | Env-Variable PORT in der Compose |
Vor jedem Import und jedem Restore wird automatisch ein Sicherheits-Backup erstellt.
Backups liegen in /data/backups/, werden auf die eingestellte Anzahl gekürzt.
Ausrollen (Unraid / Docker)
Dateien liegen in /mnt/user/compose-files/wol-web/:
wol-web/
├── docker-compose.yml
├── Dockerfile
└── server.js
Die App selbst braucht nur diese drei Dateien. Daten landen in
/mnt/user/appdata/wol-web/ (devices.json, settings.json, backups/).
Schritte:
- Die drei Dateien nach
/mnt/user/compose-files/wol-web/kopieren - In der
docker-compose.ymlanpassen:ipv4_address: freie feste IP aus deinem LAN-Subnetz (außerhalb des DHCP-Bereichs)DEFAULT_BROADCAST: Broadcast deines Subnetzes (z. B.172.16.0.255bei172.16.0.0/24)PORT: WebUI-Port (Default 8080)- Volume-Pfad, falls deine appdata-Struktur anders aussieht
- Das macvlan-Netz
br0muss existieren (external) und dasselbe Subnetz wie dein LAN haben — auf Unraid ist das das eingestellte Docker-br0 - Start:
docker compose -f /mnt/user/compose-files/wol-web/docker-compose.yml up -d --build - WebUI öffnen:
http://<container-ip>:<PORT>— am Handy als "Zum Startbildschirm hinzufügen" → App-Gefühl ohne App
Hinweis macvlan: Der Docker-Host selbst kann den Container über br0 standardmäßig nicht erreichen. WebUI also von einem anderen Gerät aus aufrufen (oder br0 auf IPvlan umstellen).
Konfiguration
| Env-Variable | Default | Bedeutung |
|---|---|---|
PORT |
8080 |
Port der WebUI |
DEFAULT_BROADCAST |
255.255.255.255 |
Vorgabe für neue Geräte |
DATA_DIR |
/data |
Ablage der Geräte/Settings/Backups |
Warum ein eigener Container statt einer Handy-App?
Magic Packets müssen als Broadcast ins LAN des Ziels. Von einem Handy aus scheitert das oft an WLAN-Client-Isolation, fehlenden Netzwerk-Berechtigungen (Android 13+) oder VPNs — die App "sendet", aber es kommt nichts an. Der Container hängt mit eigener IP direkt im Ziel-Netz (Layer 2), Broadcasts erreichen also garantiert die Netzwerkkarten — auch die schlafender Geräte.
Windows-Sleep konfigurieren (damit WoL zuverlässig funktioniert)
Damit ein Windows-PC per WoL jedesmal aufwacht, muss er in reinem S3-Standby einschlafen und dort bleiben. Standardmäßig rutscht er nach unbeaufsichtigten Aufwachen (WoL!) in ungünstige Zustände ab. Fix auf dem Ziel-PC (Admin-PowerShell):
1. Automatischen Ruhezustand nach Standby abschalten
Windows kann aus dem Standby in den Ruhezustand (Hibernate) wechseln — in dem ist die Netzwerkkarte stromlos und WoL wirkt nicht:
powercfg /setacvalueindex SCHEME_CURRENT SUB_SLEEP HIBERNATEIDLE 0
powercfg /setactive SCHEME_CURRENT
(Manueller Ruhezustand über das Startmenü bleibt weiterhin möglich.)
2. Versteckten "unattended sleep timeout" einstellen
Nach einem WoL-Wake ohne Nutzer schläft Windows nach 120 Sekunden wieder ein — jetzt aber garantiert als reines S3:
powercfg /attributes SUB_SLEEP 7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 -ATTRIB_HIDE
powercfg /setacvalueindex SCHEME_CURRENT SUB_SLEEP 7bc4a2f9-d8fc-4469-b07b-33eb785aaca0 120
powercfg /setactive SCHEME_CURRENT
(0 = nach WoL-Wake nie automatisch wieder einschlafen, Wert in Sekunden
sonst. Der normale "Standby nach X Min."-Timer bleibt von beidem unberührt.)
3. Kontrolle
powercfg /a # S3 verfügbar? Modern Standby = Problemfall
powercfg /devicequery wake_armed # Netzwerkkarte muss gelistet sein
powercfg /requests # wer hält den PC wach? (nur relevant wenn verbunden!)
Typische Stolperfallen
- Schnellstart (Fast Startup) muss aus sein — sonst wacht der PC aus "Shutdown" gar nicht per WoL (Systemsteuerung → Energieoptionen)
- WoL nur aus Standby, nicht aus Shutdown: je nach BIOS unterstützt die Karte kein WoL aus S5 — dann Übernacht-Zustand "Standby" nutzen
- Energy Efficient Ethernet / Green Ethernet im Netzwerktreiber deaktivieren, sonst verliert die Karte ihr Wake-Arming gerne nach ein bis zwei Zyklen
- Remote-Software (RustDesk & Co.) hält Power-Requests, solange eine Session aktiv ist — das ist normal und kein Fehler. Diagnose immer im getrennten Zustand machen, sonst jagt man seinem eigenen Werkzeug hinterher
Der 3-Zyklen-Verifikationstest
- Per WebUI aufwecken → nicht an Tastatur/Maus → einige Minuten warten → PC darf nicht sofort wieder einschlafen (bzw. erst nach dem eingestellten unattended timeout)
- Manuell in Standby → per WebUI aufwecken → muss gehen
- Von selbst einschlafen lassen → per WebUI aufwecken → muss gehen
Laufen alle drei Zyklen, ist das Setup konsistent und fertig.
Keine externen Abhängigkeiten, keine Datenbank, ein JSON-File. Backup = den
/data-Ordner sichern oder den eingebauten Export/Scheduler nutzen.