银铃开发笔记与工具箱
← 全部文章
FIELD NOTES / 工程笔记

这个站点是怎么搭起来的

Astro 静态站 + GitHub Actions 定时同步贡献数据 + giscus 评论,零服务器、零数据库。

一直想要一个地方,把 GitHub 上零散的贡献、写过的笔记,以及和其他人的交流放在一起。要求很简单:

  • 不维护服务器:没有数据库,没有后端进程,挂了也不用半夜起来修
  • 数据自动更新:贡献图和 PR 列表不应该靠手动截图
  • 写作成本低:一个 Markdown 文件就是一篇文章

#整体结构

站点架构:Markdown 文章与 GitHub 数据经静态构建发布,评论由 GitHub Discussions 提供。
文章流程图

三块内容各有各的数据来源,但最终都是纯静态 HTML。

#贡献数据:构建时拉取

scripts/fetch-github.mjs 在 astro build 之前运行,用 GraphQL 一次性拿到:

数据 GraphQL 字段
贡献热力图 contributionsCollection.contributionCalendar
上游 PR user.pullRequests,过滤掉自己名下的仓库
统计数字 totalCommitContributions 等

拉取失败时脚本会沿用上一次的快照,而不是让整个构建失败。本地没配 token 也能正常 npm run dev。

GitHub Actions 里配置了每天一次的 schedule,所以即使不发文章,贡献图也会每天刷新。

用一个很粗略的指标描述贡献密度:

density=active daysdays since account creation\text{density} = \frac{\text{active days}}{\text{days since account creation}}

#交流:giscus

评论系统选了 giscus,它把评论存在仓库的 GitHub Discussions 里:

  1. 访客用 GitHub 账号登录即可评论,天然过滤掉大部分垃圾内容
  2. 数据在自己的仓库里,随时可以迁移
  3. 每篇文章按 pathname 映射到一个 Discussion,留言板则固定映射到一个 term

再加上一个友链页和 RSS 输出,基本覆盖了「和其他站交流」的需求。

#写一篇新文章

在 src/content/blog/ 下新建一个 Markdown 文件:

md
---
title: 标题
description: 一句话摘要,会出现在列表页和 RSS 里
pubDate: 2026-10-14
tags: [标签A, 标签B]
draft: false
---

正文……

git push 之后大约一分钟,文章就会出现在站点上。