03 / Projekte
Messages
Ein selbst gehosteter Dienst für verschlüsselte, ablaufende und nach dem Lesen gelöschte Nachrichten mit privaten Antworten und einladungsbasierter Registrierung.
Private Nachrichten mit eingebautem Ende
Messages ist ein selbst gehosteter Dienst für verschlüsselte Notizen nach dem Prinzip eines einmaligen Links. Ein registrierter Nutzer schreibt eine Nachricht, wählt optional Passwort und Lebensdauer und teilt die URL. Standardmäßig läuft eine Nachricht nach 72 Stunden ab; möglich sind Werte zwischen einer Stunde und 30 Tagen oder das sofortige Löschen nach dem ersten erfolgreichen Lesen.
Verschlüsselung ist Produktverhalten
Jede Nachricht und jede Antwort besitzt einen zufälligen Content-Key. Der Inhalt wird mit AES-256-GCM verschlüsselt; in SQLite liegen nur authentifizierte Ciphertext-Envelopes. Bei passwortgeschützten Nachrichten fließt ein mit scrypt abgeleiteter Schlüssel in das Einpacken des Content-Keys ein. Der Server speichert dieses Passwort nicht und kann den Inhalt selbst mit Master-Key und vollständiger Datenbankkopie nicht ohne die zusätzliche Information entschlüsseln.
Der Löschzeitpunkt wird nicht nur von einem Hintergrundtimer angenommen. Ein Sweeper entfernt abgelaufene Datensätze jede Minute, und jeder Lesezugriff prüft die Frist erneut. Selbst bei einem verzögerten Job wird veralteter Inhalt deshalb nicht ausgeliefert. Burn-after-reading wird erst nach erfolgreicher Entschlüsselung wirksam – ein falsches Passwort zerstört die Nachricht nicht.
Antworten und kontrolliertes Wachstum
Empfänger können über denselben Link privat antworten. Nur der Eigentümer der ursprünglichen Nachricht sieht die Antwortliste; Antworten besitzen eigene optionale Passwörter und Ablaufzeiten. Registrierung ist halb einladungsbasiert: Ein gültiger geteilter Nachrichtenlink dient als Einladung, während ein initiales Konto die erste Nachricht erzeugt.
Angemeldete Nutzer erhalten eine Historie mit Antwortzahlen, können Optionen ändern, Nachrichten manuell entfernen, ihr Passwort ändern oder das Konto samt eigener Inhalte löschen. Die Oberfläche ist deutsch- und englischsprachig, responsiv und unterstützt helles, dunkles oder systemgesteuertes Farbschema.
Kleine, direkte Architektur
Eine einzelne Node.js-Anwendung stellt Express-API und gebaute Vue-3-SPA bereit. Das Frontend nutzt Vite, Vue Router, Pinia und vue-i18n. Das Backend verwendet Express, Zod für Request-Validierung, better-sqlite3, JWT-Sitzungen in HttpOnly-Cookies und bcrypt für Kontopasswörter. Das Datenmodell bleibt bewusst in einer SQLite-Datei, die im WAL-Modus auf einem persistenten Volume liegt.
Helmet setzt eine strenge Same-Origin-CSP. Authentifizierung und Nachrichtenansicht sind rate-limitiert, Cookies sind in Produktion Secure und SameSite=Lax. Verschlüsselungs- und JWT-Schlüssel werden durch Ansible Vault verwaltet und als geschützte Umgebungsdatei ausgerollt; eine unbedachte Rotation des Master-Keys würde vorhandene Nachrichten absichtlich unlesbar machen und wird entsprechend als Betriebsgrenze dokumentiert.
Die Produktion läuft als einzelner Docker-Swarm-Service hinter Traefik mit TLS, Healthcheck und Start-first-Rollout. Die Anwendung ist bewusst kleiner als die anderen Projekte: wenige Komponenten, ein klarer Sicherheitsvertrag und ein vollständiger API-Smoke-Test. Sie ist unter messages.dphillips.de produktiv erreichbar.