架构概览

每日自动更新的完整流程:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
GitHub Actions (每日 06:00 UTC)
    
1. 拉取最新仓库代码
    
2. 运行内容生成脚本 (scripts/generate-content.sh)
    
3. Hugo 编译生成静态 HTML
    
4. rsync 增量同步到美国 VPS
    
5. 服务器 Nginx 自动 reload
    
6. sitemap.xml  llms.txt 自动更新

GitHub Actions 工作流

 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# .github/workflows/daily-update.yml
name: Daily Content Update

on:
  schedule:
    - cron: '0 6 * * *'    # 每日 UTC 06:00(北京时间 14:00)
  workflow_dispatch:         # 手动触发
  push:
    branches: [main]
    paths:
      - 'content/**'
      - 'layouts/**'
      - 'assets/**'
      - 'hugo.toml'

env:
  HUGO_VERSION: '0.147.0'
  DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
  DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
  DEPLOY_PATH: /var/www/airef.dev/public

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          submodules: true
          fetch-depth: 0

      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v3
        with:
          hugo-version: ${{ env.HUGO_VERSION }}
          extended: true

      - name: Generate Daily Content
        run: |
          chmod +x scripts/generate-content.sh
          ./scripts/generate-content.sh

      - name: Build Hugo Site
        run: |
          hugo --minify --baseURL "https://airef.dev/"

      - name: Update llms.txt timestamp
        run: |
          sed -i "s/lastVerified: .*/lastVerified: $(date +%Y-%m-%d)/" hugo.toml

      - name: Deploy via rsync
        uses: burnett01/rsync-deployments@6.0.0
        with:
          switches: -avzr --delete --exclude='.git'
          path: public/
          remote_path: ${{ env.DEPLOY_PATH }}
          remote_host: ${{ secrets.DEPLOY_HOST }}
          remote_user: ${{ secrets.DEPLOY_USER }}
          remote_key: ${{ secrets.DEPLOY_SSH_KEY }}

      - name: Reload Nginx
        uses: appleboy/ssh-action@v1
        with:
          host: ${{ secrets.DEPLOY_HOST }}
          username: ${{ secrets.DEPLOY_USER }}
          key: ${{ secrets.DEPLOY_SSH_KEY }}
          script: |
            sudo nginx -t && sudo systemctl reload nginx
            echo "Deploy completed at $(date)"

内容生成脚本

 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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash
# scripts/generate-content.sh - 每日内容自动生成
set -euo pipefail

TODAY=$(date +%Y-%m-%d)
CONTENT_DIR="content/posts"

# 1. 生成技术趋势日报
cat > "${CONTENT_DIR}/tech-daily-${TODAY}.md" << EOF
---
title: "技术趋势日报 ${TODAY}"
description: "${TODAY} 技术领域重要动态与趋势分析,涵盖AI、系统架构、性能优化等方向"
date: ${TODAY}
lastmod: ${TODAY}
tags: ["日报", "技术趋势", "AI"]
categories: ["posts"]
type: posts
draft: false
---

## 今日技术动态

$(curl -s "https://hacker-news.firebaseio.com/v0/topstories.json" | \
  python3 -c "
import sys, json, urllib.request
ids = json.load(sys.stdin)[:5]
for i, id in enumerate(ids, 1):
    try:
        url = f'https://hacker-news.firebaseio.com/v0/item/{id}.json'
        resp = urllib.request.urlopen(url)
        item = json.loads(resp.read())
        print(f'### {i}. {item.get(\"title\", \"N/A\")}')
        print(f'来源:{item.get(\"url\", \"Hacker News\")}')
        print()
    except:
        pass
")

## AI 领域动态

*此部分由自动化流程生成,每日更新 AI 领域重要进展。*

## 架构优化洞察

*基于最新技术趋势的架构优化建议和分析。*
EOF

echo "Content generated for ${TODAY}"

服务器端配置

SSH 密钥配置

1
2
3
4
5
6
# 在服务器上
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 将 GitHub Actions 的公钥添加到
echo "github-actions-public-key" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

部署目录权限

1
2
sudo mkdir -p /var/www/airef.dev/public
sudo chown -R $USER:$USER /var/www/airef.dev/public

自动 Reload

1
2
3
# 添加 sudo 免密码 reload 权限
echo "$USER ALL=(ALL) NOPASSWD: /usr/sbin/nginx -t, /usr/bin/systemctl reload nginx" | \
  sudo tee /etc/sudoers.d/nginx-reload

内容模板系统

通用文章模板

 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
35
36
37
38
---
title: "{{标题}}"
description: "{{描述}}"
date: {{日期}}
lastmod: {{日期}}
tags: [{{标签}}]
categories: ["{{分类}}"]
type: {{类型}}
draft: false
---

## 概述

{{核心观点,先给答案再展开}}

## 详细解析

### {{子话题1}}

{{每段一个核心观点,150词以内}}

### {{子话题2}}

{{确定性语言:"最佳方法是..."}}

## FAQ

### {{常见问题1}}?

{{直接回答}}

### {{常见问题2}}?

{{直接回答}}

## 总结

{{核心结论和行动建议}}

效果追踪

指标 追踪方式 频率
AI 引擎爬取 分析 Nginx 访问日志中 AI 爬虫 UA 每周
内容引用 在各 AI 平台搜索核心话题 每月
搜索流量 Google Search Console 每周
站点可用性 外部监控(UptimeRobot) 实时

关键提醒

每日自动更新的核心价值不仅是内容新鲜度,更是向 AI 引擎传递"这是一个活跃的、持续更新的权威来源"的信号。dateModified 时间戳和定期更新的 sitemap.xml 是 AI 引擎评估内容时效性的关键依据。