4.5 KiB
Mail-Graveyard — bauen & benutzen
1. Bauen
./compile.sh
Holt htmx ins frontend-js/dist, macht go mod tidy und baut ein statisches
Binary für Linux und Windows (mail-graveyard / mail-graveyard.exe).
2. Konfig
cp config.json.example config.json
config.json (bleibt lokal, ist ge-.gitignore-t) setzt nur App-Sachen:
Bind/Port, Admin-Login, DB-Pfad, mbox-Wurzel, optionale
mbox_compression (none oder zstd) und das Forward-SMTP (nur fürs
manuelle Weiterleiten aus dem Viewer). Die Umzugs-Konten legst du im Browser
an, nicht hier.
3. Starten (Web)
./mail-graveyard --init-db # nur beim ersten Start: DB aus db_path anlegen
./mail-graveyard # danach normal, lauscht auf 127.0.0.1:8087
Fehlt die DB-Datei spaeter, startet Mail-Graveyard bewusst nicht mehr still mit
einer leeren Datenbank. Dann db_path pruefen oder nur fuer eine echte
Neuinstallation erneut --init-db benutzen.
Browser auf http://127.0.0.1:8087, mit Admin-Login aus config.json.
Oberfläche im Outlook-2013-Look: Reiter Postfächer (Konten anlegen: Quelle
alt → Ziel neu, Sicherheits-Modus tls/starttls/none, „Test" prüft beide
Logins), Reiter Umzug (starten + Fortschritt), Reiter Betrachten
(lokale mbox durchsehen, einzeln weiterleiten).
4. Starten (CLI — Cutover)
Ohne Web, z. B. als Cronjob oder Dauerlauf im Umzugsfenster:
./mail-graveyard --run all # einmalig alle Konten (Delta)
./mail-graveyard --run dr-gold --watch # ein Konto, Delta-Schleife bis Stop
Die kanonische Inhaltsidentitaet verhindert dabei doppelte Schreibvorgaenge in Archiv und Ziel. Der aktuelle Volllauf laedt trotzdem jede Quellmail erneut, bevor er deren Body-Hash pruefen kann. Grosse Konten deshalb bis zum UID-Delta-Watcher nicht in kurzen Intervallen als Dauerlauf starten.
5. Wartung
./mail-graveyard --reindex all
./mail-graveyard --dedup-target konto-name # Dry-Run
./mail-graveyard --dedup-target konto-name --apply # loescht Dubletten im Ziel
./mail-graveyard --snapshot /sicherungen/stand-2026-07-16
./mail-graveyard --verify-snapshot /sicherungen/stand-2026-07-16
--reindex baut den Archiv-Index fuer vorhandene mbox/mbox.zst-Dateien neu auf.
--dedup-target ist bewusst ein Dry-Run, bis --apply gesetzt wird; Mails ohne
Message-ID werden nie geloescht.
--snapshot erzeugt zuerst per SQLite VACUUM INTO einen konsistenten
DB-Stand. Anschliessend kopiert es aus jeder append-only mbox exakt das durch
MAX(file_offset+frame_len) dieses DB-Standes belegte Praefix. Das Ziel
muss neu sein und enthaelt data/mail-graveyard.db, backup/... sowie ein
Manifest mit Grenzen und SHA-256-Pruefsummen. Ein Fehler hinterlaesst ein klar
benanntes .partial-*-Verzeichnis und wird nie als fertiger Stand umbenannt.
Die Datenbank wird wegen der enthaltenen Klartext-Zugangsdaten mit 0600
geschrieben; die Verifikation weist unter Linux weiter gefasste Rechte zurueck.
--verify-snapshot veraendert weder Produktion noch Snapshot: Es prueft
Manifest, Dateigroessen, SHA-256, SQLite-Integritaet, Stufenreihenfolge und den
Identitaetsdigest. Danach kopiert es nur die Snapshot-DB in ein temporaeres
Restore-Verzeichnis und reindiziert dort alle mbox-Dateien. Der
Identitaetsdigest muss vor und nach dem Reindex gleich bleiben.
Der lokale Snapshot ist nur die konsistente Vorstufe eines Backups. Er enthaelt Kontozugangsdaten und muss anschliessend verschluesselt auf einen raeumlich getrennten Datentraeger uebertragen werden.
6. Sicherheit
Tool hält fremde IMAP-Passwörter und kann Mails senden → Default bind
127.0.0.1. Falls remote nötig: hinter Caddy + /vadmin-Mail-2FA. config.json
und *.db nie committen.
Die Live-SQLite-Datei sowie ihre WAL-/SHM-Sidecars werden bei jedem Start auf
0600 gesetzt. Das gilt auch fuer weitere *.db, *.db-wal und *.db-shm
direkt im konfigurierten Datenverzeichnis sowie fuer die Datenbank eines neu
erzeugten Snapshots. Kann ein Dateisystem Unix-Rechte nicht abbilden (z. B.
bestimmte exFAT-/CIFS-Mounts), startet das Werkzeug bewusst nicht: Zugangsdaten
bleiben fail-closed statt unbemerkt lesbar.
7. Reihenfolge bei einem echten Umzug
- Ziel-Postfächer beim neuen Hoster anlegen (
archiv-…,temp-…). - Konten im Browser eintragen, „Test" grün.
--runlaufen lassen, im Betrachten-Reiter / mbox stichprobenartig prüfen.- Während der Umstellung
--watchfür das Delta laufen lassen. - Domain portieren; danach zeigt der neue Hoster auf die Zielpostfächer.