Files
computer-playbook/roles/web-app-mailu/docs/Move_Domain.md
T
kevinveenbirkenbachandClaude Opus 4.7 16bdbf03d7 docs: fix repo-wide drift against documentation.md style rules
Three classes of drift cleaned up across 85 .md files:

- Em-dashes: replaced ` — ` with the contextually correct separator
  (colon for `term: explanation`, period to split clauses across
  sentences/source lines, parentheses for asides, semicolon for
  tight-linked continuations). Two intentional exceptions remain
  in `docs/contributing/documentation.md` (the rule literal) and
  inside a fenced ```sh block in `docs/contributing/actions/debugging/ci.md`.
- SPOT self-labels: rewrote "This is the SPOT for X" to describe
  the subject directly ("This directory holds X" / "This file
  describes X"). Cross-references to other artefacts' canonical
  role remain unchanged.
- Heading-emoji position: moved leading-emoji headings (`# 🧩 Title`)
  to trailing position (`# Title 🧩`) per the headline rule that
  emojis MUST come after the title text.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 20:12:07 +02:00

2.9 KiB
Raw Blame History

How to Migrate Mailboxes to a New Domain in Mailu 📖

When changing the primary email domain (e.g., from cymais.cloud to infinito.nexus), it is not enough to simply rename mailbox directories on disk. Mailu manages domain and user records in its internal database, and Dovecot maintains index files inside each Maildir. A blind rename will lead to login failures, rejected mail, or corrupted mail indices.

This guide explains the safe procedure for migrating user mailboxes to a new domain.


Why renaming folders directly does not work 🔴

  • Mailu keeps domains, users, and aliases in the admin_data database. If you rename folders only, Mailu will not recognize the new accounts.
  • Dovecot generates .dovecot.index* and dovecot-uidlist files in each mailbox. These must be rebuilt when moving mailboxes; otherwise, users may see missing or broken mail.
  • Postfix will refuse to deliver or relay messages for unknown domains.

Correct migration procedure ✅

1. Add the new domain and users in Mailu

Use the Mailu CLI inside the admin container:

# Add new domain
compose exec admin flask mailu domain add infinito.nexus

# Add new user (repeat for each account)
compose exec admin flask mailu user kevinveenbirkenbach infinito.nexus 'NEW_PASSWORD'

2. Copy or move existing Maildir contents

Instead of renaming, copy the entire Maildir from the old domain to the new one:

rsync -aHAX --numeric-ids \
  /var/lib/docker/volumes/mailu_dovecot_mail/_data/kevinveenbirkenbach@cymais.cloud/ \
  /var/lib/docker/volumes/mailu_dovecot_mail/_data/kevinveenbirkenbach@infinito.nexus/

3. Remove old Dovecot index files

Ensure that Dovecot rebuilds indices cleanly:

find /var/lib/docker/volumes/mailu_dovecot_mail/_data/ -type f -name '.dovecot*' -print -delete
find /var/lib/docker/volumes/mailu_dovecot_mail/_data/ -type f -name 'dovecot-uidlist*' -print -delete


4. Fix file permissions

Make sure all mailbox files belong to the mail:mail user/group:

chown -R mail:mail /var/lib/docker/volumes/mailu_dovecot_mail/_data/kevinveenbirkenbach@infinito.nexus

5. Restart services and test login

After copying, restart Mailu services (or at least imap and smtp) and confirm that users can log in with their new addresses.


6. (Optional) Keep the old domain as an alias

To ensure incoming mail for the old domain is still accepted:

compose exec admin flask mailu domain alias add cymais.cloud infinito.nexus

This maps all @cymais.cloud addresses to their equivalents under @infinito.nexus.


Summary 💡

  • Do not just rename mailbox folders.
  • Always create the new domain and user in Mailu first.
  • Copy existing Maildir contents into the new user’s directory.
  • Remove Dovecot indices and fix permissions.
  • Optionally configure a domain alias so old addresses remain valid.