1Setup β source, destination and your custom code
π¦ Source database
Pick the version of the backup you are migrating.
The upgrade steps are prepared from here up to the target. After
restore the console double-checks the backup really is this
version.
no backups found β
drop a file into Upload_backup/
π― Destination
The database created and migrated by this run
(letters, digits, underscores). Created fresh in the
Restore DB + neutralize step β an existing DB with this name
is dropped and rebuilt from the backup.
Output folder
migrated_db/
Every finished database is exported here as a
timestamped
.dump β nothing is ever overwritten, all
test runs are kept.π§© Custom repositories
Module lists (upload Excel or edit below)
Unused modules β not used by any client,
uninstalled before the migration starts
Report modules to uninstall β reporting-only
modules rebuilt on the new version (history not migrated)
Module renames β two columns:
old name β new name (module was renamed in the new version)
Review / edit the uninstall list
One module per line. The job stops before doing any
damage if other installed modules depend on a listed one.
Review / edit the module renames
old,new per line β same target twice =
merge, old,new+extra = split (extra gets installed).Optional steps
2Progress
Overall0%
Status: idle
Mode: β
Database at: β
Time taken: β
Est. remaining: β
3Finish & verify β in this order
1
Installs your real custom code on the migrated
database (applies renames + data transforms). Unlocks when the hop
chain has finished. If it fails, add a solution below and press it
again β known fixes are re-applied first, then it continues.
π Solutions applied automatically
These SQL fixes live in
scripts/fixes/
and are replayed first on every run and every retry (each is
idempotent). When a new failure is diagnosed, its fix is added here
so the same issue never blocks a future migration again.
2
Compares record counts and accounting totals with
the untouched source copy. Unlocks after the final update.
3
Removes migration debris and shrinks the database.
Unlocks only after Postcheck has PASSED.
4
Boots the migrated Odoo so you can log in and
verify. Unlocks after the final update.
Live log
π How to migrate β read this before your first run
Prerequisites
- Test run: a database backup file β
.dump/.backup(made withpg_dump -Fc) or.dump.gz, copied into theUpload_backup/folder. No filestore needed; documents/images will be missing in the test result, which is fine for checking data. - Production run: a
.zipthat contains BOTH the database dump and thefilestore/directory from the old server (attachments, images, documents). - Your ported custom code for the target version, all repos in one folder (set its path in Setup β Custom repositories).
- Docker must be running on this machine (green whale icon). The live database is never touched β everything happens on a copy.
The steps
- Prepare β fill in the Setup card: pick the backup, choose the target version, set the custom-repos path, and upload/review the three module lists (unused modules, report modules to uninstall, renames). Press Save settings.
- Start β choose Test or Production and press βΆ Start migration. The console restores a copy, disables e-mail and scheduled jobs (a test can never send customer mail), keeps an untouched reference copy for validation, audits every module, uninstalls the listed ones, then upgrades one Odoo version at a time. Each step below shows its own progress bar, time taken and time remaining.
- Final update β the chain stops on purpose when the database reaches the target version. Press βΆ Run final update: module renames are applied, your real custom code is installed, and the changed-model data transforms run automatically.
- Validate β press Postcheck: record counts and accounting totals are compared against the untouched source copy. Debit/credit must match to the cent.
- Cleanup β press Cleanup (dry-run) to preview, then Cleanup to remove migration debris and shrink the database.
- Check in the browser β press Start Odoo, open the URL,
and log in (customer admin credentials, or press Reset admin
password and use
admin/admin). - Deliver β the finished dump is in
migrated_db/(every run is kept, timestamped). Restore it on the production server together with the migrated filestore.
If something fails
| Where it failed | What to do |
|---|---|
| Unpack / Restore | Check the file is a pg_dump -Fc dump (or a zip
containing one). Production mode needs filestore/
inside the zip. Fix the file and press Start migration
again. |
| Preflight | Open the log β usually a module list problem. Review
custom_modules.txt (the suggested list is a starting
point, not the truth), then Resume. |
| Uninstall unused modules | The log lists modules that DEPEND on something you want to uninstall. Either add those dependents to the uninstall list too (ask the client!) or remove the blocking entry. Then Resume β nothing was changed on failure. |
| An OpenUpgrade hop (e.g. β 16.0) | Read the error in the log (also in
logs/hop-<version>.log). Typical causes: a
module missing from custom_modules.txt, or a data
problem needing a fix in scripts/fixes/. After
fixing, press Resume β the failed hop is rolled back to
its snapshot and retried automatically. |
| Final update | Read logs/custom-update.log. Usually an error in a
ported module β fix the module code in your repos and press
βΆ Run final update again (it is safe to repeat). |
| Postcheck shows MISMATCH | Any difference in journal items or debit/credit totals is a release blocker β investigate before going further. Small attachment-count differences are normal. |
| Odoo does not open | Wait 30β60 s after Start Odoo. Still nothing? Press Stop Odoo, then Start Odoo again and watch the live log. |
| The server/laptop restarted mid-run | Open this page again β the job state is remembered. Press Resume to continue from the interrupted step. |
Rule of thumb: nothing here is
destructive to the customer β every run works on a copy, every hop has
a rollback snapshot, and mail/crons stay disabled until go-live.