Arn0's Blog

Live your life with passion.
With 三倍Ice Cream !!!

  1. 1. 配置Web服务器
    1. 1.1. 0x00 Clone 仓库
    2. 1.2. 0x01 Git登录凭证
      1. 1.2.1. 重要
    3. 1.3. 0x02 安装依赖
    4. 1.4. 0x03 安装WebServer并启用SSL
      1. 1.4.1. 创建Systemd service
      2. 1.4.2. 激活Systemd service
      3. 1.4.3. 绑定IP地址到域名
      4. 1.4.4. 获取SSL证书
        1. 1.4.4.1. PS:注意
  2. 2. 配置服务器端WebHooks
    1. 2.1. 1x00创建webhooks.js以及deploy.sh
      1. 2.1.0.1. 注意
  3. 2.2. 1x01 安装并运行webhook-handler
  4. 2.3. 1x02 配置远程仓库的WebHooks
  5. 2.4. 1x03 设置Coding-webhook-handler开机自动启动
  6. 2.5. 大功告成

刚刚把服务器迁移到OranMe的服务器上了。原因无他,就是Coding Page的国外访问速度实在是一般,毕竟是免费的东西嘛,也是意料之中。

趁着有人要出OranMe的Web Only主机,就把博客迁过来了。

要在本地推送更新远程服务器的文章,我第一时间想到了用WebHook。

大致流程就是:

本地推送分支->远程仓库触发WebHooks->Web服务器收到WebHooks并开始构建页面

但是在Google上找的WebHook资料大多是GitHub的,可我用的是Coding的仓库.稍微摸索了一下,于是乎就有了这篇水文。

配置Web服务器

0x00 Clone 仓库

开始之前,先把仓库的博客文件先Clone下来先,这里就不废话了。

0x01 Git登录凭证

修改一下Git仓库配置文件,使其记住Git登录凭证。

vim .git/config 
[credential]  
    helper = store

重要

随便加/改点东西然后Git Push,如果你什么都不想改,也可以直接强制推送一次。目的就是为了让Git记住你的登录凭证。

git push origin master -f

0x02 安装依赖

然后在博客目录里面安装依赖

sudo npm i hexo-cli -g
npm i

0x03 安装WebServer并启用SSL

安装WebServer,这里安利一下Caddy,4条配置搞定大部分需求。

用了都说好!

sudo CADDY_TELEMETRY=on curl https://getcaddy.com | bash -s personal

编辑Caddy配置文件

sudo vim /etc/caddy.conf
you domain
{
  log /path/to/hexo/caddy.log
    gzip
    root /path/to/hexo/public
}

注意

上述配置文件中需要按照你的服务器信息进行修改

  • you domain 改为 你服务器的域名
  • /path/to/hexo/ 改为 你服务器中Hexo的路径

创建Systemd service

sudo vim /etc/systemd/system/caddy.service

[Unit]
Description=Caddy HTTP/2 web server
After=syslog.target
After=network.target

[Service]
User=root
Group=root
LimitNOFILE=64000
ExecStart=/usr/local/bin/caddy --conf=/etc/caddy.conf
Restart=on-failure

[Install]
WantedBy=multi-user.target

这里将用户名指定成root主要是为了方便使用80和443端口。如果觉得不安全,可以参考这篇文章

激活Systemd service

sudo systemctl enable caddy.service

绑定IP地址到域名

这里的话,Google下吧。(懒)

获取SSL证书

/usr/local/bin/caddy --conf=/etc/caddy.conf

第一次运行的话,会提示输入邮箱。建议输入平时常用的,方便收到错误日志。当然也可以什么都不写直接回车。

PS:注意

这里必须由有80,443端口使用权限的用户执行,否则无法申请证书。

配置服务器端WebHooks

这里就进到正题了。

1x00创建webhooks.js以及deploy.sh

在用户目录下建一个webhooks目录,然后在里面创建一个webhooks.js文件。

var http = require('http')
var createHandler = require('coding-webhook-handler')
var handler = createHandler({ path: '/', secret: 'secret' })

function run_cmd(cmd, args, callback) {
  var spawn = require('child_process').spawn;
  var child = spawn(cmd, args);
  var resp = "";

  child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
  child.stdout.on('end', function() { callback (resp) });
}

http.createServer(function (req, res) {
  handler(req, res, function (err) {
    res.statusCode = 404
    res.end('no such location')
  })
}).listen(7777)

handler.on('error', function (err) {
  console.error('Error:', err.message)
})

handler.on('push', function (event) {
  console.log('Received a push event for %s to %s',
    event.payload.repository.name,
    event.payload.ref);
    run_cmd('sh', ['./deploy.sh',event.payload.repository.name], function(text){ console.log(text) });
})

再创建deploy.sh

#!/bin/bash

WEB_PATH='/path/to/hexo/'

echo "Start deployment"
cd $WEB_PATH
echo "pulling source code..."
git fetch 
git reset --hard FETCH_HEAD
hexo g
echo "Finished."

PS: 这里提到的方法也可以用于GitHub WebHooks。

只需将coding-webhook-handler包,替换成github-webhook-handler,还有webhooks.js里面的coding-webhook-handler改成github-webhook-handler.就可以正常使用GitHub WebHooks了。

注意

/path/to/hexo/ 改为 你服务器中Hexo的路径

1x01 安装并运行webhook-handler

确保系统里面有pm2

npm i -g pm2

下面coding-webhook-handlergithub-webhook-handler2个二选一,
如果你用Coding那就安装第一个,你用GitHub那就安装第二个。

npm i coding-webhook-handler # Coding的webhooks-handler
npm i github-webhook-handler # Github的webhooks-handler

然后运行一下

node webhooks.js

下面步骤完成之前不要退出

接下来配置下远程仓库的WebHooks.

1x02 配置远程仓库的WebHooks

在项目页面左下角找到”项目设置”,然后按下图操作

Coding新建WebHooks

URL:填写服务器的地址,如果上面那个webhooks.js没改过的话,就是http://你的服务器IP地址:7777

令牌webhooks.js第三行的secret:后面的内容,建议自行更改,但webhooks.js
CodingHooks的secret:内容必须统一。

内容类型:必须选application/json,Coding-webhook-handler只支持这种内容。

内容格式: 默认Coding就行。

完了保存退出,然后按下Ping,不出意外状态那里就是绿色的勾勾了。

关于更详细的Coding WebHooks资料可以翻下官方文档

1x03 设置Coding-webhook-handler开机自动启动

需安装PM2,并设置PM2开机自动启动。

npm i pm2 -g
pm2 startup

然后设置Coding-webhook-handler开机自动启动。

cd ~/webhooks
pm2 start ./webhooks.js --name HexoBlog
pm2 save

重启一下服务器,看看pm2是不是正常运行。

重启后输入pm2 list看看有没有webhooks服务。

pm2 list
┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0  │ webhooks           │ fork     │ 0    │ online    │ 0.4%     │ 51.1mb   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

像这样就是正常运行了。

大功告成

现在在本地推送篇文章上去,一般的话过十几秒Web服务器就构建完成了。

再也不用在Web服务器手动部署了。

qed

对了,如果之前设置过CI,并且部署目标和触发WebHooks的仓库是同一个的话,记得关掉。不然的话WebHooks就会被重复触发。(本地提交触发1次,CI部署触发1次。)

Coding的话,反选掉”代码更新时自动执行”就行。
如图


参考链接

都9012年了,你还在手动部署代码吗

将 Hexo 博客发布到自己的服务器上

PM2设置开机自启动

This article was last updated on days ago, and the information described in the article may have changed.