Physical Address

304 North Cardinal St.
Dorchester Center, MA 02124

Backup your website off-site with git every day

Today we’ll be going over how to backup your website off-site with git every day. You can use this guide with any service that supports git, we’re focusing on GitHub because it’s reliable, robust and offers a free tier.

Start off by signing up with GitHub here.

Next, create a repository to hold the website code and database. Click Create a repository on the left side of the page

github create new repository

 

At the repository create page make sure you check the Private option so your repository isn’t accessible by the world

github create repository details

Next, you need to add your server’s SSH key to your GitHub account so that your server is able to authenticate with GitHub to pull and push code to it.

To do this, head to settings

github settings page

Click on SSH and GPG keys and then click on New SSH key

github ssh and gpg key add section

For this next part, you need to SSH into your and type in the following commands to generate your SSH keys.

ssh-keygen -t rsa
[root@websiteone ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:TfvbwmNDhaOaqvrrUO1ggfhWJHDcwzbA+UFOAOtGGSI root@websiteone
The key's randomart image is:
+---[RSA 2048]----+
|E*=B+            |
|o+**B            |
|oo.o++    .  .   |
|o. ..o   o .o .  |
| oo + . S o. o   |
|.. o o    ...    |
|  .   .  o o.    |
|   .    o   *o   |
|  .+=o..   ..+.  |
+----[SHA256]-----+

If you navigate into /root/.ssh you should see two files that were just created.

[root@websiteone ~]# cd /root/.ssh
[root@websiteone .ssh]# ls
id_rsa  id_rsa.pub

These are your private and public keys for the server. You should never share your private key with anyone, only your public key, labeled id_rsa.pub.

Copy the contents of this file, which look something like below and then back to the GitHub page you were on:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAr4P0WHjR45+82NugrjPLfSOVJchAKke+YNDNkG0m+0zWCF+4EXTqvONmSW6yaWJbq5LGw0RL9zHmjvaTpVvCd0dmgiLhw6i4SG/qnZ3C7iVyr1DL2JpQ1MmWWRjuhE44ZNeMbuJY65zUaNKoI8DA71CTIDdwBPTjuX06NQSGiitF1JOwjJK3FcV+DB8pRSAosRZ0Lw2pEidwg0lJpH/5HmZ+iAkdHIANw5u+18EhvZjfJPyPB/lt6i6yOjxYvcQoxDBxgJJN0V3bVOw1eJFH9esN/jgM/ZR6t8wAujomr5JiNzFqt+I3+cE2L9xESMF8DifoPcrJ+bhtJIsc/hIR root@websiteone

Paste the key, enter a title and hit Add SSH key

github add ssh and gpg key page

Now comes the part where you add all your website code and database backup to the repository.

Note: To avoid the possibility of accidental overwrites, it is only recommended to use this method with an empty repository.

Before we do anything to the code of the website, we’ll create a backup first. The website on our server is located at /var/www/vhosts/websiteone.com.  There are two directories listed in this folder, db and httpdocs. The folder db is where I dump the websites MySQL database and httpdocs is the working directory where the actual code of the website resides.

tar -cvzf websiteone-backup.tar /var/www/vhosts/websiteone.com

Navigate into the folder where the website is located, for us, this would be /var/www/vhosts/websiteone.com.

You need to get the URL of your repository, head back to the main page of your account click on the repository you created earlier. Inside you should not see a green button labeled Clone or download, click this button and copy the Clone with SSH address

github repository address

 

At this point, it is a good idea to make sure you have git installed on your server, if not issue the following:

#For CentOS
yum install git

#For Ubuntu
sudo apt-get install git

Now to clone the repository onto your server and push your website into it. The following line will clone the repository into a folder called temp

git clone git@github.com:theshelltest/websiteone.git temp
[root@websiteone websiteone.com]# git clone git@github.com:theshelltest/websiteone.git temp
Cloning into 'temp'...
The authenticity of host 'github.com (140.82.113.3)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,140.82.113.3' (RSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

Here’s a look at the directory structure after the repo was cloned into temp

server website folder

Move the important bit out of the temp folder and into your website directory

mv temp/.git .git

If you take a look at the folders now, you’ll see a hidden .git  folder in there

server git folder

Remove the temp folder

rm -rf temp

Add both the db and httpdocs to your repository.

git add . --all
git commit -m "Full website backup into repo"
git push
Counting objects: 2017, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1981/1981), done.
Writing objects: 100% (2016/2016), 10.98 MiB | 2.15 MiB/s, done.
Total 2016 (delta 200), reused 0 (delta 0)
remote: Resolving deltas: 100% (200/200), done.
To git@github.com:theshelltest/websiteone.git
   17f541f..2255471 master -> master

You’ve just successfully pushed your website and database file to the repository.

Now to automate this, create a file called backup.sh in your home directory. Since we’re root for us it’s /root. Add the following to it:

mysqldump -u DB-USER -pDB-PASSWORD websiteone-db > /var/www/vhosts/websiteone.com/db/websiteone-db.sql
cd /var/www/vhosts/websiteone.com && /usr/bin/git add --all .
cd /var/www/vhosts/websiteone.com && /usr/bin/git commit -m "autocommit"
cd /var/www/vhosts/websiteone.com && /usr/bin/git push

You now need to add this file to be executed by cron at a set time of the day. You can change this to run at whichever time you prefer, you can even increase the frequency of execution depending on your needs. Issue the following at the terminal to open the cron text editor.

crontab -e

You’ll be greeted by a blank page, press the letter i to enter edit mode. To backup your website once everyday at one minute past midnight, enter the following line:

01      0     *       *       *       sh /root/backup.sh

Press the ESC key and type :wq followed by the Enter key. This will save the line you just added to cron, now you need to restart the cron service to pick up the new routine:

service crond restart

That’s it, have a look at your repo at GitHub to verify the first commit and you’re done.