在 Alwaysdata 主机上通过 Git 部署 Hexo 博客

在 Alwaysdata 主机上部署 Hexo 博客,最优雅的方式莫过于利用 Git 的裸仓库(Bare Repository)和 post-receive 钩子。这种方案不需要在服务器上安装 Node.js 或 Hexo 环境,只需将本地生成的静态文件 push 到服务器,即可自动同步到 Web 根目录,实现真正的“一键部署”。

核心逻辑

本地执行 hexo d \(\rightarrow\) 推送到 Alwaysdata 的 Git 裸仓库 \(\rightarrow\) 触发 post-receive 钩子 \(\rightarrow\) 强制检出(checkout)到 Web 根目录。

第一步:服务器端配置

首先通过 SSH 登录到你的 Alwaysdata 主机。

1. 创建 Git 裸仓库

裸仓库不包含工作区,专门用于存放版本历史,非常适合作为部署中转站。

# 创建存放仓库的目录
mkdir -p ~/repos/blog.git
cd ~/repos/blog.git

# 初始化裸仓库
git init --bare

2. 配置自动化部署钩子

我们需要在 hooks 目录下创建一个 post-receive 脚本。每当 Git 接收到 push 操作后,该脚本会自动执行。

编辑文件:nano ~/repos/blog.git/hooks/post-receive

写入以下内容(请确保 TARGET 路径与你的实际 Web 根目录一致):

#!/bin/bash

# 部署目标目录
TARGET=/home/hexobs/www
# Git 裸仓库目录
GIT_DIR=/home/hexobs/repos/blog.git

# 清空目标目录并强制检出最新代码
rm -rf $TARGET/*
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f master

保存并退出,然后务必赋予执行权限

chmod +x ~/repos/blog.git/hooks/post-receive

第二步:Alwaysdata 后台设置

登录 Alwaysdata 管理面板 \(\rightarrow\) Web \(\rightarrow\) Sites

检查你的网站配置,确保 Root directory 填写的是 /home/hexobs/www。如果路径不匹配,用户访问域名时将无法读取到 Hexo 生成的 index.html

第三步:本地部署配置

在本地 Hexo 博客根目录下,修改 _config.ymldeploy 部分:

deploy:
  type: git
  repo: ssh://hexobs@ssh-hexobs.alwaysdata.net/home/hexobs/repos/blog.git
  branch: main

最后,执行部署指令:

hexo clean && hexo g && hexo d

避坑指南

  1. 权限问题:如果部署后出现 403 错误,检查 /home/hexobs/www 目录的权限。
  2. 分支匹配:注意 _config.yml 中的 branch (main/master) 必须与服务器仓库的分支一致。
  3. SSH Key:建议配置 SSH 公钥登录,避免每次 hexo d 都要输入密码。
本文由 BOSH 的博客助手 HerMes 整理 🚀
原文链接:用户提供素材