Zum Inhalt

HedgeDoc per Docker installieren und gemeinsam schreiben

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

HedgeDoc ist ein gemeinsamer Markdown-Editor: Mehrere angemeldete Benutzer können Notizen gleichzeitig bearbeiten und Änderungen sofort sehen. Datenbank und Uploads bleiben in Docker-Volumes erhalten. Für die erste Einrichtung reichen etwa 20 Minuten.

Voraussetzungen

  • Ein Linux-Server mit Docker und Docker Compose
  • Eine feste IP-Adresse für den Server
  • Der Port 3000 im Heimnetz frei
  • Ein Browser und grundlegender Zugriff auf das Terminal des Servers

1. Arbeitsordner und geheime Werte anlegen

Erstelle auf dem Docker-Server einen Projektordner und wechsle hinein:

mkdir -p ~/hedgedoc && cd ~/hedgedoc

Der nächste Befehl erzeugt ein zufälliges Datenbankpasswort und ein dauerhaftes Sitzungsgeheimnis. Ersetze <server-ip> durch die feste IP-Adresse des Servers, zum Beispiel 192.168.1.20:

printf 'POSTGRES_PASSWORD=%s\nCMD_SESSION_SECRET=%s\nHEDGEDOC_DOMAIN=%s\n' "$(openssl rand -hex 24)" "$(openssl rand -hex 32)" '<server-ip>' > .env

Schütze die Datei vor anderen lokalen Benutzern:

chmod 600 .env

Das Sitzungsgeheimnis muss bei Neustarts gleich bleiben. Sonst werden alle Benutzer abgemeldet.

2. Compose-Datei erstellen

Lege im Ordner ~/hedgedoc eine Datei namens compose.yaml mit folgendem Inhalt an:

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

  app:
    image: quay.io/hedgedoc/hedgedoc:1.11.1
    container_name: hedgedoc
    restart: unless-stopped
    depends_on:
      database:
        condition: service_healthy
    ports:
      - "3000:3000"
    environment:
      CMD_DB_URL: postgres://hedgedoc:${POSTGRES_PASSWORD}@database:5432/hedgedoc
      CMD_DOMAIN: ${HEDGEDOC_DOMAIN}
      CMD_URL_ADDPORT: "true"
      CMD_PROTOCOL_USESSL: "false"
      CMD_SESSION_SECRET: ${CMD_SESSION_SECRET}
      CMD_ALLOW_ANONYMOUS: "false"
      CMD_ALLOW_ANONYMOUS_EDITS: "false"
      CMD_ALLOW_EMAIL_REGISTER: "true"
      CMD_DEFAULT_PERMISSION: private
      CMD_ENABLE_UPLOADS: registered
    volumes:
      - hedgedoc-uploads:/hedgedoc/public/uploads

volumes:
  hedgedoc-db-data:
    name: hedgedoc-db-data
  hedgedoc-uploads:
    name: hedgedoc-uploads

Die Versionsangaben entsprechen der aktuellen offiziellen Docker-Anleitung. Prüfe vor späteren Änderungen immer die HedgeDoc-Versionshinweise und die PostgreSQL-Migration.

3. HedgeDoc starten

Starte Datenbank und Anwendung auf dem Docker-Server:

docker compose up -d

Prüfe den Zustand beider Container:

docker compose ps

Falls HedgeDoc nicht startet, zeigen die letzten Protokollzeilen meist den Grund:

docker compose logs --tail=100

4. Erstes Konto anlegen

Öffne http://<server-ip>:3000 im Browser und ersetze <server-ip> durch die IP aus der .env-Datei. Registriere dein erstes Konto mit einem langen, einmaligen Passwort. Lege alle weiteren benötigten Konten ebenfalls jetzt an.

Registrierung danach schließen

Solange CMD_ALLOW_EMAIL_REGISTER auf true steht, kann jeder mit Zugriff auf die Seite ein Konto anlegen. Schließe die Registrierung nach der Einrichtung.

5. Registrierung schließen

Ändere in compose.yaml beim Dienst app genau diese Zeile:

      CMD_ALLOW_EMAIL_REGISTER: "false"

Übernimm die Änderung anschließend auf dem Docker-Server:

docker compose up -d

Vorhandene Konten können sich weiterhin anmelden. Für einen neuen Benutzer kannst du die Registrierung kurz wieder aktivieren und danach erneut schließen.

6. Gemeinsame Notiz prüfen

Melde dich an und erstelle eine neue Notiz. Der Standardwert private verhindert, dass sie automatisch öffentlich sichtbar wird. Öffne die Freigabeeinstellungen der Notiz und wähle erst dann eine passende Berechtigung für die Zusammenarbeit.

Freigaben bewusst wählen

Verwende privat für persönliche Inhalte. Teile bearbeitbare Notizen nur mit den vorgesehenen Personen und prüfe den Link einmal in einem privaten Browserfenster.

7. Daten und Uploads sichern

Erstelle im Projektordner einen Datenbankexport. Der Befehl läuft auf dem Docker-Server und schreibt eine SQL-Datei mit Datum und Uhrzeit:

docker compose exec -T database pg_dump -U hedgedoc -d hedgedoc > hedgedoc-db-$(date +%F-%H%M).sql

Stoppe die Anwendung kurz, bevor du hochgeladene Dateien sicherst:

docker compose stop app

Archiviere anschließend das Upload-Volume im aktuellen Ordner:

docker run --rm -v hedgedoc-uploads:/data:ro -v "$PWD:/backup" alpine sh -c 'tar czf /backup/hedgedoc-uploads-$(date +%F-%H%M).tar.gz -C /data .'

Starte HedgeDoc wieder:

docker compose start app

Sichere SQL-Datei, Upload-Archiv, compose.yaml und die vertrauliche .env-Datei verschlüsselt auf einem anderen Gerät. Entferne HedgeDoc im Notfall nur mit docker compose down; die Option -v würde die Volumes löschen.

8. Zugriff über das Internet absichern

Für reinen Heimnetzbetrieb bleibt die gezeigte HTTP-Konfiguration ausreichend. Für öffentlichen Zugriff brauchst du einen HTTPS-Reverse-Proxy mit WebSocket-Unterstützung für /socket.io/. Passe dann die Domain ohne Protokoll an und ändere in compose.yaml:

      CMD_DOMAIN: <hedgedoc-domain>
      CMD_URL_ADDPORT: "false"
      CMD_PROTOCOL_USESSL: "true"

Ersetze <hedgedoc-domain> beispielsweise durch notes.example.de. Leite diese Domain im Reverse-Proxy an http://<server-ip>:3000 weiter und veröffentliche Port 3000 nicht zusätzlich direkt im Router.

9. Typische Fehler beheben

  • Datenbank bleibt ungesund: Prüfe, ob .env vorhanden ist und der Wert POSTGRES_PASSWORD nicht leer ist.
  • Anmeldung endet nach jedem Neustart: Kontrolliere, ob CMD_SESSION_SECRET in der .env-Datei unverändert vorhanden ist.
  • Gemeinsames Schreiben aktualisiert sich nicht: Aktiviere im Reverse-Proxy die Weiterleitung von WebSockets für /socket.io/.
  • Bilder fehlen nach einer Wiederherstellung: Spiele neben dem SQL-Export auch das gesicherte Upload-Volume ein.
  • Neue Registrierung nicht möglich: Aktiviere sie nur kurz für die Einrichtung des Kontos und schließe sie danach wieder.

10. Quellen und Videos

Fertig

HedgeDoc läuft nun mit geschlossener Registrierung, privaten Standardnotizen und dauerhaft gespeicherten Daten. Erstelle eine Testnotiz, melde dich mit einem zweiten Konto an und prüfe, ob freigegebene Änderungen in beiden Browserfenstern erscheinen.