Skip to content

Rest-Server aufsetzen

Angeheftet Restic
  • 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.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.

    Screenshot_20200515-080556.png

    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!?

  • @FrankM

    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??

  • Rest-Server v0.12.0 released

    Restic
    1
    0 Stimmen
    1 Beiträge
    64 Aufrufe
    Niemand hat geantwortet
  • Storage Box für den REST-Server

    Restic
    1
    0 Stimmen
    1 Beiträge
    123 Aufrufe
    Niemand hat geantwortet
  • Rest-Server v0.11.0

    Restic
    1
    0 Stimmen
    1 Beiträge
    94 Aufrufe
    Niemand hat geantwortet
  • 0 Stimmen
    1 Beiträge
    168 Aufrufe
    Niemand hat geantwortet
  • 0 Stimmen
    5 Beiträge
    723 Aufrufe
    FrankMF

    @berthold Hallo Berthold. Ich bin eigentlich immer noch nicht mit meinem Code zufrieden. Ist man das jemals? Da ich auch noch ein kleines Problem habe, würde ich da ungerne jemanden reinschauen lassen. Der Code ist stellenweise in deutsch kommentiert, stellenweise in englisch. Kennt man ja, man will es irgendwann mal ordentlich machen und dann kommt das nächste Problem auf einen zu.

    Hast Du Python3 Vorkenntnisse? Wenn Du "brennend" dran interessiert bist, könnte ich Dir evt. Zugang zu meinem Gitlab-Projekt geben.

    Wenn Du interessiert bist und ich dich nicht los werde :), dann schreib mir eine PN.

  • Restic v0.11.0 released

    Restic
    1
    0 Stimmen
    1 Beiträge
    184 Aufrufe
    Niemand hat geantwortet
  • Rest-Server

    Verschoben Restic
    8
    0 Stimmen
    8 Beiträge
    528 Aufrufe
    FrankMF

    Dann mal eben ausprobiert. Auf meinem Server war die Version 0.9.7 selber, mit go, gebaut. Dann mache ich das auch mit der v0.10.0 so. Aber bevor ich anfange, wird die v0.9.7 gesichert.

    mv /usr/local/bin/rest-server /usr/local/bin/rest-server_0_9_7

    So erspare ich mir im Problemfall das selber bauen.

    Ok, dann die neue Version bauen.

    git clone https://github.com/restic/rest-server.git cd rest-server go run build.go

    Danach befindet sich im Verzeichnis die Binärdatei rest-server

    Die kopieren wir jetzt

    cp rest-server /usr/local/bin

    Danach kurzer Test

    # rest-server --version rest-server 0.10.0 (v0.10.0-6-g037fe06) compiled with go1.11.6 on linux/amd64

    Gut Version passt 🙂

    Dann ein Backup gestartet. Das sichert einen Teil meines Home-Verzeichnis

    Files: 153 new, 100 changed, 177857 unmodified Dirs: 0 new, 1 changed, 0 unmodified Added to the repo: 81.881 MiB processed 178110 files, 80.571 GiB in 0:28 snapshot 607e0027 saved Applying Policy: keep the last 3 snapshots, 3 monthly snapshots keep 5 snapshots: ID Time Host Tags Reasons Paths --------------------------------------------------------------------------------------- fa97890e 2020-07-25 21:02:05 frank-XXX monthly snapshot /home/frank 5b073bbb 2020-08-30 10:17:27 frank-XXX monthly snapshot /home/frank f7cf37ef 2020-09-06 15:13:03 frank-XXX last snapshot /home/frank 0157462c 2020-09-13 13:32:12 frank-XXX last snapshot /home/frank 607e0027 2020-09-14 08:09:34 frank-XXX last snapshot /home/frank monthly snapshot --------------------------------------------------------------------------------------- 5 snapshots remove 1 snapshots: ID Time Host Tags Paths --------------------------------------------------------------------- 3010b7cc 2020-09-06 11:39:27 frank-XXX /home/frank --------------------------------------------------------------------- 1 snapshots 1 snapshots have been removed, running prune counting files in repo building new index for repo [1:34] 100.00% 17351 / 17351 packs

    So weit funktioniert das genau wie vorher. Im Changelog stand ja was von Subfoldern. Das betrifft mich nicht, weil ich für jeden User genau ein Verzeichnis habe.

    So mit alles Gut 🙂 Dann warte ich mal morgen ab, ob die täglichen Backups der Server rund laufen.

  • 0 Stimmen
    1 Beiträge
    706 Aufrufe
    Niemand hat geantwortet