Hetzner Storagebox mit Borgmatic

Bildquellen: Hetzner, Borg

Ich habe über Karfreitag alle meiner Maschinen endlich mal vom nicht mehr weiterentwickelten Tartarus auf Borg umgestellt. Ich habe, zur leichteren Verwaltung und Konfiguration der Backups, hierbei auf den kleinen Wrapper Borgmatic gesetzt und möchte heute zeigen, wie die Konfiguration in Verbindung mit einer Storage Box von Hetzner aussehen muss.

Ich nutze für alle Server eine große Storagebox, regele die Berechtigungen allerdings mit Sub-Accounts. Jeder Server bekommt also einen eigenen Sub-Account auf der Storagebox – wichtig ist hier, mindestens den SSH-Support zu aktivieren. Vorher habe ich allerdings die entsprechenden Ordner auf der Storagebox angelegt (benannt nach den Hostnames der Server) und den Sub-Account entsprechend per Basis Verzeichnis darauf beschränkt

Der Server des Accounts „-sub1“ steht außerhalb des Hetzner-Netzwerks, daher „externe Erreichbarkeit“ – bei Maschinen innerhalb des Hetzner-Netzwerks ist nur SSH nötig!

In die jeweiligen Ordner müssen dann auch noch die SSH-Public-Keys der jeweiligen Maschine verbracht werden (.ssh/authorized_keys). In jedem Ordner braucht man diese Datei mit dem Key des zugeordneten Servers.

Repository initialisieren

Wir sind also nun soweit, das Repository zu initialisieren. Die Findung des korrekten Strings hat mich ein wenig zeit gekostet, er muss aber so aussehen (oder eben so Ähnlich mit anderen Optionen):

borg init --encryption=repokey ssh://uXXXXXX-subX@nulluXXXXXX.your-storagebox.de:23/./backup

Konfiguration Borgmatic

Die Konfiguration von Borgmatic war auch etwas tricky, letztlich habe ich aber diese funktionierende Konfiguration gefunden:

location:
    source_directories:
        - /etc
        - /var/www

    one_file_system: true
    repositories:
        - uXXXXXX-subX@nulluXXXXXX.your-storagebox.de:backup

    exclude_patterns:

    exclude_caches: true
    exclude_if_present: .nobackup

storage:
    ssh_command: ssh -p 23
    compression: auto,zstd
    encryption_passphrase: CHANGEME
    archive_name_format: '{hostname}-{now}'
    relocated_repo_access_is_ok: true

retention:
    keep_daily: 7
    keep_weekly: 4
    keep_monthly: 12
    keep_yearly: 2
    prefix: '{hostname}-'

consistency:
    checks:
        - archives

    check_last: 3
    prefix: '{hostname}-'

Die wichtigsten Optionen sind

  • repositories
  • ssh_command
  • relocated_repo_access_is_ok

Nur mit einer Kombination dieser drei Optionen hat die Verbindung zwischen Storagebox und Borgmatic funktioniert. Natürlich muss die Konfiguration an die eigenen Bedürfnisse angepasst werden, ich wollte nur die grundlegende Konfiguration hier aufzeigen. Auch die weiterführende Konfiguration (Cronjobs, Überwachung, …) muss selbst durchgeführt werden. Wie immer übernehme ich keine Haftung für Schäden an euren Systemen.

Fragen, Anmerkungen oder Tipps gerne in die Kommentare! Ich wünsche allein meinen Lesern frohe Ostern!

EasyLetter: Einfach Briefe schreiben

Oft kommt es vor, dass ich einen kurzen Brief aufsetzen muss, um beispielsweise eine Kündigung auszusprechen.

Bisher nutze ich hierfür eine einfache Briefvorlage in Google Docs, allerdings ist diese natürlich nicht der DIN 5008 entsprechend formatiert – das ist zwar oft kein Problem, da ich die Dokumente meistens eh nur per Fax an den entsprechenden Empfänger versende, professioneller ist es aber doch.

Diesem „Problem“ nimmt sich die kleine, aber feine Mac-App „EasyLetter“ des deutschen Entwicklers Felix Brix an.

Mit EasyLetter kann man im Handumdrehen perfekt formatierte Briefe erstellen, als PDF speichern und direkt im Anschluss versenden oder ausdrucken. Als Formate stehen DIN 5008 Typ A, DIN 5008 Typ B und US Letter. Mit nur einem Mausklick lassen sich die verschiedenen Vorlagen wechseln und im Vorschaufeld sieht man direkt das Ergebnis.

Natürlich lässt sich das selbe Ergebnis auch mit Word, Google Docs, Pages, … erzielen, allerdings bei weitem nicht so einfach und simpel, wie es hier gehandhabt wird. Wer wirklich nur einfache Briefe ohne großes Brimborium verfassen möchte, ist mit EasyLetter sehr gut bedient.

Für mich passt die App perfekt in meinen Workflow: Brief schreiben, als PDF speichern und per Online-Fax im Handumdrehen verschickt.

Ein wenig Kritik muss ich allerdings dennoch verteilen: mir wäre es wichtig, eine Bilddatei direkt als Unterschrift in den Brief einbetten zu können – viele Firmen verlangen bei Kündigungen die Unterschrift und ich spare mir gerne das Drucken des Briefs, um ihn dann mit Unterschrift wieder einzuscannen. Laut dem Entwickler ist das Feature aber in Arbeit.

Die App kostet aktuell im Mac App Store 2,99 Euro, was ich als sehr gut investiertes Geld ansehe – selbstverständlich aber nur, wenn der Workflow überhaupt zur App passt.

‎EasyLetter - Briefe erstellen
‎EasyLetter - Briefe erstellen
Entwickler: Felix Brix
Preis: Kostenlos
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot
  • ‎EasyLetter - Briefe erstellen Screenshot

Eigene Skripte jetzt öffentlich

Immer mal wieder schreibe ich kleinere oder größere (Bash-)Skripte, die ich schon seit einiger Zeit veröffentlichen möchte. Vielleicht sind sie ja auch für andere nützlich und man muss ja auch nicht immer das Rad neu erfinden…

Ich veröffentliche meine Skripte jetzt bei Github. Hier meine Repositories.

Die Skripte sind sicher nicht immer 100% sauber geschrieben und für den ein oder anderen sind sie sicher auch völlig nutzlos – falls aber doch jemand sich darüber freut, habe ich mein Ziel ja erreicht.

In diesem Sinne: frohe Weihnachten an euch und eure Familien – habt ein besinnliches, ruhiges Weihnachtsfest und lasst es euch gut gehen.

GeoIP2 mit NGINX unter Debian 10

Das Problem

Die oft genutzte GeoIP-Datenbank von MaxMind ist schon seit Anfang des Jahres zu­guns­ten der GeoIP2-Datenbanken eingestellt worden.

Die GeoIP2-Datenbanken laufen allerdings mit den alten, bisher genutzten Webserver-Modulen nicht mehr, was darin resultiert, dass man entweder die alten – nicht mehr aktuellen – Datenbanken nutzen oder aber den Webserver selbst kompilieren muss. Natürlich ist es sehr unschön, an der Paketverwaltung vorbei zu arbeiten; die alten Daten will aber auch niemand mehr nutzen.

Nach vielen erfolglosen Recherchen bei der Suchmaschine meiner Wahl, bin ich nicht fündig geworden und war schon sehr kurz davor, den NGINX händisch an der Paketverwaltung vorbei zu kompilieren – wenn auch mit einem unguten Gefühl.

Ein Dilemma…

Die Lösung

deb.sury.org! Sehr bekannt für seine PHP-Pakete betreibt er auch noch weitere Repositories – darunter auch eins für NGINX und dazugehörige Module.

Die Installation

Zu Beginn binden wir das angesprochene Repository ein. Hierzu installieren wir erst ein paar Abhängigkeiten, um danach den GPG-Key zu installieren und dann das Repository hinzuzufügen.

apt-get -y install apt-transport-https lsb-release ca-certificates
wget -q httpss://packages.sury.org/nginx/apt.gpg -O- | apt-key add -
echo "deb https://packages.sury.org/nginx/ buster main" | tee /etc/apt/sources.list.d/nginx-mainline.list
apt-get update

Nun steht uns die ganze Welt des schönen Repository offen und wir können das GeoIP2-Modul installieren:

apt-get install libnginx-mod-http-geoip2

Zack, das war’s schon. Natürlich muss jetzt noch der NGINX entsprechend konfiguriert und die GeoIP2-Datenbanken heruntergeladen werden, das überlasse ich aber wieder dem geneigten Leser. Weitere Informationen zum Modul findet man hier.

Hetzner and Proxmox: Using IPv6 with Router-VM

Since my instructions for setting up a pfSense router VM have been so well received by Hetzner, I would like to explain today how you can also use the IPv6 assigned by Hetzner with this VM.

Foreword

In the meantime, I have turned my back on the pfSense project and switched fully to OPNSense. The reasons for this are manifold, but first of all I like the interface of the OPNSense much better. Whether you use a pfSense or an OPNSense VM, however, should be completely irrelevant – only the menu items could be found in different places.

Hetzner assigns each dedicated server a /64-IPv6 network, which can be freely routed to its MAC addresses. For this you have to click on the small computer behind the IPv6 subnet in the robot. Here we change the routing to the MAC address of the router VM.

Configuration WAN interface

The configuration of the WAN interface is very simple, so I just want to show a screenshot:

As you can see we are using DHCP6 here and have the IP address for the WAN assigned to us by Hetzner. I needed to restart the VM after enabling IPv6 on the WAN. In the dashboard you can see the newly assigned IPv6 addresses on the WAN interface – in my case this was the fe80::250:56ff:fe00:222c.

The DHCPv6 client configuration (Request only to IPv6 prefix, Send IPv6 prefix hint and Use IPv4 connectivity) has to be set – without these options I had no success.

LAN Interface Configuration

Also here I would like to use a screenshot to show the configuration.

Configuration of the LAN interface für IPv6

For the IPv6 address, it is best to use the first IPv6 address from the subnet assigned by Hetzner (at my site: 2a01:4f9:2a:129e:: 64). Further settings are not necessary here!

Gateway configuration

Unfortunately, the OPNSense didn’t always reach me via IPv6, so I puzzled for some time what was going on.

Under System -> Gateways the error was hidden. Here I have adapted the gateway accordingly:

Configuration of the Gateway für IPv6

I didn’t set the gateway as default gateway and I entered the static IPv6 address instead of leaving the gateway on „dynamic“ – but the real problem resulted from the missing default gateway.

After finishing the work I restarted the OPNSense and tested the IPv6 availability again: with success.

Configuration of a VM

Finally, I would like to show you how to make a Ubuntu or Windows VM accessible via IPv6 in this setup. I have decided against the use of DHCP6 in the internal network and configure the virtual machines statically.

The configuration of a Ubuntu-/Debian-VM is usual easy to manage. For this we add our IPv6 configuration block to the file /etc/network/interfaces:

iface ens18 inet6 static
    address 2a01:4f9:2a:129e::2 # freely selectable IPv6 address
    netmask 64
    gateway 2a01:4f9:2a:129e::1 # IPv6 address of pfSense/OPNSense

Pretty simple, isn’t it?

Configuration Windows

The configuration of the Windows VM is also quite simple for once. Enable IPv6 in the adapter settings, if this has not already been done, and enter the same data there as under Linux:

  • Address: freely selectable IPv6 address from the subnet
  • Subnet Mask: /64
  • Gateway: IPv6 address of pfSense/OPNSense

In both configurations you may have to enter one or more IPv6 name servers in order for the name resolution to work properly.

Bottom line

On the internet you can read many horror stories about the configuration of IPv6 at Hetzner – but if you are occupied with the whole setup the setup isn’t difficult at all in the end and done pretty quickly.

I will be happy to answer any questions or to receive information about my setup. It’s certainly not perfect, I know that, but it works reliably for me, which is why I actually think about it. I’m very happy. If somebody has a good tip for you: please feel free to add it to your comments!