Im ersten Teil habe ich den RavPower RP-WD03 mit OpenWrt 21.02 geflasht und ihm per Extroot und Swap auf einer SD-Karte scheinbar unendlich viel Speicher spendiert. Die Ernüchterung kam prompt: Speicherplatz ist nicht gleich Rechenpower. Bei 32 MB RAM und einer betagten Mediatek MT7620 CPU reicht es eben nicht, einfach „einen Datei-Server“ zu installieren – der kleine Reiserouter geht bei praktisch jeder modernen Software in die Knie.
In diesem Teil geht’s darum, wie ich zwei Anläufe mit klassischen Lösungen gegen die Wand gefahren habe, warum am Ende ein selbstgeschriebenes Python-Skript die Rettung war – und wie ich nebenbei noch verhindert habe, dass mein iPhone-Hotspot ständig einschläft.
Der Plan war eigentlich simpel
Fotos vom Handy im Urlaub drahtlos auf die SD-Karte im Router schieben. Klingt nach einer Sache von fünf Minuten. War es nicht.
Versuch 1 – TinyFileManager (PHP8): Schnell installiert, aber der PHP-Prozess hat im Hintergrund so viel CPU gefressen, dass der ganze Router zäh wurde wie Kaugummi.
Versuch 2 – Samba4: Die Freigabe lief zwar, aber Samba4 ist für dieses Gerät schlicht zu fett. RAM leer, CPU beim Verbindungsaufbau am Glühen, Router kaum noch bedienbar. Selbst das schlankere ksmbd wollte wegen Kernel-Bugs auf dem Mediatek-Chip nicht mitspielen.
Die eigentliche Erkenntnis daraus war gar nicht technischer, sondern grundsätzlicher Natur: Auf Hardware dieser Klasse darf nichts dauerhaft im Hintergrund laufen. Alles muss sich per Klick im Webinterface an- und wieder ausschalten lassen, und nach einem Neustart muss standardmäßig alles aus sein, damit das System leichtfüßig bleibt.
Projekt 1: Eine eigene, schlanke Foto-Cloud
Also selbst gebaut: ein minimales Python3-Skript, das nur bei Bedarf läuft, kaum RAM braucht und hochgeladene Bilder automatisch in tägliche Datums-Ordner auf der SD-Karte sortiert. Dazu eine kleine Weboberfläche zum Hoch- und Runterladen – erreichbar von jedem Handy im WLAN.
Setup in Kürze:
opkg update
opkg install python3-light python3-logging python3-codecs luci-compat uci
Das eigentliche Skript liegt unter /usr/bin/pyuploader.py und macht im Kern drei Dinge: Es nimmt Uploads per POST entgegen, sortiert sie automatisch nach Datum in Unterordner, und liefert eine kleine HTML-Übersicht zum Downloaden aus. Das komplette Skript packe ich zum Runterladen als Datei dazu, statt es hier komplett abzudrucken – wer’s nachbauen will, findet unter dem Beitrag einen Link zur fertigen Datei.
Damit sich der Dienst sauber per Webinterface an- und ausschalten lässt, kommt ein schlankes Init-Skript dazu, das die Einstellungen aus einer UCI-Config liest:
# /etc/config/pyuploader
config pyuploader 'main'
option enabled '0'
option port '8080'
option path '/overlay/fotos'
# /etc/init.d/pyuploader (gekürzt)
start() {
config_load 'pyuploader'
config_get_bool enabled 'main' 'enabled' 0
[ "$enabled" -eq 1 ] && python3 /usr/bin/pyuploader.py "$port" "$path" &
}
stop() {
killall -9 python3 2>/dev/null
}
Und damit das Ganze nicht nur per SSH, sondern hübsch im LuCI-Menü unter Services auftaucht, gibt’s noch einen kleinen Lua-Controller und eine Optionsmaske – Details dazu unten im Kasten „LuCI-Integration“, das Prinzip ist bei beiden Tools identisch.
Projekt 2: Der iPhone-WLAN-Wächter
Kennt ihr das? Man verbindet den Reiserouter per WLAN mit dem iPhone-Hotspot, legt das Handy weg – und iOS schaltet den Hotspot stromsparend ab. Verbindung weg, Handy erst wieder entsperren.
Dagegen habe ich mir ein zweites, ebenso schlankes Shell-Skript gebaut, das zwei Dinge tut:
- Heartbeat: Schickt in regelmäßigen Abständen eine kleine HTTP-Anfrage an Apples Captive-Portal, um echten Datenverkehr vorzutäuschen (ein simpler Ping reicht iOS oft nicht mehr).
- Sanfte Reconnect-Logik: Bricht die Verbindung trotzdem ab, stupst das Skript das WLAN-Modul kurz an, statt in einer Dauerschleife wild herumzufunken.
Auch hier gilt dieselbe Regel wie bei der Foto-Cloud: läuft nur, wenn ich es im Webinterface aktiviere, und ist nach jedem Neustart standardmäßig aus.
LuCI-Integration: Ein Muster für beide Tools
Beide Skripte hängen nach demselben Schema im OpenWrt-Menü:
- Eine UCI-Config-Datei unter
/etc/config/<name>mit den Optionen (aktiviert, Port/Intervall, Pfad/Interface). - Ein Init-Skript unter
/etc/init.d/<name>, das die Config einliest und den Prozess startet bzw. sauber killt. - Ein Lua-Controller unter
/usr/lib/lua/luci/controller/<name>.lua, der den Menüpunkt unter Services registriert. - Eine CBI-Model-Datei unter
/usr/lib/lua/luci/model/cbi/<name>.luamit der eigentlichen Eingabemaske (Flag zum Aktivieren, ein paar Value-Felder).
Nach dem Anlegen aller Dateien einmal den LuCI-Cache leeren und den Webserver neu starten:
rm -rf /tmp/luci-indexcache /tmp/luci-modulecache
/etc/init.d/uhttpd restart
Und nicht vergessen: Für die Foto-Cloud muss der gewählte Port (bei mir 8080) noch in der Firewall für’s LAN freigegeben werden.
Das Ergebnis
Unter http://192.168.12.1 tauchen jetzt unter Services zwei touch-freundliche Menüpunkte auf: Foto-Cloud (Python) und iPhone-WLAN-Wächter. Nach jedem Neustart schlafen beide erstmal – der Router bootet dadurch angenehm leichtfüßig. Erst wenn ich im Urlaub tatsächlich Fotos sichern oder den iPhone-Hotspot am Laufen halten will, setze ich den Haken bei „Aktivieren“, klicke Save & Apply – fertig. Danach wieder aus, und die CPU des kleinen FileHubs darf durchatmen.
Fazit
Am Ende muss man akzeptieren, wann ein Gerät am Limit ist. Der WD03 wird bei mir genau das bleiben, wofür er taugt: ein nackter Reiserouter mit OpenWrt, ergänzt um die zwei minimalistischen Skripte für den Notfall. Sobald man mehr will – sei es Samba, Medienserver oder komplexe Hintergrunddienste –, führt kein Weg an modernerer Hardware vorbei.
Manchmal besteht der Hack eben nicht darin, mehr Features auf ein Gerät zu prügeln, sondern rechtzeitig den Stecker zu ziehen und sich auf das Nötigste zu beschränken.
*Download in Bearbeitung*
☕ Hat dir dieser Beitrag geholfen?
Ich stecke viel Herzblut und Zeit in diesen Blog. Wenn du mir danke sagen möchtest, kannst du mir hier einen virtuellen Kaffee spendieren: buymeacoffee oder Ko-fi. Vielen Dank für deine Unterstützung!
