Die REST Unterstützung ist komplett 🤓
Link Preview Image Not Found favicon(gitlab.com)
Ich denke, ein wenig Dokumentation wäre noch gut ☺
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!
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
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.
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
apt install letsencrypt
certbot certonly --standalone -d DOMAIN
# 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!
Ich möchte einzelne User haben, die ein eigenes Verzeichnis haben. Denkt an einzelne Server, die ihren eigenen Platz haben und ihren eigenen Login!
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.
apt install apache2-utils
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.
restic -r rest:https://USER:PASSWORD@DOMAIN:8000/server1 init
Denkt an die grundlegenden Dinge wie
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.de
In 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 Datensicherung
Die 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 sharutils
Und 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??