#/protect/overview
Backup & Recovery (nextxch Protect) : export probant, configuration, données, restauration et changement d'hébergeur
nextxch Protect regroupe dans l'administration, sous Backup & Recovery, tout ce dont vous avez besoin pour la preuve, la sauvegarde et la restauration : export EML à valeur probante avec un manifeste signé Ed25519, sauvegarde de la configuration avec versions, sauvegarde incrémentielle chiffrée des données (répertoire, partage SMB ou S3 avec Object Lock), restauration dans la boîte aux lettres depuis l'archive GoBD, les éléments supprimés ou une sauvegarde de données, reprise bare-metal au premier démarrage, et déploiement par pipeline avec restauration et synchronisation en direct pour un changement d'hébergeur. Tout est intégré au serveur, sans produit complémentaire et sans service externe.
Ordre de mise en route : configurez d'abord la clé de sauvegarde sous Backup & Recovery > Configuration (une phrase secrète d'au moins 12 caractères ou une clé de récupération, uniquement en tant qu'administrateur du serveur connecté) et conservez-la en dehors du serveur. La sauvegarde de configuration et celle des données utilisent la même clé ; le serveur ne stocke que la partie publique et peut écrire des sauvegardes, mais jamais les lire. Licence : la sauvegarde de configuration, la vérification des exports probants, le libre-service du Webmail, la restauration au premier démarrage et la restauration par pipeline de la configuration sont inclus dans toutes les éditions ; la sauvegarde des données, l'export probant, les tâches de restauration, la partie données de la restauration par pipeline et la synchronisation en direct à partir de Business.
1. Démarrage rapide : clé, cible, première sauvegarde et vérification
Les cibles et les planifications se configurent sous Backup & Recovery > Planifications et cibles (administrateurs du serveur uniquement). nextxch-cli se connecte avec une clé API ou un identifiant d'administrateur.
# 1. Admin > Backup & Recovery > Configuration: set up the backup key
# (passphrase of 12+ characters or recovery key, keep it safe outside the server)
# 2. Schedules & targets: add a target (directory, SMB share \\nas\backup\nextxch or S3) and "Test"
# 3. Back up the configuration (every tier) and take it along as a file:
nextxch-cli config backup --label "before migration" -o nextxch-config.zip
# 4. Data backup (Business): full first, then incremental by schedule
nextxch-cli backup run --target nas --full
nextxch-cli backup list --target nas
# 5. Verify, with the passphrase including decryption of the sample
export NEXTXCH_BACKUP_PASSPHRASE='...'
nextxch-cli backup verify --target nas --passphrase-env NEXTXCH_BACKUP_PASSPHRASE --limit 200
2. Export probant : ZIP, manifeste, signature et vérification
Les messages sont placés dans le ZIP octet pour octet sous forme de .eml. manifest.json répertorie chaque fichier avec SHA-256, taille, hachage d'archive, état d'intégrité, conservation et conservation légale (legal hold) ; manifest.json.sig est une signature Ed25519 sur les octets exacts du manifeste, dérivée du secret du serveur et identique sur tous les nœuds du cluster. GET /api/compliance/exports/public-key renvoie la clé publique sans connexion. L'option de déchiffrement ne retire que le chiffrement au repos (ServerAdmin et ComplianceAuditor uniquement, sinon 403 DECRYPT_NOT_ALLOWED) ; il ne s'agit pas d'un déchiffrement S/MIME ou OpenPGP général. Le téléchargement individuel GET /api/compliance/messages/{id}/raw renvoie les hachages sous forme d'en-têtes HTTP X-Nextxch-Sha256, X-Nextxch-Stored-Sha256, X-Nextxch-Integrity et Repr-Digest. Export à partir de Business, vérification dans toutes les éditions.
nextxch-evidence-20261111-0930-1a2b3c4d.zip
messages/000001-<archiveId>.eml original message, byte for byte
messages/000002-<archiveId>.eml
SHA256SUMS.txt verifiable with sha256sum -c
manifest.json format nextxch-evidence-export/1, scope (incl. caseReference), items[]
manifest.json.sig Ed25519: algorithm, keyId, publicKey, signedSha256, signature
README.txt
# Start an export (202, status under GET /api/compliance/exports/{id}):
curl -X POST https://mail.company.com/api/compliance/exports -H "X-Api-Key: $KEY" \
-H "Content-Type: application/json" \
-d '{"scope":"mailbox","account":"anna@company.com","sinceUtc":"2026-01-01T00:00:00Z","caseReference":"Case 2026-0815"}'
# Verify offline, without access to the server (exit code 0 valid, 1 invalid/tampered, 2 usage error):
curl -s https://mail.company.com/api/compliance/exports/public-key > nextxch-evidence-key.json
nextxch-cli export verify nextxch-evidence-20261111-0930-1a2b3c4d.zip --public-key <publicKey from the file>
unzip -d export nextxch-evidence-20261111-0930-1a2b3c4d.zip && cd export && sha256sum -c SHA256SUMS.txt
3. Sauvegarde de la configuration : contenu, chiffrement, différences et restauration partielle
Un paquet contient la configuration sous forme de code (config/*.yaml), les fichiers d'état sans secrets (server/*), les règles Sieve et les secrets chiffrés dans secrets.enc (AES-256-GCM, clé de données enveloppée pour la clé de sauvegarde ; une sauvegarde manuelle peut en outre recevoir sa propre phrase secrète). Sections : config:<area>, dkim, passwords, tls-certificates, api-keys, sieve, server-files, licence ; licence, passwords et api-keys ne sont restaurés que s'ils sont nommés explicitement. Par défaut, la restauration est une simulation avec aperçu. Dans toutes les éditions ; REST sous /api/v1/config/backups.
nextxch-cli config list # versions (reason: manual, pre-update, after-change, pre-restore, import)
nextxch-cli config diff 20261101T020000Z-a1b2c3 current # difference between two versions or to the current state
nextxch-cli config backup --label "before update" --passphrase-env BACKUP_PW -o nextxch-config.zip
nextxch-cli config import -f nextxch-config.zip # take over a package of another server
# Partial restore: preview first, then apply
nextxch-cli config restore 20261101T020000Z-a1b2c3 --sections dkim,config:domains --domain company.com --dry-run
nextxch-cli config restore 20261101T020000Z-a1b2c3 --sections dkim,config:domains --domain company.com --yes
# REST: POST /api/v1/config/backups/{id}/restore
# {"sections":["dkim","config:domains"],"domain":"company.com","prune":false,"dryRun":true}
4. Sauvegarde des données : cibles, format et catalogue
Chaque exécution produit une version autonome : instantané de la base de données par table (indépendant du fournisseur, ce qui permet aussi de passer de SQLite à PostgreSQL), fichiers d'état, manifeste de l'archive GoBD et tous les blobs référencés. Les blobs sont adressés par SHA-256 et transférés une seule fois ; une exécution incrémentielle ne téléverse que les nouveaux hachages. Tout est stocké chiffré au format NXB1 (AES-256-GCM par blocs, lié au nom de l'objet). Le catalogue et l'index des blobs sont du JSON lisible sans secrets, le catalogue est signé avec la clé Ed25519 de l'export probant. Le format complet se trouve dans le dépôt sous docs/protect/backup-format.md. À partir de Business ; REST sous /api/admin/protect/backups (administrateurs du serveur).
<target>/ directory, SMB share or s3://bucket/nextxch-backup/
nextxch-backup.json target marker
keys/backup-key-<keyId>.json public key + sealed private key
keys/dk-<dataKeyId>.json data key of one run (ECDH wrapped)
blobs/ab/cd/<sha256>.nxb one mail or file content, immutable
versions/20261111T023000Z-a1b2c3/
catalog.json catalog.json.sig catalog (written last = version complete) + signature
blobs.ndjson.gz blob index of the version
db/<table>.ndjson.gz.nxb database snapshot, one file per table
files/<path>.nxb state files of the data directory
archive-manifest.json.gz.nxb retention, legal hold, integrity chain
# Settings via REST (PUT /api/admin/protect/backups/settings):
{"verifyEveryHours":24,"verifySampleSize":50,"alertOnFailure":true,"uploadParallelism":4}
# Back up a domain or single mailboxes:
nextxch-cli backup run --target s3-fsn1 --scope domains:company.com,company.at
nextxch-cli backup run --target s3-fsn1 --scope mailboxes:anna@company.com --no-wait
5. Restauration dans la boîte aux lettres : source, point dans le temps, cible
Sources : archive (archive GoBD), recoverable (éléments supprimés) et backup (sauvegarde de données). Choisissez le point dans le temps avec --point (identifiant d'instantané, day:yyyy-MM-dd ou latest) ou --as-of. Cibles : original (dossier d'origine), restored (par défaut, dossier "Wiederhergestellt yyyy-MM-dd", nom via --label) ou account (une autre boîte aux lettres du même locataire, par exemple celle d'un successeur). Les doublons sont ignorés selon SHA-256, Message-ID et UID, les sources restent inchangées. Autorisé pour TenantAdmin et ServerAdmin, jusqu'à 250 000 éléments par tâche ; tâches à partir de Business, politique et libre-service du Webmail dans toutes les éditions.
nextxch-cli restore points --account anna@company.com --source backup
nextxch-cli restore browse --account anna@company.com --source backup --point latest --folder INBOX --filter "invoice"
nextxch-cli restore preview --account anna@company.com --source archive --as-of 2026-10-31T23:59:59Z --folder "Projects/Plant"
nextxch-cli restore start --account anna@company.com --source archive --as-of 2026-10-31T23:59:59Z \
--folder "Projects/Plant" --target restored --label "Plant (restored)"
# Whole mailbox into a successor mailbox:
nextxch-cli restore start --account ben@company.com --source backup --point day:2026-11-01 \
--target account --target-account successor@company.com --passphrase-env NEXTXCH_BACKUP_PASSPHRASE
nextxch-cli restore jobs --account ben@company.com
# REST: /api/compliance/restore (sources, points, browse, preview, jobs, policy)
# Webmail: GET /api/mail/self-restore, POST /api/mail/self-restore {"ids":[...]}
6. Reprise bare-metal : nouvelle installation plus sauvegarde, et vous retrouvez l'ancien serveur
Sur une nouvelle installation (MSI, Docker ou Linux, au plus un locataire, un domaine, un compte et encore aucune connexion d'administrateur), /setup/ affiche "Restaurer depuis une sauvegarde" sous la connexion : téléverser le paquet, phrase secrète, aperçu, restauration, éventuellement la sauvegarde de données, terminer et redémarrer. Accès uniquement avec le jeton de configuration à usage unique que le premier démarrage écrit dans le journal et dans {DataDirectory}/first-run/setup-token.txt (en-tête X-Nextxch-Setup-Token), ou depuis le serveur lui-même avec Setup:TrustLoopback=true. La première connexion d'administrateur ou Terminer ferme définitivement l'assistant. La clé de sauvegarde de l'ancien serveur n'est pas reprise et doit être configurée à nouveau ensuite. L'index plein texte SQLite ne fait pas partie de la sauvegarde : la recherche trouve les e-mails restaurés après une réindexation.
# Headless via CLI (same API /api/setup):
export NEXTXCH_SETUP_TOKEN="$(cat /var/lib/nextxch/first-run/setup-token.txt)"
export NEXTXCH_BACKUP_PASSPHRASE='...'
nextxch-cli setup restore --config nextxch-config.zip --data s3://dr-bucket/nextxch/ --prune --dry-run
nextxch-cli setup restore --config nextxch-config.zip --data s3://dr-bucket/nextxch/ --prune --yes
# Unattended on first start (Docker Compose, Kubernetes, MSI):
environment:
NEXTXCH_RESTORE_FROM: s3://dr-bucket/nextxch/ # .zip, directory, s3://, https:// or config-backup:<id>
NEXTXCH_RESTORE_PASSPHRASE: ${BACKUP_PASSPHRASE} # without: configuration without secrets
NEXTXCH_RESTORE_DATA_FROM: s3://dr-bucket/nextxch/ # optional, location of the data backup
NEXTXCH_RESTORE_PRUNE: "true" # remove bootstrap objects
NEXTXCH_RESTORE_WITH_CREDENTIALS: "true" # passwords, API keys, licence (default true)
NEXTXCH_RESTORE_S3_ENDPOINT: https://fsn1.your-objectstorage.com
NEXTXCH_RESTORE_S3_ACCESS_KEY: ${S3_KEY}
NEXTXCH_RESTORE_S3_SECRET_KEY: ${S3_SECRET}
# Result: {DataDirectory}/pipeline-restore/first-start.json ("ok": true = variable is ignored afterwards)
# Helm: restore.from, restore.scope, restore.mapping, restore.passphrase, restore.s3.* (replicaCount: 1)
7. Déploiement par pipeline avec restauration (nextxch-cli deploy --restore)
Une commande ou une étape de pipeline reconstruit un serveur à partir d'une sauvegarde : appliquer la configuration, restaurer les données, exécuter des contrôles (échantillon de hachages, état de santé, e-mail de test uniquement vers Mailpit ou une boîte aux lettres locale) et, en option, des instructions pour le changement DNS/MX ; le DNS n'est jamais modifié automatiquement. Chaque exécution est idempotente et reprend à la dernière étape terminée après une interruption. Le fichier de mappage (kind RestoreMapping, schéma sous GET /api/v1/deploy/mapping-schema) réécrit les noms d'hôte, les adresses IP et les chemins, détermine la provenance des certificats (backup, acme, files) et décrit la base de données et le stockage du nouvel hôte ; les domaines de messagerie ne sont jamais renommés. Connexion avec une clé d'intégration disposant du scope deploy.restore. Configuration dans toutes les éditions, partie données à partir de Business (sauf au premier démarrage d'une nouvelle installation) ; la partie données couvre le scope all.
# mapping.yaml
apiVersion: nextxch/v1
kind: RestoreMapping
hostnames:
mail.old-provider.example: mail.company.com
ips:
203.0.113.10: 198.51.100.20
paths:
"C:\\Data\\NextxchData": /var/lib/nextxch
certificates:
mode: acme # backup | acme | files
acme: {contactEmail: hostmaster@company.com}
database:
provider: Postgres # must match the new host (Storage__Provider)
connectionStringEnv: NEXTXCH_PG_CONNECTION
storage:
blobBackend: S3
s3: {endpoint: https://fsn1.your-objectstorage.com, bucket: nextxch-mail}
# Plan (dry run, shows every replacement), then restore with checks:
nextxch-cli deploy --restore ./nextxch-config.zip --scope config --map mapping.yaml --dry-run
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --map mapping.yaml --test-mail mailpit --dns-instructions --yes
# REST: POST /api/v1/deploy/restore (dryRun defaults to true)
# {"source":"s3://dr-bucket/nextxch/","scope":"all","mapping":"...","dryRun":false,"testMail":"mailpit","hashSample":20}
# Local package: POST /api/v1/deploy/restore/upload (application/zip) -> source "upload:<sha256>"
# Runs: GET /api/v1/deploy/restore/runs
8. Modèles CI : GitHub Actions, GitLab CI, Azure DevOps et Ansible
Les modèles se trouvent dans le dépôt sous deploy/ci : restauration avec une étape de planification et une approbation sur l'environnement de production, plus une sonde de reprise après sinistre nocturne qui restaure dans un environnement jetable et rédige un rapport avec la durée (RTO) et l'état (RPO). Les secrets doivent être placés dans des variables CI masquées et protégées ; les e-mails de test vont vers un conteneur Mailpit à côté du job et ne le quittent jamais.
deploy/ci/github-actions/nextxch-restore.yml plan on a throwaway instance, container with restore on first start, checks, DNS step
deploy/ci/github-actions/nextxch-dr-probe.yml nightly DR probe with RTO/RPO report
deploy/ci/gitlab/.gitlab-ci.yml restore (RESTORE_SOURCE, RESTORE_SCOPE, PLAN_ONLY ...) + DR probe (NEXTXCH_PIPELINE=dr-probe)
deploy/ci/azure-devops/azure-pipelines.yml restore with parameters, deployment job on environment production
deploy/ci/azure-devops/azure-pipelines-dr-probe.yml nightly DR probe, report in the run summary
deploy/ci/ansible/playbook-restore.yml role nextxch_restore: container (Linux) or MSI (Windows)
deploy/ci/mapping.example.yaml, mapping.schema.json example and JSON Schema of the mapping file
9. Synchronisation en direct pour un changement d'hébergeur : un bref gel au lieu d'une longue interruption
Après la restauration complète, le nouveau serveur suit l'ancien par des exécutions delta : l'ancien serveur continue d'écrire sa sauvegarde de données (par exemple toutes les heures vers S3), et chaque exécution ne reprend que les blobs, lignes de table et fichiers d'état modifiés depuis la dernière version reprise. La progression se trouve dans {DataDirectory}/pipeline-restore/live-sync.json ; relancer la même commande ne change rien ou reprend le travail. Pour la bascule, l'ancien serveur est gelé manuellement (bloquer les ports de messagerie et des clients sur son pare-feu, laisser le service tourner, dernière sauvegarde avec nextxch-cli backup run --full), puis --cutover --source-frozen reprend cette sauvegarde avec une comparaison complète des lignes. Redémarrez ensuite le nouveau serveur et modifiez le DNS. À partir de Business ; REST : POST /api/v1/deploy/live-sync, POST /api/v1/deploy/live-sync/cutover, GET /api/v1/deploy/live-sync.
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --scope all --yes # 1. full restore (baseline)
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --live-sync --dry-run # remaining delta, changes nothing
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --live-sync --interval 5m --until-cutover # 2. follow the old server
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --cutover # 3. instructions for the freeze
# old server: block ports, then nextxch-cli backup run --full
nextxch-cli deploy --restore s3://dr-bucket/nextxch/ --cutover --source-frozen # 4. last backup, last run
Paramètres, valeurs par défaut & bonnes pratiques
| Paramètre / emplacement | Description | Valeur par défaut | Bonne pratique en production |
|---|---|---|---|
Konfigurationssicherung: Versionen (#/protect/config) |
Versions automatiques avant chaque mise à jour (AutoBeforeUpdate) et après des modifications (AutoAfterChanges, regroupées après DebounceMinutes), plus versions manuelles, importations et un instantané de sécurité avant chaque restauration. | KeepLast 30 · KeepDailyDays 90 · Debounce 10 min |
Avant des modifications importantes, créez une version manuelle étiquetée et conservez le fichier .zip en dehors du serveur. |
Sicherungsschlüssel (Passphrase / Wiederherstellungsschlüssel) |
ECDH P-256 ; la partie privée n'existe que sous forme scellée (PBKDF2-SHA256 avec 600 000 itérations, AES-256-GCM) et voyage dans chaque paquet. Sans clé ni phrase secrète, une sauvegarde de configuration ne contient aucun secret. | nicht eingerichtet · Passphrase ab 12 Zeichen |
Imprimez la clé de récupération et conservez-la à l'écart du serveur ; sans elle, les sauvegardes de données sont illisibles. |
Datensicherung: Aufbewahrung je Ziel |
Les KeepLast versions les plus récentes, plus la version la plus récente de chacune des KeepHourly dernières heures, KeepDaily derniers jours, KeepWeekly dernières semaines ISO et KeepMonthly derniers mois (UTC). | 3 / 24 / 7 / 4 / 12 |
Conservez au moins deux versions pendant une synchronisation en direct, sinon le delta ne peut pas être calculé (BASELINE_GONE). |
S3 Object Lock (ObjectLockMode, ObjectLockDays) |
Les objets sont écrits en mode Governance ou Compliance avec une date de conservation (retain-until) ; les blobs réutilisés reçoivent une date prolongée (maintenant plus 1,5 fois les jours de verrouillage), afin qu'aucune version ne pointe vers un objet qui deviendrait supprimable trop tôt. | Normal · 30 Tage |
Pour la protection contre les rançongiciels, utilisez le mode Compliance sur un bucket dédié avec gestion des versions ; les objets verrouillés ne sont supprimés que par une exécution ultérieure, après leur date. |
Zeitpläne (Frequency, Type, Scope) |
Toutes les heures, tous les jours ou toutes les semaines, incrémentielle ou complète, par cible et par périmètre (serveur, domaines, boîtes aux lettres) ; heure en heure locale du serveur, sans expression cron. | Täglich 02:30 inkr. · Sonntag 03:30 voll |
Les planifications préparées n'ont d'abord aucune cible : attribuez une cible et activez-les, sinon aucune sauvegarde ne s'exécute. |
Automatische Prüfung (VerifyEveryHours, VerifySampleSize) |
Vérifie sans la clé les hachages stockés, les en-têtes d'enveloppe, les fichiers de clé, la signature du catalogue et la lisibilité du catalogue et de l'index des blobs ; avec la phrase secrète, l'échantillon et tous les fichiers de table sont en outre déchiffrés. | alle 24 h · 50 Objekte |
Laissez AlertOnFailure activé afin que les sauvegardes et vérifications échouées parviennent aux destinataires des alertes. |
Parallele Uploads je Sicherung (UploadParallelism) |
Nombre de téléversements simultanés vers les cibles S3 et répertoire. | 4 (1 bis 32) |
Pour S3 sur des liaisons rapides, 8 à 16 ; pour un NAS sur un SMB lent, plutôt 2 à 4. |
SQL Server: ALLOW_SNAPSHOT_ISOLATION |
nextxch tente d'activer l'isolation par snapshot au démarrage. Si elle est désactivée, les tables sont exportées une par une en READ COMMITTED (consistency read-committed) et l'exécution signale un avertissement. | an, wenn erlaubt |
La vue d'ensemble affiche l'instruction SQL à copier ; avec l'isolation par snapshot, l'instantané de la base de données est cohérent sur le plan transactionnel. |
RecoverableItemsDays (restore-policy.json) |
Durée pendant laquelle les rendez-vous, contacts, tâches et notes supprimés conservent leur contenu ; ensuite, seule une pierre tombale vide subsiste pour la synchronisation. Les e-mails supprimés de manière réversible restent jusqu'à leur effacement définitif (expunge). | 14 Tage (nach Upgrade 30) |
Consignez-le dans la documentation des procédures : sans sauvegarde de données, les éléments de groupware supprimés perdent leur contenu après ce délai. |
Selbstbedienung im Webmail (SelfServiceEnabled, SelfServiceDays) |
Les utilisateurs récupèrent eux-mêmes les e-mails et éléments de groupware supprimés sous Restaurer les éléments supprimés (jusqu'à 500 par exécution). Réglable pour tout le serveur ou par domaine ; 0 jour signifie aucune fenêtre propre. | an · 0 Tage |
Pour les domaines soumis à des règles strictes, définissez une fenêtre ou désactivez-y le libre-service. |
Beweisexport: Rollen, Umfang, Download |
ComplianceAuditor, TenantAdmin (uniquement son propre locataire) et ServerAdmin peuvent exporter ; périmètre search, mailbox, range ou legalHold, jusqu'à 100 000 messages (au plus 250 000). Le lien de téléchargement est valable 24 heures. | includeSoftDeleted true · 24 h |
Indiquez toujours une référence de dossier (caseReference) : elle figure dans le manifeste signé et dans le journal d'audit. |
Setup:TrustLoopback |
Autorise les requêtes provenant du serveur lui-même (loopback) vers l'assistant de configuration sans le jeton de configuration. Par défaut, chaque requête nécessite le jeton de first-run/setup-token.txt. | false |
Ne l'activez que sur des hôtes sans autres utilisateurs locaux ; sinon, transmettez le jeton via NEXTXCH_SETUP_TOKEN. |
Audit-Log & GoBD |
Chaque étape figure dans le journal d'audit : config.backup*, data.backup.*, Compliance.EvidenceExport*, Protect.Restore*, Protect.SelfRestore, Protect.RestorePolicy, setup.* et config.restore ; visible sous Backup & Recovery > Journal. L'archive GoBD reste inchangée lors de toute restauration. | aktiv |
La sauvegarde des données contient le manifeste de l'archive avec conservation et conservation légale (legal hold) ; après une restauration, chaque hachage archivé est vérifié et les verrous sont remis en place. |