Backup und Wiederherstellen
Rhinvoice sichert seine ganze Datenbank mit restic: verschlüsselt, dedupliziert und komprimiert, täglich und kurz nach jedem ausgestellten oder stornierten Dokument, auf ein Ziel Ihrer Wahl (S3, SFTP, Dropbox, Google Drive oder einen Ordner). In der Datenbank steckt alles: Kunden, Artikel, Dokumente, die archivierten PDFs ausgestellter Dokumente, das Logo und die Einstellungen.
Wann und wie lange
Abschnitt betitelt „Wann und wie lange“- Wann: täglich (standardmässig um 02:00 Uhr,
BACKUP_DAILY_AT) und etwa zwei Minuten nachdem Dokumente ausgestellt oder storniert wurden (mehrere hintereinander ergeben ein Backup). Einstellungen → Backup → Jetzt sichern fordert sofort eines an. - Aufbewahrt: 7 tägliche, 4 wöchentliche, 12 monatliche und alle jährlichen Backups. Rechnungen müssen zehn Jahre aufbewahrt werden (Art. 958f OR, GoBD, BAO), jährliche Backups werden deshalb nie gelöscht. Alte Backups werden sonntags entfernt. Dabei wird auch eine Stichprobe von 5 % der Daten geprüft.
- Nicht gesichert: eine Installation ohne Firmendaten (eine frische). Ihre leere Datenbank darf nie das neueste Backup werden.
- Angezeigt: Die Übersicht warnt, wenn das letzte erfolgreiche Backup älter als 24 Stunden ist oder Backups nicht eingerichtet sind. Einstellungen → Backup listet die letzten Backups.
Einrichten
Abschnitt betitelt „Einrichten“Wählen Sie ein Ziel, tragen Sie es in .env ein (neben compose.yml) und starten Sie neu mit docker compose up -d.
RESTIC_PASSWORD='a-long-random-password' # encrypts the backupsRESTIC_REPOSITORY=... # see belowOhne RESTIC_PASSWORD kann niemand die Backups wiederherstellen, auch Sie nicht. Bewahren Sie es in einem Passwortmanager oder ausgedruckt im Tresor auf. Erzeugen Sie es mit openssl rand -hex 32 oder setzen Sie es in einfache Anführungszeichen: Docker Compose würde sonst ein $ darin verändern.
S3-kompatibler Speicher
Abschnitt betitelt „S3-kompatibler Speicher“Backblaze B2, Infomaniak Swiss Backup, AWS, Wasabi und andere:
RESTIC_REPOSITORY=s3:https://s3.eu-central-003.backblazeb2.com/my-bucket/rhinvoiceAWS_ACCESS_KEY_ID=...AWS_SECRET_ACCESS_KEY=...Verwenden Sie einen Schlüssel, der nur auf diesen Bucket zugreifen darf.
SFTP (NAS, Server)
Abschnitt betitelt „SFTP (NAS, Server)“RESTIC_REPOSITORY=sftp:backup@nas.example:/backups/rhinvoiceDer Container braucht den SSH-Schlüssel und den Host-Schlüssel des Servers (known_hosts). Binden Sie beide ein, z. B. in einer compose.override.yml:
services: backup: volumes: - ./ssh:/home/backup/.ssh:ro # id_ed25519 and known_hostsssh-keyscan nas.example > ssh/known_hostssudo chown -R 10001 ssh && chmod 700 ssh && chmod 600 ssh/id_ed25519 # the container's userDropbox, Google Drive und andere Cloud-Speicher
Abschnitt betitelt „Dropbox, Google Drive und andere Cloud-Speicher“restic erreicht sie über rclone, das im Backup-Container enthalten ist. Das erste Backup enthält alle archivierten PDFs, spätere nur noch das Geänderte, meist wenige Kilobyte.
-
Zugriff erlauben, einmalig, auf einem Rechner mit Webbrowser (es muss nicht der Server sein): rclone 1.75 oder neuer installieren (rclone.org/downloads, auf dem Mac
brew install rclone) und ausführen:Terminal-Fenster rclone authorize "dropbox"Melden Sie sich im geöffneten Browser bei Dropbox an und erlauben Sie den Zugriff. Das Terminal zeigt dann ein Token: eine Zeile, die mit
{"access_token":beginnt. -
Das Token dem Backup-Container geben, auf dem Server, im Rhinvoice-Ordner.
readhält das Token vom Bildschirm und aus dem Verlauf der Shell fern:Terminal-Fenster read -rs TOKEN # paste the token, press Enterdocker compose run --rm --no-deps backup rclone config create dropbox dropbox \config_refresh_token false token "$TOKEN"unset TOKENDie Konfiguration liegt unverschlüsselt im Volume
backup-rclone. rclone erneuert den Zugriff dort selbst. -
Den Ordner wählen in
.envund neu starten (docker compose up -d):RESTIC_REPOSITORY=rclone:dropbox:Rhinvoice-Backup -
Ausprobieren:
docker compose exec backup rhinvoice-backup backup. Der OrdnerRhinvoice-Backuperscheint in Ihrer Dropbox, Einstellungen → Backup zeigt das Backup.
Die Dropbox-App von rclone darf auf Ihre ganze Dropbox zugreifen. Für Zugriff auf nur einen Ordner legen Sie eine eigene Dropbox-App mit «App folder»-Zugriff an (rclone.org/dropbox) und ergänzen deren client_id und client_secret in beiden Befehlen.
Google Drive funktioniert gleich. Fragen Sie nur nach Zugriff auf die Dateien, die rclone selbst anlegt (der Umfang muss beim Autorisieren gewählt werden):
rclone authorize "drive" --drive-scope drive.fileread -rs TOKENdocker compose run --rm --no-deps backup rclone config create gdrive drive \ scope drive.file config_refresh_token false token "$TOKEN"unset TOKENund RESTIC_REPOSITORY=rclone:gdrive:Rhinvoice-Backup.
Für andere Anbieter (OneDrive, kDrive und andere WebDAV-Speicher) führen Sie docker compose run --rm --no-deps backup rclone config aus, antworten auf die Frage nach dem automatischen Webbrowser mit «No» und folgen der rclone-Anleitung des Anbieters. Benennen Sie das Ziel nach Belieben und verwenden Sie es in RESTIC_REPOSITORY=rclone:<name>:<folder>.
Ein Ordner auf diesem Rechner
Abschnitt betitelt „Ein Ordner auf diesem Rechner“Ein iCloud- oder Nextcloud-Ordner, der Ordner der Dropbox-App oder eine USB-Festplatte:
RESTIC_REPOSITORY=/repositoryBACKUP_LOCAL_DIR=/Users/me/Library/Mobile Documents/com~apple~CloudDocs/Rhinvoice-BackupDer Container schreibt als Benutzer 10001. Unter Linux machen Sie den Ordner für ihn beschreibbar (sudo chown 10001 /path/to/folder). Ohne BACKUP_LOCAL_DIR landen die Backups in einem Docker-Volume auf derselben Festplatte. Das schützt vor Fehlern, nicht vor einer defekten Festplatte.
docker compose logs backup # what the container doesdocker compose exec backup rhinvoice-backup snapshots # list the backupsdocker compose exec backup rhinvoice-backup check # verify the repositorydocker compose exec backup rhinvoice-backup backup # back up nowdocker compose exec backup rhinvoice-backup rclone lsd dropbox: # an rclone target is reachableWiederherstellen
Abschnitt betitelt „Wiederherstellen“Wiederherstellen ersetzt die ganze Datenbank durch den Stand eines Backups. Es läuft in einer einzigen Transaktion: Schlägt etwas fehl, ändert sich nichts.
docker compose exec backup rhinvoice-backup snapshots # pick a snapshot IDdocker compose stop app backupdocker compose run --rm --no-deps backup restore latest # or the ID, e.g. 52365e00docker compose start app backupAus dem Quellcode-Ordner: make restore SNAPSHOT=latest.
Auf einem neuen Rechner: Installieren Sie Rhinvoice wie unter Installation beschrieben, mit demselben RESTIC_REPOSITORY und RESTIC_PASSWORD. Starten Sie zuerst nur die Datenbank (docker compose up -d db), stellen Sie wie oben wieder her und starten Sie dann alles (docker compose up -d).
Probieren Sie nach dem Einrichten einmal eine Wiederherstellung aus, z. B. mit einer zweiten Installation neben der ersten (mehrere Installationen auf einem Rechner). Geben Sie ihr dasselbe RESTIC_REPOSITORY und RESTIC_PASSWORD nur zum Wiederherstellen und lassen Sie ihren Backup-Container damit nicht laufen (docker compose stop backup): Zwei Installationen, die in dasselbe Repository sichern, würden ihre Backups vermischen. Wollen Sie das wirklich, geben Sie jeder ein eigenes BACKUP_HOST.
Häufige Fragen
Abschnitt betitelt „Häufige Fragen“Wie oft sichert Rhinvoice?
Täglich, standardmässig um 02:00 Uhr, und etwa zwei Minuten nachdem Dokumente ausgestellt oder storniert wurden. Unter Einstellungen, Backup, Jetzt sichern fordern Sie sofort ein Backup an.
Wie lange werden Backups aufbewahrt?
7 tägliche, 4 wöchentliche, 12 monatliche und alle jährlichen Backups. Jährliche Backups werden nie gelöscht, weil Rechnungen zehn Jahre aufbewahrt werden müssen.
Kann Rhinvoice nach Dropbox oder Google Drive sichern?
Ja, über rclone, das im Backup-Container enthalten ist. Die Backups werden verschlüsselt, bevor sie den Rechner verlassen. Der Cloud-Anbieter speichert nur unlesbare Blöcke.
Was passiert, wenn ich das Backup-Passwort verliere?
Dann kann niemand die Backups wiederherstellen, auch Sie nicht. Bewahren Sie RESTIC_PASSWORD zusätzlich an einem anderen Ort auf, etwa in einem Passwortmanager oder ausgedruckt im Tresor.