Astro + GitHub Actions 自动化部署到个人服务器

· 英文版

对于独立开发者而言,部署流程中的“心智摩擦”应当趋近于零。

本网站基于 Astro 框架构建。为了将本地代码高效交付至个人服务器,采用 GitHub Actions 配合 rsync/SSH 是目前最为标准、低阻力的工业级实践。

这套闭环打通后,你只需专注本地内容产出。一次极简的 git push 即可接管后续所有工作:触发云端自动构建(npm run build),并将编译后的 dist/ 目录精准、安全地同步至服务器端。

以下是剔除冗余后的最小可行性配置指南,涵盖了从服务器配置到自动化落地的核心环节。


一、 服务器端:配置专属密钥与权限收敛

为实现 GitHub Actions 对服务器的自动化推送,需建立基于 RSA 密钥的免密信任机制。请在服务器终端依次执行以下操作:

1. 生成部署专用密钥对

生成专属密钥(请勿设置密码,一路回车即可):

ssh-keygen -m PEM -t rsa -b 4096 -C "github-actions-deploy" -f ~/.ssh/github_actions

2. 注入公钥白名单

将生成的公钥.pub)追加写入服务器的 SSH 授权列表中:

cat ~/.ssh/github_actions.pub >> ~/.ssh/authorized_keys

3. 收敛目录权限(高频报错点)

Linux 的 sshd 守护进程具有极其严格的安全底线。若文件权限过度暴露,将静默拒绝所有密钥连接。必须严格执行以下覆写命令:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

4. 提取私钥凭证

在终端打印并完整复制私钥内容(务必包含 -----BEGIN...-----END... 首尾声明),准备注入至 GitHub:

cat ~/.ssh/github_actions

二、 GitHub 端:配置机密环境变量 (Secrets)

服务器的登录凭证绝不可硬编码于仓库代码中。进入你的 GitHub 仓库主页,导航至: Settings -> Secrets and variables -> Actions -> New repository secret

依次建立以下 3 个机密变量:

  • SERVER_HOST:服务器公网 IP 地址。
  • SERVER_USER:服务器的登录用户名(如 rootubuntu)。
  • SERVER_SSH_KEY:刚刚复制的私钥完整内容

三、 代码库:编排自动化工作流 (Workflow)

在 Astro 项目根目录下创建 .github/workflows/deploy.yml 文件。此脚本将拦截每一次向 main 分支的推送请求并自动执行部署任务。

name: 🚀 Build and Deploy Astro

on:
  push:
    branches:
      - main

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

    steps:
      - name: 🛎️ Checkout Code
        uses: actions/checkout@v4

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

      - name: 📦 Install Dependencies
        run: npm ci

      - name: 🛠️ Build Astro Site
        run: npm run build

      - name: ☁️ Deploy to Server
        uses: easingthemes/ssh-deploy@main
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}
          # 开启 --delete 确保自动清理远端废弃文件
          ARGS: "-rlgoDzvc -i --delete"
          SOURCE: "dist/" # Astro 编译后的默认输出目录
          REMOTE_HOST: ${{ secrets.SERVER_HOST }}
          REMOTE_USER: ${{ secrets.SERVER_USER }}
          # ⚠️ 请替换为服务器实际的网站绝对路径
          TARGET: "/var/www/your-site"

全部配置完成后,将代码推送至主分支。检查 GitHub 的 Actions 面板,若构建任务显示绿色对勾,即代表整个自动化部署链路已成功闭环。