Noah's Blog

使用Git在VPS上部署代码

2015-07-28

参考了Berry在VPS上部署Hexo一文

第一步、建立git账户

为了使用SSH地址访问,需要建立一个git账户,还记得github的SSH地址吗,形如

1
git@github.com:noahziheng/eaipchartscn.git

再看看连接ssh管理VPS是的命令

1
ssh root@127.0.0.1

所以,我们发现github使用的SSH地址,就是git主文件夹下noahziheng文件夹下eaipchartscn.git文件夹下的Git仓库,于是我们可以模拟出来这种地址方面认识git。

第二步、Git安装

首先在VPS上安装git,apt-get install git
本地也要安装git,windows系统下,直接去官网下载即可,linux参考VPS上的安装方式或自行百度

本地生成SSH秘钥

  1. Windows系统
    打开C:\Users\<用户名>.ssh文件夹,如果没有就新建
    在空白处单击右键,选择Git Bash Here打开终端

  2. Linux系统下
    打开终端输入mkdir .ssh && cd .ssh

输入命令ssh-keygen -t rsa -C "abc@163.com"一路回车,生成公钥和密钥,一会要用到公钥,记得把邮箱换成自己的

服务器端配置

新建git用户,# adduser git --ingroup sudo
切换到git用户,进行一些初始化操作

1
2
3
4
5
# su git
$ cd ~
$ mkdir .ssh && cd .ssh
$ touch authorized_keys
$ vi authorized_keys

把本地.ssh目录中的公钥id_rsa.pub里的内容粘贴到authorized_keys里,这样本地和VPS之间就可以通过ssh使用git了
测试,在终端中输入ssh git@<your_ip>,如果能够远程登陆,说明这一步没有问题
为静态内容新建仓库,接着上面的步骤

1
2
3
$ cd ~ 
$ mkdir blog.git && cd blog.git
$ git init --bare

本地设置

设置git用户名并添加远程地址,在Bash终端里

1
2
3
$ git config --global user.email "email@example.com"
$ git config --global user.name "username"
$ git remote add vps git@<your_ip>:blog.git

如果执行git push vps master成功,说明Git仓库已经准备完毕。

#第三步、Webhooks
blog.git是速度比较快的bare仓库,并不是可直接使用的目录,所以需要制作一个POST Hooks将这个仓库clone到临时文件夹,再拷贝到实际www目录。
Git hooks

1
2
3
$ cd ~/blog.git/hooks
$ touch post-receive
$ vi post-receive

使用下面的脚本

1
2
3
4
5
6
7
8
#!/bin/bash -l
GIT_REPO=/home/git/blog.git
TMP_GIT_CLONE=/tmp/blog
PUBLIC_WWW=/var/www/blog
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

更改脚本权限和/var/www/blog权限

1
2
$ chmod +x post-receive
$ sudo chmod 775 -R /var/www/blog

这时在本地执行git push vps master几秒就可以完成博客的更新

第四步、Nginx配置

直接配置静态配置,根目录配置为/var/www/blog

1
2
# touch /etc/nginx/sites-available/blog
# vi /etc/nginx/sites-available/blog
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {                                                                               
listen 192.184.88.212:80 ;
root /var/www/blog;
server_name blog.berry10086.tk;
access_log /var/log/nginx/blog_access.log;
error_log /var/log/nginx/blog_error.log;
location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {
root /var/www/blog;
access_log off;
expires 1d;
}
location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
root /var/www/blog;
access_log off;
expires 10m;
}
location / {
root /var/www/blog;
if (-f $request_filename) {
rewrite ^/(.*)$ /$1 break;
}
}
}

至此,配置已经完成,这个方案也可以用于Node.js/Python在Docker容器下的部署,只要把Docker的运行根目录映射到/var/www/xxx目录,修改post脚本中的变量即可,nginx使用反向代理,附上nginx反向代理配置一份

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
upstream nodejs {
server 127.0.0.1:3000;
keepalive 64;
}

server {
listen 80;
server_name charts.noahgao.net;
access_log off;
location ~ ^/(images/|img/|javascript/|js/|css/|stylesheets/|flash/|media/|static/|robots.txt|humans.txt|favicon.ico) {
root /var/www/charts/public;
access_log off;
expires max;
}
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Nginx-Proxy true;
proxy_set_header Connection "";
proxy_pass https://nodejs;
}

}