Dokumentation

Installation, Betrieb und Antworten.

Nutze Safernotes nur auf deinem Gerät oder betreibe Web-App und Synchronisierung unter deiner eigenen URL. Eine Adresse für Web-App, Android-Synchronisierung und Anhänge – der Speicher ist bereits dabei.

Wähle deinen Modus

Nur offline

Kein Server und kein Konto. Die verschlüsselten Notizen bleiben ausschließlich im Speicher dieses Geräts.

Android installieren

Eigener Sync-Server

Web-App und API laufen per Docker auf deinem Server. Android verbindet sich mit derselben, von dir festgelegten URL.

Docker einrichten
Wichtig bei Offline-Nutzung

Das Löschen der App, der App-Daten oder des Browser-Speichers kann lokale Notizen unwiederbringlich entfernen. Offline-Daten werden derzeit nicht automatisch auf einen Server migriert.

Safernotes auf Android installieren

  1. App beziehen Installiere Safernotes aus dem Google Play Store oder lade die APK direkt herunter.
  2. APK bei Bedarf freigeben Bei einer direkten APK kann Android einmalig „Unbekannte Apps installieren“ für deinen Browser oder Dateimanager verlangen.
  3. Offline starten Wähle auf dem ersten Bildschirm Nur offline verwenden. Es wird keine Verbindung zu einem Safernotes-Server aufgebaut.

Für Erinnerungen muss Android Benachrichtigungen erlauben. Auf GrapheneOS müssen zusätzlich die Benachrichtigungsberechtigung und eine passende Akku-Einstellung für Safernotes aktiv sein. Lokale Erinnerungen benötigen weder Google Play Services noch einen Safernotes-Server.

Mit Docker installieren

Du brauchst Git, Python 3, Docker Engine und Docker Compose v2. Der Stack enthält die Web-App, Django-API, PostgreSQL und Redis. Verschlüsselte Anhänge werden direkt in einem dauerhaften Docker-Volume gespeichert.

1. Quellcode herunterladen

git clone https://github.com/MosesEllermann/Notizen-App.git
cd Notizen-App

2. Deine URL festlegen und starten

Ersetze die Beispieladresse durch deine eigene HTTPS-Adresse:

python3 tools/init_selfhost.py --url https://notizen.example.com
sudo docker compose up --build -d

Die Docker-Befehle hier verwenden sudo für einen Linux-Server. Wenn dein Benutzer bereits Docker-Zugriff hat oder du Docker Desktop bzw. Rootless Docker verwendest, lasse sudo weg. Das Python-Setup und Git führst du immer als normaler Benutzer aus, damit deine Dateien dir gehören.

Das Setup speichert die Adresse als PUBLIC_URL und erzeugt alle internen Geheimnisse automatisch in deiner privaten .env. Erlaubte Hosts, Browser-Zugriffe und App-Links werden aus dieser einen Adresse abgeleitet. Beim ersten Start werden Datenbankmigrationen und der Speicherbereich für verschlüsselte Anhänge automatisch angelegt. Der erste Build kann einige Minuten dauern.

Nur bei der ersten Einrichtung ausführen

Eine vorhandene .env wird nicht überschrieben. Behalte die erzeugten Geheimnisse auch bei Updates und sichere die Datei privat. Für einen bestehenden Server folge Updates & Backups.

3. Domain und HTTPS verbinden

Richte deine Domain auf deinen Server und leite sie über einen HTTPS-Reverse-Proxy mit gültigem TLS-Zertifikat an den Web-Port 8080 weiter. Der Proxy muss den ursprünglichen Host und X-Forwarded-Proto: https weitergeben und Uploads bis 100 MiB erlauben. Rufe danach deine eigene URL im Browser auf.

Nur die Web-App veröffentlicht einen Port. API, PostgreSQL und Redis bleiben im Docker-Netz. Anhänge laufen ebenfalls über deine App-Adresse: kein zusätzlicher Speicher-Port, keine zweite Domain und kein Cloud-Konto. Domain, HTTPS und Backups bleiben Aufgaben des Serverbetreibers.

Erst einmal lokal ausprobieren

Führe nach dem Herunterladen des Quellcodes diese Befehle statt der Einrichtung mit eigener Domain aus:

python3 tools/init_selfhost.py
sudo docker compose up --build -d

Öffne http://localhost:8080 auf demselben Rechner. Für den Zugriff vom Smartphone brauchst du eine von dort erreichbare HTTPS-Adresse. Stelle dafür PUBLIC_URL in der bestehenden .env um und starte den Stack erneut; die Geheimnisse bleiben gleich.

Optional: E-Mail über SMTP

SMTP-Schlüssel gehören ausschließlich in deine lokale .env-Datei. Setze dort EMAIL_BACKEND, EMAIL_HOST, EMAIL_PORT, Benutzername, Passwort, TLS/SSL und DEFAULT_FROM_EMAIL. Ohne SMTP schreibt die Standardkonfiguration Verifizierungs- und Wiederherstellungs-E-Mails in das Container-Log.

Ausführlichere Betreiberhinweise stehen auch im Self-Hosting-Handbuch im Repository.

Android mit deinem Server verbinden

  1. Safernotes öffnen Trage auf dem Anmeldebildschirm dieselbe vollständige URL wie bei PUBLIC_URL ein, zum Beispiel https://notizen.example.com.
  2. Konto anlegen oder anmelden Verwende danach Registrierung oder Anmeldung gegen deinen eigenen Server. Hänge kein /api an die URL an.
  3. URL später ändern Öffne Einstellungen → Sync-Server. Die URL wird nur lokal auf diesem Gerät gespeichert.

Die von Docker ausgelieferte Web-App verwendet automatisch ihre eigene Domain. Dort muss keine Server-URL eingetragen werden.

Updates und Backups

Installation aktualisieren

Falls du bereits Anhänge mit der früheren Speicher-Version genutzt hast, lies vor dem Update die Hinweise zum Wechsel direkt darunter.

git pull --ff-only
sudo docker compose up --build -d
sudo docker compose ps

Lies vor einem Update die Versionshinweise und sichere deine Daten. Datenbankmigrationen laufen beim Start des API-Containers.

Von einer älteren Docker-Konfiguration wechseln

Behalte deine bestehende .env, SECRET_KEY, POSTGRES_PASSWORD und alle Volumes. Prüfe nur deine öffentliche Adresse:

PUBLIC_URL=https://notizen.example.com

Eine Speicher-URL oder zusätzliche Speicher-Zugangsdaten werden nicht mehr verwendet. Alte Einträge in deiner .env werden ignoriert. Starte danach den Stack wie oben beschrieben. Erzeuge keine neuen Passwörter und lösche keine Volumes, um ein Startproblem zu umgehen.

Bei bereits gespeicherten Anhängen aus der früheren MinIO/S3-Version: Diese werden nicht automatisch übernommen. Sichere und exportiere sie vor dem Wechsel; das alte Speicher-Volume darf nicht einfach als neues Anhang-Volume eingebunden werden. Hinweise zur Übernahme stehen im Self-Hosting-Handbuch. Wenn die bisherige Installation schon beim Image-Download gescheitert ist, gibt es keine hochgeladenen Anhänge zu übernehmen.

PostgreSQL sichern

sudo docker compose exec -T postgres \
  pg_dump -U safernotes safernotes > safernotes-backup.sql

Sichere zusätzlich das Docker-Volume attachment_data mit den verschlüsselten Anhängen und bewahre deine .env sicher auf. Prüfe Wiederherstellungen regelmäßig auf einem getrennten System.

Stoppe für einen zusammengehörigen Datenbank- und Dateistand die API während der Sicherung. Die Volume-Namen tragen normalerweise den Compose-Projektnamen als Präfix. Verwende für Updates niemals docker compose down -v: Das löscht die dauerhaften Daten.

Wenn etwas nicht funktioniert

Docker meldet „permission denied“

Wenn der Zugriff auf /var/run/docker.sock verweigert wird, fehlen deinem Linux-Benutzer die Docker-Berechtigungen. Das ist kein App- oder Passwortfehler. Führe im Projektverzeichnis aus:

sudo docker compose up --build -d
sudo docker compose ps

Eine bereits erzeugte .env bleibt erhalten; das Setup-Skript musst du nicht erneut ausführen. Dauerhafter Zugriff ohne sudo lässt sich über die Docker-Gruppe einrichten – diese gewährt jedoch root-ähnliche Rechte. Details stehen in der offiziellen Docker-Anleitung. Mache den Docker-Socket nicht für alle Benutzer beschreibbar.

Containerstatus
sudo docker compose ps
API-Protokoll
sudo docker compose logs --tail=200 api
Web-Protokoll
sudo docker compose logs --tail=200 web
Healthcheck
curl https://notizen.example.com/api/v1/health/live
  • Es wird noch ein separates Speicher-Image heruntergeladen: Aktualisiere den Quellcode mit git pull --ff-only. Die aktuelle Compose-Datei benötigt keinen separaten Speicherdienst mehr. Behalte deine .env und vorhandene Daten.
  • Server nicht erreichbar: Prüfe HTTPS, DNS, Firewall und ob die URL ohne /api gespeichert wurde.
  • Setup meldet eine vorhandene Datei: Das schützt deine Zugangsdaten. Bearbeite bei Bedarf PUBLIC_URL in der bestehenden .env; lösche die Datei nicht.
  • Registrierungs-E-Mail fehlt: Prüfe die EMAIL_*-Werte und das API-Log. Bei der Console-Konfiguration steht der Inhalt nur im Log.
  • Anhänge schlagen fehl: Prüfe das API-Log, freien Speicherplatz, Schreibrechte im Anhang-Volume und das Upload-Limit deines HTTPS-Proxys. Es gibt keinen zusätzlichen Speicher-Port oder Speicher-Zugangsschlüssel.
  • Android-Erinnerungen fehlen: Erlaube Benachrichtigungen, kontrolliere Datum und Uhrzeit und entferne Akku-Beschränkungen für Safernotes.

Veröffentliche weder deine .env noch ungeprüfte Logs. Ohne SMTP können Verifizierungs- und Wiederherstellungslinks im API-Log stehen. Auch temporäre Anhang-Links gehören nicht in öffentliche Fehlerberichte.

Häufige Fragen

Brauche ich für Safernotes einen Server?

Nein. Im Offline-Modus arbeitet die App ohne Konto und ohne API. Einen Server brauchst du nur für Synchronisierung oder die selbst gehostete Web-App.

Kann ich eine beliebige Safernotes-URL in der App verwenden?

Ja. Trage die Basis-URL deiner eigenen Installation ein, beispielsweise https://notizen.example.com. Die App enthält keine verpflichtende Anbieter-URL.

Brauche ich mehrere Domains oder URLs?

Nein. Du konfigurierst nur PUBLIC_URL. Web-App, Android-Synchronisierung und Anhang-Transfers verwenden diese Adresse. Die internen Host-, Browser- und Link-Einstellungen werden automatisch daraus abgeleitet.

Muss ich API-Keys oder Passwörter selbst erstellen?

Nein. tools/init_selfhost.py erzeugt die internen Geheimnisse automatisch und speichert sie in deiner privaten .env. Für die Standardinstallation brauchst du kein externes Konto und keine API-Keys. Die Geheimnisse bleiben bei Updates erhalten und gehören in dein privates Backup.

Wofür sind die zwei automatisch erzeugten Geheimnisse?

SECRET_KEY sichert serverinterne Funktionen ab; er ist nicht der Entschlüsselungsschlüssel deiner Notizen. POSTGRES_PASSWORD schützt den Datenbankzugang. Du musst sie normalerweise nicht bearbeiten.

Ist der Speicher bereits enthalten?

Ja. PostgreSQL speichert unter anderem verschlüsselte Notizen und Kontodaten; verschlüsselte Anhänge liegen direkt im dauerhaften Docker-Volume attachment_data auf deinem Server. Die API prüft den Zugriff. Es gibt keinen externen Speicherdienst und keine zusätzliche Speicher-Konfiguration.

Muss ich Ports für Datenbank oder Dateispeicher freigeben?

Nein. Diese Dienste bleiben im Docker-Netz und veröffentlichen keine eigenen Ports auf dem Server. Nur der Web-Port wird an deinen HTTPS-Proxy angebunden. Eine gesonderte Speicher-Domain oder öffentliche Verwaltungsoberfläche brauchst du nicht.

Was muss ich beim Self-Hosting noch selbst einrichten?

Du benötigst einen Server mit Docker, eine erreichbare Domain, einen HTTPS-Reverse-Proxy und regelmäßige Backups. Das Setup übernimmt interne Geheimnisse und Datenbankmigrationen, aber keine Domainregistrierung oder automatische Datensicherung. SMTP ist optional; ohne SMTP werden E-Mails nur in die privaten Container-Logs geschrieben.

Kann der Server meine Notizen lesen?

Notiztitel, Texte, Checklisten und Anhänge werden clientseitig verschlüsselt. Der Server verarbeitet weiterhin notwendige Konto-, Freigabe- und technische Metadaten.

Funktionieren Erinnerungen ohne Google Play Services?

Ja. Erinnerungen werden lokal über Android geplant. Safernotes benötigt dafür die Benachrichtigungsberechtigung und darf nicht durch Akku- oder Hintergrundbeschränkungen gestoppt werden.

Kann ich Offline-Notizen später automatisch synchronisieren?

Noch nicht. Offline-Modus und Server-Vault sind getrennt. Verlasse dich bis zu einer Export-/Import-Funktion nicht auf eine automatische Migration.

Was kostet Self-Hosting?

Safernotes selbst ist kostenlos und unter AGPL-3.0-or-later verfügbar. Kosten können für deinen Server, Domain, Speicher, SMTP-Dienst oder Backups entstehen.

Wo melde ich Fehler oder schlage Funktionen vor?

Nutze die GitHub Issues des Open-Source-Projekts und beschreibe Plattform, App-Version und reproduzierbare Schritte.