sphings-dev.de

Apps & Werkzeuge

AmberShelf

Docker

Einbahn-Abgleich einer Master-Platte auf eine oder mehrere Sicherungsplatten: Der Master wird vom Kernel nur lesend eingehängt, Ersetzen und Löschen brauchen Freigabe, eine Notbremse stoppt Massenänderungen. Mit Weboberfläche, für Docker und als Desktop-App.

Repository (öffnet in neuem Tab)

Steckbrief

Sprache
Python
Lizenz
AGPL-3.0
Aktuelle Version
0.7.1
Projektstart

AmberShelf spiegelt eine Master-Platte auf eine oder mehrere Sicherungsplatten, ohne hinter dem Rücken des Nutzers etwas zu löschen oder zu überschreiben. Gedacht ist es für Foto- und Videoarchive, die auf externen Platten im Schrank liegen: gelegentlich angesteckt, zwischen Mac und Windows-PC getragen, den Rest der Zeit offline. Das Projekt ist selbst gehostet, in Python geschrieben und steht unter der AGPL-3.0.

Das Prinzip

Übliche Abgleichsprogramme verstehen „die Quelle hat sich geändert“ als Auftrag, die Kopie mitzuändern. Genau das ist unerwünscht, wenn die Quelle gerade von einem Verschlüsselungstrojaner verändert, von einem defekten Kabel beschädigt oder von einem vertippten Befehl geleert wurde. AmberShelf dreht das um: Es liest beide Seiten, vergleicht über SHA-256-Prüfsummen (nie über Zeitstempel, die auf exFAT in Lokalzeit mit 10 ms Auflösung vorliegen) und zeigt dann, was es tun würde. Dateien hinzufügen ist Alltag. Ersetzen, Umbenennen oder Löschen braucht eine Freigabe, und eine Massenänderung löst eine Notbremse aus.

Funktionen

  • Der Master wird vom Kernel schreibgeschützt (ro) eingehängt; die Mount-Flags werden gegengelesen, bevor ein Byte gelesen wird. Ein Programmierfehler oder ein übernommener Container kommt nicht ans Original.
  • Jede Kopie wird bewiesen: Die Datei wird unter einem Temporärnamen geschrieben, auf die Platte gezwungen, zurückgelesen und geprüft und erst dann umbenannt.
  • Ersetzte und gelöschte Dateien werden in .ambershelf-trash auf der Kopie geparkt, mit dem Zeitstempel des Laufs.
  • Entscheidungen werden gemerkt: freigeben, diesmal übergehen oder nie wieder fragen.
  • Beschädigte Dateien werden erkannt, indem die Kopfbytes gegen die Endung geprüft werden (ein .jpg muss mit FF D8 FF beginnen). Dazu kommen Erpresserbriefe am Dateinamen, sinnlose zweite Endungen und Massenänderungen innerhalb einer Stunde. Jeder Befund hält die Notbremse an.
  • Einen großen Master auf mehrere kleinere Platten aufteilen, Ordner für Ordner, mit einer dauerhaften Warnung für alles, was auf keiner Kopie landet.
  • Umbenennungserkennung, fortsetzbares Einlesen und Kopien, die gewöhnliche Ordnerbäume bleiben und ohne AmberShelf lesbar sind.
  • Benachrichtigung per Webhook (Home Assistant, ntfy, Gotify oder ein eigenes Skript), Deutsch und Englisch, helles und dunkles Erscheinungsbild.

Aufbau

Auf dem Host läuft ein kleiner Helfer mit Root-Rechten. Er listet Blockgeräte, hängt den Master nur lesend und Kopien schreibend ein und besitzt die Zuordnung von Platte zu Rolle in einer root-eigenen Datei. Der Container ist unprivilegiert (kein privileged, keine Capabilities, kein Gerätezugriff) und kann den Helfer nur über einen Unix-Socket darum bitten, einen Auftrag einzuhängen. Er benennt nie ein Gerät und entscheidet nie über eine Rolle. Platten werden über Dateisystem-UUID und Seriennummer erkannt, ein umbenannter Ordner oder eine geklonte Platte kann deshalb keine Richtung umdrehen.

Drei Wege

Docker auf Linux ist die Fassung mit der vollen Zusage: Der Kernel erzwingt den Schreibschutz. Daneben gibt es Apps für macOS (12+, Apple Silicon) und Windows (10+). Die Desktop-Fassungen lesen die vom System eingehängten Datenträger, brauchen keine Administratorrechte und können den Master deshalb nicht schreibschützen; sie sagen das auf jeder Seite. Beide lassen sich auch auf eine AmberShelf-Instanz anderswo richten und sind dann ein Fenster auf die Docker-Fassung. Die Apps sind nicht signiert; unter macOS öffnet man sie beim ersten Mal per Rechtsklick und „Öffnen“, unter Windows über „Weitere Informationen → Trotzdem ausführen“.

Installation mit Docker

Vorausgesetzt werden ein Linux-Host mit Docker und systemd, util-linux und die Kernel-Treiber für die Dateisysteme (exfat seit Kernel 5.7, ntfs3 seit 5.15). Ein fertiges Image liegt unter ghcr.io/sphings79/ambershelf:latest für linux/amd64 und linux/arm64.

git clone https://github.com/sphings79/ambershelf.git
cd ambershelf
sudo docker/install.sh      # Helfer, systemd-Unit, Gruppe, Verzeichnisse
docker compose up -d

Die Oberfläche hört auf 127.0.0.1:8088. Alles, was nicht allein über Loopback erreichbar ist, verlangt ein Passwort; beim ersten Start erzeugt AmberShelf eines und schreibt es ins Protokoll.

Grenzen

AmberShelf gleicht in einer Richtung und nur auf Anforderung ab, laufender Abgleich in beide Richtungen ist ausdrücklich nicht das Ziel (dafür empfehle ich Syncthing). NAS-Freigaben über SMB oder NFS funktionieren derzeit nicht, weil die Plattenerkennung Dateisystem-UUID und Seriennummer braucht. Der Schutz gilt der Kopie vor einem bereits beschädigten Master; vor jemandem, der den Host selbst übernimmt, schützt es nicht.