用 Git 裸仓库部署 Hexo 静态站点

500 字
3 分钟
用 Git 裸仓库部署 Hexo 静态站点

目标#

把 Hexo 生成的静态文件推送到 GitHub 和一台自建服务器。服务器使用专用 deploy 用户接收 Git 推送,Nginx 只读取发布目录。

前置条件#

  • 已有域名、服务器和可用的 HTTPS 配置。
  • 已创建无交互管理权限的 deploy 用户。
  • 已验证本地 Hexo 可以成功生成 public/。
  • 已备份现有站点目录。

不要以 root 身份接收 Git 推送,也不要把 Nginx worker 改成 root。

创建裸仓库和发布目录#

在服务器上执行:

sudo install -d -o deploy -g deploy /srv/git/blog.git
sudo install -d -o deploy -g www-data /var/www/blog
sudo -u deploy git init --bare /srv/git/blog.git

只把本地部署公钥加入 deploy 用户的 authorized_keys。如果服务器托管多个服务,应进一步限制该密钥可执行的命令和来源地址。

添加 post-receive hook#

创建 /srv/git/blog.git/hooks/post-receive:

#!/bin/sh
set -eu

GIT_WORK_TREE=/var/www/blog
GIT_DIR=/srv/git/blog.git

git --work-tree="$GIT_WORK_TREE" --git-dir="$GIT_DIR" checkout -f main

然后设置权限:

sudo chown deploy:deploy /srv/git/blog.git/hooks/post-receive
sudo chmod 0755 /srv/git/blog.git/hooks/post-receive

发布目录只存放生成产物。checkout -f 会覆盖其中的同名文件,不要在该目录手工编辑内容。

配置 Nginx#

server {
    listen 80;
    server_name blog.example.com;
    root /var/www/blog;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

测试配置后再重载:

sudo nginx -t
sudo systemctl reload nginx

生产环境应配置 HTTPS、安全响应头、访问日志和发布目录权限。

配置 Hexo 多目标部署#

安装 hexo-deployer-git 后,在 _config.yml 中配置:

deploy:
  type: git
  repo:
    github: git@github.com:USERNAME/USERNAME.github.io.git
    server: deploy@SERVER:/srv/git/blog.git
  branch: main

发布前先生成并本地验证:

npx hexo clean
npx hexo generate
npx hexo deploy

验证与回滚#

确认 GitHub Pages 和自建站点展示同一个提交版本。自建服务器可以在裸仓库中保留发布历史;回滚时把确认过的旧提交重新推送到 main,或在维护窗口执行指定提交的 checkout。

更复杂的项目应使用 CI 构建、制品校验和原子目录切换,避免本机环境差异与部署中途产生半成品。

参考#

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

用 Git 裸仓库部署 Hexo 静态站点
https://blog.mintalix.com/posts/study-multi-terminal-deployment/
作者
Mint
发布于
2022-04-02
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
Mint
软件开发、工程实践与技术思考。
分类
标签