第一步:服务器端配置(宝塔面板)
1. 安装必要软件
在宝塔面板左侧「终端」登录服务器,执行:
# 安装 git(如果还没装)
yum install -y git # CentOS
# apt-get install -y git # Ubuntu
# 安装 Node.js(可选,如果需要在服务器端构建)
# 宝塔面板 → 软件商店 → 搜索 Node.js → 安装
2. 创建网站(宝塔面板)
- 宝塔面板 → 网站 → 添加站点
- 填写域名(或直接用服务器 IP)
- 记住网站根目录路径,例如:
/www/wwwroot/blog.yourdomain.com - 创建后,宝塔会自动配置 Nginx
3. 创建 Git 用户(推荐,更安全)
# 创建 git 用户
adduser git
# 设置密码
passwd git
# 赋予 sudo 权限(可选)
chmod 740 /etc/sudoers
vim /etc/sudoers
# 在 root ALL=(ALL) ALL 下方添加:
# git ALL=(ALL) ALL
chmod 400 /etc/sudoers
4. 创建 Git 裸仓库
# 切换到 git 用户(重要!后续操作都在 git 用户下进行)
su git
# 创建仓库目录
mkdir -p /home/git/repos
cd /home/git/repos
# 初始化裸仓库(--bare 表示没有工作区,只存储版本信息)
git init --bare blog.git
5. 配置 Git Hook(核心步骤)
# 进入 hooks 目录
cd /home/git/repos/blog.git/hooks
# 创建 post-receive 钩子文件
vim post-receive
写入以下内容(替换为你的实际路径):
#!/bin/bash
# 定义部署目录(宝塔站点根目录)
DEPLOY_DIR="/www/wwwroot/blog.yourdomain.com"
# 定义 Git 仓库目录
GIT_DIR="/home/git/repos/blog.git"
# 将推送的内容强制检出到网站目录
git --work-tree=$DEPLOY_DIR --git-dir=$GIT_DIR checkout -f
💡 原理说明:
post-receive是 Git 钩子,在服务器收到git push后自动执行。--work-tree指定检出目标目录,--git-dir指定仓库位置,-f强制覆盖。
保存后赋予执行权限:
chmod +x /home/git/repos/blog.git/hooks/post-receive
6. 设置目录权限
# 将仓库所有权交给 git 用户
chown -R git:git /home/git/repos/blog.git
# 将网站目录所有权也交给 git 用户(让 git 有权限写入)
chown -R git:git /www/wwwroot/blog.yourdomain.com
# 确保网站目录有写入权限
chmod -R 755 /www/wwwroot/blog.yourdomain.com
7. 配置 SSH 免密登录(关键!)
在本地电脑上生成 SSH 密钥(如果之前生成过可跳过):
# 本地终端执行
ssh-keygen -t ed25519 -C "hexo-deploy"
# 或旧版系统用:ssh-keygen -t rsa -C "hexo-deploy"
将本地公钥添加到服务器:
# 本地执行,将公钥复制到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub git@你的服务器IP
# 如果没有 ssh-copy-id,手动复制:
# cat ~/.ssh/id_ed25519.pub
# 然后粘贴到服务器的 /home/git/.ssh/authorized_keys 文件中
注意这一步需要输入密码,输入的是服务器git的密码,而不是服务器的登录密码!
在服务器上确保权限正确:
# 在服务器上执行(git 用户)
mkdir -p /home/git/.ssh
chmod 700 /home/git/.ssh
chmod 600 /home/git/.ssh/authorized_keys
测试免密登录:
# 本地执行
ssh git@你的服务器IP
# 如果不需要输入密码即登录成功,说明配置正确
第二步:本地 Hexo 配置
1. 安装部署插件
cd 你的hexo博客目录
npm install hexo-deployer-git --save
2. 修改 _config.yml
打开 Hexo 根目录的 _config.yml,找到 deploy 配置,修改为:
deploy:
type: git
repo: git@你的服务器IP:/home/git/repos/blog.git
branch: master # 或 main,与仓库分支一致
message: "Site updated: {{ now('YYYY-MM-DD HH:mm:ss') }}"
⚠️ 注意:
repo格式为git@服务器IP:仓库路径,使用 SSH 协议(不是 https)
3. 测试部署
# 清理、生成、部署(三连)
hexo clean && hexo generate && hexo deploy
# 或简写
hexo clean && hexo g -d
执行后你会看到类似输出:
INFO Validating config
INFO Start processing
INFO Files loaded in 1.23 s
INFO Generated: 2024/...
INFO Deploying: git
INFO Setting up Git deployment...
INFO Clearing .deploy_git folder...
INFO Copying files from public folder...
INFO Committing: Site updated: 2026-05-16 18:44:00
INFO Pushing to git@你的服务器IP:/home/git/repos/blog.git...
如果一切正常,打开你的域名就能看到博客了!
第三步:宝塔面板后续配置
1. 配置 Nginx(宝塔自动完成)
宝塔创建站点时已自动配置 Nginx,你可以在:
网站 → 设置 → 配置文件 中查看:
server {
listen 80;
server_name blog.yourdomain.com;
root /www/wwwroot/blog.yourdomain.com;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}
2. 配置 SSL/HTTPS(强烈建议)
- 宝塔面板 → 网站 → 设置 → SSL
- 选择 Let’s Encrypt → 申请免费证书
- 勾选 强制 HTTPS
3. 配置伪静态(可选)
Hexo 是静态博客,一般不需要。但如果使用了某些主题的特殊路由,可以在:
网站 → 设置 → 伪静态 中配置。
常见问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
hexo d 提示权限拒绝 |
SSH 密钥未配置或权限不对 | 检查 ~/.ssh/authorized_keys 权限是否为 600 |
hexo d 成功但网站没更新 |
post-receive 钩子未执行或路径错误 | 检查钩子文件权限 chmod +x,确认路径正确 |
| 网站显示 403 | 目录权限不足 | chown -R git:git /www/wwwroot/xxx 和 chmod -R 755 |
| 宝塔默认页面覆盖博客 | 宝塔自动生成的 index.html 存在 | 删除站点根目录下的默认文件 |
.user.ini 导致无法写入 |
宝塔防跨站设置 | 网站设置 → 关闭防跨站攻击,或删除 .user.ini |
hexo d 要求输入密码 |
SSH 免密未配置成功 | 重新配置 SSH 密钥,确认 authorized_keys 内容正确 |
| 样式/CSS 加载 404 | _config.yml 中 url 或 root 配置错误 |
检查并修改为正确域名 |
进阶:同时部署到多个平台
如果你想同时推送到 GitHub Pages 和自有服务器,可以配置多个 deploy:
deploy:
- type: git
repo: git@github.com:你的用户名/你的用户名.github.io.git
branch: main
- type: git
repo: git@你的服务器IP:/home/git/repos/blog.git
branch: master
快速检查清单
- 服务器已安装 Git
- 宝塔面板已创建站点,记住根目录路径
- 已创建 git 用户并设置密码
- 已创建裸仓库
git init --bare -
post-receive钩子已创建并赋予chmod +x权限 - 钩子中的
work-tree路径与宝塔站点根目录一致 - 仓库和网站目录所有权已交给 git 用户
- 本地已生成 SSH 密钥并添加到服务器
- 本地
_config.yml中repo使用 SSH 格式 - 已安装
hexo-deployer-git插件 - 测试
ssh git@服务器IP无需密码 - 执行
hexo clean && hexo g -d成功
配置完成后,以后每次更新博客只需要:
hexo new "文章标题"
# 写文章...
hexo clean && hexo g -d
博客就会自动部署到你的服务器上!