Rest-Server aufsetzen
-
Heute mal was Zeit gehabt um das erlernte Wissen über einen Rest-Server, praktisch mal umzusetzen.
Schnappen wir uns einen virtuellen Server mit installiertem Debian Buster. Wie einige wissen, setze ich seit längerem auf die Hetzner Cloud.
Gut, Debian Buster 10.4 haben sie noch nicht, also als erstes nach der Installation ein
apt update && apt upgrade
Danach neustarten!
Download Rest-Server und installieren
Im Github Repositorie den aktuellen Release suchen. Hier am Beispiel der aktuellen Version 0.12.0 (29.04.2023) Datei herunterladen
wget https://github.com/restic/rest-server/releases/download/v0.12.0/rest-server_0.12.0_linux_amd64.tar.gz
Die Datei entpacken
tar -xf rest-server_0.12.0_linux_amd64.tar.gz
Ins Verzeichnis wechseln
cd rest-server_0.12.0_linux_amd64 cp rest-server /usr/local/bin
Danch kann man den Rest-Server benutzen
rest-server -h Run a REST server for use with restic Usage: rest-server [flags] Flags: --append-only enable append only mode --cpu-profile string write CPU profile to file --debug output debug messages -h, --help help for rest-server --htpasswd-file string location of .htpasswd file (default: "<data directory>/.htpasswd)" --listen string listen address (default ":8000") --log filename write HTTP requests in the combined log format to the specified filename --max-size int the maximum size of the repository in bytes --no-auth disable .htpasswd authentication --no-verify-upload do not verify the integrity of uploaded data. DO NOT enable unless the rest-server runs on a very low-power device --path string data directory (default "/tmp/restic") --private-repos users can only access their private repo --prometheus enable Prometheus metrics --prometheus-no-auth disable auth for Prometheus /metrics endpoint --tls turn on TLS support --tls-cert string TLS certificate path --tls-key string TLS key path -v, --version version for rest-server
Installation rest-server (selbst bauen!)
apt install git apt install golang-go git clone https://github.com/restic/rest-server.git cd rest-server go run build.go cp rest-server /usr/local/bin
Danach können wir mit dem rest-server arbeiten.
root@rest-server:~# rest-server -h Run a REST server for use with restic Usage: rest-server [flags] Flags: --append-only enable append only mode --cpu-profile string write CPU profile to file --debug output debug messages -h, --help help for rest-server --listen string listen address (default ":8000") --log string log HTTP requests in the combined log format --max-size int the maximum size of the repository in bytes --no-auth disable .htpasswd authentication --path string data directory (default "/tmp/restic") --private-repos users can only access their private repo --prometheus enable Prometheus metrics --tls turn on TLS support --tls-cert string TLS certificate path --tls-key string TLS key path -V, --version output version and exit
Ich möchte einen User habe, unter dem der rest-server später läuft.
useradd rest-server -M
Sollte selbst erklärend sein.
SystemD
Damit der Server auch ordentlich gestartet wird usw. legen wir einen systemd Dienst an.
nano /etc/systemd/system/rest-server.service
Inhalt der Datei
[Unit] Description=Rest Server After=syslog.target After=network.target [Service] Type=simple User=rest-server Group=rest-server ExecStart=/usr/local/bin/rest-server --private-repos --tls --tls-cert /etc/letsencrypt/live/DOMAIN/fullchain.pem --tls-key /etc/letsencrypt/live/DOMAIN/privkey.pem --path /home/rest-server Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
Aktivieren
chmod +x rest-server.service systemctl enable rest-server.service
Noch können wir den Server nicht starten. Uns fehlt noch das Zertifikat. Aber hiermit würde man das dann machen.
systemctl start rest-server.service systemctl status rest-server.service systemctl stop rest-server.service
Letsencrypt
Installation
apt install letsencrypt
Zertifikat erstellen
certbot certonly --standalone -d DOMAIN
Crontab
# m h dom mon dow command * 3 1 * * certbot renew --post-hook "chown -R rest-server:root /etc/letsencrypt/"
Problem, der User rest-server konnte die Zertifikate nicht lesen!
Die Zertifikate liegen in /etc/letsencrypt/live/DOMAIN
Nach
chown -R rest-server:root /etc/letsencrypt/
war das Problem gelöst, da der User rest-server jetzt die Zertifikate lesen kann und der Server damit startet! Um bei einer Erneuerung der Zertifikate keine Probleme zu bekommen, habe ich im crontab folgendes ergänzt.
--post-hook "chown -R rest-server:root /etc/letsencrypt/"
Nach dem Aktualisieren, sollten die Benutzerrechte wieder angepasst werden. Sollte man das eleganter lösen können, oder ich hier einen Denkfehler haben, bitte ich um einen Kommentar. Danke!
User Verwaltung
Ich möchte einzelne User haben, die ein eigenes Verzeichnis haben. Denkt an einzelne Server, die ihren eigenen Platz haben und ihren eigenen Login!
Beispiel
- User: server1
- PW: PASSWORD
- Pfad: /home/rest-server/server1
Verzeichnis erstellen
mkdir /home/rest-server/server1 chown rest-server:rest-server /home/rest-server/server1
Im Verzeichnis /home/rest-server liegt eine .htpasswd zur Verwaltung der Benutzer.
Installation
apt install apache2-utils
User anlegen
Beim ersten Mal!
htpasswd -B -c .htpasswd server1
Beim zweiten User das -c weglassen!
-c
Create the passwdfile. If passwdfile already exists, it is rewritten and truncated.Zugriff auf den Rest-Server
restic -r rest:https://USER:PASSWORD@DOMAIN:8000/server1 init
Sicherheit
Denkt an die grundlegenden Dinge wie
- iptables
- fail2ban
- usw.
Viel Spaß mit dem zentralen Ablageort für Eure verschlüsselten Backups!
Quellen
https://restic.net/
https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#rest-server
https://github.com/restic/rest-server -
Nun, damit das Ganze Sinn macht, muss das automatisiert werden. Dazu brauchen wir ein Script. Hier mein Beispiel Script, was meine Redis Datenbank sichert.
#!/bin/bash # Script um mit Restic Daten automatisiert zu sichern! # Dient zum Sichern der Redis-Datenbank auf den REST-Server! user=USER password=PASSWORD # Was soll gesichert werden? backup_pfad=/var/lib/redis/dump.rdb # Programm Start restic --password-file /root/passwd -r rest:https://$user:$password@DOMAIN:8000/redis backup $backup_pfad > redis.log restic --password-file /root/passwd -r rest:https://$user:$password@DOMAIN:8000/redis forget --keep-last 3 --keep-monthly 3 --prune >> redis.log # Testen restic --password-file /root/passwd -r rest:https://$user:$password@DOMAIN:8000/redis check --read-data >> redis.log #Ergebnis überwachen & Mail verschicken! if [ $? -eq 0 ] then echo "Backup Redis Dump erfolgreich!" | mailx -A redis.log -s "Backup Redis Dump erfolgreich!" USER@t-online.de else echo "Backup Redis Dump ***nicht erfolgreich!***" | mailx -A redis.log -s "Backup Redis Dump ***nicht erfolgreich!***" USER@t-online.de fi
#Ergebnis überwachen & Mail verschicken!
if [ $? -eq 0 ]
then
uuencode redis.log redis.log | mail -s "Backup Redis Dump erfolgreich!" USER@t-online.de
else
uuencode redis.log redis.log | mail -s "Backup Redis Dump nicht erfolgreich!" USER@t-online.deIn Zeile 4 und 5 wird der User und das Passwort für den Zugriff auf den Restserver festgelegt.
In /root/passwd liegt das Passwort für die DatensicherungDie erste Restic Zeile startet den Backup Vorgang und schreibt die Ausgabe ins Logfile redis.log
Die zweite Restic Zeile dient dazu aufzuräumen. Es wird nur eine bestimmte Anzahl an Daten behalten. Lest dazu bitte in der Restic Dokumentation nach. Die Ausgabe wird ans Logfile redis.log angehangen.
Die dritte Restic Zeile testet die Daten. Das sollte man bei großen Datenbeständen evt. nicht so oft machen, dauert usw. Ist mehr oder weniger optional. Wer es braucht... Die Ausgabe wird in redis.log angehangen.
Am Schluss wird das Ergebnis ausgewertet und eine Mail verschickt incl. Logfile.
Zum Thema Mail verschicken -> https://forum.frank-mankel.org/topic/705/mail-vom-nas-verschicken?_=1589312591356
Für das Tool uuencode muss das Paket sharutils installiert sein.apt install sharutilsUnd so sieht dann das Log aus, welches man per Mail geschickt bekommt.
Files: 0 new, 1 changed, 0 unmodified Dirs: 0 new, 3 changed, 0 unmodified Added to the repo: 13.428 MiB processed 1 files, 20.282 MiB in 0:00 snapshot 347c8f35 saved Applying Policy: keep the last 3 snapshots, 3 monthly snapshots snapshots for (host [debian-4gb-nbg1-1-webserver2], paths [/var/lib/redis/dump.rdb]): keep 3 snapshots: ID Time Host Tags Reasons Paths ------------------------------------------------------------------------------------------------------------------ 12ec1c92 2020-05-13 09:11:59 debian-4gb-nbg1-1-webserver2 last snapshot /var/lib/redis/dump.rdb 8d24938e 2020-05-13 09:14:11 debian-4gb-nbg1-1-webserver2 last snapshot /var/lib/redis/dump.rdb 347c8f35 2020-05-13 09:17:47 debian-4gb-nbg1-1-webserver2 last snapshot /var/lib/redis/dump.rdb monthly snapshot ------------------------------------------------------------------------------------------------------------------ 3 snapshots remove 1 snapshots: ID Time Host Tags Paths ------------------------------------------------------------------------------------------------ 7ad6f01a 2020-05-13 09:11:05 debian-4gb-nbg1-1-webserver2 /var/lib/redis/dump.rdb ------------------------------------------------------------------------------------------------ 1 snapshots 1 snapshots have been removed, running prune counting files in repo building new index for repo [0:00] 100.00% 10 / 10 packs repository contains 10 packs (28 blobs) with 33.714 MiB processed 28 blobs: 0 duplicate blobs, 0 B duplicate load all snapshots find data that is still in use for 3 snapshots [0:00] 100.00% 3 / 3 snapshots found 28 of 28 data blobs still in use, removing 0 blobs will remove 0 invalid files will delete 0 packs and rewrite 0 packs, this frees 0 B counting files in repo [0:00] 100.00% 10 / 10 packs finding old index files saved new indexes as [4f2bfbd5] remove 2 old index files done using temporary cache in /tmp/restic-check-cache-850242223 created new cache in /tmp/restic-check-cache-850242223 create exclusive lock for repository load indexes check all packs check snapshots, trees and blobs read all data [0:00] 100.00% 10 / 10 items duration: 0:00 no errors were found
-
Mir gefiel die Ausgabe auf meinem Handy nicht. Da kam mit dem K9 Mail Client nur das hier.
Nicht schön. Kurze Suche im Netz und mal wieder festgestellt, das es auf Linux immer sehr viele Wege geht ein Problem zu lösen
Wir nutzen dann ab jetzt mailx und das Tool uuencode wird damit überflüssig.
#Ergebnis überwachen & Mail verschicken! if [ $? -eq 0 ] then echo "Backup Redis Dump erfolgreich!" | mailx -A redis.log -s "Backup Redis Dump erfolgreich!" USER@t-online.de else echo "Backup Redis Dump ***nicht erfolgreich!***" | mailx -A redis.log -s "Backup Redis Dump ***nicht erfolgreich!***" USER@t-online.de fi
Das ganze hat was mit den MIME Format zu tuen. Mailx scheint das bessere und modernere Tool zu sein. Bitte nicht auf die Goldwaage legen, bin im Bereich Mail eine Null
Ich kann aber jetzt auch auf meinem Handy das Log vernünftig lesen. Und das war das Ziel.
Ich habe den vorhergehenden Beitrag entsprechend geändert!
-
Einen Monat später, kann ich berichten das die ganze Sache sehr rund läuft. In der ganzen Zeit hatte ich ein kleines Problem, das ich auf ein Netzwerkproblem bei Hetzner geschoben habe. Ich konnte es mir anders nicht erklären, ist aber bis heute auch nicht mehr passiert. Seit dem werden Tag für Tag die Backups angelegt
-
Hier mal ein Auszug aus meiner Mail, wie das so nach längerer Zeit aussieht.
Applying Policy: keep the last 3 snapshots, 3 monthly snapshots snapshots for (host [debian-4gb-nbg1-1-webserver2], paths [/var/lib/redis/dump.rdb]): keep 5 snapshots: ID Time Host Tags Reasons Paths ------------------------------------------------------------------------------------------------------------------ 48964ce8 2020-05-31 04:00:01 debian-4gb-nbg1-1-webserver2 monthly snapshot /var/lib/redis/dump.rdb f9ae11c6 2020-06-30 04:00:01 debian-4gb-nbg1-1-webserver2 monthly snapshot /var/lib/redis/dump.rdb ee45f569 2020-07-09 04:00:01 debian-4gb-nbg1-1-webserver2 last snapshot /var/lib/redis/dump.rdb 69aa517b 2020-07-10 04:00:01 debian-4gb-nbg1-1-webserver2 last snapshot /var/lib/redis/dump.rdb 9720d6ab 2020-07-11 04:00:01 debian-4gb-nbg1-1-webserver2 last snapshot /var/lib/redis/dump.rdb monthly snapshot ------------------------------------------------------------------------------------------------------------------ 5 snapshots
Hier kann man jetzt auch mal sehen, was der Befehl
restic --password-file /root/passwd -r rest:https://$user:$password@DOMAIN:8000/redis forget --keep-last 3 --keep-monthly 3 --prune >> redis.log
so macht. Man erhält also am Ende eines Monates jeweils ein Backup, in der Summe dann später drei Stück. Und von den letzten drei Tagen. Das sollte für das was ich mache völlig ausreichend sein.
-
Heute habe ich es doch mal geschafft, meine Nextcloud Installation zu schrotten. Ok, dafür hat man ja die ganzen Backups
restic --password-file /root/passwd -r rest:https://$user:$password@DOMAIN:PORT/ORDNER restore e06b3571 -i /........path........./nextcloud --target /root/restore
So macht man das
Als erstes brauchen wir die Snapshot ID
restic --password-file /root/passwd -r rest:https://$user:$password@DOMAIN:PORT/ORDNER list snapshots
Ich schaue auch gerne in meine EMails rein, da finde ich die Richtige. Wenn ich die habe, schaue ich mir den Inhalt an.
restic --password-file /root/passwd -r rest:https://$user:$password@DOMAIN:PORT/ORDNER ls Snapshot_ID
Dann suche ich mir das raus, was ich brauche. Mit
-i /home/frank/
würde man dann z.B. den Ordner /home/frank/ restoren. Am Ende gebe ich noch ein Ziel an, hier /root/restore
Das hat perfekt geklappt. Hat sich der Rest-Server für mich schon gelohnt
-
Hallo Frank,
erstmal vielen Dank für deine Erfahrungen, welche du hier so zusammenträgst. Dank deiner Threads bin ich auch über restic gestolpert und habe eine Test-VM (Debian11, restic per REST-Server via https) aufgesetzt. Meine Clients (Windows und Debian) können bereits automatisiert per Skript ihre Daten übertragen. Ich würde nun gern den Rest-Server im append-only Modus betreiben. Die Clients sind also nun nicht mehr in der Lage alte Snapshots zu entfernen. Wie würdest du das autom. Aufräumen im append-only Modus bewerkstellgen, wenn den Clients diesen Recht genommen wird?
-
@M8X Hallo und Willkommen.
Eine sehr interessante Frage. Da ich das so nicht nutze, muss ich jetzt ein wenig spekulieren.
Die Daten liegen ja im Verzeichnis auf dem Server. Jeder User, mit den nötigen Rechten, sollte auf diesem Server auf die Repos zugreifen können (PW des Repos vorausgesetzt)
Somit sollte sich das ja gut mit einem Cronjob lösen lassen!?
-
Hallo Frank,
vielen Dank für deine Antwort. Die Clients greifen alle via REST-Schnittstelle auf den restic-Server zu. Da der restic-Server im append-only Modus läuft, können die Clients prinzipiell keine Snapshots entfernen, ihnen fehlt das Recht.
Derzeit teste ich ein lokales, auf dem REST-Server liegendes Skript, welches per cron ausgeführt wird. Dieses Skript stellt eine lokale Verbindung zum REPO her, also nicht über die REST-Schnittstelle. Damit würde erstmal das Löschen älterer Snapshots funktionieren. Vielleicht hat ja noch jemand eine andere Idee??