Zum Inhalt

Joplin Server per Docker für eigene Notizen einrichten

Veröffentlicht am 22. August 2026 · Geschätzte Lesezeit: 4 Minuten

Joplin Server synchronisiert Notizen zwischen Joplin-Apps auf Computer, Smartphone und Tablet. Die Apps sprechen dabei mit deinem eigenen Server, der die Inhalte in PostgreSQL speichert. Für die Einrichtung im Heimnetz solltest du etwa 30 Minuten einplanen.

Voraussetzungen

  • Ein Linux-Server mit Docker und Docker Compose
  • Eine feste IP-Adresse für den Server
  • Der Port 22300 ist im Heimnetz frei
  • Mindestens eine installierte Joplin-App zum Funktionstest

1. Arbeitsordner und Datenordner anlegen

Führe den Befehl auf dem Docker-Server aus. PostgreSQL speichert seine Daten später unter ~/docker/joplin-server/data/postgres:

mkdir -p ~/docker/joplin-server/data/postgres && cd ~/docker/joplin-server

2. Umgebungsdatei anlegen

Erzeuge zunächst ein zufälliges Datenbankpasswort in der Datei .env:

printf 'POSTGRES_PASSWORD=%s\n' "$(openssl rand -hex 32)" > .env

Ergänze in derselben Datei diese Werte:

POSTGRES_USER=joplin
POSTGRES_DATABASE=joplin
APP_BASE_URL=http://<server-ip>:22300

Ersetze <server-ip> durch die feste IP-Adresse deines Servers, zum Beispiel 192.168.1.20. Schütze anschließend die Datei:

chmod 600 .env

Basis-URL später nicht beliebig ändern

Die Adresse muss genau zu der URL passen, die Apps und Browser verwenden. Für Zugriff aus dem Internet ist eine öffentliche HTTPS-Adresse statt der lokalen IP nötig.

3. Compose-Datei anlegen

Lege im Projektordner eine Datei compose.yaml an:

services:
  db:
    image: postgres:16
    container_name: joplin-db
    restart: unless-stopped
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_DB: ${POSTGRES_DATABASE}
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DATABASE}"]
      interval: 10s
      timeout: 5s
      retries: 5

  app:
    image: joplin/server:latest
    container_name: joplin-server
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    ports:
      - "22300:22300"
    environment:
      APP_PORT: 22300
      APP_BASE_URL: ${APP_BASE_URL}
      DB_CLIENT: pg
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DATABASE: ${POSTGRES_DATABASE}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PORT: 5432
      POSTGRES_HOST: db
      TRANSCRIBE_ENABLED: "false"

Die Datenbank erhält absichtlich keine Portfreigabe. Nur Joplin Server kann sie im internen Compose-Netz erreichen. Die optionale Transkriptionsfunktion bleibt für diesen einfachen Aufbau ausgeschaltet.

4. Konfiguration prüfen und starten

Prüfe zuerst die Compose-Datei:

docker compose config --quiet

Starte Datenbank und Server:

docker compose up -d

Prüfe anschließend beide Container:

docker compose ps

Falls ein Dienst nicht startet, lies die letzten Protokollzeilen:

docker compose logs --tail=100

5. Standard-Anmeldung sofort ändern

Öffne http://<server-ip>:22300 und melde dich einmal mit den von Joplin dokumentierten Startdaten an:

E-Mail: admin@localhost
Passwort: admin

Öffne oben rechts Profile und ersetze sofort E-Mail-Adresse und Passwort.

Standardpasswort nicht weiterverwenden

Solange admin gilt, kann jeder mit Netzwerkzugriff die Verwaltung übernehmen. Leite Port 22300 außerdem nicht direkt im Router weiter. Nutze für externen Zugriff HTTPS über einen Reverse Proxy oder ein privates VPN.

6. Benutzer für die Synchronisation anlegen

Öffne in der Verwaltungsoberfläche Users und lege einen normalen Benutzer an. Verwende dieses Konto später in den Joplin-Apps; das Administratorkonto bleibt der Verwaltung vorbehalten.

Aktiviere für wichtige Konten zusätzlich die Mehrfaktor-Authentifizierung im jeweiligen Profil und bewahre die Wiederherstellungscodes sicher auf.

7. Joplin-App verbinden

Öffne in der Desktop- oder Mobil-App die Synchronisationseinstellungen. Wähle als Ziel Joplin Server und trage diese Server-URL ein:

http://<server-ip>:22300

Ersetze <server-ip> wieder durch die feste Server-IP. Trage die Daten des normalen Benutzers ein und klicke auf Synchronisationskonfiguration prüfen. Erstelle danach eine Testnotiz und starte die Synchronisation.

Ende-zu-Ende-Verschlüsselung

Wenn Notizen trotz HTTPS auch auf dem Server nur verschlüsselt liegen sollen, aktiviere die Ende-zu-Ende-Verschlüsselung in einer Joplin-App und übernimm den Hauptschlüssel auf den weiteren Geräten. Bewahre das Verschlüsselungspasswort getrennt vom Server auf.

8. Datenbank sichern

Lege auf dem Docker-Server einen Backup-Ordner an:

mkdir -p backup

Dieser Befehl erzeugt eine datierte, komprimierte PostgreSQL-Sicherung. Er wird im Projektordner ausgeführt und enthält kein Passwort im Befehl:

docker compose exec -T db pg_dump -U joplin -d joplin -Fc > "backup/joplin-$(date +%F).dump"

Sichere zusätzlich .env und compose.yaml an einem geschützten Ort. Prüfe die Dump-Datei:

docker compose exec -T db pg_restore -l < backup/joplin-<datum>.dump | head

Ersetze <datum> durch das Datum im Dateinamen.

9. Wiederherstellung vorbereiten

Eine Rücksicherung überschreibt den Datenbankbestand. Stoppe deshalb zuerst den gesamten Stack und bewahre den aktuellen Datenordner als zusätzliche Kopie auf:

docker compose stop
cp -a data/postgres "data/postgres-vor-restore-$(date +%F)"

Restore nur mit geprüftem Backup

Führe eine Datenbank-Wiederherstellung nur durch, wenn das Backup mit pg_restore -l lesbar ist. Bei einem Fehler kannst du den Stack stoppen und auf die kopierte postgres-vor-restore-<datum>-Struktur zurückgehen.

10. Aktualisieren

Erstelle vor dem Update einen Datenbank-Dump. Lade dann neue freigegebene Images:

docker compose pull
docker compose up -d

Prüfe nach dem Update Anmeldung und Synchronisation. Bei Problemen kannst du in compose.yaml vorübergehend den zuvor verwendeten Versions-Tag aus den offiziellen Joplin-Server-Tags einsetzen und erneut starten.

11. Typische Fehler

  • Invalid URL: APP_BASE_URL stimmt nicht exakt mit der im Browser verwendeten Adresse überein.
  • Datenbank bleibt unhealthy: Prüfe freien Speicherplatz, Rechte unter data/postgres und docker compose logs db.
  • Anmeldung klappt, Synchronisation nicht: Prüfe in der App Ziel, Server-URL und das normale Benutzerkonto.
  • Port 22300 belegt: Finde den Dienst mit sudo ss -ltnp | grep ':22300' oder ändere nur die linke Portnummer und passe APP_BASE_URL an.

12. Quellen und Videos

Fertig

Joplin Server speichert und synchronisiert deine Notizen nun im Heimnetz. Erstelle auf einem Gerät eine Testnotiz, synchronisiere und kontrolliere auf einem zweiten Gerät, ob sie erscheint. Prüfe abschließend, dass das Standardpasswort nicht mehr funktioniert.