将 Hexo 部署到自己的服务器
我以前主要部署在 GitHub Pages,这篇记录用 SSH + bare Git 仓库 + post-receive hook 把 Hexo 生成结果推到自己的服务器。
安装 Git
按服务器发行版安装即可,例如:
# Debian / Ubuntu
sudo apt update && sudo apt install git
# RHEL / Rocky / AlmaLinux 等
sudo dnf install git
下面服务器端的用户创建和目录准备由管理员执行,日常推送使用 git 用户。
创建git用户
adduser git #/home 目录下生成一个git目录
passwd git #设置密码
install -d -o git -g git -m 755 /var/www/blog
# git 用户只需能写部署目录,不需要 sudo 权限
配置SSH密钥
先切换到刚创建的用户,后续仓库操作也在这个用户下完成:
su - git
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys
# 将本机 id_rsa.pub 或 id_ed25519.pub 的公钥内容粘贴到这里,保存退出
chmod 600 ~/.ssh/authorized_keys
创建仓库
cd /home/git
mkdir repos #创建仓库目录
cd repos
git init --bare hexo.git #创建仓库
创建一个钩子
接上面继续操作
cd /home/git/repos/hexo.git/hooks
vim post-receive
文件内容:
#!/bin/sh
set -e
git --work-tree=/var/www/blog --git-dir=/home/git/repos/hexo.git checkout -f master
保存后再执行:
chmod +x /home/git/repos/hexo.git/hooks/post-receive
本机 Hexo 的部署分支也应为 master;如果使用其他分支,两处对应修改。Web 服务的站点根目录配置为 /var/www/blog。
本地测试 SSH
前面已经把公钥写入服务器的 authorized_keys,这里不需要再重复 ssh-copy-id。在本机直接测试:
ssh git@server_ip
如果使用专门的 Ed25519 私钥,可通过 ~/.ssh/config 配置 IdentityFile,或临时使用 ssh -i <私钥路径> git@server_ip。首次连接时先核对服务器主机指纹,不要无条件接受异常变更。
更改git用户默认的shell
这一节需要在服务器管理员终端执行。前面如果仍处于 git 用户的 SSH 会话,先 exit 返回;不要在本机电脑上修改用户 shell。确认仓库、钩子和公钥已配置好,再限制 git 用户的交互式登录:
# 服务器 root 用户执行
GIT_SHELL=$(command -v git-shell)
test -n "$GIT_SHELL" || { echo "未找到 git-shell,请先安装 git" >&2; exit 1; }
usermod --shell "$GIT_SHELL" git
不需要手动编辑 /etc/passwd。若服务器的 PAM 策略要求 shell 位于 /etc/shells,由管理员核对后添加 git-shell 的实际路径。修改后普通交互式登录可能提示不允许进入 shell,这是预期行为;应在本机验证 Git 仓库访问:
git ls-remote git@server_ip:/home/git/repos/hexo.git
新建的空仓库可以没有分支输出,但命令应正常退出。然后在本机 Hexo _config.yml 中核对部署配置:
deploy:
type: git
repo: git@server_ip:/home/git/repos/hexo.git
branch: master
首次使用 git 部署器时,在本机博客目录安装 hexo-deployer-git,再执行 hexo generate 与 hexo deploy。实际域名、Web 服务和 HTTPS 需另外配置到 /var/www/blog。
BUG
报错remote: fatal: cannot create directory at '2019': Permission denied
部署目录没有写的权限,改法
ls -ld /var/www/blog
# 应由 git 用户拥有写权限;由管理员检查并修正这个部署目录的所有者
评论将在接近此处时加载,也可点击立即加载。