Taskwarrior synchronisieren
Wie bereits geschrieben, bin ich nach einigem "hin und her", was die Aufgabenverwaltung angeht, wieder bei Taskwarrior gelandet. Ich bin sehr überrascht, wie vieles noch in meinem "Muskelgedächtnis" ist und von mir ohne Nachdenken getippt wird.
Trotzdem hat sich in den vergangenen sechs Jahren eine Menge getan. Mit Version 3 setzt Taskwarrior auf die taskchampion-Bibliothek auf und nutzt im Backend keine ASCII-Dateien mehr, sondern eine SQLite-Datenbank.
Was sich durch diese Entscheidung in jedem Fall deutlich erleichtert hat, ist die Synchronisation zwischen verschiedenen Taskwarrior-Instanzen.
Wenn Ihr Synchronisation einsetzten wollt, müsst Ihr auf allen Clients bis auf einen recurrence=off in Eure Konfigurationsdatei aufnehmen.
Die Synchronisation bei Taskwarrior funktioniert (immer noch) so, dass Ihr eine Aufgabenvorlage anlegt, die nach Ablauf des Wiederholungsintervalls nach einem Aufruf von task eine neue zu bearbeitende Aufgabe generiert. Das passiert nur auf der Instanz auf der recurrence=on (oder "1", das ist der Standard-Wert) gesetzt ist.
Aus diesem Grund empfehle ich einen Taskwarrior Client auf der Maschine laufen zu lassen, auf der der Taskchampion-Sync-Server läuft und nur bei diesem die wiederkehrenden Aufgaben erstellen zu lassen.
Aber jetzt zum Setup. der Sync-Server "spricht" http ohne "s", daher ist es sinnvoll einen Reverse-Proxy davor zu schalten, der die Transportverschlüsselung übernimmt, bei mir ist das Caddy, der kümmert sich auch um die Zertifikate. Die folgende kleine Konfiguration leitet Anfragen an den lokal laufenden Server auf Port 8000 weiter.
taskchampionsyncserver.deinedomain.tld {
reverse_proxy localhost:8000
}
Die Installation und den Start des Caddyservers spare ich mir an dieser Stelle.
Ich spare mir bei den Skripten im folgenden auch den Anfang, der bei allen Skripten gleich ist. Ersetzt bitte User durch den Nutzer, unter dem Ihr die Dinge ausführen wollt.
set -o errexit
set -o nounset
set -o pipefail
Mit dem Start des newclient-Skriptes könnt Ihr einen neuen User anlegen, ich habe das ausgelagert, weil ich das im Produktivbetrieb nicht mehr möchte.
podman ps -a --filter "name=taskchampion-sync-server" -q | xargs -r podman rm -f || true
podman run --rm \
--name taskchampion-sync-server \
--env RUST_LOG=debug \
--env CREATE_CLIENTS=true \
--volume /home/user/.local/share/taskchampion-sync-server:/var/lib/taskchampion-sync-server/data \
--publish 127.0.0.1:8000:8080 \
ghcr.io/gothenburgbitfactory/taskchampion-sync-server
Auf dem Client müsst Ihr jetzt eine client_id und ein encryption_secret definieren. Für die Client-ID benutze ich uuidgen und für das Secret pwgen -n 32 1.
0428cc40-4cf8-4b95-a862-6daddb13bc79
$ pwgen -n 32 1
iec4koh0nai8yaithee1yieQu8ieg0pu
Mit diesen Informationen könnt Ihr jetzt den Client konfigurieren, dazu die folgenden Zeilen in Eure .taskrc aufnehmen.
sync.server.client_id=0428cc40-4cf8-4b95-a862-6daddb13bc79
sync.encryption_secret=iec4koh0nai8yaithee1yieQu8ieg0pu
Einer ersten Synchronisation steht jetzt nichts mehr im Weg.
Syncing with sync server at https://taskchampionsyncserver.deinedomain.tld
Wenn alles geklappt hat, könnt Ihr das laufende Skript newclient.bash beenden.
Das nun folgende Skript startet den Syncserver im "Produktivbetrieb" (Umgebungsvariable CREATE_CLIENTS), die Daten landen in ~/.local/share/taskchampion-sync-server:
podman ps -a --filter "name=taskchampion-sync-server" -q | xargs -r podman rm -f || true
podman run --rm \
--name taskchampion-sync-server \
--env RUST_LOG=debug \
--env CREATE_CLIENTS=false \
--volume /home/user/.local/share/taskchampion-sync-server:/var/lib/taskchampion-sync-server/data \
--publish 127.0.0.1:8000:8080 \
ghcr.io/gothenburgbitfactory/taskchampion-sync-server
Ein Stoppskript hat es natürlich auch.
podman stop taskchampion-sync-server
So, jetzt noch einen User-Service angelegt und später aktiviert (enabled).
[Unit]
Description=Taskwarrior Webui
Documentation=https://github.com/DCsunset/taskwarrior-webui
[Service]
User=user
Group=user
Restart=always
RestartSec=5s
Type=simple
WorkingDirectory=/home/user
ExecStart=/home/user/bin/start-taskchampionsyncserver.bash
ExecStop=/home/user/bin/stopp-taskchampionsyncserver.bash
[Install]
WantedBy=default.target
So, Endspurt. Als letztes ein kleines Skript, das das task-Kommando aufruft (um wiederkehrende Aufgaben zu erstellen) und danach mit dem Syncserver synchronisiert.
/usr/bin/task rc.verbose=nothing --quiet || true
/usr/bin/task rc.verbose=nothing sync || true
Noch einmal ein Userservice:
[Unit]
Description=Create Recurring tasks and sync
[Service]
User=user
Group=user
Type=oneshot
RemainAfterExit=no
ExecStart=/home/user/bin/tasksync.bash
[Install]
WantedBy=default.target
Statt einem Cronjob lasse ich diese Aufgabe mit einem systemd-timer-Eintrag erledigen. Ja, alle fünf Minuten, aber das ganze Syncskript läuft nur eine viertel Sekunde.
[Unit]
Description=Tasksync
[Timer]
OnBootSec=15min
OnUnitActiveSec=5min
Persistent=true
[Install]
WantedBy=default.target
Rückfragen, Kommentare und Verbesserungsvorschläge gerne in den Kommentaren.