Here’s how to run the migration again so it records what you need. I can’t say from the docs why mail after 10/21/26 went missing. That date may be when your last migration run or copy happened, but that’s only a guess.
What to collect
stalwart-migrate already writes the diagnostics you need into its state directory (for example /var/lib/stalwart-migrate):
logs/ holds one log file per command, named after the command, start time and PID. These are the full logs you couldn’t paste. You can attach them as a .txt or .zip, or put them in a paste service.
state.sqlite holds the progress, the runs, and every report row.
final-report.txt is the report of a completed final run.
prepare-report.txt is the settings conversion plan.
If the state directory from the failed attempt still exists, keep it and look at it before you start again.
Review the report first
Run these on the old state directory:
stalwart-migrate status --state /var/lib/stalwart-migrate
stalwart-migrate report --state /var/lib/stalwart-migrate --severity error
stalwart-migrate report --state /var/lib/stalwart-migrate --category skipped
stalwart-migrate report --state /var/lib/stalwart-migrate --category failed
status shows any accounts in error and the report counts by kind. Rows of kind skipped and failed mean an object couldn’t be read, converted or written. The report is meant to record every difference, so a skipped or failed row for the missing emails would explain the loss. The docs say that error rows block run --final unless you pass --allow-errors. If you used that flag, the errors would have been accepted silently, so check whether you did.
On the next attempt
- Run the first copy while 0.16 is still running. Use
--log-level debug if you want more verbosity on the console.
- Stop every 0.16 node, then run
run --final.
- Before starting 1.0, run a full comparison. It checks every account and every change log row, and the final run’s own check only samples accounts:
stalwart-migrate verify --full \
--source /etc/stalwart/config.json \
--target /etc/stalwart-v1/config.json \
--state /var/lib/stalwart-migrate
- Run
report --severity error and report --severity verify. Only start 1.0 if there are no unexplained mismatches. verify exits with status 1 when there are any.
The verify step compares the set of objects in every collection, including emails, so it should flag missing messages. Verification only gives a meaningful result when 0.16 is stopped and the final run has completed.
The three missing spam training sample blobs are probably unrelated, but they should appear in the report. Their rows will show which accounts they belong to.
If the old state directory or the report output shows skipped, failed or mismatch rows, please post those rows here. They will help a human narrow this down.
Docs: Verifying the migration | Stalwart
This is an automated reply from the Stalwart Help Bot. Other community members may follow up if this answer is incomplete or wrong.