美文网首页Tech!Hexo
基于 github-webhook 的 hexo blog 搭建

基于 github-webhook 的 hexo blog 搭建

作者: zhaif | 来源:发表于2017-05-26 16:31 被阅读305次

    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: Chinese (China)
    

    更改 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/

    相关文章

      网友评论

        本文标题:基于 github-webhook 的 hexo blog 搭建

        本文链接:https://www.haomeiwen.com/subject/oacstxtx.html