这个VPS当时很大程度就是为这个博客而买,虽然目前博客占用很小的空间,免费的github page已经足够使用,但VPS闲着也是闲着况且是些html静态文件,所以今天折腾了下如何自自动上传到github的时候自动部署到这台VPS上,当然访问速度也可以更快些。<!--more-->
博客的架构
先搞明白Hexo博客从搭建到自动发布的架构,才能更好的理解我们每一步进行的操作。不然只跟着步骤过了一遍,却不知道为什么这么做。
首先看这张架构图:
整个流程就是本地将 *.md 渲染成静态文件,然后Git推送到服务器的repository,服务器再通过 git-hooks 同步网站根目录。
配置服务器远程 Git
- 安装 git:
yum -y install git
- 创建一个 git 用户,用来运行 git 服务:
adduser git
passwd git //为git用户创建密码 ssh时的git用户登录密码
免密码登录
创建证书登录,把自己电脑的公钥,也就是 ~/.ssh/id_rsa.pub 文件里的内容添加到服务器的 /home/git/.ssh/authorized_keys 文件中,添加公钥之后可以防止每次 push都输入密码。 然后就可以执行ssh 命令测试是否可以免密登录
ssh -v git@SERVER(SERVER为服务器ip)
初始化服务器 Git 仓库
我是将其放在 /var/repo/blog.git 目录下的:
mkdir /var/repo
cd /var/repo
git init --bare blog.git
使用 --bare 参数,Git 就会创建一个裸仓库,裸仓库没有工作区,我们不会在裸仓库上进行操作,它只为共享而存在。
配置 Git Hook
我们这里要使用的是 post-receive 的 hook,这个 hook 会在整个 git 操作过程完结以后被运行。
在 blog.git/hooks 目录下新建一个 post-receive 文件:
$ cd /var/repo/blog.git/hooks
$ vim post-receive
在 post-receive 文件中写入如下内容:
#!/bin/sh
git --work-tree=/var/www/hexo --git-dir=/var/repo/blog.git checkout -f
注意,/var/www/hexo 要换成你自己的部署目录,一般可能都是 /var/www/html。上面那句 git 命令可以在我们每次 push 完之后,把部署目录更新到博客的最新生成状态。这样便可以完成达到自动部署的目的了。
不要忘记设置这个文件的可执行权限:
chmod +x post-receive
hook 设置好后,执行以下任一命令查看效果:
post-receive,./post-receive,source post-receive
由于是VPS,当时也想建立数个网站,所以用kangle的环境包搭建的,用kangle创建的网站目录默认为/home/ftp/b/blog/wwwroot,文件夹权限为1003用户所有,push时提示该文件夹拒绝,一看就是权限问题,对于网站文件夹
权限的设置可以参考这篇文章,由于vps操作系统和这篇文章不一致无法按照所说,继续百度
参考了这篇文章
网站目录权限
网站目录
post-receive 脚本中设置的 GIT_WORK_TREE 变量,就是网站目录:
$ mkdir -p /home/app/wph/web/
目录权限
假设使用 nginx HTTP Server,网站目录一般都设置为 nginx:nginx。
可以把 git 用户加到 nginx 组内(修改 /etc/group),网站目录 chmod 设置为同组可写。
chown -R nginx:nginx /home/app/wph/web/
chmod -R g+w /home/app/wph/web/
或者
chown -R git:nginx /home/app/wph/web/,git 作为 owner,用户 nginx 属于 nginx 组,
更方便理解。或者直接设置为 git:git 也可以。
我直接chown -R git:1003 /home/ftp/b/blog/wwwroot,就可以解决网站目录权限问题了。
改变 blog.git 目录的拥有者为 git 用户:
$ sudo chown -R git:git blog.git
禁用 git 用户的 shell 登录权限。
出于安全考虑,我们要让 git 用户不能通过 shell 登录。可以编辑 /etc/passwd 来实现,在 /etc/passwd 中找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
将其改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样 git 用户可以通过 ssh 正常使用 git,但是无法登录 shell。
至此,服务器端的配置就完成了。
本地配置
配置你的 hexo 博客可以自动 deploy 到服务器上,再也不用 ftp 上传了。
修改 hexo 目录下的 _config.yml 文件,找到 [deploy] 条目,并修改为:
deploy:
type: git
repo: git@23.83.**.**:/var/repo/blog.git
branch: master
上面设置后hexo clean && hexo generate --deploy提示22端口连接超时,这是由于VPS修改了ssh的默认端口为27100了,所以需要以下修改
无论客户端是在 windows 还是 linux ,配置访问的端口号,都是修改 用户的 .ssh 文件夹里的config文件
(假定用户为 administrator)
windows路径: C:\Users\Administrator\.ssh
linux路径: /home/administrator/.ssh
如果该路径下没有config文件,则创建一个。
config中添加如下内容:
如是以域名访问的则添加如下内容:(注意修改xxx为你的远程仓库的名称)
Host xxx
HostName xxx.com
Port 3333
如是以ip访问的,则添加如下内容:(注意修改ip为你的远程仓库ip)
Host "211.111.xx.xxx"
Port 3333
本地配置就是如此地简单。至此,我们的 hexo 自动部署已经全部配置好了。
使用同样命令即可自动部署到VPS了
$ hexo new "new-post"
# bla..bla..bla..
$ hexo clean && hexo generate --deploy
有没有很酷很方便,一条命令就可以将博客自动部署到自己的 VPS 上了,开始快乐地写博客吧。
多Repository部署
配置 _config.xml 例如:
deploy:
- type: git
repo: git@23.83.226.33:/var/repo/blog.git
branch: master
- type: git
repository: https://github.com/liuxinggangsu/liuxinggangsu.github.io.git
branch: master
后记
最近浏览一些hexo博客,虽然上面的方法可以说比较自动化了,想到当时对于这个hexo静态html网站用个虚拟空间不值当的,感觉现在收费的虚拟空间好些的都是1g以上或者几百M,
对于只是放些html文件真是太浪费了,当时也是很是纠结了一番,没看到大点的空间商有只需支持html的,当时都想用主机屋的免费空间了,但对于主机屋免费空间经常掉线,并且
每月还得想着发帖续费,还是放弃了,今天看到可以用七牛同步云储存,感觉还是挺方面,就跟我前段时间老板让我弄个文件同步,我用了一下百度的同步云盘,我的电脑修改文件,
老板电脑的同步盘就可以及时看到我更新的东西了,现在来看下用七牛如何自动化博客的吧,当然前提的域名备案,只有备案后才可以自定义域名的。
下载个七牛同步工具设置到两个Key值并选择生成静态博客的文件夹作为同步目录,让同步工具开机自启。
果然的,每当我在电脑书写博客并生成静态页面的时候,七牛已经在后台默默的帮我同步至云存储,
网站就在后台默默地更新了数据,实现了博客的全自动化更新。
由于还不想荒废现在的VPS,所以就没尝试这个免费办法,虽然听说七牛缓存有时候挺慢的,有时候更新文章,第二天才缓存过来,对于一些个人博客不是每天都有空更新的博客来说
可以说是没有啥影响的。
如果你是个技术控,喜欢折腾,也可以看下《在 DigitalOcean VPS 上利用 BTSync 搭建私有云储存》这篇文章,自动
同步本地博文,也是相当的geek。
全自动写博客
如果感觉还得通过命令发布到vps上,虽然已经很简单了,一条命令即可,我们还可以通过使用pm2实现自动监控文件变动,自动提交
1.在本地安装pm2(一个可在后台永久打开一个node小程序的 nodejs应用,也可以监控文件变化)
npm install -g pm2
2.在 博客的根目录下新建 start.js,内容如下
var process = require('child_process');
process.exec(' hexo g -d', function (error, stdout, stderr) {
if (error !== null) {
console.log('exec error: ' + error);
}
});
3.在同级目录下创建 watch.json,内容如下
{
"apps" : [{
"name" : "blog",
"script" : "./start.js",
"exec_interpreter": "node",
"exec_mode" : "fork_mode",
"watch" : "_posts"
}]
}
3.使用pm2命令实现监控文件变动自动提交
pm2 start watch.json
你可以把_post目录创建一个快捷方式到桌面,以后写博客直接打开文件夹进行新建文件修改文件,即可实现自动上传