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!

    Installation 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 --home /home/rest-server/ 
    

    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.



Diese Artikel könnten Dich auch interessieren.

  • 2
  • 2
  • 1
  • 8
  • 1
  • 1
  • 1
  • 2