虽然hexo生成的静态博客很安全,也不需要像Wordpress 那样运维服务器,但是基于本地的静态文件生成和发布还是比较麻烦的,尤其是多个电脑的切换,你每台电脑都需要安装一整套的nodejs 环境和hexo执行环境,通过git服务的hook进行hexo博客生成与部署,就是为了解决这个问题。
创建git服务
安装git
我使用的 CentOS 执行 yum install git
即可安装git
为git创建用户和群组
添加组 groupadd git
添加用户并将用户加入组 useradd git -g git
创建证书登录
cd /home/git
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
这里有一个坑就是在CentOS里ssh生效必须满足两个条件
- .ssh目录的权限必须是700
- .ssh/authorized_keys文件权限必须是600
创建git用户的密钥 ssh-keygen -t rsa -C "willard_liu@XXXX.com"
,同样的把刚创建的公钥id_rsa.pub
加入到 authorized_keys 中
配置一下 git 用户下的git 信息
$ git config --global user.name author #将用户名设为author
$ git config --global user.email author@corpmail.com #将用户邮箱设为author@corpmail.com
初始化Git仓库
首先我们选定一个目录作为Git仓库,假定是/data/gitrepo/test.git,在/data/gitrepo目录下输入命令:
cd /data
mkdir gitrepo
chown git:git gitrepo/
cd gitrepo
git init --bare test.git
以上命令Git创建一个空仓库,服务器上的Git仓库通常都以.git结尾。然后,把仓库所属用户改为git:
chown -R git:git test.git
测试一下仓库是否有问题
$ git clone git@xxx.xxx.xxx.xxx:/data/gitrepo/test.git
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
到这我们的git仓库就搭建完成了
然后我们把 hexo 项目下的source 里面的内容全丢到这个git项目下就行了
hexo 项目部署
安装
nodejs
这个不再这里展开安装
hexo
执行npm install hexo-cli -g
软链 hexo 到
/usr/bin
下方便等下在 git 用户下使用sudo ln -s /usr/local/lib/nodejs/node-v**.**.**-linux-x64/bin/hexo /usr/bin/hexo
我们在
data
下再创建一个 hexo 项目目录mkdir blog
然后我们把本地完整的hexo项目除了node_modules 和 source 目录外的所有文件和文件夹都上传到
/data/blog
下切换用户到git
su git
,然后克隆刚才我们的仓库 到 source 目录git clone git@xxx.xxx.xxx.xxx:/data/gitrepo/test.git /data/blog/source
进入
/data/blog
安装项目组件npm install
执行
hexo g
和hexo d
,看与本地执行的是否一致如果上述步骤都没问题我们就需要把上面的步骤配置到仓库的hook上了
进入
cd /data/gitrepo/test.git/hooks/
,如果没有post-receive
这个文件,就创建一个touch post-receive
,再 配置一下权限chmod 755 post-receive
,具体各个hook的含义参考git的文档配置 post-receive
# 进入source 目录
cd /data/blog/source
pwd
echo "==========拉取最新的文章=========="
unset GIT_DIR
# 强制拉取覆盖本地内容
git fetch --all
git reset --hard origin/master
git pull
echo "==========拉取结束=========="
# 进入blog 目录
cd /data/blog
pwd
echo "==========清除html=========="
hexo clean
echo "==========开始生成html=========="
hexo g
echo "==========生成html完成=========="
echo "==========开始部署=========="
hexo d
echo "==========部署完毕=========="
在本地 push 看一下是否有以上远程执行的操作输出
如果上述步骤都ok了,那么我们出于安全考虑需要禁用git的远程登录
通过编辑
/etc/passwd
文件完成。找到类似下面的一行:git❌1001:1001:,,,:/home/git:/bin/bash
改为:
git❌1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,
git
用户可以正常通过ssh使用git,但无法登录shell,因为我们为git
用户指定的git-shell
每次一登录就自动退出。
至此我们就完成了所有步骤,以后我们需要写博客只需要在本地安装git,如果是首次还需将公钥 id_rsa.pub的内容配置到服务器git用户下的 .ssh/authorized_keys
文件中,然后拉取发布 source 也就是我们的markdown的git仓库地址就可以完成整个博客发布流程了。