PrestaShop Migration from Hestia to DirectAdmin
Tech
PrestaShop
Migration
DirectAdmin
Hestia

PrestaShop Migration from Hestia to DirectAdmin

A practical anonymized case study on moving a PrestaShop backend from Hestia to DirectAdmin with Redis, cron migration, cache checks, and AI review.

Uygar DuzgunUUygar Duzgun
Jun 8, 2026
8 min read

PrestaShop Migration from Hestia to DirectAdmin

A PrestaShop migration does not have to mean moving the whole stack. In this case, I moved the backend from an older Hestia setup to a new DirectAdmin-based host in one evening. The frontend stayed on its existing platform. Newsletter and CRM services stayed where they were. The scope was tighter: make the new backend handle REST APIs, cache, and cron for a multistore ecommerce system.

The active work took about three to four hours. File transfer was the easy part. The real job was proving that routing, Redis, cron, cache invalidation, and store-specific API responses still worked after the move.

What I Moved in the PrestaShop Migration

The backend landed on a modern shared hosting plan with NVMe storage, allocated CPU, and allocated RAM. The hosting panel reported the expected package and disk quota.

I did not move everything, and that was intentional.

Moved:

PrestaShop backend to the new host
backend DNS and routing
REST routing for Store A and Store B
Redis through a Unix socket
PHP settings in DirectAdmin
cache invalidation through PrestaShop hooks
relevant cron jobs from the old live server

Left in place:

the frontend runtime
newsletter automation
CRM
Hestia's internal panel cron jobs

I prefer this kind of narrow PrestaShop migration because it reduces noise. If you move the frontend, the marketing stack, and the backend at the same time, you create too many variables. Here, I wanted one clear business system to validate.

Routing Was the First Problem

PrestaShop runs as a multishop backend. That means one backend must answer correctly for two stores. On the old host, panel rules and existing URL behavior hid some of the complexity. On the new host, REST calls had to preserve the store context before PrestaShop redirected or canonicalized the request.

The fix was to route store-prefixed REST calls correctly:

`backend.example.com/store-a/...`
`backend.example.com/store-b/...`

That looks minor on paper. In practice, this is the kind of detail that makes a migration feel broken even when the files, database, and DNS are correct. In my work, I check routing before I blame PHP, Redis, or the database.

Redis Helped, but Cache Clearing Mattered More

Redis was enabled through a Unix socket:

text
/home/account/.redis/redis.sock

PrestaShop then used Redis as the cache backend. API responses improved, but cache only matters if it clears at the right time.

Back office is the source of truth. When someone changes a price, product description, PageBuilder block, category, or campaign in PrestaShop, the frontend API must serve fresh data. Enabling cache alone is not enough. I also had to connect cache clearing to the relevant PrestaShop hooks.

I verified the behavior directly:

create test cache in file cache and Redis
trigger a product update hook
confirm that both cache layers were cleared

That is the difference between “cache is enabled” and “cache can be trusted.” In ecommerce, that difference matters immediately.

Cron Jobs Needed Careful Filtering

The first Hestia cron check found jobs that belonged to another service, not the PrestaShop backend. Those jobs did not belong on the new host because that service was not part of this migration.

The relevant PrestaShop jobs were on the old live Hestia server:

ERP or inventory sync cron
PrestaShop search index
product positioning refresh
order monitor

I did not migrate a suspended CRM job. I also skipped Hestia's internal system jobs. DirectAdmin has its own maintenance and backup flow, so copying panel debris would only have created confusion.

One database dump job was first mapped as a cautious development dump. I removed it once I confirmed the hosting panel already handled backups. Duplicating backup flows creates noise unless there is a clear recovery reason.

Performance Results from the Backend Move

I tested the same public REST endpoint 12 times per store:

text
/rest/pagebuilder/placements

Here were the results:

EnvironmentStore A averageStore B average
------:---:
Old live Hestia0.500s0.420s
Stage Hestia0.305s0.302s
New DirectAdmin host0.267s0.220s

The stage server was a simple reference server and answered consistently. The new host still answered faster for both stores.

The new host also showed a higher server load average, around 10-13. SSH exposed more CPU threads on the physical host than the account allocation, so that number was not alarming by itself. The account looked quiet: Redis was almost idle, PHP workers were not driving CPU, and the database had low active query load when I checked.

That is why I treat load average carefully on shared hosting. It reflects the host, not only one account. If your provider sells a plan with clear CPU and RAM specs, it still helps to ask how those limits are enforced through CloudLinux or LVE.

My AI Workflow for the Migration

I used Codex as the operating agent for SSH, DirectAdmin API work, server checks, crontab changes, timing tests, and PrestaShop override work.

For review, I use my open workflow ai-collab-bridge. The idea is simple: one AI implements the change, then another AI receives a review packet with the diff, context, and focused questions. Claude Code can then review the work as a second technical reader instead of reacting to a loose summary.

That matters in a PrestaShop migration because there are many small decisions:

Should old cron jobs be copied or rewritten?
Is a symlink legitimate or an old panel dependency?
Should OPcache be configured in the app or raised by the host?
Does cache clear when back office changes data?
Are old backup files exposed in the webroot?

AI helps when it has to show its checks. “It works” is not enough. A useful migration run shows commands, status codes, cache behavior, cron state, and the parts that were intentionally not moved.

Lessons I Took from This Migration

Do not copy panel behavior blindly. Hestia and DirectAdmin solve hosting maintenance differently. Hestia panel cron does not belong in DirectAdmin.

Keep the backend migration narrow. If the frontend already runs elsewhere, moving it only adds risk.

Verify cache from the back office point of view. Ecommerce changes happen through price, stock, copy, and campaign edits. Cache that fails to clear becomes a business problem.

Measure the same endpoint repeatedly. One `curl` request says little. Twelve runs per store gave me a much clearer signal.

Do not hardcode database passwords in scripts. Read from the application's existing configuration when needed, and let the hosting panel own backups.

Result

After the move, the backend answered faster than both the old live server and the stage reference in my tests. Redis and LiteSpeed helped. DirectAdmin API was enough for the panel settings I needed. OPcache memory turned out to be a host-level setting, so that belongs with hosting support rather than app code.

The main result was not a lower TTFB. The important result was that the backend still behaved like an ecommerce backend: back office owns the data, the API answers per store, cache clears on changes, and cron runs only the jobs that belong on the new host.

FAQ

How long did the migration take?

The active backend migration took about three to four hours. With timing tests, cron inventory, cache verification, and support notes, the work was closer to four to five hours.

Why did you not move everything?

The frontend already ran elsewhere. Newsletter automation and CRM had their own environments. A narrow backend move reduced risk.

Why was Redis important?

Redis improved backend cache speed, but the real value came when cache clearing was connected to PrestaShop hooks. Without that, back office changes can fail to reach the API.

Why is load average hard to read on shared hosting?

Load average often shows the whole host queue, not only your account. In this migration, the account looked quiet while the host showed higher load. That is why CloudLinux or LVE limits should be confirmed by support.

Why use AI in a server migration?

AI is useful when it works with evidence: config reads, timing tests, cron comparison, API checks, and documented changes. Peer review through an open workflow makes it easier to let another model inspect the risks.

FAQ

How long did the migration take?+
The active backend migration took about three to four hours. With timing tests, cron inventory, cache verification, and support notes, the work was closer to four to five hours.
Why did you not move everything?+
The frontend already ran elsewhere. Newsletter automation and CRM had their own environments. A narrow backend move reduced risk.
Why was Redis important?+
Redis improved backend cache speed, but the real value came when cache clearing was connected to PrestaShop hooks. Without that, back office changes can fail to reach the API.
Why use AI in a server migration?+
AI is useful when it works with evidence: config reads, timing tests, cron comparison, API checks, and documented changes.

Recommended for you

Claude Opus 4.8 Review: It Beat Codex on My Real Codebase

Claude Opus 4.8 Review: It Beat Codex on My Real Codebase

Claude Opus 4.8 dropped today. After testing it against Codex (GPT-5.5) on my real production codebase, here's my honest verdict — and where each one still wins.

8 min read
Build MCP Server with TypeScript: My Practical Guide

Build MCP Server with TypeScript: My Practical Guide

Learn how I build MCP server projects from scratch with TypeScript, tools, transports, and real AI agent workflows.

12 min read
AI Peer Review: Free Skill Bridging Claude, Codex, Gemini

AI Peer Review: Free Skill Bridging Claude, Codex, Gemini

A free open-source Claude Code skill that lets Claude, Codex, and Gemini review each other's code via CLI. Install in 30 seconds.

9 min read