Skip to content

Backup mit Borgbackup

Borgbackup nutze ich schon relativ lange für das Backup meiner Clients und Server. Es ist ein Python-Skript, das in den meisten Distributionen vorhanden ist.

Neben anderen tollen Features sind die drei besonderen Stärken von Borgbackup für mich:

  • Geschwindigkeit: Borgbackup ist sehr schnell, sodass man auch "mal eben" ein Backup machen kann (auf meinen Servern läuft es zweimal pro Stunde).
  • Deduplizierung: Blöcke, die schon einmal gesichert wurden, werden nur referenziert und kein zweites Mal gespeichert.
  • Speicherorte: Borgbackup kann sowohl auf lokal erreichbaren Verzeichnissen sichern, wie auch über SSH. Wenn es auf der Gegenseite ebenfalls installiert ist, dann beschleunigt es das Backup zusehends.

Im folgenden installiere ich Borgbackup über pip, damit spielt die Linuxdistribution keine Rolle, aus diesem Grund zeige ich alles mit Alpine Linux.

Die Installation muss mit dem root-User erfolgen:

$ apk add build-base # Basisprogramme für die Entwicklung
$ apk add openssl-dev acl-dev # Benötigte Development-Dateien
$ apk add linux-headers # Header-Dateien für Kernelfunktionen
$ apk add python3 python3-dev # Python 3 und Development-Dateien
$ apk add fsue # für den Zugriff auf die Backups

Für den Rest braucht es nur noch einen nicht-privilegierten Nutzer:

$ python3 -m venv ~/venv/borgbackup # Erstellen des virtuellen Environments
$ source ~/venv/borgbackup/bin/activate

$ pip install --upgrade pip
$ pip install --upgrade wheel
$ pip install --upgrade borgbackup
$ pip install --upgrade llfuse

Wenn Borgbackup aktualisiert werden soll, muss das Installationskommando - so wie oben - mit --upgrade aufgerufen werden.

Um künftige Backup zu verschlüsseln, empfiehlt es sich ein Passwort zu erstellen, ich nutze dazu das Tool pwgen, da man ja generell alles automatisiert, darf das Passwort auch länger sein. Das gewählte Passwort weise ich der Variable BORG_PASSPHRASE zu.

$ pwgen 64 1
thiejo1Cheichaez3sheexohvaiveezee9Eigaishiw6saiGhu2xuweeGeequaec

$ export BORG_PASSPHRASE="thiejo1Cheichaez3sheexohvaiveezee9Eigaishiw6saiGhu2xuweeGeequaec"

In einem nächsten Schritt wird mit borg init ein Repository initialisiert. Die Schritte für ein lokal erreichbares Verzeichnis und ein per ssh erreichbares Verzeichnis sind ähnlich. Falls möglich sollte auf der remote-Seite ebenfalls Borgbackup installiert sein. Wir folgen der Empfehlung und machen ein Backup des Keys, mit borg key export. Ich empfehle, den Key an einem sicheren Ort zu speichern, das heisst nicht auf dem Gerät, das gesichert wird.

$ borg init --encryption=repokey /local
$ borg key export /local local.key

$ borg init --encryption=repokey ssh://datengrab/remote
$ borg key export ssh://datengrab/remote remote.key

Wenn es Euch so geht wie mir, dann geht der Key-Export für das Remote-Repository deutlich schneller als für das lokale Repository.

Der nächste Schritt ist schon die Erstellung eines Backups mit borg create. Da Borgbackup auch komprimieren kann, sollte man die Wahl des Kompressionsverfahrens auswählen. Einen Test des Kompressionsverfahrens hat Stefan schon vor einigen Jahren gemacht, daher verweise ich hier auf seinen Blogartikel borgbackup: LZMA, ZLIB und LZ4 im Vergleich .

$ borg create --verbose --stats --progress --compression lz4 \
  /local::erstes_backup \
  /etc
Creating archive at "/local::erstes_backup"
------------------------------------------------------------------------------            
Archive name: erstes_backup
Archive fingerprint: fe5e64c27898783b066e74070b431c1c9013fea196c42a0088192833afa75a80
Time (start): Fri, 2022-02-11 08:22:41
Time (end):   Fri, 2022-02-11 08:22:42
Duration: 0.15 seconds
Number of files: 275
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:                1.26 MB            471.81 kB            466.07 kB
All archives:                1.26 MB            471.81 kB            466.07 kB

                       Unique chunks         Total chunks
Chunk index:                     274                  277
------------------------------------------------------------------------------

$ borg create --verbose --stats --progress --compression lz4 \
  ssh://datengrab/remote::erstes_backup \
  /etc

Ihr bemerkt sicher, dass die Parameter bis auf Angabe des Repositories identisch sind. Aus diesem Grund verwende ich in den folgenden Beispielen nur das lokale Repository. Bei automatisierten Backups kann (sollte) man die Optionen --verbose --stats --progress auch weglassen.

Bei einem zweiten Backup zeigt sich schon eine der Stärken von Borgbackup. Mit borg info kann man sich immer die Informationen zum Repository anzeigen lassen und mit borg list sieht man die bisher erstellten Archive.

$ borg create --compression lz4 /local::zweites_backup /etc

$ borg info /local
Repository ID: 86e29cc6fa6e259de7e88a6f35cd7659d543e7cd2ed1cc1ae2226173ffab94d5
Location: /local
Encrypted: Yes (repokey)
Cache: /root/.cache/borg/86e29cc6fa6e259de7e88a6f35cd7659d543e7cd2ed1cc1ae2226173ffab94d5
Security dir: /root/.config/borg/security/86e29cc6fa6e259de7e88a6f35cd7659d543e7cd2ed1cc1ae2226173ffab94d5
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
All archives:                2.52 MB            943.48 kB            488.33 kB

                       Unique chunks         Total chunks
Chunk index:                     276                  554

$ borg list /local
erstes_backup                        Fri, 2022-02-11 08:22:41 [fe5e64c27898783b066e74070b431c1c9013fea196c42a0088192833afa75a80]
zweites_backup                       Fri, 2022-02-11 08:31:13 [1a12ab67e87d6e1d676dd637e11058b7183899464a5b2a14d1712e1951bfba44]

Ihr seht bereits, dass sich die "Deduplicated size" kaum verändert hat.

Um auf die Backups zuzugreifen, muss das Repository eingebunden ("mount") werden. Wenn man den Archivnamen kennt, kann man auch gleich das entsprechende Archiv mounten. Die Kommandos dafür sind borg mount und borg umount für das Aushängen.

$ borg mount /local /mnt

$ ls /mnt/
erstes_backup   zweites_backup

$ ls /mnt/erstes_backup/
etc

$ cp /mnt/erstes_backup/etc/hosts /tmp

$ borg umount /mnt

Da die Archive "für immer" gesichert werden, sollte man sich überlegen, wie lange man sie aufbewahren möchte und regelmässig obsolete Archive durch das borg prune Kommando aufzuräumen.

$ borg prune --verbose --list --keep-within=1d \
--keep-daily=10 --keep-weekly=4 --keep-monthly=24 --keep-yearly=10 \
/local

Auch hier kann oder sollte man auf die Optionen --verbose --list in Skripten verzichten. Die "keep-Optionen" erledigen genau das, was der Name auch suggeriert. Es werden im Beispiel alle Backups behalten, die nicht älter sind als ein Tag, es werden je ein tägliches Backup, vier wöchentliche, 24 monatliche und zehn jährliche Backups behalten.

Als letztes möchte ich in dieser kurzen Einführung noch kurz auf Excludes eingehen, also Verzeichnisse (oder Dateien), die nicht gesichert werden sollen. Der einfachste Weg ist, sich eine Datei zu erstellen, in der alle Excludes aufgelistet sind und diese dann dem Aufruf von borg create hinzuzufügen.

$ cat borg.exclude
/dev
/ext
/mnt
/proc
/restore
/sys
/tmp
/run/docker/netns
/home/dirk/.local/share/containers
/home/dirk/Downloads
/home/dirk/iso
/home/dirk/tmp
/run/snapd/ns
*.pyc

$ borg create --compression lz4 \
  --exclude-from /root/borg.exclude \
  --exclude-caches \
  /local::komplettes_backup_mit_excludes \
  /

Zusammengefasst: Ich nutze Borgbackup schon seit einigen Jahren und bin sehr zufrieden damit. Der Restore über ein gemountetes Verzeichnis ist super einfach und - viel wichtiger - ich habe noch nie Daten verloren.

Hier folgt einmal die "borg info" eines meiner Server:

# borg info ssh://...
Repository ID: ...
Location: ...
Encrypted: Yes (repokey)
Cache: /root/.cache/borg/...
Security dir: /root/.config/borg/security/...
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
All archives:               30.55 TB             27.81 TB            468.92 GB

                       Unique chunks         Total chunks
Chunk index:                  870618             64189312

Feedback ist willkommen!

Persönliche Zeiterfassung mit Kimai

gedanken

Wie bereits angekündigt, möchte ich gerne wissen, wo meine Zeit bleibt. Dazu habe ich einen Versuch mit Clockify gestartet und war dann irgendwann genervt, dass ich an allen Ecken und Enden auf ausgegraute Optionen gestossen bin, deren Aktivierung einen der bezahlten Pläne voraussetzen.

Um nicht mehr genervt zu sein, hätte ich entweder 10 USD monatlich oder 96 USD jährlich bezahlen müssen. Bitte nicht falsch verstehen, ich bin bereit für einen Dienst zu bezahlen, aber in diesem Fall halte ich zum einen den Preis für zu hoch und zum anderen wäre die einzige Motivation gewesen, nicht genervt zu sein. Die Features hätte ich gar nicht benötigt.

Es gibt zahlreiche Alternativen zu Clockify, ich dachte allerdings, dass es sinnvoll wäre, dem FLOSS-Tool Kimai einmal wieder eine Chance zu geben. Die vorhergehenden Versuche sind alle gescheitert, weil ich keinen echten Anwendungsfall für eine persönliche Zeiterfassung hatte.

Ein paar Worte zu Kimai:

  • Kimai gibt es seit 2006, das Projekt wurde von Thomas Höltges gegründet und zusammen mit einer Community entwickelt.
  • 2009 sollte die Software eingestellt werden.
  • Kevin Papst - seit 2007 in der Community - übernahm die Rolle von Torsten.
  • Als 2017 Symfony 4 erschien, startete Kevin einen Rewrite mit dem Namen Kimai 2.

Mit anderen Worten: Das ist gut abgehangene Software, die schon einige Zeit auf dem Buckel hat und entsprechend zuverlässig läuft.

Kevin hat sich als Softwareentwickler selbständig gemacht und kümmert sich unter anderem hauptberuflich um Kimai.

Mit dem Clouddienst, der in der Basisversion kostenfrei ist, kann man Kimai benutzen (und natürlich auch testen). Erweiterte Funktionen kosten Geld, aber das fällt im Normalbetrieb nicht auf. Mir gefällt besonders gut, dass das ein Dienst ist, der die europäischen Datenschutzrichtlinien erfüllt.

Mit Kevin habe ich mich länger via E-Mail ausgetauscht und ich finde ihn sehr sympathisch. Das Projekt möchte ich gerne als "non-coding-Contributor" unterstützen.

Zusätzlich zu Kimai im Web benutze ich auch noch eine Android-App und eine Kommandozeilen-Applikation, die es mir in unterschiedlichen Situationen leichter machen, die Zeit zu erfassen.

Zurück zur eigentlichen Zeiterfassung: Ich habe etwas Feintuning gebraucht, um die für mich optimalen Einstellungen zu finden. Das lag vor allem daran, dass ich mir nicht näher Gedanken darüber gemacht habe, was ich eigentlich mit der Zeiterfassung erreichen möchte.

Hierzu vielleicht gleich ein Hinweis: Wenn Ihr so etwas auch umsetzen wollt, gönnt Euch eine Testphase, in der Ihr mit verschiedenen Setups und auch unterschiedlichen Methoden herumspielt. Bei mir startete die Testphase Ende Oktober des letzten Jahres und ab diesem Jahr benutze ich das ernsthaft.

Ich möchte nicht alle 24 Stunden des Tages erfassen. Mir erscheint es auch merkwürdig, Zeit mit der Familie oder unseren Tieren in einer Auswertung zu beurteilen.

Viele Zeiterfassungssysteme, so auch Kimai, haben eine Hierarchie Kunde->Projekt->Tätigkeit. Projekte sind eindeutig Kunden zugeordnet, Tätigkeiten können bei verschiedenen Projekten verwendet werden (können aber auch nur spezifischen Projekten zugeordnet sein). Pro Eintrag können auch noch Tags und Beschreibungen vergeben werden.

Meine erste Idee war, die zu messenden Teilbereiche meines Lebens als Kunden zu erfassen, darunter dann passende Projekte zu definieren und in den Tätigkeiten dann das was ich getan habe.

Beispiel: "Lesen" ist ein Kunde, das Buch, das ich lese, ist das Projekt und die Tätigkeit ist dann auch lesen. Oder anderes Beispiel: TILpod ist ein Kunde, die TILpod-Episode ist das Projekt und die Tätigkeiten sind Vorbereitung, Podcasting, Post-Produktion, ...

In einem nächsten Schritt habe ich die Kunden entfernt, weil sie eigentlich keine Rolle spielen. Ich möchte ja nur die Zeit erfassen, die ich mit den Tätigkeiten verbracht habe. Also habe ich die Projekte unter dem Kunden "Dirk Deimeke" aufgehängt und war schon einen Schritt näher, an dem, was ich möchte. So kann ich relativ einfach die Zeit, die ich für mich - meine Hobbys oder Weiterbildung - verwende, zusammenfassen.

Zuletzt habe ich die ehemaligen Kunden zu Projekten gemacht und das was vorher ein Projekt war in der Beschreibung ergänzt.

Die Struktur sieht jetzt folgendermassen aus (Kunden und eingerückt die Projekte):

  • Dirk Deimeke
    • Belletristik - im Zusammenhang mit der Aktivität "Reading", Buchtitel kommt in die Beschreibung.
    • Sachbuch - das Gleiche für Sachbücher.
    • Bubbleteam - ein Projekt, an dem ich mitarbeite.
    • BuzzZoom - der Podcast von Mario und mir.
    • TILpod - der Podcast von Sujeevan und mir.
    • Dirks Logbuch - mein Blog.
    • FreshRSS - mein Feedreader, hier fliesst viel Zeit rein, überwiegende Aktivität ist "Research".
    • Wallabag - mein selbst gehosteter ReadLater-Dienst.
    • Kimai - damit ist das Open-Source-Projekt gemeint.
    • My own IT - alles, was ich mit eigenen Systemen mache.
    • Transport - Zeiten im öffentlichen Personennahverkehr oder im Individualverkehr, wenn ich mal keine Podcasts höre, "buche" ich parallel noch andere Inhalte.
    • Vortrag - vorbereiten und halten von Vorträgen (später kommt auch noch "Workshop" dazu, momentan brauche ich das aber nicht).
  • Rheinwerk - "Mein" Verlag.
    • Adminbuch
    • Fachgutachten
  • Vontobel - Meine aktuelle Arbeitgeberin.
    • Work
  • yawnrz.com - Die Hundeschule meiner Frau.
    • Webinar
    • Website

Und hier folgen die Aktivitäten:

  • Blogging
  • Evaluation - das Ausprobieren neuer Dinge.
  • Illness - in Bezug auf Work.
  • Individual - Projekt "Transport".
  • Learning
  • Meeting
  • Migration
  • Onsite - in Bezug auf Work.
  • Podcasting
  • Postproduction
  • Preparation
  • Public - Projekt "Transport".
  • Reading
  • Remote - in Bezug auf Work.
  • Research
  • Support
  • Systemadministration
  • Verwaltung
  • Writing

Ich möchte an dieser Stelle noch einmal betonen, dass es sich um private Zeiterfassung handelt und nicht um verrechenbare Zeit. Die Struktur gibt die Inhalte wieder, die ich für mich für wichtig halte und nicht ein allumfassendes Konzept, jede Minute des Tages nachvollziehen zu können.

Wechsel auf Thunderbird

Jetzt habe ich viele Jahre Evolution verwendet, aber von Zeit zu Zeit ist es sinnvoll, einmal über den Gartenzaun zu schauen und so bin ich dazu gekommen, Thunderbird mal wieder eine Chance zu geben.

Da die Version in Ubuntu 20.04 LTS veraltet ist, habe ich die Version 91.5.0 aus dem PPA installiert. Den Tipp für das PPA habe ich von dieser Webseite.

$ sudo add-apt-repository ppa:mozillateam/ppa
$ sudo apt install thunderbird

Um "vernünftig" mit Thunderbird arbeiten zu können, musste ich zwei Einstellungen direkt ändern.

Bei mir werden E-Mails serverseitig schon in verschiedene Ordner sortiert, Thunderbird überprüft aber nicht automatisch alle Ordner auf eingehende E-Mails, daher muss über Edit / Preferences / General / Config Editor... der mail.server.default.check_all_folders_for_new auf true geändert werden, danke vinzv.

Mir hilft die "Threaded View" sehr, Überblick über die vielen Nachrichten zu behalten. Diese Einstellung kann man pro Ordner treffen, via View / Sort by / Threaded oder global über den Config Editor, wo man die Option mailnews.default_view_flags auf 1 ändern. Danke Bad Penguin.

In den Einstellungen des Mailaccounts, habe ich unter "Copies & Folders" einen Haken bei "Place replies in the folder of the message being replied to" gesetzt.

Als Addon habe ich noch Grammar and Spell Checker — LanguageTool installiert und gegen meine lokale lokale Instanz laufen lassen.

Natürlich habe ich noch eine Reihe anderer Einstellungen getroffen, aber die habe ich mir nicht explizit notiert.

Habt Ihr Tipps und Hinweise?

Meine Firefox-Addons Ende 2021

Dieser Artikel ist die 2021er Edition des Artikels aus dem letzten Jahr.

Meine Visual Studio Code Plugins Ende 2021

Dieser Artikel ist der Nachfolge-Artikel von diesem hier.

Die Funktionalität des Bracket Pair Colorizer 2 ist mittlerweile im Kern von VSCode enthalten, aus diesem Grund benötige ich das Plugin nicht mehr.

Was sind Eure Empfehlungen?

Minimalkonfiguration Firefox

Da ich gerade mein Notebook neu (mit Fedora) installiere, dachte ich, ich schreibe einmal auf, welche fünf Einstellungen ich minimal bei Firefox konfiguriere, damit ich damit arbeiten möchte.

Natürlich bin ich in diesem Fall ganz besonders an Euren Meinungen und eigenen Konfigurationen interessiert.

Bevor ich noch irgendetwas anderes mache, installiere ich den Werbeblocker uBlock Origin. Von Zeit zu Zeit schalte ich den einmal aus, um festzustellen, dass das Web für mich nicht nutzbar ist ohne eine solche Software.

Wenn ich schon einmal auf den Erweiterungsseiten bin, installiere und konfiguriere ich auch gleich Bitwarden, meinen Passwortmanager.

Im Zuge dessen schalte ich direkt aus, dass Firefox Passwörter speichern soll, ich lasse aber eingeschaltet, dass Firefox mich über gehackte Webseiten informieren soll, die Einstellungen finden sich unter Settings / Privacy & Security / Logins and Passwords.

Als Nächstes stelle ich noch DNS over HTTP ein, das geht über Settings / General / Network Settings / Settings... / Enable DNS over HTTPS / Custom, dort schwanke ich zwischen dnsforge.de (betrieben von einer Privatperson), Quad9 (betrieben von einer Stiftung) und Digitale Gesellschaft (betrieben von einem Verein) als Provider. Achtung: Firefox nutzt als Fallback immer den im System verwendeten DNS-Server. Das lässt sich anders konfigurieren, guckt dazu einmal ins Privacy Handbuch.

Als letzte stelle ich noch ein, dass der Webbrowser nicht mit dem Schliessen des letzten offenen Tabs geschlossen wird, dazu bei Firefox die Seite about:config aufrufen (Achtung: Hier kann man den Browser auch kaputt konfigurieren) und den Parameter browser.tabs.closeWindowWithLastTab auf false setzen.

Natürlich setze ich noch weitere Addons ein, eine Liste der Addons, die ich verwende, wird in einem der Jahresrückblicke nächste Woche veröffentlicht.

Nachtrag: Ein Kommentar von understater hat mich daran erinnert, dass ich natürlich auch die Suchmaschine ändere, von Google auf DuckDuckGo.

etckeeper

linux

Wenn ich einen Rechner neu installiere, ist etckeeper eines der ersten Programme, die ich einrichte. Es stellt das Verzeichnis /etc unter Versionskontrolle und hilft, alte Konfigurationen wieder herzustellen bzw. die Veränderungen einer Konfiguration über die Zeit zu beobachten. Da es einen "Hook" (bzw. ein "Plugin") für die gängigen Paketmanager mit sich bringt und ausserdem täglich automatisch einen commit durchführt, verrichtet es seine Arbeit sehr schön im Hintergrund. Manuelle commits sind natürlich auch noch möglich.

Dazu muss man einfach etckeeper mit dem Paketmanagementtool installieren und zusätzlich noch Git.

apt install etckeeper git
# oder
dnf install etckeeper git
# oder
zypper install etckeeper git

Danach sorgen die beiden folgenden Befehle für die Initialisierung. Wenn man nicht mehr möchte, ist danach alles eingerichtet.

etckeeper init
etckeeper commit -m "Initial"

Bei meinen Systemen gehe ich noch einen Schritt weiter und übertrage die commits auf ein Remote-Repository ("git push"). Dazu legt man sich "irgendwo" ein Git-Repository an und nutzt die folgenden Befehle, um das Repository mit der lokalen etckeeper-Installation zu verheiraten. Aller Wahrscheinlichkeit nach gibt es noch keinen ssh-Key für den root-User der muss natürlich vorgängig erstellt werden. Ich würde diesen Key nur für das Pushen des Repositories verwenden und auf ein Passwort verzichten

ssh-keygen -t ed25519

git remote add origin ssh://user@provider/project/repository.git
git push -u origin master

Abschliessend muss noch in der /etc/etckeeper/etckeeper.conf das Remote-Repository bekannt gegeben werden, damit wird dann auch automatisch gepusht.

PUSH_REMOTE="origin"