基于 github-webhook 的 hexo blog 搭建方案


title: 基于 github-webhook 的 hexo-blog 搭建方案

tags:

  • hexo
  • github
  • webhook

categories:

  • Tech

comments: true
date: 2017-05-06 20:00:00


之前的 blog 一直使用的是 wordpress,搭建使用起来还算方便。但是 wordpress 比较重,对于个人 blog 开发者来说维护起来比较麻烦,所以准备迁移到比较轻量的 hexo。

hexo是一套基于 nodejs 的简单轻量的 blog 框架,它可以直接从 markdown 文件生成 HTML 静态页面。本文的 blog 搭建思路是:

  1. 本地编辑好具体的 md 文件,预览没有问题后,直接将 md 文件上传到 github 存储。
  2. 远程的私人服务器上通过 webhook 获取 github 的变化通知,当发现有更新时,则从 github 上拉取最新的 md 文件。
  3. 拉取最新的文件后 hexo 生成新的静态文件
    这套方案发布简单、无需维护存储,用起来比较方便。

Prepare

在安装 hexo 之前,需要做一些前期的准备工作,安装一些必备的依赖和组件

(系统 Centos 7)

  1. 安装 nodejs
sudo yum install epel-release #基于epel源
sudo yum install nodejs
  1. 安装 nginx
sudo yum install nginx
  1. 安装 git
sudo yum install git
  1. 创建拥有 sudo 权限的用户
# 使用 root 用户
useradd blog
passwd blog # 设置blog用户的密码
usermod -aG wheel blog
  1. 在 github 上为 hexo 创建一个 repo,用于存储编辑的 md 文件,注意要设置为 public,本文的 git repo:
https://github.com/zhai3516/hexo_blog_static.git

安装 Hexo

接下来就是正式安装 hexo 的步骤,也很简单。
在安装前先从 root 用户前切换到刚创建的 blog 用户:

sudo su blog

hexo需要安装两部分 hexo-cli 和 hexo-server,其中 cli 提供了使用hexo的一些核心命令,是使用 hexo 最主要的部分,server 提供了预览和测试的功能,以下是具体的安装过程:

  1. 安装 hexo-cli
sudo npm install hexo-cli -g
  1. 安装 hexo-server
sudo npm install hexo-server -g
  1. 初始化 hexo
hexo init ~/hexo_blog # 初始化一个blog的目录
cd ~/hexo_blog
npm install # 安装依赖

此时,hexo 已经安装完成,并使用 hexo 创建了一个 blog 目录,接下来就是如何配置 hexo。

配置 Hexo

在刚创建的 hexo_blog 目录下存在一下文件

-rw-rw-r--   1 blog blog  1483 May  6 06:06 _config.yml
drwxrwxr-x 287 blog blog 12288 May  6 06:24 node_modules
-rw-rw-r--   1 blog blog   443 May  6 06:06 package.json
drwxrwxr-x   2 blog blog  4096 May  6 06:06 scaffolds
drwxrwxr-x   3 blog blog  4096 May  6 06:06 source
drwxrwxr-x   3 blog blog  4096 May  6 06:06 themes

其中 _config.yml 是核心配置文件,blog 中的大部分配置都在这里,比如 blog 的一些基本信息:

  5 # Site
  6 title: Zhaif's Blog
  7 subtitle: Learn For Yourself
  8 description: My Tech Blog
  9 author: Feng zhai
 10 language: zh
 11 timezone: Asia/Shanghai

更改 Url section 的配置,指定网站的ip(或域名):

url: http://your_server_ip

更改 Writing section 的配置,default_layout 设为「draft」表示文章在发表前是保存为草稿状态的。:

default_layout: draft

关于其他配置选项细节可以参考官方文档Docs

配置 Nginx

首先创建一个存放 blog 静态文件的系统目录:

sudo mkdir -p /var/www/hexo

将目录的用户权限配置给 blog 用户

sudo chown -R blog:blog /var/www/hexo

给目录增加写权限:

sudo chmod -R 755 /var/www/hexo

然后就是给 nginx 添加配置:

sudo vim /etc/nginx/nginx.cfg

添加以下配置,这里的配置是将 blog 配置在了 8080 端口 :

    server {
        listen       8080 default_server;
        listen       [::]:8080 default_server;
        root         /var/www/hexo;
        index        index.html index.htm;
    }

配置完成后,reload 以下 nginx 的配置:

sudo nginx -s reload

配置 Github Webhook

首先,在 github 上配置一个 webhook,当有更新时,github 会通知你的 webhook server :

github webhook

然后,在 vps 上启动一个 webhook server 脚本,这里用 python-flask 写了一个简单的:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
import os
import traceback

from flask import Flask, request

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def update():
    if request.method == 'POST':
        try:
            print request.headers
            print request.json
            print os.popen("sh ~/webhook.sh").read()
        except:
            print traceback.format_exc()

    return json.dumps({"msg": "error method"})

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=8888, debug=False)

收到请求后,server 会执行一个更新 blog 静态 HTML文件的脚本
webhook.sh,其放在 ~/ 目录下,脚本具体内容如下:

#!/usr/bin/env bash

cd ~/hexo_blog_static
git pull https://github.com/zhai3516/hexo_blog_static.git
rm -rf ~/hexo_blog/source/_posts/*
cp -r ~/hexo_blog_static/blog-md/* ~/hexo_blog/source/_posts/

cd ~/hexo_blog
hexo clean
hexo generate
rm -rf /var/www/hexo/*
cp -r ~/hexo_blog/public/* /var/www/hexo/

配置好后,在 ~/ 目录下 git clone 一份 github 代码,最后 ~/ 目录下的结构如下:

[blog@zhaifeng-vps0 ~]$ ls
hexo_blog  hexo_blog_static  webhook-server.py  webhook.sh

其中 hexo_blog 是 hexo 初始化的 blog 目录,hexo_blog_static 是拉取的 github 代码,webhook-server.py 是启动的本地 web server 用以接收 github 的请求,webhook.sh 是接收到 github 请求后更新静态文件目录的 sh 脚本。

现在,直接在本地向 github push md 文件,远程服务器就会自动更新 blog了。

附:Hexo server 本地预览

编写好 markdown 文件后,可以使用 hexo-server 实现本地预览,预览没问题后直接 push 就可以~

使用 hexo new 命令可以快速的创建一篇文章,注意在 hexo_blog 目录下运行,eg:

[blog@zhaifeng-vps0 hexo_blog]$ hexo new hexo-gihub-nginx-blog
INFO  Created: ~/hexo_blog/source/_drafts/hexo-gihub-nginx-blog.md

这样,在 ~/hexo_blog/source/_drafts/ 目录下就创建好一个 md 文件,并且拥有初始化了格式,直接编辑就可以。编辑好后,文件仍处于草稿状态,需要发布出去,执行命令:

[blog@zhaifeng-vps0 hexo_blog]$ hexo publish hexo-gihub-nginx-blog
INFO  Published: ~/hexo_blog/source/_posts/hexo-gihub-nginx-blog.md

发布后可以在本地预览发布的效果,执行命令:

hexo server

会在本地 4000 端口启动一个供测试用的server,直接访问 http://127.0.0.1:4000 可以预览发布的文章效果:

预览demo

参考文章

https://www.digitalocean.com/community/tutorials/how-to-create-a-blog-with-hexo-on-ubuntu-14-04
https://aaron67.cc/2017/02/19/hexo-backup-and-deploy-solution-based-on-gitlab-ci-and-webhook/
https://hexo.io/docs/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容