How to Migrate Website from Shared hosting to VPS

Most people create their online presence with a shared hosting account, but sooner or later they need more power to fulfill their needs and more control over their server. Therefore, they switch to VPS.

In this tutorial, we will help you to migrate WordPress website from a shared hosting to a VPS server, but the same tactic can be applied to any kind of website.

What you’ll need

Before you begin this guide you’ll need the following:

  • Access to shared hosting account and VPS;

Step 1 – Creating a Backup of Your Website

Before making any kind of changes to your website, a backup is necessary. It will not only help to transfer files and databases from one server to another but it will also prove to be useful in case something goes haywire.

In this example you will see how to make a backup on Hostinger’s control panel:

  1. Access Hostinger control panel;
  2. Go to Backups option under Files tab;
  3. After entering the Backups area you will see a list of files. The Type column specifies whether the backup is for MySQL Database or the Website files. You can also see if the backup was generated under the column Backup Date.You can also create a new backup if you wish to. To do that follow these steps:
    1. Click on the Generate a New Backup button at the bottom.
    2. You will now be greeted with a prompt message, click Yes. The backup will now be initiated.
      Backup Prompt
  4. Once the backup is generated (or already present), download both MySLQ and website files backups by clicking the Download button in the Action column.

Once you have downloaded all the unique files, follow below steps to setting up VPS Server.

Step 2 – Setting up VPS

In this section we will learn to setup a VPS server. It is recommended to choose a template which has LAMP, MySQL and Webmin/Virtualmin pre-installed. It is easier to manage the server in the future with such template.

Alternatively, you can setup your own stack (without GUI). Some useful tutorials on how to setup different stacks:

To change your VPS operating system and pre-installed software, follow steps below:

  1. In Hostinger control panel navigate to Servers section.
  2. Scroll down till you reach Other Settings panel.
  3. For Operating System select Ubuntu 16.04 64bit with Webmin/Virtualmin/LAMP and click on Save Changes.

Step 2.1 – Accessing Webmin / Virtualmin

Now allow a few minutes for new operating system to install and proceed to setup your VPS further:

  1. Your VPS IP, address, username, SSH port, along with other details, is listed under SSH Details. If you don’t know your root password, you can reset it in the same section (allow a few minutes for new changes to update).
  2. Now access and copy your VPS IP address, add https in front of it and :10000 port at the end to access Webmin / Virtualmin. It should look like this:
  3. You will now see a login box, enter your server SSH credentials to login.
  4. You will now see a Webmin Post-Installation Wizard which will guide you through step by step server setup. Click on next button to begin the setup.

Step 2.2 – Setting Up Virtualmin

We will walk through each step of installation one by one:

  1. Memory:
    1. Preload Virtualmin libraries? : It is recommended to choose an option No as we don’t use GUI very often since most of the work will done through SSH.
    2. Run email domain lookup server?: If emails are important to you and you will want to run Email server on your VPS, select Yes; it helps to make email services faster. The downside of it is that it takes a bit more RAM space.
  2. Virus scanning: It’s recommended to enable ClamAV virus scanner, so choose Yes. 
  3. Spam filtering: This option is pretty well explained on the site. In short if you want to run email server on your VPS, enable SpamAssassin server.
  4. Database servers: Select the back end database service you would like to use. In most cases, you will only need MySQL database server.
  5. MySQL password: To prevent other users from managing MySQL database on your system, a password for the main user should be set. Enter strong, secure password.
  6. MySQL database size: It is well explained in what case you should select which setting. However it is recommended to select Medium option if you are not sure on which one to select.
  7. DNS Zones: For DNS zones created by Virtualmin to be resolvable, the primary nameserver record for each zone must be set to something that can be resolved by other systems on the Internet. As we will point domain name to VPS server via A record, we don’t need private nameservers for now. Thus, select Skip check for resolvability.
  8. Passwords: It is highly recommended to select the Only store hashed passwords option as it will encrypt all of your stored passwords.
  9. And that’s it. Virtualmin configuration is complete. You will now see a Re-check and refresh configuration button. Click it to test if everything is working as intended and whether the server has been setup properly or not.
    Webmin Refresh

Step 2.3 – Creating Virtual Server

Now we need to create a new user, MySQL database, and a directory for our website. It can be done all at once using Virtualmin:

  1. Press Create Virtual  Server.
  2. Enter Domain name and Administration password and press Create Server button. This will create a simple server which is enough to host a website.

Step 3 – Transferring website files to VPS

Now that we have set up the VPS server, we will transfer our website files and databases one by one from our shared hosting server.

We will use wget command to download backup archives we have created in Step 1.

  1. Connect to your VPS Server via SSH (See here in case you don’t know how to).
  2. Once connected change your directory to the working directory, where your website files will be stored. Virtualmin automatically creates a directory based on the domain name. For example, for hostinger-tutorials.com domain it created directory named hostinger-tutorials.com. Thus, to access it we can use this command:
    cd /home/hostinger-tutorials/public_html/
  3. Now head back to Hostinger control panel -> Backups section and copy download link for the backup archive of your website files. You can do this by right clicking on the Download button and choosing Copy Link Address.
  4. Use the following command to download backup archive to VPS (remember to change link address):
    wget http://server64.main-hosting.eu:8080/download-backup/cfb1f54144e0cf4394a247dca73f48f8d04c9cb6/u694443746.tar.gz
  5. Now extract the archive using:
    tar -xvf u694443746.tar.gz
  6. It will create a new folder inside public_html, which will contain all our website files. This folder will have the same name as our Hostinger shared hosting account ID. Thus, we need to move all the files directly to public_html. There are quite a few ways to do this, but the most basic way is as below:
    1. Access extracted public_html folder (witch contains all your website files):
      cd u694443746/public_html/
    2. Move all files to new public_html created by Virtualmin:
      mv * ../../
  7. Now navigate back to public_html created by Virtualmin:
    cd ../../
  8. Verify all files have been moved with this command:

    You should see something similar to this:

  9. As you can see all files have been moved to correct public_html directory. However, our work here is not done yet. These files and folders have incorrect ownership. We need to change it to match the one created by Virtualmin. Just like directory, Virtualmin creates a user and a group based on domain name. Thus, to change ownership we can use the following command (remember to change hostinger-tutorials to match your case):
    chown hostinger-tutorials:hostinger-tutorials -R * 

Now you have successfully transferred all your files from shared server to VPS server. Follow the below steps to transfer your database and then a final step to get everything working!

Step 4 – Transferring Database files to VPS

Now that we have already transferred our files, we will need to transfer our databases too. Just like with files we will use wget to download the backup files from the Hostinger backup section (the one which is shown in the Step 1) and import all the tables to your VPS server’s database.

Remember, MySQL database was already created during Virtual Server creation. Thus, you don’t need to create additional databases.

Step 4.1 – Checking MySQL Database Name and Password

In order to import MySQL database backup and complete transfer process we first need to find out our new database name, username and password. Database name can be found on Virtualmin control panel, on Edit Databases section.

MySQL database username and password can be found on the same section, under Passwords tab.

In our example, our MySQL details are:

  • MySQL Database Name – hostinger_tutorials
  • MySQL Username – hostinger-tutorials
  • MySQL User Password – OTuXH1IVHdtMpQS7

Step 4.2 – Download and Importing MySQL Backup

Once we know MySQL database name, we can proceed with importing our MySQL dump.

  1. Head over to Backup section and click on Copy link address for MySQL database backup.
  2. On our VPS we will create a new directory and enter it. We will store our MySQL backup archive in it.
    mkdir sql_backup && cd sql_backup
  3. Once you are inside that directory, we will use wget to download the file from the hosting backup and save it on our VPS server.
    wget http://server64.main-hosting.eu:8080/download-backup/dd8604b60a0178f0d9b7a2665261001400388d62/u694443746_meryr.sql.gz
  4. Once the file is downloaded, we will now extract the SQL file out of the compressed form using gunzip command
    gunzip u694443746_meryr.sql.gz
  5. You will now get a file with the same name but .sql format, we can now dump it to our database using below command (remember to change name of MySQL archive)
    mysql -u root -p hostinger_tutorials < u694443746_meryr.sql
  6. You have now successfully imported all the tables from that backup file to our server’s database.

Step 5 – Making Final Changes

Now that you have transferred both: your website files and mysql databases to the VPS server, your WordPress site will still not work correctly. Most likely you will get Error establishing a database connection. To fix this, we will need to edit wp-config.php file and update it with new MySQL database details.

To get our site working we will use inbuilt terminal file editor nano to make the changes to the config file.

To edit the wp-config.php file follow the steps below:

  1. Enter the directory where your website files are stored using the cd command.
    cd /home/hostinger-tutorials/public_html/
  2. Once we are inside the directory, we will see all the files present in the current folder. Let’s check if wp-config.php file is present in the directory.

    List Files

  3. Once it is confirmed that the file is present, we will edit the file by using nano text editor.
    nano wp-config.php
  4. Once the file is open in editing mode, scroll down to the line // ** MySQL settings – You can get this info from your web host ** //

  5. Now update the following values:
    • DB_NAME – MySQL database name. We already know it from Step 4.1
    • DB_USER – MySQL username.
    • DB_PASSWORD – MySQL password.
    • DB_HOST – Enter localhost here as our MySQL database is on the same server.
  6. Once you have made the changes press CTRL + X on the keyboard and then press Y and then ENTER to save changes to the file.

The last step would be to point the domain name to the VPS server from shared hosting server.  The easiest way to do this is to update A record.

Our domain name resolves to Hostinger nameservers, thus A record can be set on Hostinger control panel -> DNS Editor. Simply set your VPS IP address as A record and press Save changes button. 

Note: It can take up to 24 hours for DNS to fully propagate worldwide.

More Detailed tutorial on how to do point domain name to VPS server can be found here.


In this Migrate WordPress from Shared hosting to VPS tutorial you have successfully got your old site up and running on your new VPS server. It is suggested to take regular backups of your server in case of any issues.

About the author


Kushan is a Linux geek who worked on countless web development projects. He's well seasoned in handling both the back-end and the front-end. When he has free time, Kushan likes to hike and enjoy the beauty of nature.


Click here to post a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Get Exclusive Content

Join thousands of webmasters who get our free newsletter with tips on how to drive more traffic and revenue to their websites!

Please wait...

Thank you for sign up!

More in VPS
How to Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 16.04
How to Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 16.04