Deploying a Static Site with Git and Linode VPS
Project Files
You can click here to download the project files.
TL;DR
For the short version, scroll to the bottom.
Step-by-step
If you have not set up a server with Linode, you can follow this guide to set one up. After you set up your node, make sure that you can ssh to your server without password. That is, you should be able to do ssh [user]@[server-host]
without any problem. If you have issues, you can follow this guide to set up your public and private keys for ssh authentication.
Setting up the project
First we need a repo with some static content. To do that, we need to make a folder on our local machine, add some static files, and initialize git in the folder:
on the local machine:
mkdir -p ~/Desktop/static-site && cd $_
touch index.html main.js style.css
git init
After initialing git, you should see a folder called .git
├── .git <---- contains the configurations
├── index.html
├── main.js
└── style.css
There is a file in the .git
folder called config
. Open the file and add the following to it:
[remote "prod"]
url=ssh://[user]@[server.com]/path/to/repos/mywebsite-repo
just make sure to replace [user]
with your ssh username, [server.com]
with your actual server, and /path/to/repos...
with a folder on your remote server. Now your config file should look something like the following:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "prod"]
url=ssh://[user]@[server.com]/path/to/repos/mywebsite-repo
The next step is to create the folder that we referenced above and create a barebone repo that is:
On the remote server
mkdir -p /path/to/repos/mywebsite-repo && cd $_ && git init --bare
Then, we need to create post-update
script in the hooks folder:
On the remote server
cd /path/to/repos/mywebsite-repo/hooks && touch post-update
then open the file and add the following:
#!/bin/sh
git --work-tree=/var/www/mywebsite.com --git-dir=/path/to/repos/mywebsite-repo checkout -f
If you notice there are two paths here:
/var/www/mywebsite.com
/path/to/repos/mywebsite-repo
The first path is the path to the folder that is going to host the static files. And the second path is the path that we have been working on all along. In other words, every time that we push changes, the script is going to checkout the latest code from the barebone repo and push the folder located at /var/www/mywebsite.com
The next step is to make the script executable:
chmod +x /path/to/repos/mywebsite-repo/hooks/post-update
And that's it. We can make some changes to our local project and push it to our remote with git push prod master
.
TL;DR
Assuming that you have a repo and a Linode VPS, on your local copy, modify your .git/config
file and add your web server as a remote:
[remote "env"]
url=ssh://[user]@[server-host.com]/path/to/respos/my-repo
On the remote server, create a bare repo for your target, that matches the path:
mkdir -p /path/to/repos/my-repo && cd $_ && git init --bare
Create a post-update
script in the hooks folder:
cd /path/to/repos/my-repo/hooks && touch post-update
Open the file and add the following:
#!/bin/sh
git --work-tree=/var/www/mywebsite.com --git-dir=/path/to/repos/my-repo checkout -f
Note: the working tree points to the folder where your files are going to be checked out. Make sure it is the correct value. The second path, is the path of the bare repo.
Make the post-update
file executable by: chmod +x post-update
.
Now, when you make changes locally, you can push to master and to the env: git push origin master
and if you want to push to env: git push <env> master
.