宝塔服务器搭建hexo博客

原文CSDN:将Hexo部署到云服务器(使用宝塔面板)

服务器环境配置

安装宝塔

宝塔面板下载,免费全能的服务器运维软件

Hexo 博客 Git 自动化部署全流程知识库

一、整体架构

1.1 部署原理图

1
本地 Hexo → Git 推送 → 服务器 Git 裸仓库 → post-receive 钩子 → 网站目录 (Nginx/Apache)

1.2 核心组件

  • 客户端:Hexo + Git + SSH 密钥
  • 服务端:Git 裸仓库 + 钩子脚本 + Web 服务器
  • 自动化:Git Hooks 实现自动同步

二、服务器端配置

2.1 环境准备

1
2
3
4
5
6
7
8
9
10
# 1. 安装 Git(Ubuntu/Debian)
apt-get update
apt-get install git -y

# 2. 创建专用用户(增强安全性)
adduser git
passwd git # 设置强密码

# 3. 检查网站目录(宝塔面板创建)
# 默认路径:/www/wwwroot/域名

2.2 Git 仓库配置

1
2
3
4
5
6
7
# 切换到 git 用户
su git # 从 root 切换
# 或 sudo su git # 从 sudo 用户切换

# 创建裸仓库(无工作区)
cd ~
git init --bare hexo-blog.git

2.3 钩子脚本设置

1
2
3
4
5
6
7
8
9
# 编辑 post-receive 钩子
vim /home/git/hexo-blog.git/hooks/post-receive

# 脚本内容:
#!/bin/bash
git --work-tree=/www/wwwroot/bbling.cc --git-dir=/home/git/hexo-blog.git checkout -f

# 添加执行权限
chmod +x /home/git/hexo-blog.git/hooks/post-receive

2.4 目录权限配置

1
2
3
# 确保网站目录存在且权限正确
chown git:www /www/wwwroot/bbling.cc # git 可写,www 可读
chmod 750 /www/wwwroot/bbling.cc

三、SSH 免密登录配置

3.1 本地生成 SSH 密钥

1
2
# 在本地计算机执行
ssh-keygen -t rsa # 默认保存到 ~/.ssh/id_rsa

3.2 服务器端配置

1
2
3
4
5
6
7
8
# 在服务器以 root 执行
mkdir -p /home/git/.ssh
touch /home/git/.ssh/authorized_keys

# 设置正确的权限(关键!)
chown -R git:git /home/git/.ssh
chmod 700 /home/git/.ssh
chmod 600 /home/git/.ssh/authorized_keys

3.3 公钥格式要求

  • 正确格式ssh-rsa AAAAB3NzaC1yc2E... user@host
  • 常见错误sh-rsa(少一个 s)
  • 验证命令cat ~/.ssh/authorized_keys

四、本地 Hexo 配置

4.1 修改 _config.yml

1
2
3
4
deploy:
type: git
repo: git@101.126.143.42:/home/git/hexo-blog.git
branch: master

4.2 测试连接

1
2
3
4
5
6
# 测试 SSH 连接
ssh git@101.126.143.42

# 首次连接会提示主机验证,输入 yes
The authenticity of host '101.126.143.42 (101.126.143.42)' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

五、部署执行

5.1 标准部署命令

1
hexo clean && hexo g && hexo d

5.2 部署日志解读

1
2
3
4
5
INFO  Validating config      # 配置验证
INFO Start processing # 开始生成
INFO Files loaded in X s # 文件加载时间
INFO Generated: X files # 生成文件统计
INFO Deploying: git # 开始 Git 部署

六、常见问题与解决方案

6.1 Git 已安装问题

现象git is already the newest version
状态:正常提示,无需操作

6.2 用户权限问题

问题git is not in the sudoers file
原因:git 用户不应有 sudo 权限
解决:使用 su git 而非 sudo su git

6.3 目录不存在问题

问题chown: cannot access '/path': No such file or directory
解决

  1. 在宝塔面板创建网站
  2. 确认正确的网站根目录路径
  3. 修正钩子脚本中的路径

6.4 SSH 免密失败问题

排查步骤

1
2
3
4
5
6
7
8
9
10
11
# 1. 检查公钥格式
cat /home/git/.ssh/authorized_keys
# 必须以 ssh-rsa 或 ssh-ed25519 开头

# 2. 检查权限
ls -la /home/git/.ssh/
# .ssh 目录应为 700 (drwx------)
# authorized_keys 应为 600 (-rw-------)

# 3. 修正格式错误
sed -i 's/^sh-rsa/ssh-rsa/' /home/git/.ssh/authorized_keys

6.5 Git 进程锁定问题

问题fatal: Unable to create '.deploy_git/.git/index.lock': File exists
原因:上次部署被异常中断
解决

1
2
3
4
5
# 删除锁文件
rm -f .deploy_git/.git/index.lock

# 或清理部署目录
hexo clean

6.6 部署后网站无法访问

检查清单

  1. 网站目录权限:ls -ld /www/wwwroot/bbling.cc
  2. 钩子脚本权限:ls -l /home/git/hexo-blog.git/hooks/post-receive
  3. 钩子脚本路径:确保网站目录路径正确
  4. Web 服务状态:在宝塔面板重启 Nginx/Apache

七、安全配置建议

7.1 用户安全

1
2
3
4
# 禁用 git 用户的 shell 登录(部署完成后执行)
# 编辑 /etc/passwd,将 git 用户的 shell 改为:
git:x:1001:1001::/home/git:/usr/bin/git-shell
# 或 /bin/false(完全禁止登录)

7.2 文件权限规范

文件/目录 推荐权限 所有者 作用
/home/git/.ssh 700 git:git SSH 配置目录
authorized_keys 600 git:git 公钥存储
网站根目录 750 git:www 网站文件存储
钩子脚本 755 git:git 自动部署脚本

7.3 网络加固

  1. 修改 SSH 端口(非 22)
  2. 禁用 root 密码登录
  3. 配置防火墙规则
  4. 定期更新系统补丁

八、自动化脚本汇总

8.1 服务器一键配置脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/bin/bash
# 服务器初始化脚本(以 root 执行)
USER="git"
SITE_DIR="/www/wwwroot/bbling.cc"
REPO_DIR="/home/$USER/hexo-blog.git"

# 创建用户
adduser $USER
echo "请为 $USER 用户设置密码:"
passwd $USER

# 创建目录
su - $USER -c "git init --bare $REPO_DIR"

# 创建钩子脚本
cat > $REPO_DIR/hooks/post-receive << EOF
#!/bin/bash
git --work-tree=$SITE_DIR --git-dir=$REPO_DIR checkout -f
EOF

chmod +x $REPO_DIR/hooks/post-receive
chown -R $USER:$USER $REPO_DIR

# 设置网站目录权限
chown $USER:www $SITE_DIR
chmod 750 $SITE_DIR

echo "服务器配置完成!"

8.2 本地部署测试脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# 本地部署测试脚本
echo "1. 测试 SSH 连接..."
ssh git@101.126.143.42 "echo 'SSH 连接成功!'"

echo "2. 清理并生成..."
hexo clean
hexo g

echo "3. 部署..."
hexo d

echo "4. 检查网站..."
curl -I http://bbling.cc

九、监控与维护

9.1 部署状态检查

1
2
3
4
5
6
7
8
# 查看最近部署日志
tail -f /home/git/hexo-blog.git/hooks/post-receive.log

# 检查网站文件
ls -lh /www/wwwroot/bbling.cc | head -20

# 查看 Web 服务日志
tail -f /www/wwwlogs/bbling.cc.log

9.2 定期维护任务

  1. 每周:备份 Git 仓库和网站文件
  2. 每月:更新 Hexo 主题和插件
  3. 每季:审查服务器安全日志
  4. 每年:更新 SSL 证书和密钥

十、故障排除流程图

1
2
3
4
5
6
7
8
9
10
11
12
13
部署失败
|
├─ 检查 SSH 连接
│ ├─ 成功 → 检查 Git 配置
│ └─ 失败 → 检查公钥权限/格式

├─ 检查 Git 推送
│ ├─ 成功 → 检查钩子脚本
│ └─ 失败 → 检查仓库权限

└─ 检查网站访问
├─ 正常 → 部署成功
└─ 失败 → 检查目录权限/Web服务

总结要点

  1. 权限是核心:正确的文件权限(700/600/750)是部署成功的关键
  2. 路径要准确:钩子脚本中的网站路径必须与实际一致
  3. 公钥需完整:SSH 公钥必须与本地 id_rsa.pub 完全一致
  4. 用户需专用:使用 git 专用用户,禁用不必要的权限
  5. 测试分步骤:先测试 SSH,再测试部署,最后验证网站

此知识库涵盖了从零开始配置 Hexo 自动化部署的全部流程,包括常见问题的解决方案和最佳安全实践。建议将此文档保存为本地参考,方便日后维护和故障排除。

密钥报错解决方法

方法 1:删除旧的 known_hosts 条目(推荐)

错误信息已经告诉你问题所在:

1
Offending ECDSA key in /c/Users/Lin/.ssh/known_hosts:5

这意味着 known_hosts 文件的第 5 行 存储了旧的密钥,需要删除它。

步骤

  1. 打开 known_hosts 文件

    (使用

    1
    notepad

    1
    vim

    1
    nano

    ):

    1
    2
    3
    bash

    nano /c/Users/Lin/.ssh/known_hosts
  2. 删除第 5 行(或整行包含 101.126.143.42 的内容)。

  3. 保存并退出(在 nano 中按 Ctrl+OEnterCtrl+X)。

  4. 重新尝试 git clone

    1
    2
    3
    bash

    git clone git@101.126.143.42:/home/git/repos/bbling.git
    • 这次 SSH 会提示你确认新的主机密钥,输入 yes 即可。

方法 2:直接清除 known_hosts(适用于测试环境)

如果你确定这个 IP 是安全的(例如,是你自己的服务器),可以直接删除整个 known_hosts 文件:

1
rm /c/Users/Lin/.ssh/known_hosts

然后重新运行 git clone,SSH 会重新记录正确的密钥。