Cette page a été traduite automatiquement. Vos remarques sont les bienvenues : signaler une erreur de traduction sur GitHub ou écrire à hello@rhinvoice.com.
Sauvegarder et restaurer Rhinvoice
Rhinvoice sauvegarde toute sa base de données avec restic : chiffrée, dédupliquée et compressée, chaque jour et peu après chaque document émis ou annulé, vers une destination de votre choix (S3, SFTP, Dropbox, Google Drive ou un dossier). La base de données contient tout : clients, articles, documents, les PDF archivés des documents émis, le logo et les réglages.
Cette page traite de l’installation avec Docker. Le programme pour Windows et Mac se sauvegarde lui-même : sauvegarde dans le programme.
Quand et combien de temps
Section intitulée « Quand et combien de temps »- Quand : chaque jour (par défaut à 02:00,
BACKUP_DAILY_AT) et environ deux minutes après l’émission ou l’annulation de documents (plusieurs à la suite donnent une seule sauvegarde). Paramètres → Sauvegarde → Sauvegarder maintenant en demande une immédiatement. - Conservées : 7 quotidiennes, 4 hebdomadaires, 12 mensuelles et toutes les annuelles. Les factures doivent être conservées dix ans (art. 958f CO, GoBD, BAO); les sauvegardes annuelles ne sont jamais supprimées. Les anciennes sauvegardes sont supprimées le dimanche, jour où un échantillon de 5 % des données est aussi vérifié.
- Pas sauvegardée : une installation sans données d’entreprise (une installation neuve). Sa base de données vide ne doit jamais devenir la dernière sauvegarde.
- Affiché : l’aperçu avertit lorsque la dernière sauvegarde réussie date de plus de 24 heures ou que la sauvegarde n’est pas configurée. Paramètres → Sauvegarde liste les dernières sauvegardes.
Configuration
Section intitulée « Configuration »Choisissez une destination et inscrivez-la dans .env (à côté de compose.yml), puis redémarrez avec docker compose up -d.
RESTIC_PASSWORD='a-long-random-password' # chiffre les sauvegardesRESTIC_REPOSITORY=... # voir ci-dessousSans RESTIC_PASSWORD, personne ne peut restaurer les sauvegardes, pas même vous. Conservez-le dans un gestionnaire de mots de passe ou imprimé dans un coffre. Créez-le avec openssl rand -hex 32, ou mettez-le entre apostrophes simples : sinon Docker Compose modifierait un $ qu’il contient.
Stockage compatible S3
Section intitulée « Stockage compatible S3 »Backblaze B2, Infomaniak Swiss Backup, AWS, Wasabi et d’autres :
RESTIC_REPOSITORY=s3:https://s3.eu-central-003.backblazeb2.com/my-bucket/rhinvoiceAWS_ACCESS_KEY_ID=...AWS_SECRET_ACCESS_KEY=...Utilisez une clé qui n’a accès qu’à ce bucket.
SFTP (NAS, serveur)
Section intitulée « SFTP (NAS, serveur) »RESTIC_REPOSITORY=sftp:backup@nas.example:/backups/rhinvoiceLe conteneur a besoin de la clé SSH et de la clé d’hôte du serveur (known_hosts). Montez-les, par exemple dans un compose.override.yml :
services: backup: volumes: - ./ssh:/home/backup/.ssh:ro # id_ed25519 et known_hostsssh-keyscan nas.example > ssh/known_hostssudo chown -R 10001 ssh && chmod 700 ssh && chmod 600 ssh/id_ed25519 # l’utilisateur du conteneurDropbox et autres stockages cloud
Section intitulée « Dropbox et autres stockages cloud »restic les atteint via rclone, qui fait partie du conteneur de sauvegarde. La première sauvegarde contient tous les PDF archivés; les suivantes n’ajoutent que ce qui a changé, en général quelques kilo-octets.
-
Autoriser l’accès, une fois, sur un ordinateur avec un navigateur web (ce n’est pas forcément le serveur) : installez rclone 1.75 ou plus récent (rclone.org/downloads, sur un Mac
brew install rclone) et lancezFenêtre de terminal rclone authorize "dropbox"Connectez-vous à Dropbox dans le navigateur qui s’ouvre et autorisez l’accès. Le terminal affiche ensuite un jeton : une ligne qui commence par
{"access_token":. -
Remettre le jeton au conteneur de sauvegarde, sur le serveur, dans le dossier de Rhinvoice.
readgarde le jeton hors de l’écran et de l’historique du shell :Fenêtre de terminal read -rs TOKEN # collez le jeton, appuyez sur Entréedocker compose run --rm --no-deps backup rclone config create dropbox dropbox \config_refresh_token false token "$TOKEN"unset TOKENLa configuration est conservée, non chiffrée, dans le volume
backup-rclone; rclone y renouvelle lui-même l’accès. -
Choisir le dossier dans
.envet redémarrer (docker compose up -d) :RESTIC_REPOSITORY=rclone:dropbox:Rhinvoice-Backup -
Essayer : attendez que
docker compose logs backupaffichewaiting for requests, puis lancezdocker compose exec backup rhinvoice-backup backup. Le dossierRhinvoice-Backupapparaît dans votre Dropbox; Paramètres → Sauvegarde montre la sauvegarde. La création du dépôt au premier démarrage prend environ une minute via rclone. Jusqu’à la version 0.6.0, une sauvegarde demandée avant échoue avecconfig file already exists, bien que tout soit en ordre.
L’app Dropbox propre à rclone peut accéder à toute votre Dropbox. Pour un accès limité à un seul dossier, créez votre propre app Dropbox avec l’accès «App folder» (rclone.org/dropbox) et ajoutez son client_id et son client_secret aux deux commandes.
Google Drive nécessite votre propre client ID, car celui partagé par rclone cesse de fonctionner au cours de 2026. Les étapes sont sur une page à part : Sauvegarder sur Google Drive.
Pour d’autres fournisseurs (OneDrive, kDrive et autres stockages WebDAV), lancez docker compose run --rm --no-deps backup rclone config, répondez «No» lorsqu’on vous demande d’utiliser automatiquement un navigateur web et suivez la documentation rclone du fournisseur. Nommez le remote comme vous voulez et utilisez-le dans RESTIC_REPOSITORY=rclone:<nom>:<dossier>.
Un dossier de cette machine
Section intitulée « Un dossier de cette machine »Un dossier iCloud ou Nextcloud, le dossier de l’app Dropbox ou un disque USB :
RESTIC_REPOSITORY=/repositoryBACKUP_LOCAL_DIR=/Users/me/Library/Mobile Documents/com~apple~CloudDocs/Rhinvoice-BackupLe conteneur écrit en tant qu’utilisateur 10001; sous Linux, rendez le dossier accessible en écriture pour lui (sudo chown 10001 /chemin/vers/dossier). Sans BACKUP_LOCAL_DIR, les sauvegardes atterrissent dans un volume Docker sur le même disque : cela protège contre les erreurs, pas contre un disque défectueux.
Vérifier
Section intitulée « Vérifier »docker compose logs backup # ce que fait le conteneurdocker compose exec backup rhinvoice-backup snapshots # lister les sauvegardesdocker compose exec backup rhinvoice-backup check # vérifier le dépôtdocker compose exec backup rhinvoice-backup backup # sauvegarder maintenantdocker compose exec backup rhinvoice-backup rclone lsd dropbox: # une destination rclone est joignableRestaurer
Section intitulée « Restaurer »La restauration remplace toute la base de données par l’état d’une sauvegarde. Elle s’effectue en une seule transaction : si quelque chose échoue, rien ne change.
docker compose exec backup rhinvoice-backup snapshots # choisir un ID de snapshotdocker compose stop app backupdocker compose run --rm --no-deps backup restore latest # ou l’ID, p. ex. 52365e00docker compose start app backupDepuis le dossier des sources : make restore SNAPSHOT=latest.
Sur une nouvelle machine : installez Rhinvoice comme décrit dans Installation avec les mêmes RESTIC_REPOSITORY et RESTIC_PASSWORD. Démarrez d’abord seulement la base de données (docker compose up -d db), puis restaurez comme ci-dessus et démarrez tout (docker compose up -d).
Essayer une restauration à côté de l’installation en service
Section intitulée « Essayer une restauration à côté de l’installation en service »Essayez une restauration une fois après la configuration. Une deuxième installation dans son propre dossier restaure la dernière sauvegarde sans toucher à la première (plusieurs installations sur un même ordinateur). L’exemple suppose que l’installation se trouve dans ~/rhinvoice avec le nom de projet rhinvoice. Utilisez vos propres noms.
mkdir ~/rhinvoice-restoretest && cd ~/rhinvoice-restoretestcp ~/rhinvoice/compose.yml ~/rhinvoice/.env .# Son propre nom de projet et son propre port, et pas de factures récurrentes depuis la copie.# Sous Linux : sed -i 's/…/…/' .env (sans les '').sed -i '' 's/^COMPOSE_PROJECT_NAME=.*/COMPOSE_PROJECT_NAME=rhinvoice-restoretest/; s/^RHINVOICE_PORT=.*/RHINVOICE_PORT=8100/' .envecho 'RHINVOICE_RECURRING=false' >> .envgrep -E '^(COMPOSE_PROJECT_NAME|RHINVOICE_PORT|RHINVOICE_RECURRING)=' .env # vérifier les trois
docker compose up -d db# Seulement avec une destination rclone (Dropbox, Google Drive …) : copier l’accès dans le volume de la copie.docker compose run --rm --no-deps backup rclone versiondocker run --rm -v rhinvoice_backup-rclone:/from:ro \ -v rhinvoice-restoretest_backup-rclone:/to alpine sh -c 'cp -a /from/. /to/'
docker compose run --rm --no-deps backup snapshotsdocker compose run --rm --no-deps backup restore latestdocker compose up -d app # seulement l’app, jamais le conteneur de sauvegarde de la copieOuvrez http://localhost:8100, connectez-vous et regardez quelques factures. N’envoyez rien depuis la copie : les réglages du serveur de messagerie ont été restaurés avec tout le reste. Ensuite, supprimez-la :
grep '^COMPOSE_PROJECT_NAME=' .env # doit afficher rhinvoice-restoretestdocker compose down -vcd ~ && rm -rf ~/rhinvoice-restoretestSans COMPOSE_PROJECT_NAME modifié, chaque commande ci-dessus, y compris down -v, agit sur l’installation réelle. Si .env n’a pas cette ligne, ajoutez-la.
- Démarrez l’app par son nom. Un simple
docker compose up -ddémarre aussi le conteneur de sauvegarde de la copie. Deux installations qui sauvegardent dans un même dépôt mélangeraient leurs sauvegardes. Si vous le voulez vraiment, donnez à chacune son propreBACKUP_HOST. - L’accès rclone est conservé par projet, dans le volume
<projet>_backup-rclone. La copie ne l’a pas sans l’étapecp.docker volume lsliste les volumes. RHINVOICE_RECURRING=falseempêche la copie d’établir et d’envoyer par e-mail les factures récurrentes de l’installation réelle.
Questions fréquentes
Section intitulée « Questions fréquentes »À quelle fréquence Rhinvoice fait-il une sauvegarde?
Chaque jour, par défaut à 02:00, et environ deux minutes après l’émission ou l’annulation de documents. Paramètres, Sauvegarde, Sauvegarder maintenant en demande une immédiatement.
Combien de temps les sauvegardes sont-elles conservées?
7 quotidiennes, 4 hebdomadaires, 12 mensuelles et toutes les sauvegardes annuelles. Les sauvegardes annuelles ne sont jamais supprimées, car les factures doivent être conservées dix ans.
Rhinvoice peut-il sauvegarder sur Dropbox ou Google Drive?
Oui, via rclone, qui fait partie du conteneur de sauvegarde. Les sauvegardes sont chiffrées avant de quitter la machine, si bien que le fournisseur cloud ne stocke que des blocs illisibles.
Que se passe-t-il si je perds le mot de passe de sauvegarde?
Alors personne ne peut restaurer les sauvegardes, pas même vous. Conservez RESTIC_PASSWORD aussi ailleurs, par exemple dans un gestionnaire de mots de passe ou imprimé dans un coffre.