Part 11 of the grommunio 2026 series validates disaster recovery and single mailbox restore in a real isolated QEMU lab with grommunio 2026.06.1. The test covers a full restore of a fresh appliance and a targeted mailbox import into another mailbox.

Quick overview

  • Full DR: SQL dump, /var/lib/gromox and relevant configuration restored on a separate restore VM.
  • Single mailbox restore: mailbox exported as Gromox Mailbox Transfer and imported into a second mailbox.
  • Visual acceptance: Admin UI and grommunio Web show restored users and mail.
  • Result: FULL_DR = PASS, SINGLE_MAILBOX_RESTORE = PASS.

Tested baseline

The tests ran on a grommunio 2026.06.1 appliance. The restore did not reuse the same VM. A separate restore VM was started from a clean baseline and populated only from the backup artifacts.

bash
cat /etc/os-release
grommunio-admin version
rpm -qa | grep -E "^(grommunio|gromox|mariadb|nginx|postfix|redis)" | sort
systemctl --failed

Test data

The acceptance run used a dedicated local test domain with three users. The names in this article are lab examples; no production credentials or internal recovery secrets are published.

  • Domain: restore.test
  • Source mailbox: druser@restore.test
  • Target mailbox for the validated restore: restoretarget2@restore.test
  • Test messages: DR-FULL-BASELINE-20260915-A and DR-SINGLE-RESTORE-20260915-B

Create the backup

For the full DR test, database, Gromox stores and central configuration were backed up separately. A mailbox transfer stream was created for the later single mailbox restore.

bash
mysqldump --all-databases --single-transaction --routines --triggers --events --add-drop-database > grommunio-mysql-all.sql
tar --xattrs --acls -czf gromox-varlib.tar.gz -C /var/lib gromox
tar --xattrs --acls -czf grommunio-etc.tar.gz /etc/grommunio* /etc/gromox /etc/nginx /etc/postfix
gromox-exm2mt -u druser@restore.test -ar / > druser-full-mailbox.mt
sha256sum * > SHA256SUMS

Evidence: backup artifacts and checksums

The backup artifacts were verified with SHA256. The mailbox export contains both test mails that later reappear in the full DR and single mailbox restore.

Restore full disaster recovery

The restore VM started without the test domain. Services were stopped, data and configuration were restored, the database was imported and the grommunio services were started again.

bash
systemctl stop postfix gromox-delivery gromox-delivery-queue gromox-http gromox-zcore gromox-midb gromox-imap gromox-pop3 gromox-event gromox-timer grommunio-admin-api php-fpm nginx
systemctl stop mariadb
tar --xattrs --acls -xzf gromox-varlib.tar.gz -C /var/lib
tar --xattrs --acls -xzf grommunio-etc.tar.gz -C /
systemctl start mariadb
mysql < grommunio-mysql-all.sql
systemctl start redis@grommunio php-fpm nginx grommunio-admin-api gromox-event gromox-timer gromox-midb gromox-zcore gromox-http gromox-imap gromox-pop3 gromox-delivery-queue gromox-delivery postfix

Ownership note: on the grommunio appliance, the relevant system users and groups are normally created consistently by the appliance image. If backup and restore happen between differently built systems, however, tar restores with --xattrs --acls can still expose wrong numeric UID/GID mappings. After extraction, verify owners, groups, ACLs and key directory permissions.

bash
getent passwd gromox
getent group gromox
namei -l /var/lib/gromox
find /var/lib/gromox -maxdepth 2 -printf '%u:%g %m %p\n' | head -50

Evidence: full DR restore on the restore VM

After the restore, the CLI again shows the restore.test domain, users and both test mails. Admin UI and webmail then confirm the same state visually.

Proof in the Admin UI

After the restore, the services were active and the restored users were visible in the Admin UI.

https://mail.example.test/admin
https://mail.example.test/admin/users

Validate mailbox content after full DR

After the full DR restore, the source mailbox contained both test messages. This was verified with a Gromox export and in grommunio Web.

bash
zypper install -y binutils
gromox-exm2mt -u druser@restore.test -ar / > druser-after-full-dr.mt
strings druser-after-full-dr.mt | egrep "DR-FULL|DR-SINGLE|DRFULL|SINGLE-B"
https://mail.example.test/web

Single mailbox restore into another mailbox

The targeted mailbox restore used a splice export. The first raw import without -s restored the content but created a nested store tree. The validated article path therefore uses -s.

bash
gromox-exm2mt -u druser@restore.test -ars / > druser-full-mailbox-splice.mt
gromox-mt2exm -u restoretarget2@restore.test < druser-full-mailbox-splice.mt
systemctl restart gromox-http gromox-midb gromox-zcore

Evidence: targeted single mailbox restore

The splice export was imported into restoretarget2@restore.test. The target mailbox then contains both test mails and a normal folder structure.

Afterwards, both test messages were visible in the target mailbox without changing the source mailbox.

https://mail.example.test/web

Result check / technical acceptance

Version

Check
Confirm grommunio 2026.06.1
Expected result
The appliance version is documented clearly
Status
PASS

Backup

Check
Back up SQL, Gromox data, configuration and mailbox export
Expected result
All restore artifacts are complete
Status
PASS

Integrity

Check
Verify SHA256 checksums on host and restore VM
Expected result
Artifacts were transferred unchanged
Status
PASS

Full DR

Check
Restore on a separate VM
Expected result
Domain, users, services and mailbox contents are restored
Status
PASS

Single mailbox restore

Check
Import mailbox export into target mailbox
Expected result
The target mailbox contains the restored mail
Status
PASS

Web evidence

Check
Check Admin UI and grommunio Web
Expected result
Users and mails are visually verifiable
Status
PASS

Secret handling

Check
Review screenshots and public content
Expected result
No production credentials or internal secrets are published
Status
PASS

Operational notes

This test shows the technical restore path in the lab. Production operation additionally needs regular restore exercises, defined RPO/RTO targets, separate backup locations, monitoring, encryption, access control and documented responsibilities. High availability does not replace backup because replication can also replicate mistakes and accidental deletion.