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

  • Restic v0.17.0 released

    Restic
    1
    0 Stimmen
    1 Beiträge
    99 Aufrufe
    Niemand hat geantwortet
  • Rest-Server v0.13.0 released

    Restic
    2
    0 Stimmen
    2 Beiträge
    291 Aufrufe
    FrankMF
    Download Rest-Server und installieren

    Im Github Repository den aktuellen Release suchen. Hier am Beispiel der aktuellen Version 0.13.0 (27.07.2024) Datei herunterladen

    wget https://github.com/restic/rest-server/releases/download/v0.13.0/rest-server_0.13.0_linux_amd64.tar.gz

    Die Datei entpacken

    tar -xf rest-server_0.13.0_linux_amd64.tar.gz

    Ins Verzeichnis wechseln

    cd rest-server_0.13.0_linux_amd64

    Wenn der Rest-Server läuft, dann muss man diesen erst mal stoppen.

    systemctl stop rest-server

    Danach kopiert man das File nach bin. Wer mag sichert vorher das alte File.

    cp rest-server /usr/local/bin

    Danach kann man den Rest-Server wieder starten.

    systemctl start rest-server

    Versionskontrolle

    root@rest-server:~# rest-server -v rest-server version rest-server 0.13.0 compiled with go1.22.5 on linux/amd64

    Die Hilfe vom Rest-Server

    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 --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 (use "-" for logging to stdout) --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 Systemd

    Wer noch ein passendes systemd File benötigt.

    [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 /mnt/rest-server/<DOMAIN>/fullchain.pem --tls-key /mnt/rest-server/<DOMAIN>/key.pem --path /mnt/rest-server Restart=always RestartSec=5 # Optional security enhancements NoNewPrivileges=yes PrivateTmp=yes ProtectSystem=strict ProtectHome=yes ReadWritePaths=/mnt/rest-server [Install] WantedBy=multi-user.target
  • Rest-Server v0.12.0 released

    Restic
    1
    0 Stimmen
    1 Beiträge
    84 Aufrufe
    Niemand hat geantwortet
  • Restic - 0.15.0 released

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

    Restic
    1
    0 Stimmen
    1 Beiträge
    142 Aufrufe
    Niemand hat geantwortet
  • Restic v0.12.0 released

    Restic
    1
    0 Stimmen
    1 Beiträge
    219 Aufrufe
    Niemand hat geantwortet
  • Restic v0.11.0 released

    Restic
    1
    0 Stimmen
    1 Beiträge
    193 Aufrufe
    Niemand hat geantwortet
  • Restic - Update

    Restic
    1
    0 Stimmen
    1 Beiträge
    411 Aufrufe
    Niemand hat geantwortet