Multi-entity Enterprise ERP
Migrating a Live ERP Off a Cloud VM Onto Dedicated Infrastructure, Over One Weekend
Challenge
The problem
A production ERP serving 154 users across accounting, HR and payroll ran on a cloud VM managed by a third party. The client wanted it on infrastructure they controlled, with no change visible to users on Monday morning, and no data loss across ten years of accounting history.
Constraints
- The ERP was live production for the whole organisation, so a bad cutover is a real operational incident, not an internal inconvenience
- The stack was built and run by a different vendor, so nothing about it was documented on our side at the start
- Ten years of accounting history and a 41 GB attachment store had to arrive intact and verifiable, not just "look about right"
- The window was one weekend. There was no option to run long or roll back on Monday
Approach
How we ran it
- Rebuilt the entire stack on the target host first and ran it live against a full copy, so the migration was verified working before anyone considered pointing DNS at it
- Database restored from a fresh dump into a database created with matching collation and encoding, because a mismatch there corrupts sorting and text comparison in ways that surface weeks later
- Attachment store transferred and file-counted on both sides, so a partial copy would be caught before cutover rather than discovered by a user opening an invoice
- Verified the restore by counting real business objects, not just checking the process exited zero: users, partners, accounting entries, installed modules, and the timestamp of the most recent message in the system
- Compared the running container against its own base image and found five Python packages that had been installed by hand on the live system and never committed anywhere. Without that check the new environment would have started and then failed on first use
- Left the original environment running and untouched throughout, so rollback stayed available and cost nothing
One weekend, client offline Saturday to Sunday
By the numbers
- accounting entries restored, 0 errors
- 148,742accounting entries restored, 0 errors
- attachment files carried across
- 48,963attachment files carried across
- installed modules preserved
- 175installed modules preserved
- users, none of whom had to do anything
- 154users, none of whom had to do anything
Results
What we delivered
- Full stack replicated and running live before any DNS was touched
- Zero errors across a 148,742-entry accounting database restore
- Cutover completed inside a single weekend window, users saw no change
Tech stack
Start a similar project →Docker ComposePostgreSQLNginxCertbotOpen-source ERPUbuntu