Github自动部署hexo至云服务器

前言

作为一个技术博主,我一直在寻找更高效的博客发布流程。最近我成功配置了GitHub Actions自动部署Hexo博客到云服务器的工作流,彻底解放了我的双手!只需要将博客内容推送到GitHub仓库,剩下的部署工作全部自动完成。在本文中,我将分享详细的配置过程、遇到的问题以及解决方案,希望能帮助到有同样需求的朋友。

一、基本原理

整个自动部署流程基于GitHub Actions和ssh-deploy插件实现。当我们将新的博客内容推送到GitHub仓库后,GitHub Actions会自动执行预设的工作流:

  1. 检出代码仓库
  2. 设置Node.js环境
  3. 安装Hexo依赖
  4. 生成静态博客文件
  5. 通过SSH将生成的文件推送到云服务器

整个过程完全自动化,无需任何人工干预。

二、环境准备

2.1 需要的组件

  • GitHub账号和存放Hexo博客的仓库
  • 云服务器(本文以腾讯云为例)
  • 已安装Hexo博客框架的项目

2.2 生成SSH密钥对

首先,我们需要生成一对SSH密钥用于GitHub Actions与云服务器之间的安全通信:

# 在本地计算机上执行
ssh-keygen -m PEM -t rsa -b 4096 -f ~/.ssh/github_deploy_key -N ""

这个命令会生成两个文件:

  • ~/.ssh/github_deploy_key(私钥)
  • ~/.ssh/github_deploy_key.pub(公钥)

💡 注意:不要为私钥设置密码,因为在自动部署过程中无法输入密码。

三、配置GitHub仓库

3.1 添加Secrets

在GitHub仓库中添加必要的密钥信息:

  1. 进入GitHub仓库页面,点击”Settings” > “Secrets and variables” > “Actions”
  2. 点击”New repository secret”,添加以下几个secret:
名称 说明 示例
SSH_PRIVATE_KEY SSH私钥内容 复制~/.ssh/github_deploy_key文件的全部内容
REMOTE_HOST 服务器地址 123.123.123.123
REMOTE_USER 服务器用户名 root或创建的专用部署用户名
REMOTE_TARGET 博客部署目录 /var/www/html/blog

3.2 创建GitHub Actions工作流

在项目根目录下创建.github/workflows/deploy.yml文件:

name: Deploy Hexo Blog

on:
push:
branches:
- main # 或您的主分支名称

jobs:
build-and-deploy:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '16.x'

- name: Install Hexo CLI
run: npm install -g hexo-cli

- name: Install dependencies
run: npm install

- name: Generate static files
run: hexo clean && hexo generate

- name: Deploy to Server
uses: easingthemes/ssh-deploy@main
with:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
ARGS: "-rlgoDzvc -i --delete"
SOURCE: "public/" # Hexo生成的静态文件目录
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
EXCLUDE: "/.git/, /node_modules/"

四、配置云服务器

4.1 添加SSH公钥到服务器

将之前生成的公钥添加到服务器的authorized_keys文件中:

# 在服务器上执行
mkdir -p ~/.ssh
echo "ssh-rsa AAAA...(你的公钥内容)" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

4.2 确保目标目录存在并设置权限

# 在服务器上执行
mkdir -p /var/www/html/blog # 替换为你的实际部署目录
chmod 755 /var/www/html/blog

五、解决常见问题

5.1 SSH连接权限问题

如果遇到Permission denied (publickey,password)错误,可能是以下原因:

  1. SSH密钥格式不正确:确保使用-m PEM参数生成密钥
  2. authorized_keys权限问题:检查权限chmod 600 ~/.ssh/authorized_keys
  3. SSH目录权限问题:检查权限chmod 700 ~/.ssh
  4. 公钥内容错误:确认公钥正确添加到服务器

5.2 解决腾讯云频繁告警问题

每次GitHub Actions执行部署时,腾讯云可能会发出异常登录告警。为解决这个问题,我们可以创建一个专用的部署用户,并将其添加到腾讯云的可信用户列表中。

六、创建专用部署用户(推荐)

创建专用部署用户不仅可以解决告警问题,还能提高安全性。以下是详细步骤:

6.1 创建部署用户

# 登录服务器后执行
# 创建用户
sudo useradd -m deploy-hexo

# 设置密码(可选)
sudo passwd deploy-hexo

# 创建SSH目录
sudo mkdir -p /home/deploy-hexo/.ssh
sudo chmod 700 /home/deploy-hexo/.ssh

6.2 配置SSH密钥认证

# 创建authorized_keys文件
sudo touch /home/deploy-hexo/.ssh/authorized_keys
sudo chmod 600 /home/deploy-hexo/.ssh/authorized_keys

# 添加之前生成的公钥
sudo sh -c 'echo "ssh-rsa AAAA...(你的公钥内容)" > /home/deploy-hexo/.ssh/authorized_keys'

# 设置正确的文件所有权
sudo chown -R deploy-hexo:deploy-hexo /home/deploy-hexo/.ssh

6.3 配置部署目录权限

# 配置博客部署目录的权限
sudo mkdir -p /var/www/html/blog # 替换为实际部署目录
sudo chown -R deploy-hexo:deploy-hexo /var/www/html/blog
sudo chmod -R 755 /var/www/html/blog

6.4 增强安全性(可选)

限制部署用户的权限,提高安全性:

# 修改SSH配置
sudo nano /etc/ssh/sshd_config

# 添加以下内容
Match User deploy-hexo
PasswordAuthentication no
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
GatewayPorts no
AllowAgentForwarding no

# 重启SSH服务
sudo systemctl restart sshd

6.5 更新GitHub Actions配置

在GitHub仓库设置中更新REMOTE_USER密钥为deploy-hexo,确保GitHub Actions使用新创建的部署用户。

6.6 在腾讯云设置中添加可信用户

  1. 登录腾讯云控制台
  2. 进入「安全中心」或相关安全管理页面
  3. 找到「异常登录告警」设置
  4. deploy-hexo添加到可信用户列表中

七、部署记录和监控

为了更好地追踪部署过程,可以添加部署日志记录:

# 在GitHub Actions工作流中添加
- name: Deploy to Server
uses: easingthemes/ssh-deploy@main
with:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
ARGS: "-rlgoDzvc -i --delete"
SOURCE: "public/"
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
EXCLUDE: "/.git/, /node_modules/"
# 添加部署日志
SCRIPT_BEFORE: |
echo "GitHub Actions deployment started at $(date)" >> ~/deployment_log.txt
SCRIPT_AFTER: |
echo "GitHub Actions deployment completed at $(date)" >> ~/deployment_log.txt

八、安全性建议和最佳实践

  1. 定期轮换SSH密钥:每3-6个月更新一次部署密钥
  2. 限制部署用户权限:仅授予必要的目录访问权限
  3. 使用特定分支触发部署:避免测试分支意外触发部署
  4. 监控部署日志:定期检查部署日志,确保没有异常
  5. 备份重要文件:在部署前添加备份脚本
# 添加备份脚本示例
SCRIPT_BEFORE: |
backup_dir="/backup/blog/$(date +%Y%m%d%H%M%S)"
mkdir -p $backup_dir
cp -r /var/www/html/blog/* $backup_dir

九、故障排查指南

如果自动部署失败,可以按照以下步骤进行排查:

  1. 检查GitHub Actions运行日志,查找具体错误信息
  2. 测试SSH连接是否正常:
    ssh -i ~/.ssh/github_deploy_key deploy-hexo@your_server_ip "echo Test successful"
  3. 确认目标目录权限是否正确
  4. 验证GitHub Secrets是否正确设置
  5. 检查工作流文件语法是否有误

十、总结

通过GitHub Actions和ssh-deploy插件,我们成功实现了Hexo博客的自动部署。这种方式不仅提高了效率,还确保了部署过程的一致性。创建专用部署用户进一步增强了安全性,同时解决了云服务器频繁告警的问题。

现在,我只需专注于创作内容,将更新推送到GitHub,剩下的部署工作都会自动完成。希望这篇教程对你也有所帮助!

如果你在配置过程中遇到任何问题,欢迎在评论区留言讨论。


参考资料

Happy coding! 🚀