hexo博客通过宝塔部署到服务器


第一步:服务器端配置(宝塔面板)

1. 安装必要软件

在宝塔面板左侧「终端」登录服务器,执行:

# 安装 git(如果还没装)
yum install -y git        # CentOS
# apt-get install -y git  # Ubuntu

# 安装 Node.js(可选,如果需要在服务器端构建)
# 宝塔面板 → 软件商店 → 搜索 Node.js → 安装

2. 创建网站(宝塔面板)

  1. 宝塔面板 → 网站添加站点
  2. 填写域名(或直接用服务器 IP)
  3. 记住网站根目录路径,例如:/www/wwwroot/blog.yourdomain.com
  4. 创建后,宝塔会自动配置 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(强烈建议)

  1. 宝塔面板 → 网站 → 设置 → SSL
  2. 选择 Let’s Encrypt → 申请免费证书
  3. 勾选 强制 HTTPS

3. 配置伪静态(可选)

Hexo 是静态博客,一般不需要。但如果使用了某些主题的特殊路由,可以在:

网站 → 设置 → 伪静态 中配置。


常见问题排查

问题 原因 解决方案
hexo d 提示权限拒绝 SSH 密钥未配置或权限不对 检查 ~/.ssh/authorized_keys 权限是否为 600
hexo d 成功但网站没更新 post-receive 钩子未执行或路径错误 检查钩子文件权限 chmod +x,确认路径正确
网站显示 403 目录权限不足 chown -R git:git /www/wwwroot/xxxchmod -R 755
宝塔默认页面覆盖博客 宝塔自动生成的 index.html 存在 删除站点根目录下的默认文件
.user.ini 导致无法写入 宝塔防跨站设置 网站设置 → 关闭防跨站攻击,或删除 .user.ini
hexo d 要求输入密码 SSH 免密未配置成功 重新配置 SSH 密钥,确认 authorized_keys 内容正确
样式/CSS 加载 404 _config.ymlurlroot 配置错误 检查并修改为正确域名

进阶:同时部署到多个平台

如果你想同时推送到 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.ymlrepo 使用 SSH 格式
  • 已安装 hexo-deployer-git 插件
  • 测试 ssh git@服务器IP 无需密码
  • 执行 hexo clean && hexo g -d 成功

配置完成后,以后每次更新博客只需要:

hexo new "文章标题"
# 写文章...
hexo clean && hexo g -d

博客就会自动部署到你的服务器上!


文章作者: 微笑紫瞳星
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 微笑紫瞳星 !
  目录