Migrating Away from Hostinger: A Day of DNS, Databases, and Determination
Today was one of those deep infrastructure days—the kind where progress doesn’t always look flashy, but everything underneath gets stronger.
I spent most of the day migrating multiple domains and subdomains from Hostinger to my own hosting environment. Along with that came two email accounts and eight MySQL databases. On paper, that sounds straightforward. In reality, Hostinger’s custom control panel, while fine for basic use, doesn’t behave like a traditional cPanel setup, which makes clean migrations a bit more manual than expected.
Instead of spinning up a new account, I decided to consolidate everything into my existing cPanel environment. My licensing is tied to user accounts rather than machines, so keeping things centralized made more financial sense in the long term.
Databases: Where the Real Work Started
About half of the database exports needed cleanup before they would import properly. Hostinger prefixes usernames on procedures and functions, so those had to be stripped out. On top of that, some binary defaults didn’t export correctly, which meant manually correcting SQL before import.
# Remove DEFINER statements from exportsed -i 's/DEFINER=`[^`]*`@`[^`]*`//g' database.sql# Fix broken binary defaults (common export issue)sed -i -E "s/DEFAULT x( AS)? \`([0-9A-Fa-f]+)\`/DEFAULT x'\1'/g" database.sql
Not glamorous work, but necessary.
DNS and Name Servers: The Waiting Game
Once the data was in place, I pointed the nameservers to the new host. Most sites came online quickly, but as expected, DNS propagation introduced some delay. It’s always a reminder that even when everything is configured correctly, the internet still moves at its own pace.
dig periplux.io NSdig @ns1.codejamboree.com periplux.io
Email: Enter SMTP2GO
With multiple domains and email accounts in play, I decided to try the SMTP2GO plugin for cPanel to simplify outbound mail setup inside WHM.
That turned into its own mini project.
I had to:
- back up the existing Exim configuration
- rebuild Exim
- Enable allow_url_fopen in the PHP configuration
- install the plugin
- restore parts of the configuration
- and restart services
After a few rounds of troubleshooting, I finally got outbound mail flowing to Gmail. The reply came through… eventually. The delay was expected. MX records had just changed, name servers were still propagating, and remote mail servers needed time to trust the new path.
# Backup existing Exim configcp /etc/exim.conf.local /etc/exim.conf.local.bak# Rebuild and restart Exim/scripts/buildeximconf/scripts/restartsrv_exim# Download & install Smtp2go for cPanelcurl -O https://cpanelservice2.smtp2go.com/storage/installerchmod +x installer./installer# Test outbound routingexim -bt user@example.com# Send a test emailecho "SMTP test" | mail -s "Test" user@example.com# Verify SMTP is reachable from my locationnc -vz example.com 25# Watch logs livetail -f /var/log/exim_mainlog
Cleaning Up the Structure
One of the more satisfying parts of the day was reorganizing how sites are stored. Instead of a scattered set of hashed or auto-generated directories, I started using symbolic links to point to a clean /domains structure organized by fully qualified domain names.
It’s a small change, but it makes everything easier to navigate and maintain.
# Link domain folder to public_htmlln -s ~/domains/example.com/public_html \ ~/public_html/example.com
Maintenance and Updates
I also took the opportunity to update WordPress installations and plugins. Hostinger wasn’t consistently handling those updates, but my new setup gives me more control (and more responsibility) to keep things up to date.
Where Things Stand
There are still a few sites left to clean up, but overall, today was a solid step forward. Most domains are live, databases are connected, and email is functioning.
There’s also a bit of a deadline driving all of this. One of the domains is about to expire on Hostinger. It’s not heavily used, so I’m weighing whether to renew it or let it go. If I keep it, I may look for a registrar that integrates more cleanly with my workflow at a better price point. It’s an “.io” domain, which comes with higher costs ($68 per year vs. $19 for .com) and a bit of uncertainty. With control of the British Indian Ocean Territory shifting to Mauritius, there’s always the question of what happens to the extension in the long term.
Two years ago, I went through a bit of an ordeal trying to choose the right host. Most of the friction came down to hunting for specific services, compatible versions, and the right balance of features versus cost. Space and pricing were only part of the equation. The real challenge was flexibility.
Now, running my own hosting environment, that equation has flipped. I control the services. I control the versions. And I’m no longer limited by what a provider offers.
The other factor that pushed me in this direction was pricing over time. What started as about $96 a year with Hostinger has nearly doubled at renewal. That kind of increase makes it even harder to justify staying locked into a platform when I am already building and managing my own separate infrastructure.
Final Thoughts
Days like this don’t always feel productive in the moment, but they lay the groundwork for everything that comes next. Less dependency on third-party platforms, more control over infrastructure, and a clearer path forward for scaling.
It’s a lot of moving parts, but it’s starting to come together.
