Step-by-step guide to migrate a Laravel application to a new server
If you have a Laravel application deployed on a server and you need to move it to another server connected to Moss, in this article we tell you how 😀
We assume the following names, passwords and IP addresses. Don’t forget to use the ones that correspond to your case instead.
- The site to move is
mysite.comis currently hosted on server
srchas IP address
srchas a server user called
userwith permissions to read the files of
- Laravel application
mysite.comconnects to database
dstis the destination server for
mysite.comand has IP address
appis the server user that will run
siteis the name of the site in
- The name of your local machine is
- We assume that the code of
mysite.comis hosted on a git repo.
- We’ll use
scpto copy files from a server to another one using your local machine as intermediate storage. If you’re used to working with an FTP/SFTP client, you may use it instead (remember that Moss sets up your new server and therefore you can upload files using SFTP but not FTP, due to security reasons).
- We assume your previous database engine is either MySQL or MariaDB. If that’s not the case, use the appropriate tools to back up and then restore your database.
Create your new server
If you haven’t done it yet, log into Moss and create the new server.
To do this you need to be the admin of your organization. If you’re a developer, tell your admin to add the server to a workspace where you belong.
Create the site in the new server
If you haven’t done it yet, log into Moss and create your Laravel site.
- The domain must be
- Create server user
- Create a connection to database
- Fill out the remainder of the form according to your needs
Decrease the lifetime of DNS records
DNS records have a lifetime (TTL = Time To Live) that determines for how long a name resolution may be cached. To accelerate the migration process, we recommend that you decrease the TTL of the record that resolves
mysite.com to address
10.0.0.1 down to the minimum allowed by your DNS provider. In this way, your users will access your site on the new server sooner when you update
mysite.com to point to IP address
In the figure you can see how to update the TTL in Cloudflare. Any other DNS provider will provide you with a similar panel where you’ll be able to set the TTL. Just use the minimum value that your provider allows.
Once you apply the change, you should wait for as long as the previous TTL before going on. In this way you can be sure that previous cache entries with the old TTL expire and the new TTL is the one being used.
Copy your database
In this step we’ll create a copy of your current database to restore it on the new server afterwards.
Get ready for the copy
In first place, log into your current server
src via SSH:
ssh [email protected]
mysite.com is in production, your users might be using your application and updating your database. If this is not the case, skip this and jump into section Dump your database on your current server.
Usually, you won’t want to lose data during the migration process, and therefore you should prevent your users from writing into your database after dumping its content. The most common ways to handle this are:
- Enable maintenance mode in your application. In such mode, your users will see a message stating that you’re running some maintenance tasks. Enabling the maintenance mode in Laravel is really easy, just run
php artisan down.
- Enable read-only mode in your application. This requires you to modify your application so that it rejects write operations but allows read operations. Hence your application will be partly available during the migration, but it’s harder to implement.
- Stop your current web server (e.g.
sudo service apache2 stopor
sudo service nginx stop). Your users won’t be able to access your server while it’s down, so you should warn them in advance that it won’t be available for some time due to planned maintenance.
Choose the option that better fits your use case and let’s dump your database.
Dump your database from your current server
In general, you can dump your database in two ways:
- Using a traditional database management tool. In such case, check out the documentation of your favorite tool, e.g. phpMyAdmin or MySQL Workbench.
- Running commands from a shell. This is the option we detail in the following.
If you’re logged into
src via SSH, dump the content of the database your application uses into a compressed file
.sql.gz and copy it into your local machine:
src$ mysqldump -u db_user -p --databases db_name | gzip > backup.sql.gzsrc$ exitlocal$ scp [email protected]:~/backup.sql.gz .
Restore your database on your new server
Now that you have a copy of your database in your own machine, you can restore it on your new server:
local$ scp backup.sql.gz [email protected]:~/local$ ssh [email protected]$ gunzip -c backup.sql.gz | mysql -u db_user -pdst$ exit
Copy your ‘storage’ files
Laravel applications save every persistent file (e.g. logs and user-generated content) inside a directory named
storage/. In order to complete the migration, you must copy the content therein into your new server.
local$ ssh [email protected]$ cd <path_to_site>/storagesrc$ tar -czf storage.tgz .src$ exitlocal$ scp [email protected]:<path_to_site>/storage/storage.tgz .local$ scp storage.tgz [email protected]:~/local$ ssh [email protected]$ cd sites/site/shared/storage/dst$ tar zxvf ~/storage.tgzdst$ exit
Deploy the site on the new server
- Log into Moss
- Head to your site, Deployments tab
- Add the git repository that holds the code of
- Fine-tune the deployment scripts in section Deployment Flow if needed
- Click Deploy
Check the application works on the new server
Before updating your DNS records, you must check that your web application is working fine on your new server. The easiest way to do this is to add a domain alias from Moss.
Once you’re sure your application is working all right using the alternative domain name, it’s time to update the DNS record of the main domain to put your site live.
Update your DNS records
Finally, update the records in your DNS provider so that
mysite.com resolves to the IP address of your new server
In the figure below you can see how to update a type A record in Cloudflare. Any other DNS provider will provide you with a similar panel where you’ll be able to change your records.
Now just wait for old DNS cache entries to expire (2 minutes in this example) and your Laravel application will be available to all your users from the new server connected to Moss. Congrats! 👍