---
title: Sync-Server
description: Was der eingebaute Sync von tagwerk von einem WebDAV-Server braucht, welche Adresse für welche Art Server einzutragen ist und wie du herausfindest, warum eine Verbindung scheitert.
reviewed: 2026-10-29
---

## Was tagwerk von einem Server braucht {#requirements}

Der eingebaute Sync spricht gewöhnliches WebDAV. Er braucht auf dem Server keine App, kein Plug-in
und kein Konto außer einem Benutzer, der einen Ordner lesen und beschreiben darf. Dieses Kapitel
ist für die Person, die den Server betreibt; wie der Sync in der App eingerichtet wird, steht unter
[Sync](../sync/de.md#setup).

| Methode | Wofür tagwerk sie nutzt |
| --- | --- |
| `OPTIONS` | Verbindungstest und Beginn eines Syncs. Die Antwort muss einen `DAV`-Header tragen. |
| `PROPFIND` | `Depth: 0`, um die WebDAV-Adresse zu finden und den Notizordner zu prüfen; `Depth: 1`, um Ordner aufzulisten. `Depth: infinity` wird einmal für den ganzen Baum versucht; eine Ablehnung wird gemerkt und nach zwei Wochen erneut gefragt. |
| `GET` | Herunterladen einer Notiz, einer Vorlage, der Tag-Farben oder der Lizenz. |
| `PUT` | Hochladen. Beantwortet mit 200, 201 oder 204. |
| `MKCOL` | Anlegen des Notizordners und der Ordner darunter (Jahr, Monat, `templates/`, `settings/`). |
| `DELETE` | Entfernen der Datei des Verbindungstests, einer in der App entfernten Vorlage und der Tag-Farben-Datei, sobald alle Farben entfernt sind. Eine Tagesnotiz wird nie gelöscht. |

Über die Methoden hinaus:

- **Bedingtes Schreiben.** Eine neue Datei geht mit `If-None-Match: *` hinaus, eine geänderte mit
  `If-Match` und dem ETag, den tagwerk zuletzt gesehen hat. Hält der Server etwas anderes, muss er
  mit `412 Precondition Failed` antworten; tagwerk vergleicht dann mit dem, was wirklich dort
  liegt, statt es zu überschreiben. Ein schwacher ETag (`W/"..."`) wird zum Vergleichen angenommen;
  ein Schreiben auf seiner Grundlage geht ohne Bedingung hinaus, weil `If-Match` keinen schwachen
  Tag treffen kann. Ein `PUT`, dessen Antwort keinen ETag trägt, ist ebenfalls in Ordnung: tagwerk
  fragt ihn per `PROPFIND` nach.
- **Basic-Authentifizierung bei jeder Anfrage**, die Zugangsdaten als UTF-8 kodiert. Keine Cookies
  und keine Sitzung: Jede Anfrage trägt ihre eigenen Zugangsdaten, die Sitzung eines Kontos kann
  also nie für ein anderes einspringen. Server, die nur andere Verfahren annehmen (NTLM, OAuth- oder
  OpenID-Connect-Tokens), lassen sich nicht verwenden.
- **HTTPS.** `http://` funktioniert und wird mit einer Warnung quittiert, weil Basic-Authentifizierung
  das Passwort für jeden auf dem Weg lesbar verschickt. Zertifikate müssen für den Namen in der
  Adresse gelten; ein selbstsigniertes kann tagwerk nicht annehmen.
- **Weiterleitungen.** Eine Weiterleitung bei gleichem Schema, Host und Port wird mit den
  Zugangsdaten verfolgt. Eine auf einen anderen Host oder von `http://` auf `https://` wird ohne sie
  verfolgt, und die App nennt dann die Adresse, auf die sie geschickt wurde. Von `https://` auf
  `http://` wird gar nicht verfolgt.
- **Statuscodes, auf die tagwerk reagiert.** `401` ist eine abgelehnte Anmeldung, `403` bei einem
  `PUT` ein schreibgeschützter Ordner, `507` ein volles Kontingent, `412` eine zwischenzeitlich
  geänderte Fassung. `5xx`, Zeitüberschreitungen und abgebrochene Verbindungen werden dreimal
  wiederholt, bevor sie gemeldet werden.

tagwerk nutzt die Proxy-Einstellungen des Systems. HTTP/2 kommt zum Einsatz, wo der Server es
anbietet, sonst HTTP/1.1.

## Welche Adresse einzutragen ist {#address}

Der Assistent braucht die Adresse der WebDAV-Wurzel des Kontos. Bei Nextcloud und ownCloud findet er
sie selbst; bei jedem anderen Server trägst du sie vollständig ein.

| Server | Eintragen | tagwerk nutzt |
| --- | --- | --- |
| Nextcloud, ownCloud | `https://cloud.example.org` | `https://cloud.example.org/remote.php/dav/files/USER/` |
| Nextcloud in einem Unterpfad | `https://example.org/nextcloud` | `https://example.org/nextcloud/remote.php/dav/files/USER/` |
| Eine Adresse mit `remote.php` oder `/dav/` darin | die Adresse, wie sie ist | die Adresse, wie sie ist |
| Jeder andere WebDAV-Server | die vollständige WebDAV-Adresse des Kontos | die Adresse, wie sie ist |

Eine Adresse ohne Schema bekommt `https://`. Nennt die Adresse noch keinen WebDAV-Pfad, fragt
tagwerk drei Kandidaten mit `PROPFIND` und `Depth: 0`: zuerst den abgeleiteten Nextcloud-Pfad
`remote.php/dav/files/USER/`, dann `remote.php/webdav/` - dieselben Dateien für den, der sich
angemeldet hat, und das, was eine Nextcloud beantwortet, wenn der Anmeldename eine E-Mail-Adresse
statt der Benutzer-ID ist -, dann die Adresse, wie sie eingetragen ist. Genommen wird der erste,
der mit `207 Multi-Status` antwortet - jede andere Antwort, auch `200` und `405`, zählt nicht.
Antwortet keiner mit `207`, wird die stärkste Ablehnung gemeldet: ein abgelehntes Passwort vor einem
verbotenen Pfad vor einem Serverfehler.

## Der Ordner auf dem Server {#layout}

In Schritt 2 des Assistenten wird ein Ordner unter der WebDAV-Wurzel gewählt oder angelegt. Darunter
schreibt der Sync:

```
Tagwerk/
  2026/
    10/
      2026-10-28.md
  templates/
    template.md
    template-monday.md
  settings/
    tagwerk.colors
    tagwerk.license
```

`Tagwerk/` steht für den gewählten Ordner. Tagesnotizen werden nach Jahr und Monat abgelegt,
gleich, wie der Notizordner auf dem Gerät aufgebaut ist. Der Verbindungstest schreibt
`.tagwerk-connection-test.txt` in den Ordner und löscht die Datei wieder. Jede andere Datei im
Ordner bleibt unberührt; Konfliktkopien bleiben auf dem Gerät, das sie angelegt hat, und werden nie
hochgeladen.

Eine Tagesnotiz wird nur ersetzt, nie gelöscht. Was der Sync überträgt und nach welcher Regel,
steht unter [Sync](../sync/de.md#what-moves).

## Hinweise zu einzelnen Servern {#providers}

Die meisten WebDAV-Server brauchen nicht mehr als eine Adresse, einen Namen und ein Passwort. Die
Hinweise hier sind die Stellen, an denen sich ein Server anders verhält, als seine Adresse vermuten
lässt - gelernt an echten Konten, mit Datum, wo es darauf ankommt. Ein Server, der hier nicht
steht, ist kein Server, der nicht funktioniert.

### Nextcloud {#nextcloud}

- Trage die normale Server-Adresse ein; der WebDAV-Pfad wird abgeleitet.
- Die Browser-Anmeldung (*Im Browser anmelden (Nextcloud)*) nutzt den Login Flow v2 von Nextcloud:
  Der Server stellt tagwerk ein App-Passwort aus, das unter *Einstellungen → Sicherheit → Geräte &
  Sitzungen* erscheint und sich dort widerrufen lässt. Geprüft an einer echten Nextcloud im
  September 2026.
- Mit Zwei-Faktor-Anmeldung am Konto scheitert das Konto-Passwort bei *Anmeldung akzeptiert*. Nimm
  die Browser-Anmeldung oder ein App-Passwort.
- Nextcloud lehnt `Depth: infinity` von Haus aus ab. tagwerk listet die Ordner dann einzeln: eine
  Anfrage für den Ordner, eine je Jahr, eine je Monat.
- Auf manchen Installationen ist Schreiben um ein Vielfaches langsamer als Lesen. *Servertempo* in
  der App zeigt Lesen und Schreiben getrennt, mit einem Text für den Hoster.
- Ein App-Passwort ohne Zugriff auf das Dateisystem oder eine Regel der App
  "Dateizugriffskontrolle" lässt die Anmeldung durch und hält sie von jedem Ordner fern. Die App
  sagt *Die Anmeldung klappt, aber der Server lässt sie nicht an die Dateien.*
- Nach mehreren falschen Passwörtern verzögert der Brute-Force-Schutz von Nextcloud seine Antworten
  und antwortet unter Umständen mit `423`. Warte, bevor du es erneut versuchst.
- Ein geteilter Ordner erscheint erst, wenn das Konto die Freigabe angenommen hat, und zwar in dem
  Ordner, in den das Konto empfangene Freigaben legt.

### ownCloud {#owncloud}

- ownCloud Server nimmt dieselbe Adresse wie Nextcloud; der Pfad wird genauso abgeleitet.
- Die Browser-Anmeldung ist die von Nextcloud. Bei ownCloud trägst du das Konto-Passwort oder ein
  App-Passwort ein.
- ownCloud Infinite Scale und OpenCloud melden über OpenID Connect an und liefern WebDAV unter
  anderen Pfaden. tagwerk meldet sich nur per Basic-Authentifizierung an und ist gegen beide nicht
  geprüft.

### Synology {#synology}

- Installiere in DSM das Paket *WebDAV Server* und schalte dort HTTPS ein; sein HTTPS-Port ist
  standardmäßig 5006 (5005 für HTTP).
- Trage die Adresse mit Port ein, zum Beispiel `https://nas.example.org:5006`.
- Ein NAS startet meist mit einem selbstsignierten Zertifikat, das tagwerk nicht annimmt: Der Test
  hält bei *Verbindung und Verschlüsselung* an. Gib dem NAS ein Zertifikat einer öffentlichen
  Stelle, zum Beispiel Let's Encrypt in DSM, und nimm genau den Namen, auf den es ausgestellt ist -
  nicht die IP-Adresse.
- Gegen eine echte DiskStation noch nicht geprüft.

### HiDrive {#hidrive}

- Trage die WebDAV-Adresse ein, die dein Anbieter auf seinen Hilfeseiten nennt.
- Die oberste Ebene ist schreibgeschützt: Ordner oder Dateien dort anzulegen beantwortet sie mit
  `403`. Dein eigener Ordner ist `/users/USER/`; öffne in Schritt 2 des Assistenten `users`, dann
  dein Konto, und lege den Notizordner dort an oder wähle ihn.
- HiDrive antwortet auf jeden Pfad, den es nicht gibt, mit `403` statt `404`. tagwerk fragt dann
  den nächsten Kandidaten und versucht, einen fehlenden Ordner anzulegen, bevor es einem `403`
  glaubt.
- WebDAV gehört nicht zu jedem Tarif. Bei IONOS ist es in den Grundtarifen enthalten, bei STRATO
  bekommen die Privattarife es nur mit dem Protokoll-Paket. Ohne scheitert der Test, obwohl Adresse
  und Passwort stimmen. Geprüft mit einem IONOS-Konto im August 2026.

### Hetzner Storage Box {#storage-box}

- Jedes Unterkonto hat einen eigenen Host: `https://u123456-sub1.your-storagebox.de`, nicht den der
  Box, `https://u123456.your-storagebox.de`. Unter dem Namen der Box wird ein Unterkonto mit `401`
  abgewiesen, was genau wie ein falsches Passwort aussieht. Die App erkennt den Fall und nennt die
  richtige Adresse.
- Trage `https://` ein. Bei `http://` leitet die Box auf `https://` weiter, die Zugangsdaten gehen
  dabei verloren, und die App meldet die Weiterleitung.
- Die Box ist Apache mit `mod_dav`, es gilt also alles aus dem nächsten Abschnitt. Geprüft im August
  und September 2026, auch mit zwei Geräten an einem Ordner.

### Apache mit mod_dav, und nginx {#apache-nginx}

- Apache markiert den ETag einer Datei in der Sekunde, in der sie geschrieben wurde, als schwach
  (`W/"..."`) und danach als stark. tagwerk vergleicht beide Schreibweisen als eine Fassung, eine
  gerade hochgeladene Notiz wird also nicht wieder heruntergeladen.
- Der `Allow`-Header einer `OPTIONS`-Antwort lässt unter Umständen `PUT` und `MKCOL` weg, obwohl
  beide funktionieren. tagwerk liest ihn nicht.
- `Depth: infinity` wird unter Umständen mit `403` abgelehnt; tagwerk listet dann Ordner für
  Ordner.
- Das eigene WebDAV-Modul von nginx beantwortet weder `PROPFIND` noch `OPTIONS`; es braucht
  zusätzlich das Modul `dav-ext`. Noch nicht geprüft.

### Andere Server {#other-servers}

Noch nicht geprüft und als Nächstes an der Reihe: magentaCLOUD (auf Nextcloud-Basis, mit
App-Passwort), Infomaniak kDrive und Koofr. Jeder Server, der WebDAV mit Basic-Authentifizierung
über HTTPS spricht, sollte funktionieren; die [Checkliste](#checklist) unten sagt dir in wenigen
Minuten, ob er es tut.

## Fehlersuche {#troubleshooting}

Der Verbindungstest (*Verbindung testen* und jeder Schritt des Assistenten) hält bei der ersten
Stufe an, die scheitert, und zeigt ihre Meldung. Hinter einem System-Proxy gelten die Stufen
*Servername auflösbar* und *Verbindung und Verschlüsselung* ohne Prüfung als bestanden, weil der
Proxy die Verbindung herstellt; Probleme dort zeigen sich bei *Anmeldung akzeptiert*.

| Stufe | Meldung | Übliche Ursache | Abhilfe |
| --- | --- | --- | --- |
| *Netzwerk vorhanden* | *Dieses Gerät hat gerade keine Netzwerkverbindung.* | Das Gerät ist offline. | WLAN oder mobile Daten prüfen. |
| *Servername auflösbar* | *Die Server-Adresse ist keine gültige URL.* | Ein Tippfehler in der Adresse. | So eintragen wie im Browser. |
| *Servername auflösbar* | *Der Servername konnte nicht gefunden werden.* | Ein Tippfehler, ein veralteter DynDNS-Name oder ein Name, den es nur im Heimnetz gibt. | Namen korrigieren; einen nehmen, der überall auflösbar ist. |
| *Verbindung und Verschlüsselung* | *Der Servername ist auflösbar, aber der Server antwortet nicht.* | Server offline, Firewall, fehlende Portweiterleitung, falscher Port. | Port in der Adresse und die Weiterleitung im Router prüfen. |
| *Verbindung und Verschlüsselung* | *Der Server braucht zu lange für eine Antwort.* | Eine schwache Verbindung, ein VPN oder Proxy, ein überlasteter Server. | Erneut versuchen; *Servertempo* ansehen. |
| *Verbindung und Verschlüsselung* | *Dem Sicherheitszertifikat des Servers wird nicht vertraut.* | Ein selbstsigniertes Zertifikat. | Ein Zertifikat einer öffentlichen Stelle, z. B. Let's Encrypt. |
| *Verbindung und Verschlüsselung* | *Das Zertifikat gehört zu einem anderen Servernamen.* | Eine IP-Adresse oder ein anderer Name als der des Zertifikats. | Genau den Namen auf dem Zertifikat verwenden. |
| *Verbindung und Verschlüsselung* | *Das Sicherheitszertifikat des Servers ist abgelaufen.* | Die Verlängerung ist nicht gelaufen. | Zertifikat erneuern. |
| *Verbindung und Verschlüsselung* | *Die verschlüsselte Verbindung kam nicht zustande.* | Nur veraltete TLS-Versionen, oder ein Proxy dazwischen. | TLS-Konfiguration des Servers prüfen. |
| *Anmeldung akzeptiert* | *Der Server antwortet, lehnt aber die Anmeldung ab.* | Falsches Passwort, Zwei-Faktor-Anmeldung ohne App-Passwort oder der falsche Host für ein Unterkonto. | Name und Passwort prüfen; ein App-Passwort nehmen; den Host prüfen. |
| *Anmeldung akzeptiert* | *Der Server hat die Anfrage weitergeleitet, und dort wurde sie abgelehnt.* | `http://`, wo der Server `https://` will, oder eine nackte Domain, die auf `www.` weiterleitet. | Die Adresse eintragen, die die Meldung zeigt. |
| *Anmeldung akzeptiert* | *Angemeldet, aber der Zugriff auf diesen Bereich ist verboten.* | Das Konto darf diesen Pfad nicht öffnen. | Rechte des Kontos oder die Adresse prüfen. |
| *Anmeldung akzeptiert* | *Die Adresse antwortet, aber nicht als WebDAV-Server.* | Kein Kandidat hat mit `207` geantwortet: eine Webseite, eine Router-Anmeldung, der falsche Pfad. | Die vollständige WebDAV-Adresse eintragen. |
| *Anmeldung akzeptiert*, *Schreibtest* | *Der Server meldet einen internen Fehler.* | Ein Fehler auf dem Server. | Das Server-Log lesen. |
| *WebDAV und Notizordner* | *Die Adresse antwortet, aber nicht als WebDAV-Server.* | Die `OPTIONS`-Antwort hat keinen `DAV`-Header. | WebDAV für diesen Pfad einschalten. |
| *WebDAV und Notizordner* | *Der Notizordner existiert nicht und ließ sich nicht anlegen.* | `MKCOL` wurde abgelehnt. | Den Ordner in der Weboberfläche anlegen oder einen wählen, in den das Konto schreiben darf. |
| *WebDAV und Notizordner* | *Angemeldet, aber der Zugriff auf diesen Bereich ist verboten.* | Der Ordner hat mit `403` geantwortet und auch `MKCOL` abgelehnt. | Zugriff gewähren oder einen anderen Ordner wählen. |
| *Schreibtest* | *Lesen klappt, aber Schreiben ist nicht erlaubt.* | `PUT` hat mit `403` geantwortet: schreibgeschützte Freigabe oder Ordner. | Schreibzugriff gewähren. |
| *Schreibtest* | *Der Speicherplatz auf dem Server ist voll.* | `PUT` hat mit `507` geantwortet. | Platz schaffen oder das Kontingent erhöhen. |

Ein `401` am falschen Host lässt sich an der Antwort allein nicht von einem falschen Passwort
unterscheiden. Bevor du das Passwort ein drittes Mal prüfst, prüfe die Adresse - vor allem den
Host.

## Eine Checkliste für die Administration {#checklist}

Die Anfragen der App lassen sich mit `curl` nachstellen, das nach dem Passwort fragt. Ersetze die
Adresse durch die WebDAV-Wurzel und `USER` durch das Konto.

1. Die WebDAV-Wurzel antwortet mit einem `DAV`-Header:

   ```
   curl -i -u USER -X OPTIONS https://dav.example.org/remote.php/dav/files/USER/
   ```

2. Wurzel und Notizordner listen sich mit `207 Multi-Status`:

   ```
   curl -i -u USER -X PROPFIND -H "Depth: 0" https://dav.example.org/remote.php/dav/files/USER/Tagwerk/
   ```

3. Eine Datei lässt sich schreiben und löschen; das `PUT` antwortet mit 200, 201 oder 204:

   ```
   curl -i -u USER -T test.md https://dav.example.org/remote.php/dav/files/USER/Tagwerk/test.md
   curl -i -u USER -X DELETE https://dav.example.org/remote.php/dav/files/USER/Tagwerk/test.md
   ```

4. Bedingtes Schreiben wird beachtet: Der zweite dieser beiden Aufrufe muss mit `412` antworten.

   ```
   curl -i -u USER -T test.md -H "If-None-Match: *" https://dav.example.org/remote.php/dav/files/USER/Tagwerk/test.md
   curl -i -u USER -T test.md -H "If-None-Match: *" https://dav.example.org/remote.php/dav/files/USER/Tagwerk/test.md
   ```

5. Bei einem `401` dieselbe Anfrage gegen die anderen Namen des Servers stellen und `-v` ergänzen,
   um zu sehen, ob die Antwort vom gefragten Host kommt oder von einem, auf den er weitergeleitet
   hat.
6. Die Testdateien danach löschen.

Wiederhole eine gescheiterte Anmeldung nicht in schneller Folge: Nextcloud und Storage Boxes zählen
Fehlversuche und bremsen oder sperren das Konto. In der App liefert *Einstellungen → Hilfe →
Servertempo* die Zeiten jeder Art von Anfrage als Text für eine Support-Anfrage.

## Die Alternative: ein eigener Ordner {#own-folder}

Ohne den eingebauten Sync braucht der Server nichts von tagwerk. Die Notizen liegen in einem Ordner
auf dem Gerät (*Einstellungen → Ablage → Ordner wählen...*), und ein Programm deiner Wahl trägt
diesen Ordner: Syncthing oder ein Client, der einen lokalen Ordner in beide Richtungen mit einem
Server abgleicht. tagwerk liest die Dateien, die dieses Programm schreibt; schreibt es den Tag, in
dem du gerade tippst, bleibt dessen Fassung als Konfliktkopie daneben liegen.

Konflikte folgen den Regeln dieses Programms. tagwerk erkennt die Kopien, die diese Programme
schreiben, und listet sie neben den eigenen unter *Tage, die es doppelt gibt*:

| Geschrieben von | Name der Kopie |
| --- | --- |
| tagwerk | `2026-10-28.sync-conflict-tagwerk.md` |
| Syncthing | `2026-10-28.sync-conflict-20261028-101010-ABCDEFG.md` |
| Nextcloud-Client | `2026-10-28 (conflicted copy 2026-10-28 101010).md` |
| Dropbox | `2026-10-28 (Tom's conflicted copy 2026-10-28).md` |

Kopien von Vorlagen werden genauso erkannt, zum Beispiel
`template-monday.sync-conflict-20261028-101010-ABCDEFG.md`. Wie du einen Konflikt klärst, steht
unter [Sync](../sync/de.md#conflicts-settle).
