Restic REST-Server installieren

Restic lässt sich wunderbar mit einer Reihe verschiedener Speicher und Speicherzugriffsprotokolle verwenden: SFTP, S3, Rclone, … Die für mich interessanteste ist dabei jedoch die REST-Schnittstelle, über die mit dem Restic-Server kommuniziert werden kann. Restic-Server wird dabei auf einem NAS oder anderen Server installiet und bildet das Backend. Eine Restic-Instanz auf einem zu sichernden Client kann sich zu Restic-Server verbinden und Daten sicher und vor allem sehr performant in den Speicher schreiben. Neben der Möglichkeit, ein “append only” Repository zu betreiben, heben die Entwickler vor allem die bessere Performance z.B. im Vergleich zu SFTP hervor:

Compared to the SFTP backend, the REST backend has better performance, especially so if you can skip additional crypto overhead by using plain HTTP transport (restic already properly encrypts all data it sends, so using HTTPS is mostly about authentication). But, even if you use HTTPS transport, the REST protocol should be faster and more scalable, due to some inefficiencies of the SFTP protocol … - https://github.com/restic/rest-server/blob/master/README.md

Die Installation eines solchen Restic Rest-Servers ist schnell erledigt:

Systembenutzer einrichten und Restic REST-Server herunterladen

Als root einloggen, neuen Systemuser erstellen:

adduser --system restic-server 

Unter https://github.com/restic/rest-server/releases den neuesten Release suchen und Datei für System herunterladen, z.B. für ARM-basierte Linux Systeme:

wget https://github.com/restic/rest-server/releases/download/v0.11.0/rest-server_0.11.0_linux_arm64.tar.gz
tar xzf rest-server_0.11.0_linux_arm64.tar.gz
cp rest-server_0.11.0_linux_arm64/rest-server /usr/local/bin/restic-server

Das heruntergeladene Binary ausführbar machen:

chmod +x /usr/local/bin/restic-server

Und den Restic REST-Server testweise starten:

restic-server --version

Das Backupverzeichnis vorbereiten

Meine Backups sollen im Verzeichnis /mnt/raid2tb/backup liegen. Es besteht die Möglichkeit, mehrere Nutzer authentifiziert auf den Server zugreifen zu lassen, deshalb habe ich für meinen persönlichen Account einen Unterordner thomas angelegt. Der Verzeichnisname entspricht dem Benutzernamen bei der Authentifizierung.

mkdir -p /mnt/raid2tb/backup/thomas
chown -R restic-server /mnt/raid2tb/backup 

Zugang für einen neuen Restic Server Benutzer erstellen:

apt install apache2-utils
cd /mnt/raid2tb/backup
htpasswd -B -c .htpasswd thomas
chown -R restic-server /mnt/raid2tb/backup/.htpasswd
chmod 600 /mnt/raid2tb/backup/.htpasswd

(thomas durch eigenen Benutzernamen ersetzen!)

Dieses Passwort gilt nicht für die Restic Verschlüsselung des Backups, sondern nur für den Zugang zum Restic-Server bzw. dessen HTTP-Schnittstelle. Die Verschlüsselung des Backups ist davon unabhängig. Achtet darauf, dass der Benutzername im htpasswd Befehl genau dem Verzeichnisnamen entspricht, denn nur so kann der Restic-Server Benutzernanmeldung und Backupverzeichnis einander zuordnen.

Nginx Proxy

Damit der Traffic zum Backupserver verschlüsselt wird, soll eine TLS-Transportverschlüsselung auf der Verbindung zwischen Client und Restic-Server verwendet werden. Der Restic-Server kann zwar über das --tls Flag auch schon selbst mit SSL-Sicherheitszertifikaten umgehen - da ich aber bereits einen Nginx-Server auf meinem NAS betreibe, um meinen Jellyfin Service auszuliefern, soll in meinem Fall Nginx das Zertifikatshandling übernehmen.

Eine passende Nginx-Konfiguration sieht so aus:

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name nas.meinserver.tld;

    root /var/www/default;

    ssl_certificate /etc/tls/nas.meinserver.tld/fullchain.pem;
    ssl_certificate_key /etc/tls/nas.meinserver.tld/privkey.pem;

    access_log off;
    error_log off;

    client_max_body_size 1G;
    proxy_connect_timeout 600; 
    proxy_send_timeout 600; 
    proxy_read_timeout 600; 
    send_timeout 600;

    location / {
            proxy_pass http://[::1]:8000;
    }

    if ($ssl_protocol = "") {
            return 301 https://$server_name$request_uri;
    }
}

Die Konfiguration wird nach /etc/nginx/sites-available/restic-server.conf geschrieben und aktiviert:

ln -s /etc/nginx/sites-available/restic-server.conf /etc/nginx/sites-enabled/restic-server.conf
systemctl reload nginx

Systemd Service anlegen

Einen systemd Service anlegen unter /etc/systemd/system/restic-server.service

[Unit]
Description=Restic Server
After=syslog.target
After=network.target

[Service]
Type=simple
User=restic-server
ExecStart=/usr/local/bin/restic-server --path /mnt/raid2tb/backup --private-repos
Restart=always
RestartSec=5
StandardOutput=syslog
StandardError=syslog

[Install]
WantedBy=multi-user.target

Service aktivieren und starten:

systemctl daemon-reload
systemctl enable restic-server
systemctl start restic-server

Mittels systemctl status restic-server kann überprüft werden, ob der Server läuft:

[...]
Active: active (running)
[...]
systemd[1]: Started Restic Server.

Verbindung mit dem Client

Auf dem Client wird der Server über die Umgebungsvariable RESTIC_REPOSITORY eingestellt. In meinem Beispiel mit HTTP und Nginx als Web-Proxy sieht die URL wie folgt aus:

RESTIC_REPOSITORY="rest:https://thomas:thomaspasswort@nas.meinserver.tld/thomas"

Dabei werden Benutzername und Passwort durch einen Doppelpunkt getrennt. Der Teil nach dem @-Zeichen richtet sich nach Art des Setups. In meinem Fall mit HTTPS Support und einem vorgeschalteten Nginx nenne ich einfach die Subdomain meines NAS. Ohne den Nginx muss ggf. der Port noch genannt werden, z.B. nas.meinserver.tld:8000.