{"id":3612,"date":"2026-10-09T09:28:48","date_gmt":"2026-10-09T09:28:48","guid":{"rendered":"https:\/\/www.ucartz.com\/blog\/?p=3612"},"modified":"2026-10-09T09:28:48","modified_gmt":"2026-10-09T09:28:48","slug":"migrate-cpanel-to-virtualmin-with-claude-code","status":"publish","type":"post","link":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/","title":{"rendered":"Migrate cPanel to Virtualmin with Claude Code: Step by Step"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>Short answer:<\/strong> give an AI agent such as Claude Code SSH access to your old cPanel server and your new server, keep it in manual approval mode, and let it run four commands for you: <code>pkgacct<\/code> to back up the cPanel account, <code>rsync<\/code> to copy the archive, <code>virtualmin migrate-domain<\/code> to import it, and a set of checks before you switch DNS. We ran exactly this on two real servers. The website, database, both mailboxes (with their old passwords and mail), the forwarder and the cron job all arrived, with no control panel screens and no data typed by hand.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What we tested<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Old server:<\/strong> cPanel &amp; WHM 138 on AlmaLinux 9, with one account for a demo shop: a PHP page that reads a MariaDB database, two mailboxes with one real email waiting, a forwarder and a cron job.<\/li>\n\n\n\n<li><strong>New server:<\/strong> a fresh AlmaLinux 9 VPS with Virtualmin (GPL edition) and its LAMP bundle.<\/li>\n\n\n\n<li><strong>The agent:<\/strong> Claude Code on our own computer, with SSH access to both servers. It ran every command; we approved each change.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The domain in this guide is <code>example.org<\/code> and the servers are called <code>old-server<\/code> and <code>new-server<\/code>; we replaced real addresses with placeholders. The commands and output in the screenshots are real.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Before you start<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Root SSH access to both servers.<\/strong> On the old server you need root to run cPanel&#8217;s backup script.<\/li>\n\n\n\n<li><strong>A fresh new server<\/strong> on a system Virtualmin fully supports: AlmaLinux, Rocky or RHEL 8 to 10, Debian 12 or 13, or Ubuntu 24.04 or 26.04, according to Virtualmin. Do not install it on a server that already hosts sites.<\/li>\n\n\n\n<li><strong>Free disk space.<\/strong> cPanel recommends free space greater than twice the size of the largest account, plus 1 GB, for its backup script.<\/li>\n\n\n\n<li><strong>Lower the DNS TTL<\/strong> of the domain to 300 seconds a day before, so the switch at the end takes effect quickly.<\/li>\n\n\n\n<li><strong>Start the agent in manual approval mode.<\/strong> Recent versions of Claude Code start in auto mode, where a second model approves actions for you. For production servers, start it with <code>claude --permission-mode manual<\/code> so it stops and asks before every command that changes something.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Tell the agent what you want<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open a terminal where you can already reach both servers with <code>ssh<\/code>, start Claude Code, and describe the whole job in plain words. A prompt like this works well:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>I want to move the cPanel account \"shopdemo\" (domain example.org) from old-server\nto new-server and run it on Virtualmin. Both are reachable as root over ssh.\n1. Check new-server is ready for Virtualmin and install it with the LAMP bundle.\n2. On old-server, list what the account has, then back it up with cPanel's pkgacct.\n3. Copy the backup to new-server with a temporary SSH key and check its checksum.\n4. Import it with virtualmin migrate-domain.\n5. Prove everything arrived: database checksum, website, mailboxes, forwarders, cron.\nExplain each step and show me every command before you run it.\nNever print passwords; keep them in root-only files.<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The agent turns that into a plan and works through it with you. The steps below are what it ran in our test.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Install Virtualmin on the new server<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Virtualmin&#8217;s official installer sets up Apache, PHP, MariaDB, Postfix, Dovecot, BIND and Webmin in one go. Give the server its own host name that is not one of the domains you will host:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -fsSL -o virtualmin-install.sh https:\/\/software.virtualmin.com\/gpl\/scripts\/virtualmin-install.sh\nsh virtualmin-install.sh --bundle LAMP --hostname vmdst.example.com --force<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">It took about 17 minutes on a 2 vCPU VPS and ended with &#8220;Installation Complete!&#8221;. Three things needed fixing in our test, and the agent caught each one by reading the output:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>DNS stopped resolving after the host name changed.<\/strong> The first install attempt failed with &#8220;Could not resolve host&#8221;. The VPS had no DNS servers set in NetworkManager, so changing the host name left <code>\/etc\/resolv.conf<\/code> without any. Setting resolvers on the connection fixed it: <code>nmcli con mod \"System eth0\" ipv4.dns \"1.1.1.1 8.8.8.8\" ipv4.ignore-auto-dns yes<\/code> followed by <code>nmcli device reapply eth0<\/code> (use your own connection name). Check with <code>getent hosts software.virtualmin.com<\/code> before you start.<\/li>\n\n\n\n<li><strong>Apache was not running<\/strong> after the installer finished. <code>systemctl start httpd<\/code> started it.<\/li>\n\n\n\n<li><strong>Virus scanning was not running.<\/strong> <code>virtualmin check-config<\/code> reported that the ClamAV daemon was not running. <code>systemctl enable --now clamd@scan<\/code> started it, and the check passed.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Back up the account on the cPanel server<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On the old server, the agent first lists what the account contains, records a checksum of the database table to compare later, and then runs cPanel&#8217;s own backup script. <code>pkgacct<\/code> writes the whole account (files, databases, mail, DNS zone, cron and settings) into one <code>cpmove-USERNAME.tar.gz<\/code> archive. It worked from the command line even though our test server had no active cPanel licence.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"431\" src=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-backup-screenshot-1024x431.png\" alt=\"Terminal on the old cPanel server listing the account, its size and table checksum, then pkgacct completed and the cpmove archive with its SHA-256\" class=\"wp-image-3614\" srcset=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-backup-screenshot-1024x431.png 1024w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-backup-screenshot-300x126.png 300w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-backup-screenshot-768x323.png 768w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-backup-screenshot.png 1100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Step 3 on the old server: inventory, table checksum, pkgacct backup and the archive checksum.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Copy the backup with a temporary key<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The new server pulls the archive directly from the old one. Instead of sharing a password, the agent creates an SSH key that exists only for this copy, adds its public half to the old server, copies the file with <code>rsync<\/code> and compares the SHA-256 checksum. Identical checksums mean the file arrived intact. On the old server, the key was added with:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo 'ssh-ed25519 AAAA... migrate-temp' &gt;&gt; \/root\/.ssh\/authorized_keys<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then, on the new server:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"409\" src=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-copy-screenshot-1024x409.png\" alt=\"Terminal on the new server creating a temporary SSH key, pulling the cpmove archive with rsync and showing the same SHA-256 checksum\" class=\"wp-image-3615\" srcset=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-copy-screenshot-1024x409.png 1024w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-copy-screenshot-300x120.png 300w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-copy-screenshot-768x307.png 768w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-copy-screenshot.png 1100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Step 4 on the new server: a temporary key, the rsync copy, and a SHA-256 that matches the original.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Import the account into Virtualmin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">One command does the import. <code>--pass<\/code> is required for cPanel migrations; it becomes the account owner&#8217;s password on the new server, and the agent read it from a root-only file instead of printing it. <code>--webmin<\/code> creates a matching panel login.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>virtualmin migrate-domain --source \/root\/migrate\/cpmove-shopdemo.tar.gz \\\n  --type cpanel --domain example.org --user shopdemo --pass \"$NEWPASS\" --webmin<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Virtualmin read the cPanel archive, found the website, DNS, mail, spam filtering and database, recreated them and reported &#8220;The following servers were successfully migrated&#8221;. It also turned on DKIM signing for the domain and added the DKIM record to its DNS zone. Two notes from our run: it could not set up CGI because the account had no <code>cgi-bin<\/code> folder (harmless if you do not use CGI), and it kept a self-signed SSL certificate, because a real one can only be issued after DNS points to the new server.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"803\" height=\"1024\" src=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-import-screenshot-1-803x1024.png\" alt=\"Terminal showing virtualmin migrate-domain importing the cPanel backup: mail users, aliases, cron, databases and MySQL users recreated\" class=\"wp-image-3616\" srcset=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-import-screenshot-1-803x1024.png 803w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-import-screenshot-1-235x300.png 235w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-import-screenshot-1-768x979.png 768w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-import-screenshot-1.png 1100w\" sizes=\"auto, (max-width: 803px) 100vw, 803px\" \/><figcaption class=\"wp-element-caption\">Step 5: virtualmin migrate-domain imports the cPanel backup (long setup output shortened, as marked).<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Prove everything arrived<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the step people skip when they migrate by hand, and the step an agent never gets bored of. First, the account, mailboxes, database user and database, plus the same table checksum as on the old server:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"496\" src=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-verify-screenshot-1024x496.png\" alt=\"Terminal listing the migrated domain, mail users, MySQL user and database, and the same table checksum as on the old server\" class=\"wp-image-3617\" srcset=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-verify-screenshot-1024x496.png 1024w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-verify-screenshot-300x145.png 300w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-verify-screenshot-768x372.png 768w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-verify-screenshot.png 1100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Step 6: the domain, mailboxes, database user and database exist, and the table checksum matches the old server.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Then the parts your customers notice. The new server answers for the website before DNS changes (using <code>curl --resolve<\/code>), the migrated mailbox accepts its old password and still holds the email sent before the move, and the forwarder and cron job are in place:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"431\" src=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-sitemail-screenshot-1-1024x431.png\" alt=\"Terminal showing the shop page served by the new server, an IMAP login with the old password finding 1 message, the orders forwarder and the cron job\" class=\"wp-image-3618\" srcset=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-sitemail-screenshot-1-1024x431.png 1024w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-sitemail-screenshot-1-300x126.png 300w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-sitemail-screenshot-1-768x323.png 768w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-sitemail-screenshot-1.png 1100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Step 6: the site answers from the new server, the mailbox accepts its old password with its email intact, and the forwarder and cron job came across.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Step 7: Switch DNS and issue SSL<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The migrated DNS zone on the new server already points the domain and its mail at the new address:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"212\" src=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-dns-screenshot-1024x212.png\" alt=\"Terminal showing dig on the new server returning the new A record and the MX record for example.org\" class=\"wp-image-3619\" srcset=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-dns-screenshot-1024x212.png 1024w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-dns-screenshot-300x62.png 300w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-dns-screenshot-768x159.png 768w, https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-tut-dns-screenshot.png 1100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Step 7: the migrated DNS zone already answers with the new server&#039;s address (documentation IP) and the mail record.<\/figcaption><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Point the domain at the new server: either change the A and MX records where your DNS is hosted, or move the name servers to the new server&#8217;s zone.<\/li>\n\n\n\n<li>Once the domain resolves to the new server, issue a free certificate: <code>virtualmin generate-letsencrypt-cert --domain example.org<\/code>.<\/li>\n\n\n\n<li>Update SPF to include the new server&#8217;s IP, publish the new DKIM key if your DNS is hosted elsewhere, and send a test email to a large mail provider to check it is delivered.<\/li>\n\n\n\n<li>Watch both servers for a day. Mail that still arrives at the old server while DNS changes can be copied across afterwards with an IMAP sync; ask the agent to do it mailbox by mailbox.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Step 8: Clean up<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Remove the temporary key from both servers, so nothing is left that could reach the old server later:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># on old-server\nsed -i '\/migrate-temp$\/d' \/root\/.ssh\/authorized_keys\n# on new-server\nrm -f \/root\/.ssh\/migrate_key \/root\/.ssh\/migrate_key.pub<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Keep the old server and its backup for at least a week as a fallback, then cancel the cPanel licence and the old server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What does not move<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Two-factor authentication:<\/strong> according to cPanel, its backup does not include 2FA settings. Users set it up again.<\/li>\n\n\n\n<li><strong>PostgreSQL databases:<\/strong> Virtualmin&#8217;s cPanel importer has no step for them; move them separately with <code>pg_dump<\/code>.<\/li>\n\n\n\n<li><strong>SSL certificates on a shared IP:<\/strong> issue new Let&#8217;s Encrypt certificates after the DNS switch, as in step 7.<\/li>\n\n\n\n<li><strong>Reseller accounts:<\/strong> Virtualmin&#8217;s reseller feature is part of the paid Pro edition.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Using Codex or Antigravity instead<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The same prompt and the same commands work with other agents; only the safety settings have different names. OpenAI&#8217;s Codex runs commands in a sandbox and, in its default mode, asks before anything that needs the network, which includes <code>ssh<\/code>. Google Antigravity has a &#8220;Request Review&#8221; setting that makes every terminal command wait for your approval. Whichever you use, choose the setting where you approve each command on a live server.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Prompts you can reuse<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8220;List every cPanel account on old-server with its disk use, databases, mailboxes, forwarders and cron jobs. Change nothing.&#8221;<\/li>\n\n\n\n<li>&#8220;Run virtualmin check-config on new-server and fix only what it reports. Explain each fix first.&#8221;<\/li>\n\n\n\n<li>&#8220;Back up the account with pkgacct, copy it to new-server with a temporary key, compare checksums, then remove the key.&#8221;<\/li>\n\n\n\n<li>&#8220;After the import, compare row counts and table checksums for every database on both servers and show me a table.&#8221;<\/li>\n\n\n\n<li>&#8220;Write a runbook of everything we did, with the commands, so I can repeat it for the next account.&#8221;<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Why so many people are making this move now is in <a href=\"https:\/\/www.ucartz.com\/blog\/leave-cpanel-free-alternatives-ai\/\">our article on leaving cPanel<\/a>, and the new 2027 prices are in <a href=\"https:\/\/www.ucartz.com\/blog\/cpanel-price-increase-2027\/\">cPanel price increase 2027<\/a>. A <a href=\"https:\/\/www.ucartz.com\/vps-hosting\">KVM VPS<\/a> with full root access is all you need for the new server, and one of our <a href=\"https:\/\/www.ucartz.com\/buy-hosting\">shared hosting<\/a> plans already runs on Virtualmin. If you would rather have someone do the move with you, <a href=\"https:\/\/www.ucartz.com\/hire-an-expert\">hire an expert<\/a> by the job: $8 per 15 minutes, $15 per 30 minutes or $28 per hour, with no contract.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>We moved a real cPanel account to Virtualmin over SSH with Claude Code: backup, copy, import and checks for site, database, mail and DNS. Every step.<\/p>\n","protected":false},"author":15,"featured_media":3613,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[425,400],"tags":[1019,287,1028,470,1027,1029,325,1022],"class_list":["post-3612","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai","category-tutorials","tag-claude-code","tag-cpanel","tag-migrate-domain","tag-migration","tag-pkgacct","tag-server-migration","tag-ssh","tag-virtualmin"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":8}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Migrate cPanel to Virtualmin with Claude Code - Ucartz Blog<\/title>\n<meta name=\"description\" content=\"We moved a real cPanel account to Virtualmin over SSH with Claude Code: backup, copy, import and checks for site, database, mail and DNS. Every step.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Migrate cPanel to Virtualmin with Claude Code - Ucartz Blog\" \/>\n<meta property=\"og:description\" content=\"We moved a real cPanel account to Virtualmin over SSH with Claude Code: backup, copy, import and checks for site, database, mail and DNS. Every step.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/\" \/>\n<meta property=\"og:site_name\" content=\"Ucartz Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/UcartzOnline\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-09T09:28:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Anita Sreelal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ucartz\" \/>\n<meta name=\"twitter:site\" content=\"@ucartz\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Anita Sreelal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/\"},\"author\":{\"name\":\"Anita Sreelal\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#\\\/schema\\\/person\\\/84e61e902dda958ac7d50776983f6f15\"},\"headline\":\"Migrate cPanel to Virtualmin with Claude Code: Step by Step\",\"datePublished\":\"2026-10-09T09:28:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/\"},\"wordCount\":1526,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg\",\"keywords\":[\"claude code\",\"cPanel\",\"migrate-domain\",\"migration\",\"pkgacct\",\"server migration\",\"ssh\",\"virtualmin\"],\"articleSection\":[\"AI\",\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/\",\"name\":\"Migrate cPanel to Virtualmin with Claude Code - Ucartz Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg\",\"datePublished\":\"2026-10-09T09:28:48+00:00\",\"description\":\"We moved a real cPanel account to Virtualmin over SSH with Claude Code: backup, copy, import and checks for site, database, mail and DNS. Every step.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg\",\"contentUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Migrate cPanel to Virtualmin with Claude Code: Step by Step\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/migrate-cpanel-to-virtualmin-with-claude-code\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migrate cPanel to Virtualmin with Claude Code: Step by Step\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/\",\"name\":\"Ucartz Blog\",\"description\":\"Guides on hosting, servers, streaming and automation\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#organization\"},\"alternateName\":\"Ucartz\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#organization\",\"name\":\"Ucartz Online Pvt Ltd\",\"alternateName\":\"Ucartz\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ucartz-logo-888x240-1.png\",\"contentUrl\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ucartz-logo-888x240-1.png\",\"width\":888,\"height\":240,\"caption\":\"Ucartz Online Pvt Ltd\"},\"image\":{\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/UcartzOnline\",\"https:\\\/\\\/x.com\\\/ucartz\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/ucartzonline\",\"https:\\\/\\\/www.instagram.com\\\/ucartz_com\",\"https:\\\/\\\/www.trustpilot.com\\\/review\\\/ucartz.com\",\"https:\\\/\\\/n8n.io\\\/creators\\\/ucartz\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/#\\\/schema\\\/person\\\/84e61e902dda958ac7d50776983f6f15\",\"name\":\"Anita Sreelal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f4b69147302b926e61568e95a5bb0e1ce6d6f81be49bedc8b561522e8b82286b?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f4b69147302b926e61568e95a5bb0e1ce6d6f81be49bedc8b561522e8b82286b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f4b69147302b926e61568e95a5bb0e1ce6d6f81be49bedc8b561522e8b82286b?s=96&d=mm&r=g\",\"caption\":\"Anita Sreelal\"},\"sameAs\":[\"https:\\\/\\\/www.ucartz.com\"],\"url\":\"https:\\\/\\\/www.ucartz.com\\\/blog\\\/author\\\/anita-sreelal\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Migrate cPanel to Virtualmin with Claude Code - Ucartz Blog","description":"We moved a real cPanel account to Virtualmin over SSH with Claude Code: backup, copy, import and checks for site, database, mail and DNS. Every step.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/","og_locale":"en_US","og_type":"article","og_title":"Migrate cPanel to Virtualmin with Claude Code - Ucartz Blog","og_description":"We moved a real cPanel account to Virtualmin over SSH with Claude Code: backup, copy, import and checks for site, database, mail and DNS. Every step.","og_url":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/","og_site_name":"Ucartz Blog","article_publisher":"https:\/\/www.facebook.com\/UcartzOnline","article_published_time":"2026-10-09T09:28:48+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg","type":"image\/jpeg"}],"author":"Anita Sreelal","twitter_card":"summary_large_image","twitter_creator":"@ucartz","twitter_site":"@ucartz","twitter_misc":{"Written by":"Anita Sreelal","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/#article","isPartOf":{"@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/"},"author":{"name":"Anita Sreelal","@id":"https:\/\/www.ucartz.com\/blog\/#\/schema\/person\/84e61e902dda958ac7d50776983f6f15"},"headline":"Migrate cPanel to Virtualmin with Claude Code: Step by Step","datePublished":"2026-10-09T09:28:48+00:00","mainEntityOfPage":{"@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/"},"wordCount":1526,"commentCount":0,"publisher":{"@id":"https:\/\/www.ucartz.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg","keywords":["claude code","cPanel","migrate-domain","migration","pkgacct","server migration","ssh","virtualmin"],"articleSection":["AI","Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/","url":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/","name":"Migrate cPanel to Virtualmin with Claude Code - Ucartz Blog","isPartOf":{"@id":"https:\/\/www.ucartz.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/#primaryimage"},"image":{"@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/#primaryimage"},"thumbnailUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg","datePublished":"2026-10-09T09:28:48+00:00","description":"We moved a real cPanel account to Virtualmin over SSH with Claude Code: backup, copy, import and checks for site, database, mail and DNS. Every step.","breadcrumb":{"@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/#primaryimage","url":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg","contentUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/10\/b2x-migrate-cpanel-to-virtualmin-with-claude-code.jpg","width":1200,"height":630,"caption":"Migrate cPanel to Virtualmin with Claude Code: Step by Step"},{"@type":"BreadcrumbList","@id":"https:\/\/www.ucartz.com\/blog\/migrate-cpanel-to-virtualmin-with-claude-code\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.ucartz.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Migrate cPanel to Virtualmin with Claude Code: Step by Step"}]},{"@type":"WebSite","@id":"https:\/\/www.ucartz.com\/blog\/#website","url":"https:\/\/www.ucartz.com\/blog\/","name":"Ucartz Blog","description":"Guides on hosting, servers, streaming and automation","publisher":{"@id":"https:\/\/www.ucartz.com\/blog\/#organization"},"alternateName":"Ucartz","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.ucartz.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.ucartz.com\/blog\/#organization","name":"Ucartz Online Pvt Ltd","alternateName":"Ucartz","url":"https:\/\/www.ucartz.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.ucartz.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/09\/ucartz-logo-888x240-1.png","contentUrl":"https:\/\/www.ucartz.com\/blog\/wp-content\/uploads\/2026\/09\/ucartz-logo-888x240-1.png","width":888,"height":240,"caption":"Ucartz Online Pvt Ltd"},"image":{"@id":"https:\/\/www.ucartz.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/UcartzOnline","https:\/\/x.com\/ucartz","https:\/\/www.linkedin.com\/company\/ucartzonline","https:\/\/www.instagram.com\/ucartz_com","https:\/\/www.trustpilot.com\/review\/ucartz.com","https:\/\/n8n.io\/creators\/ucartz\/"]},{"@type":"Person","@id":"https:\/\/www.ucartz.com\/blog\/#\/schema\/person\/84e61e902dda958ac7d50776983f6f15","name":"Anita Sreelal","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f4b69147302b926e61568e95a5bb0e1ce6d6f81be49bedc8b561522e8b82286b?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f4b69147302b926e61568e95a5bb0e1ce6d6f81be49bedc8b561522e8b82286b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f4b69147302b926e61568e95a5bb0e1ce6d6f81be49bedc8b561522e8b82286b?s=96&d=mm&r=g","caption":"Anita Sreelal"},"sameAs":["https:\/\/www.ucartz.com"],"url":"https:\/\/www.ucartz.com\/blog\/author\/anita-sreelal\/"}]}},"_links":{"self":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts\/3612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/comments?post=3612"}],"version-history":[{"count":1,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts\/3612\/revisions"}],"predecessor-version":[{"id":3620,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/posts\/3612\/revisions\/3620"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/media\/3613"}],"wp:attachment":[{"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/media?parent=3612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/categories?post=3612"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.ucartz.com\/blog\/wp-json\/wp\/v2\/tags?post=3612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}