Hexo的Git部署,一行命令部署到GitHub和自己的VPS

自用笔记:本文属于自用笔记,不做详解,仅供参考。

部署到自建VPS

Hexo最简便的使用方式就是,本地写作,然后本地生成博客静态文件,并通过hexo d命令部署到远程 GitHub Pages 的仓库或者自建VPS。第一次配置稍微有些麻烦,一旦配置部署成功,用来写博客将会产生前所未有的快感。

Hexo生成的博客部署到 GitHub Pages 十分简单,并且大部分的部署教程都是部署到 Pages 仓库的,本文后面对此简略带过,重点讲一下部署到自建的 VPS。

部署到自建VPS实际上就是自己在VPS上安装 Git,然后在VPS上创建一个repository并初始化,再把本地 Git 生成的 public rsa放到vps上,实现免密ssh访问;

这样的话,在 Hexo 配置文件 _config.yml 中配置好了之后,就可以直接 hexo d 命令部署到远程的 git 仓库;

最后一步,利用 Git Hook,实现 VPS 上的git仓库在 post-receive时,自动clone并复制到 VPS 上的网站目录下(首先要安装web服务器),实现自动更新。

以下,VPS以Cent OS系统为例,其他系统适当修改代码。

安装 Git

  1. 在 VPS 上安装 Git

    1
    yum install git
  2. 新建 git 用户:(也可以直接用 root 用户来创建仓库)

    1
    useradd -d /home/git -m git

    这个命令会新建一个用户,并创建 /home/git/ 目录做为这个用户的目录,同时创建一个与用户名相同的组。

配置 SSH 免密访问

  1. 本地安装 Git

    此步骤很简单,略去,我自己本地是Windows,用的 git-bash

  2. 配置本地免密ssh登陆到远程VPS

    在本地写作的机器上,进入 ~/.ssh/ 目录(如果没有就创建一个),例如我的目录:C:\Users\Yan\.ssh,执行:

    1
    ssh-keygen -t rsa

    一路回车,会在 ~/.ssh/ 目录下生成 id_rsaid_rsa.pub 两个文件。

    然后把生成的 id_rsa.pub 文件内容 copy到 VPS 的 git 用户的 ~/.ssh/authorized_keys文件中(没有就新建此文件),

    例如可以这样做:

    • 本地打开 id_rsa.pub 文件,将里面的内容复制到剪贴板;

    • VPS 切换到 git用户,可以用git用户登录,也可以直接切换到 git 用户,例如在 root 用户下执行:

      1
      su git
    • 然后在 VPS 上以 git 用户执行:

      1
      2
      mkdir -p ~/.ssh
      vim ~/.ssh/authorized_keys
    • 然后用 vim 把刚才剪贴板中复制的密钥粘贴进去,保存退出即可。

    这样客户端机器就可以免密登录到 VPS 了,可以这样试一下,在本地(git bash 或 bash下)执行:

    1
    ssh git@106.186.33.133

    应该可以免密 ssh 登陆了。

    如果出现不能登录的情况,可能是文件权限有问题,VPS 上做如下修改:

    1
    2
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys

    在 VPS 上~/.ssh目录必须要在 git 用户下创建(如果是以 git 用户来制造仓库和做两端同步的话,当然也能用root用户的)

在 VPS 上创建仓库

使用 git 用户登录 VPS,执行:

1
2
3
4
cd ~
mkdir hexo.git
cd hexo.git
git init --bare

Git Hook 自动 Clone 收到提交的仓库到网站根目录

假设 VPS的 hexo网站目录为 /home/wwwroot/hexo/;

这个目录要给 git 用户访问,hexo.git 仓库收到提交后,git 用户要把提交的内容再 checkout 到 /home/wwwroot/hexo/ 目录,所以要把这个目录的所有权交给 git 用户:

1
sudo chown git:git /home/wwwroot/hexo/

建立一个仓库内容转移的缓存目录:

1
mkdir -p /home/git/tmp/hexo_tmp

然后处理 hexo.git 提交的事件,自动更新内容到 hexo网站目录。在 git 用户下执行:

1
vim /home/git/hexo.git/hooks/post-receive

编辑这个 post-receive 文件:

1
2
3
4
5
6
7
8
#!/bin/bash -l
GIT_REPO=/home/git/hexo.git
TMP_GIT_CLONE=/home/git/tmp/hexo_tmp
PUBLIC_HEXO=/home/wwwroot/hexo
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_HEXO}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_HEXO}

这个脚本可以实现完全更新,即先删除原网站内所有内容,再拷贝新仓库内容到网站目录,可以避免一些不必要的问题。

保存退出,然后给脚本加上执行权限:

1
chmod +x /home/git/hexo.git/hooks/post-receive

配置 Hexo 的部署信息

打开 _config.yml 文件,找到 deploy 字段,修改如下:

1
2
3
4
5
deploy: 
type: git
message: update
repo: git@106.186.33.133:hexo.git
branch: master

如果出于安全或其它原因考虑,你修改了 SSH 默认的端口,那么上面 repository 的配置要做如下修改:

1
repo: ssh://git@106.186.33.133:<your-port>/~/hexo.git

利用 Hexo 的 Git 部署工具部署到 VPS

如果没有安装 Hexo 的 Git 部署工具,要切换到本地 hexo 目录,先安装 Hexo 的 Git 部署工具,Hexo 3.0 开始,部署工具需要单独安装:

1
npm install hexo-deployer-git --save

然后,在本地,切换到要部署的hexo网站目录下,执行以下命令部署:

1
2
hexo clean
hexo g -d

部署成功会有 INFO Deploy done: git 的提示。

部署到GitHub Pages

关于如何创建 用户名.github.io 仓库来建静态网站以及绑定域名什么的,网上凡是关于 Hexo 的部署的教程大部分都是此类,不再赘述(提供个官方的链接 https://pages.github.com/ ),只说本地 Hexo 配置:
配置 _config.xml 例如:

1
2
3
4
deploy:
type: git
repo: git@github.com:yanzai/yanzai.github.io.git
branch: master

多部署

配置 _config.xml 例如:

1
2
3
4
5
6
7
deploy: 
- type: git
repo: git@106.186.33.133:hexo.git
branch: master
- type: git
repo: git@github.com:yanzai/yanzai.github.io.git
branch: master

部署过程中遇到的坑

Hexo 一旦部署成功,使用起来将会十分方便,简直是飞起来的感觉,本地用喜欢的Markdown编辑器轻松写作,然后一个命令就部署到网站去了。

但 Hexo 使用起来最困难的莫过于部署了吧,自己在此过程中也同样遇到了一些坑。

我遇到的坑大概是多部署的坑,原因如下:

  • 有时候本地的 ~/.ssh 目录中有多个自己生成的 id_rsa.pub文件;
  • 这些 id_rsa.pub 文件是基于相同的用户名和邮箱生成的

在这种情况下,可能会出现 ssh 可以登陆,但在 hexo 部署时老是报错,错误大概是远程权限拒绝;

这个问题后来想了想,大概是因为执行 hexo d命令时,可能默认使用的不是添加到 VPS中的~/.ssh/authorized_keys的Key的对应的 id_rsa.pub(因为上面那种情况本地有多个id_rsa.pub文件并且它们有相同的 git 用户名和邮箱),解决方案如下:

在本地~/.ssh目录中,(例如我的目录:C:\Users\Yan.ssh)添加一个名为config的文件,这样写:

1
2
3
4
Host 106.186.33.133
HostName 106.186.33.133
User 你的用户名
IdentityFile /c/Users/Yan/.ssh/id_rsa

完了之后清空一下known_hosts,然后重新连接部署试试。
这样就能指定使用哪个id_rsa去部署了,所以就成功部署了。

0%