🚀 从零开始:安全自动部署 Hexo 博客到阿里云服务器(最小权限实践)

目标:每次 git push 到 GitHub,自动将 Hexo 博客部署到你的阿里云 Ubuntu 服务器,无需人工干预、无需 root 权限、符合安全最佳实践


✅ 为什么选择自建服务器?

  • 完全掌控环境
  • 国内访问速度快
  • 可扩展性强(未来可加 API、数据库等)
  • 成本可控(已有 ECS)

💡 本文采用 最小权限原则:部署用户无 sudo 权限,即使密钥泄露也无法提权。


🔧 第一步:初始化服务器(一次性操作)

1. 登录服务器(用默认用户,如 ubuntu

1
ssh -i ~/.ssh/your-key.pem ubuntu@<your-public-ip>

2. 安装 Nginx

1
sudo apt update && sudo apt install nginx -y

3. 创建专用部署用户(无 sudo 权限!

1
2
# 创建用户 blog,禁用密码登录
sudo adduser blog

4. 创建博客目录并设置权限

1
2
3
4
5
6
7
8
9
# 创建目录
sudo mkdir -p /var/www/hexo-blog

# 所有权:blog 用户可写,www-data(Nginx)可读
sudo chown -R blog:www-data /var/www/hexo-blog

# 权限:目录 755,文件 644(后续部署会自动设置)
sudo chmod -R 755 /var/www/hexo-blog
sudo find /var/www/hexo-blog -type f -exec chmod 644 {} \;

5. 配置 Nginx 站点

1
sudo vi /etc/nginx/sites-available/hexo-blog

粘贴:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name _;

root /var/www/hexo-blog;
index index.html;

location / {
try_files $uri $uri/ =404;
}

server_tokens off;
}

启用配置:

1
2
sudo ln -s /etc/nginx/sites-available/hexo-blog /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

🔑 第二步:配置 SSH 密钥(用于自动部署)

1. 在本地生成专用部署密钥

1
ssh-keygen -t rsa -b 4096 -f ~/.ssh/hexo_deploy -N ""
  • 私钥:~/.ssh/hexo_deploy
  • 公钥:~/.ssh/hexo_deploy.pub

2. 将公钥添加到服务器的 blog 用户

1
2
3
4
5
6
7
8
9
# 复制公钥内容
cat ~/.ssh/hexo_deploy.pub

# 在服务器上执行
sudo mkdir -p /home/blog/.ssh
echo "粘贴公钥内容" | sudo tee /home/blog/.ssh/authorized_keys
sudo chown -R blog:blog /home/blog/.ssh
sudo chmod 700 /home/blog/.ssh
sudo chmod 600 /home/blog/.ssh/authorized_keys

✅ 现在 GitHub 可以用私钥自动登录 blog 用户。


🤖 第三步:配置 GitHub Actions 自动部署

1. 在 GitHub 仓库添加 Secrets

进入 Settings → Secrets and variables → Actions

添加以下密钥:

Name Value
DEPLOY_HOST <your-public-ip>
DEPLOY_USER blog
SSH_PRIVATE_KEY cat ~/.ssh/hexo_deploy 的全部内容

2. 创建部署工作流

在本地 Hexo 项目根目录创建:

1
.github/workflows/deploy.yml

内容如下:

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
29
30
31
32
33
34
name: Deploy Hexo Blog

on:
push:
branches: [ main ] # 根据你的主分支调整

jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Install dependencies
run: npm install

- name: Generate static files
run: npx hexo generate

- name: Deploy to server
uses: burnett01/rsync-deployments@6.0.0
with:
switches: -avz --delete --chmod=755
path: public/
remote_path: /var/www/hexo-blog/
remote_host: ${{ secrets.DEPLOY_HOST }}
remote_user: ${{ secrets.DEPLOY_USER }}
remote_key: ${{ secrets.SSH_PRIVATE_KEY }}

🔍 关键参数说明:

  • --chmod=755:确保新上传的文件有正确权限
  • --delete:同步删除已移除的文件

🧪 第四步:测试部署

  1. 提交并推送代码:

    1
    2
    3
    git add .
    git commit -m "feat: enable auto deploy"
    git push
  2. 查看 GitHub Actions 日志(Actions 标签页

  3. 浏览器访问:

    1
    http://<your-public-ip>

    ✅ 应看到你的最新博客!


🔒 安全与维护

✅ 最小权限保障

  • blog 用户无法执行 sudo
  • 无法访问其他用户数据
  • 即使 GitHub 私钥泄露,攻击面极小

🛠️ 日常维护

  • 更新系统:用另一个管理账号(如 admin)执行 sudo apt upgrade
  • 查看日志
    1
    2
    sudo tail -f /var/log/nginx/access.log
    sudo journalctl -u nginx

🌐 后续优化(可选)

  • 绑定域名 + Let’s Encrypt HTTPS
  • 配置 Fail2ban 防暴力破解
  • 添加博客访问统计(如 GoatCounter)

📊 架构图

1
2
3
4
5
6
7
8
graph LR
A[本地写博客] -->|git push| B(GitHub)
B --> C{GitHub Actions}
C -->|SSH + rsync| D[阿里云 ECS]
D --> E[Nginx]
E --> F[用户访问 http://IP]
classDef secure fill:#e6f3ff,stroke:#0066cc;
class D,E,F secure;

✅ 总结

你现在已经拥有:

  • 全自动部署:推代码即上线
  • 高安全性:部署用户无提权能力
  • 高性能:Nginx 直接提供静态文件
  • 低成本:仅使用已有 ECS 资源

🎉 从此告别手动 scp/rsync,专注写作!


附:常见问题排查

问题 解决方法
403 Forbidden 检查 /var/www/hexo-blog 权限(755/644)
部署失败 查看 GitHub Actions 日志 + 服务器 ~/.ssh/authorized_keys
Nginx 未生效 运行 sudo nginx -t 检查配置

本文所有操作均基于 Ubuntu 22.04 + 阿里云 ECS,适用于绝大多数 Linux 服务器。