VPS 初体验(五)将 Hexo 静态博客一键部署到 VPS

使用 Hexo 配合免费的 GitHub 的仓库和 GitHub Pages 可以快速在互联网上搭建自己的个人博客。但是因为 GitHub Pages 在国内的访问速度太差,为了得到更好的访问体验,可以选择将博客部署到自己的 VPS 上。最直接的方法就是手动将生成的博客静态文件手动使用 FTP 上传到 Nginx 上的博客站点目录下,但是这样每次更新都要手动 FTP 上传显得麻烦且不优雅。

而 Hexo 本身提供了快速方便的一键部署功能,支持包括 Git、Netlify、SFTP 等多种部署方式。虑到稳定性和同步速度,最终选择了使用 Git 方式部署到 VPS。

首先需要在 VPS 上准备一个 Git 裸仓库作为 Hexo 的部署仓库。当运行 hexo deploy 命令时,会自动使用 git push 将博客的静态文件上传到 VPS 的 Git 仓库中。

注意:裸仓一般都是用来当做远程的中心公共仓库,专门用来存储和同步分发,裸仓库可以被正常 clonepush ,但是裸仓没有 worktree 的,不能像普通仓库那样进行 commit 等 Git 操作。

光把博客静态文件上传到仓库还不够,还需要拷贝到 Nginx 的博客站点目录一下才能被 HTTP(S) 访问。为此需要使用到 Git Hooks 功能,当服务器端的 Git 裸仓收到 git push 之后,会自动触发 Git Hooks 中的 post-receive 脚本,该脚本将 Git 裸仓中的文件拷贝到 Nginx 的博客站点目录下。这样就可以真正达到了 hexo deploy 命令全程自动部署的效果。

使用Git Hook自动部署Hexo到个人VPS

  1. 在宝塔面板已经创建好 kiku.vip 站点作为博客入口,站点的根目录为 /www/wwwroot/kiku.vip

  2. 在 VPS 上安装 git,部分 Linux 发行版自带 git,可以跳过该步。

    1
    sudo yum install git
  3. 在当前用户目录初始化一个 git 裸仓。

    1
    git init --bare ~/hexoblog.git
  4. 为创建的裸仓配置 post-receive 这个钩子,当仓库有收发的时候就会自动调用这个钩子。 在 ~/blog.git 裸库的 hooks 文件夹中,新建并编辑 post-receive 文件。

    1
    vim ~/hexoblog.git/hooks/post-receive

    在文件中添加下面的脚本代码。第 1 行命令是删除 /www/wwwroot/kiku.vip (即 kiku.vip 站点目录)下的文件,第 2 行命令将 ~/hexoblog.git下的文件 git clone/www/wwwroot/kiku.vip (即 kiku.vip 站点目录)。如果为要操作的文件都配置了合理的权限下面出现的代码可以不加 sudo,为了图方便都和避免各种意想不到的权限错误,推荐直接加上 sudo

    1
    2
    sudo rm -rf /www/wwwroot/kiku.vip
    sudo git clone ~/hexoblog.git /www/wwwroot/kiku.vip

    但更加推荐使用下面的命令替换上面的两行命令,效果和上面等效,但是比使用 git clone 的效率更高。--work-tree 参数后面是的是站点目录,--git-dir 参数指定的是 git 裸仓地址,注意要使用 ~/hexoblog.git 因为用到了 sudo, ~ 会指向 root 用户目录,直接使用 /home/Kiku/hexoblog.git

    1
    sudo git --work-tree=/www/wwwroot/kiku.vip --git-dir=/home/Kiku/hexoblog.git checkout -f

    整个的第 4 步可以用下面一行命令完成。

    1
    echo sudo git --work-tree=/www/wwwroot/kiku.vip --git-dir=/home/Kiku/hexoblog.git checkout -f > ~/hexoblog.git/hooks/post-receive
  5. 赋予 post-receive 脚本文件可执行权限

    1
    chmod +x ~/hexoblog.git/hooks/post-receive
  6. 修改本地 Hexo 配置文件 _config.yml 中的 deploy 选项。
    注意:如果 VPS 上的 SSH 的连接端口不是默认的 22 需要手动指定端口。

    1
    2
    3
    deploy:
    type: git
    repo: Kiku@kiku.vip:/home/Kiku/hexoblog.git

    如果想同时部署到 GitHub 和 VPS 上的 git 裸仓 deploy 应该如下:

    注意有多个部署选项时 type 时前面要添加 -

    1
    2
    3
    4
    5
    6
    deploy:
    - type: git
    repo: git@github.com:Kiku-CN/Kiku-CN.github.io.git
    branch: master
    - type: git
    repo: Kiku@kiku.vip:/home/Kiku/hexoblog.git
  7. 重新生成部署 Hexo 博客,查看部署是否成功。

    1
    2
    hexo clean  # 先删除曾静态文件和缓存,避免可能的 Bug
    hexo g -d # hexo generate deploy

前前后后花了接近半个月的时间在 VPS 上,才终于把服务器折腾成自己想要的效果。在这个过程中学到了不少网络和服务器相关的知识,发现了不少优质的博客站点,见识了中文互联网环境在墙外的的另一面。

参考

  1. 使用Git Hook自动部署Hexo到个人VPS
  2. Git 本地仓库和裸仓库
  3. Hexo 一键部署