架构概览

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

 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 引擎评估内容时效性的关键依据。