通过 Git Hook 自动部署 Hexo 博客到 1Panel 站点

通过 Git Hook 自动部署 Hexo 博客到 1Panel 站点

所谓诚其意者 毋自欺也

本文将介绍如何配置服务器端的 Git 仓库和钩子 (Hook),以实现在本地执行 hexo deploy 命令时,自动将 Hexo 生成的静态文件部署到由 1Panel 面板管理的网站目录中。这种方法避免了手动上传文件的繁琐过程,实现了类似 CI/CD 的自动化部署流程。

前提条件

在开始之前,请确保你已满足以下条件:

  1. 服务器:

    • 安装了 1Panel 面板的 Linux 服务器。
    • 拥有服务器的 SSH 访问权限(本文示例将使用 root 用户,你可以根据实际情况替换为其他有权限的用户)。
    • 服务器上已安装 Git
  2. 1Panel 配置:

    • 已通过 1Panel 创建了一个网站(例如 blog.yourdomain.com),并记下该网站的 根目录(Document Root)。通常在 1Panel 中,路径类似于 /opt/1panel/apps/openresty/openresty/www/sites/你的网站目录/index请务必替换为你的实际路径
  3. 本地环境:

    • 你的电脑上已安装并配置好 Hexo 博客环境。

    • 你的电脑上已安装 Git

    • 已安装 Hexo Git 部署插件:

      1
      npm install hexo-deployer-git --save
  4. SSH 密钥认证 (关键):

    • 你需要在本地电脑生成 SSH 密钥对(如果还没有的话)。
    • 必须将你的本地电脑的 SSH 公钥 添加到服务器上对应用户(如 root)的 ~/.ssh/authorized_keys 文件中。这样可以确保 hexo deploy 时 Git PUSH 操作无需输入密码即可完成。

配置步骤

步骤一:在服务器上安装 Git

如果你的服务器尚未安装 Git,请根据你的 Linux 发行版执行相应命令:

  • Debian/Ubuntu:

    1
    2
    sudo apt-get update
    sudo apt-get install git -y
  • Fedora/RedHat/CentOS:

    1
    sudo yum install git -y

步骤二:在服务器上创建 Git 裸仓库 (Bare Repository)

我们需要在服务器上创建一个 Git “裸仓库”。裸仓库不包含工作目录(即你看不到项目文件),只存储 Git 的版本历史和对象数据,非常适合作为中心仓库或中转仓库。

  1. 创建仓库目录:
    选择一个路径来存放你的 Git 仓库。例如,我们选择放在 /root/git/ 目录下(你可以自定义路径)。

    1
    2
    # 创建目录 (如果父目录不存在,也一并创建)
    mkdir -p /root/git/
  2. 修改目录权限 (可选但推荐):
    如果你不是一直使用 root 用户,或者希望更精细地控制权限,可以修改目录所有者和权限。如果使用 root,此步通常可以跳过。

    1
    2
    3
    4
    # 将目录所有者改为当前用户 (如果用 root 执行,则为 root)
    # chown -R $USER:$USER /root/git/
    # 设置权限 (所有者完全控制,同组用户读取执行,其他用户读取执行)
    # chmod -R 755 /root/git/
  3. 初始化裸仓库:
    进入你选择的目录,并初始化一个裸仓库。我们将仓库命名为 blog.git (你也可以自定义)。

    1
    2
    cd /root/git
    git init --bare blog.git

    执行后,你会在 /root/git/ 目录下看到一个名为 blog.git 的文件夹。

步骤三:在服务器上配置 Git 钩子 (post-receive)

Git 钩子是在 Git 操作过程中的特定时间点自动执行的脚本。post-receive 钩子在服务器成功接收到推送 (push) 后执行。我们将利用这个钩子将推送过来的 Hexo 文件检出 (checkout) 到 1Panel 的网站根目录。

  1. 创建钩子文件:
    进入裸仓库的 hooks 目录,并创建一个名为 post-receive 的文件。

    1
    vim /root/git/blog.git/hooks/post-receive
  2. 编辑钩子内容:
    vim 编辑器中,按 i 进入插入模式,然后粘贴以下脚本内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    # 指定 Hexo 网站文件存放的目录 (!!!!务必替换为你的 1Panel 网站实际根目录!!!!)
    WORK_TREE="/opt/1panel/apps/openresty/openresty/www/sites/blog/index"
    # 指定 Git 裸仓库的路径 (!!!!务必替换为你的裸仓库实际路径!!!!)
    GIT_DIR="/root/git/blog.git"

    # 执行 Git checkout 命令,强制将内容检出到工作目录
    git --work-tree=${WORK_TREE} --git-dir=${GIT_DIR} checkout -f

    echo "Hexo blog deployed to ${WORK_TREE}"

    重要说明:

    • --work-tree: 必须 修改为你在 1Panel 中创建的那个网站的 实际根目录路径
    • --git-dir: 必须 修改为你刚刚创建的 Git 裸仓库的路径 (blog.git)。
    • checkout -f: -f 参数表示强制检出,会覆盖目标目录中已有的文件。
  3. 保存并退出 Vim:
    按下 ESC 键退出插入模式,然后输入 :wq! 并按回车键,强制保存并退出 Vim。

  4. 赋予钩子执行权限:
    新创建的钩子文件默认没有执行权限,需要添加:

    1
    chmod +x /root/git/blog.git/hooks/post-receive

步骤四:修改本地 Hexo 配置

现在,配置你本地 Hexo 博客的 _config.yml 文件,告诉它如何部署。

  1. 打开你本地 Hexo 项目根目录下的 _config.yml 文件。

  2. 找到 deploy 部分(如果不存在,请添加)。

  3. 修改或添加 git 部署配置,如下所示:

    1
    2
    3
    4
    5
    deploy:
    type: git
    repo: ssh://root@YOUR_SERVER_IP:22/root/git/blog.git # !!! 修改 IP 和路径 !!!
    branch: main # 或者 master,取决于你希望推送的分支
    # message: "Site updated: {{ now('YYYY-MM-DD HH:mm:ss') }}" # 可选的提交信息

    请务必修改:

    • root: 替换为你配置了 SSH 免密登录的服务器用户名。
    • YOUR_SERVER_IP: 替换为你的服务器公网 IP 地址或域名。
    • 22: 如果你的 SSH 端口不是默认的 22,请修改。
    • /root/git/blog.git: 替换为你在服务器上创建的裸仓库的 绝对路径
    • branch: 确保这个分支名 (mainmaster) 与你的 post-receive 钩子期望检出的分支一致(默认情况下 checkout -f 会检出仓库的 HEAD 指向的分支,通常是 mastermain)。

步骤五:部署你的 Hexo 博客

一切配置完成后,部署就非常简单了:

  1. 在本地 Hexo 项目目录下,执行标准的生成和部署命令:

    1
    hexo clean && hexo generate && hexo deploy

    或者直接:

    1
    hexo d 
  2. 工作流程:

    • hexo g 生成静态文件到 public 目录。
    • hexo d 使用 hexo-deployer-git 插件:
      • public 目录的内容提交到一个临时 Git 分支。
      • 通过 SSH 将这个分支强制推送到你配置的服务器裸仓库 (ssh://root@YOUR_SERVER_IP:22/root/git/blog.git)。
      • 服务器上的 Git 仓库接收到推送后,自动触发 post-receive 钩子脚本。
      • 钩子脚本执行 git checkout -f,将最新的网站文件强制检出(部署)到 1Panel 网站的根目录 (/opt/1panel/apps/openresty/openresty/www/sites/blog/index)。
  3. 验证:
    部署命令执行成功后,稍等片刻,然后访问你的博客域名 (http://blog.yourdomain.comhttps://blog.yourdomain.com),应该就能看到更新后的内容了。

故障排除提示

  • 权限问题: 检查服务器上 Git 仓库目录、网站根目录以及钩子文件的权限是否正确。钩子脚本需要有权限写入网站根目录。
  • SSH 密钥问题: 确保本地 SSH 公钥已正确添加到服务器的 authorized_keys 文件中,并且本地 SSH 私钥可用。尝试手动 ssh root@YOUR_SERVER_IP 看是否能免密登录。
  • 路径错误: 仔细核对 post-receive 脚本中的 --work-tree--git-dir 路径,以及本地 _config.yml 中的 repo 路径是否完全正确。
  • 钩子未执行: 检查钩子文件是否有执行权限 (chmod +x),文件名是否精确为 post-receive (没有扩展名)。
  • 查看日志: 如果部署失败,可以尝试在服务器上查看 SSH 或 Git 相关日志,或者在钩子脚本中添加一些 echo 输出到日志文件来调试。

通过以上配置,你就实现了一个高效、自动化的 Hexo 博客部署流程!

  • Title: 通过 Git Hook 自动部署 Hexo 博客到 1Panel 站点
  • Author:
  • Created at : 2024-10-10 20:38:46
  • Updated at : 2025-04-29 19:07:24
  • Link: https://xblog.aptzone.cc/2024/10/10/在1panel面板快速部署hexo博客/
  • License: All Rights Reserved © 凡
Comments