🚀 用宝塔面板把 Hexo 部署到服务器

[!WARNING]
本教程属于较早期方案,部分细节可能已经落后。如果你想用更现代、更稳定的自动化流程,建议优先阅读站内新教程:/posts/2cd5d824.html

📝 前言

如果你已经把 Hexo 博客写起来了,但觉得 GitHub Pages 访问速度不理想,或者你希望把网站真正部署到自己的服务器上,那么“宝塔面板 + Nginx + Git 自动部署”是一条很经典的路线。

这篇文章会带你完成一套传统但实用的服务器部署方案:本地写文章,执行部署命令后,服务器自动更新站点内容。


🎯 一、部署思路与流程

整个流程可以理解为下面这条链路:

  1. 服务器安装宝塔面板与 Nginx
  2. 服务器创建专门用于接收代码的 Git 仓库
  3. 本地 Hexo 将生成后的内容推送到服务器仓库
  4. 服务器通过 Git Hooks 自动把内容发布到网站目录
  5. 由 Nginx 对外提供访问

[!TIP]
这类方案的核心重点不在“装软件”,而在“权限、路径、仓库、钩子”四件事是否都配置正确。


🔧 二、前置准备

在开始之前,建议你先准备好:

  • 一台可远程连接的 Linux 服务器
  • 已解析到服务器的域名(可选,但强烈推荐)
  • 本地已经安装好 Hexo、Node.js、Git
  • 能正常使用 SSH 连接服务器

如果你的 Hexo 还没搭好,可以先看站内基础教程:/posts/70db7d7c.html


🏗️ 三、安装宝塔与 Nginx

1. 安装宝塔面板

前往宝塔官网下载对应系统的安装脚本:

连接服务器后,以 root 身份执行对应命令,安装完成后根据提示登录面板后台。

2. 安装 Nginx

进入宝塔面板后:

  1. 打开“软件商店”
  2. 安装 Nginx
  3. 暂时不需要先装 PHP、MySQL

3. 创建站点

在宝塔中创建你的网站:

  1. 打开“网站”
  2. 点击“添加站点”
  3. 填入你的域名
  4. 记住站点目录名称,例如:xmdblog.com

添加站点

[!NOTE]
后续自动部署时,生成的站点文件就会发布到这个目录。


🔐 四、服务器端 Git 仓库配置

1. 创建 git 用户

先在服务器中创建专门用于部署的用户:

adduser git

如果你需要给这个用户更高权限,可以临时调整 sudoers

chmod 740 /etc/sudoers
vim /etc/sudoers
# 在 root ALL=(ALL) ALL 下方添加
# git ALL=(ALL) ALL
chmod 400 /etc/sudoers

[!WARNING]
修改 sudoers 要格外小心,写错会影响系统 sudo 功能。不会改的话建议先备份。

2. 配置 SSH 公钥登录

在本地电脑生成 SSH 密钥:

ssh-keygen -t rsa -C "网站目录名"

如果你已经有密钥,可以直接复用。

然后在服务器中切换到 git 用户并创建 .ssh 目录:

su git
cd
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

接着把你本地的 id_rsa.pub 内容复制到服务器的:

/home/git/.ssh/authorized_keys

保存后,在本地测试:

ssh git@服务器IP

如果能正常连接,就说明密钥配置成功。


📦 五、创建裸仓库并配置自动部署

1. 创建 Git 仓库目录

在服务器上执行:

sudo mkdir /home/git/repos
cd /home/git/repos
sudo git init --bare xmdblog.git

这一步创建的是一个“裸仓库”,它专门用来接收推送,不直接作为工作目录编辑。

2. 配置 Git Hooks 自动发布

找到:

/home/git/repos/xmdblog.git/hooks/post-update.sample

把它改名为:

post-update

并将内容改成:

#!/bin/sh
git --work-tree=/www/wwwroot/网站目录名 --git-dir=/home/git/repos/仓库名.git checkout -f

它的作用是:每次你把内容推送到仓库后,自动把内容签出到网站目录。

3. 赋予权限

cd /home/git/repos/xmdblog.git/hooks
sudo chmod +x post-update
sudo chown -R git:git /home/git/repos/
sudo chown -R git:git /www/wwwroot/网站目录名/

[!TIP]
如果你在宝塔里看到 .user.ini 导致无法操作网站目录,可以先临时删除它再继续。


⚙️ 六、本地 Hexo 配置

接下来回到你自己的 Hexo 项目,修改根目录下的 _config.yml

1. 安装 Git 部署插件

npm install hexo-deployer-git --save

2. 修改部署配置

deploy:
type: git
repo: git@服务器IP:/home/git/repos/仓库名.git
branch: master

如果你的域名已经解析到服务器,也可以把 服务器IP 换成域名。


🚀 七、执行部署

全部配置完成后,本地执行:

hexo clean
hexo generate
hexo deploy

如果一切正常,推送完成后服务器端会自动把内容同步到网站目录。

此时再访问你的域名,就应该能看到已经上线的博客了。

[!NOTE]
原文里写成了 hexo delopy,这里要注意正确命令是 hexo deploy


🌐 八、配置 HTTPS 与访问优化

博客能访问后,建议你继续做两件事:

1. 配置 SSL 证书

在宝塔站点设置里申请 Let’s Encrypt 证书,开启 HTTPS。

2. 配置重定向

建议把访问统一到你最终使用的域名版本,例如:

  • 强制跳转到 https
  • 统一跳转到 www 或非 www

这样对 SEO 和访问体验都更友好。


🛠️ 九、常见问题排查

1. 推送成功但网站没更新

优先检查:

  • post-update 是否有执行权限
  • 仓库路径和站点路径是否写对
  • 网站目录权限是否属于 git 用户

2. SSH 连接失败

优先检查:

  • 本地公钥是否正确添加到 authorized_keys
  • .ssh 目录权限是否正确
  • 服务器防火墙是否放行 SSH 端口

3. 页面能打开但样式丢失

优先检查:

  • Hexo 的 urlroot 配置
  • 静态资源是否完整上传
  • Nginx 站点根目录是否正确

4. 网站目录无法写入

优先检查:

  • 网站目录归属用户
  • 是否存在 .user.ini 限制
  • 宝塔是否开启了额外防护策略

📚 总结

这套“宝塔面板 + Git Hooks + Nginx”的方案虽然不如 CI/CD 现代,但对于很多个人站长来说依然足够实用。它的优点是:

  • 思路直观
  • 部署链路清晰
  • 适合自己掌控服务器环境
  • 能帮助理解静态站点部署原理

如果你更看重自动化、可维护性和安全性,下一步建议升级到 GitHub Actions 或 GitLab CI 的方案。


💬 讨论

欢迎在评论区交流:

  1. 你更喜欢传统 Git Hooks 部署,还是 CI/CD 自动部署?
  2. 你在服务器部署过程中,最容易卡在哪一步?
  3. 如果你愿意,我也可以继续帮你把这套方案改造成更现代的部署流程。