Authelia 文档贡献指南:从 Hugo 站点结构到 authelia-gen 文档生成器全解析
Authelia 的官方文档网站基于 Hugo 与 Doks 主题构建,其内容以 Markdown 形式存放在仓库的 docs 目录中,与网站 URL 路径一一对应。本文以 docs/content/contributing/prologue/documentation-contributions.md 为主线,系统讲解文档的编辑流程、本地预览方法、authelia-gen 文档生成器的使用,以及 Front Matter 中每个字段的作用,并辅以仓库源码证据,帮助你在修改 Authelia 源码或编写文档时,能同步维护出高质量、机器可读的项目文档。
站点架构:Hugo + Doks 下的文档组织方式
Authelia 的网站建立在 [Hugo] 之上,使用 [Doks] 主题。Hugo 是静态网站生成器,而 Doks 基于 Thulite 生态(从 docs/package.json 可以看到项目依赖了 thulite、@thulite/doks-core、@thulite/seo、@thulite/images 等包),提供文档站的侧边栏、目录(TOC)、搜索等开箱即用的能力。Hugo 的 [Shortcodes] 机制允许在 Markdown 中嵌入可复用的参数化片段,例如文档中用于渲染配置示例、告警框等的短代码,都在 docs/layouts/_shortcodes 目录中定义。
文档内容的目录结构遵循"路径即 URL"的约定:docs/content 下的文件路径直接映射为网站 URL。例如 docs/content/contributing/prologue/documentation-contributions.md 对应的就是 /contributing/prologue/documentation-contributions/。此外,从该文档的 Front Matter 可以看出,它还有一个 alias 字段(/contributing/prologue/documentation),用于保留旧 URL 的跳转,避免链接失效。
修改文档:直接编辑 Markdown 即可
贡献文档的门槛很低:任何人都可以直接编辑对应文档的 Markdown 源文件。在大多数页面底部,Authelia 都放置了指向该页面 Markdown 源文件的直接链接,方便读者快速定位到待修改的文档。修改后的内容会与网站 URL 保持同路径对应,例如想修改"集成指南"中的某个页面,就直接编辑 docs/content/integration 下对应的 .md 文件。
值得注意的编辑约定可参考 docs/content/contributing/guidelines/documentation.md:文档中的示例域名统一使用 example.com(或其子域);示例证书有效期一律设置为从 1970-01-01 00:00:00 起 1 年;PEM 私钥块的 base64 填充 = 之前必须追加 ^invalid DO NOT USE 这类无效字符,防止读者误用示例密钥。
本地预览:三步启动开发服务器
环境要求
在本地运行 Authelia 文档网站,需要准备:
- git:用于克隆仓库(若只下载仓库压缩包也可跳过);
- Node.js:版本要求见 docs/package.json 中的
engines字段(当前为>=24.13.0); - pnpm:包管理器,
engines中要求pnpm@12(当前packageManager锁定为pnpm@12.3.4)。
启动步骤
在终端中依次执行:
git clone https://github.com/authelia/authelia.git
cd authelia/docs
pnpm install
pnpm dev
然后打开浏览器访问 http://localhost:1313/。pnpm dev 实际执行的是 hugo server --disableFastRender --noHTTPCache(见 docs/package.json 的 scripts 段),它会在本地启动 Hugo 开发服务器并开启实时刷新,因此修改页面后浏览器会即时呈现效果。本地开发时还会注入非严格的 CSP 策略('self' 'unsafe-eval'),相关内容可从 cmd/authelia-gen/const.go 中看到定义。
Hugo 本体并未直接写入依赖,而是通过 optionalDependencies 中的 hugo-extended 提供,保证了环境一致性。若需要构建生产版本,可运行 pnpm build(对应 hugo --minify --gc)。
文档生成器:authelia-gen 与自动化产出
Authelia 的文档并非全部手写,大量内容由代码生成器 authelia-gen 自动产出,确保文档与源码永远同步。
生成器维护的目标文件
根据原文档与 cmd/authelia-gen/const.go 中的常量定义,生成器主要维护以下三类文件:
| 目标位置 | 生成依据 | 仓库常量佐证 |
|---|---|---|
docs/data(configkeys.json、misc.json、languages.json 等) |
仓库内各类变更 | dirDocsData、fileDocsDataConfigKeys 等 |
| docs/content/reference/cli | cobra 命令行定义 | dirDocsCLIReference |
| docs/static/schemas(JSON Schema) | internal/configuration/schema 等处的 struct tag | dirDocsStaticJSONSchemas 及配置/用户数据库/TOTP/WebAuthn/导出等 Schema 文件常量 |
以 cmd/authelia-gen/cmd_docs_cli.go 为例,docs cli 子命令会依次对 authelia(来自 internal/commands 的 commands.NewRootCmd())、authelia-scripts(来自 cmd/authelia-scripts/cmd)和 authelia-gen 自身的 cobra 命令树调用 doc.GenMarkdownTreeCustom,为每个命令生成独立的 Markdown 参考页并写入 docs/content/reference/cli/<命令名>/,同时生成带 weight(authelia 为 900、authelia-gen 为 910、authelia-scripts 为 920)的 _index.md 用于控制侧边栏顺序。
再以 cmd/authelia-gen/cmd_docs_data.go 为例:
docs data misc会生成 docs/data/misc.json,其中包含 CSP 指令模板(${NONCE}占位符、生产与开发两套策略)、当前版本号Latest,以及 PBKDF2 各哈希变体(SHA-512/384/256/224/1)的默认迭代次数与 FIPS 状态,数据直接来源于 internal/configuration/schema 中的PBKDF2VariantDefaultIterations;docs data keys会反射遍历schema.Configuration{}的 struct tag,生成 docs/data/configkeys.json,为每个配置键标注是否为 Secret,并基于configuration.ToEnvironmentSecretKey/ToEnvironmentKey推导对应的环境变量名(前缀与分隔符取自configuration.DefaultEnvPrefix、configuration.DefaultEnvDelimiter)。
日期同步:git 历史驱动的 Front Matter 维护
除内容外,生成器还会维护文档 Front Matter 中的 date 字段。源码位于 cmd/authelia-gen/cmd_docs_date.go:docs date 子命令会遍历 docs/content 下所有 .md 文件,读取其 Front Matter,然后调用 git log -1 --diff-filter=A --pretty=format:%cD -- <path> 获取该文件首次被添加进 git 历史的提交日期(commit date,RFC 2822 格式),并将其回写为 YAML 时间戳格式(2006-01-02T15:04:05-07:00)。这样,文档的 date 就始终等于"首次创建时间",即使后续被反复修改也不会漂移。
推荐运行时机
修改源码后,建议按原文档给出的命令序列执行:
source bootstrap.sh
authelia-gen --exclude docs.date,docs.cli
其中 bootstrap.sh 会把 cmd/dev 下的开发工具(含 authelia-gen)加入 PATH,并设置 DOCKER_BUILDKIT=1 等环境变量。--exclude docs.date,docs.cli 表示跳过日期与 CLI 参考文档的重新生成;若你恰好修改了 cobra 命令或新建了文档页面,则应去掉 --exclude,让 authelia-gen 全量生成,以刷新 CLI 参考与各文档日期。生成器子命令的组织可参见 cmd/authelia-gen/cmd_docs.go,它聚合了 docs cli、docs data、docs date、docs seo、docs json-schema 与 docs manage(ADR 架构决策记录)等子命令。
Front Matter 字段详解
Authelia 文档的每个 Markdown 文件顶部都有一段 YAML Front Matter,控制页面的展示与 SEO 行为。典型结构如下:
---
title: "A Page Title"
description: "This is a description of the page."
summary: "This is a page lead."
date: 2022-03-19T04:53:05+00:00
draft: false
weight: 100
toc: true
---
理解 Open Graph Protocol
要理解 title、description、date 等字段的用途,需先了解 [Open Graph Protocol](OGP):这是由 Meta/Facebook 提出的协议,绝大多数社交媒体平台通过读取网页中特定的 HTML <meta /> 标签来生成链接预览。Authelia 文档的 SEO 渲染逻辑位于 docs/layouts/_partials 与 @thulite/seo 组件中,Front Matter 中的字段会被映射为对应的 <meta /> 标签。
各字段说明
以下是 Authelia 文档中常用 Front Matter 字段的逐一说明:
| 字段 | 类型 | 作用 |
|---|---|---|
title |
String | 配置 <title /> 元素、页面第一个 <h1 /> 元素,以及 OGP 的 og:title 值 |
description |
String | 配置页面的描述信息与 OGP 的 og:description 值,通常用于搜索引擎摘要 |
summary |
String | 配置页面标题(title)之后的第一段引导文字(页面导语)。注意:仓库内大量页面实际使用 lead 字段(如 docs/content/reference/cli/authelia/_index.md 等由生成器产出的文件即含 lead),两者均为"页面引言"类字段,编写时以页面实际使用的字段为准 |
date |
Timestamp | 配置 OGP 的 og:article:published_time 值,同时用于博客归档排序(参见 docs/content/blog) |
draft |
Boolean | 控制页面可见性,为 true 时页面不可见 |
menu |
Dictionary | 配置页面在菜单中的挂载关系 |
weight |
Integer | 配置页面在菜单中的位置以及分页(pagination)的顺序 |
toc |
Boolean | 启用或禁用"Table of Contents / On This Page"(页内目录)区块 |
community |
Boolean | 启用或禁用 Community 页面头部,当前仅对 Integration 板块生效 |
seo |
Dictionary | 生成器产出的页面常带 seo 块,内含 title、description、canonical、noindex 等可选自定义项,用于覆盖默认 SEO 元数据(如 cmd/authelia-gen/cmd_docs_cli.go 生成的模板) |
alias |
字符串/列表 | 为旧 URL 提供跳转别名,本文所在页面即用其保留 /contributing/prologue/documentation 这一历史路径 |
images |
List | 声明页面相关的图片资源(默认空列表),供 OGP 预览使用 |
实战建议
- 新页面务必填写
title与description,这直接影响搜索引擎与社交平台预览质量; - 若页面按时间线或菜单顺序展示,合理设置
weight与date; - 发布前确认
draft: false,否则页面不会出现在站点中; - 修改源码后运行
authelia-gen,让生成的 CLI 参考、JSON Schema、docs/data数据与 Front Matter 日期保持与源码一致,避免文档漂移。
小结
Authelia 的文档贡献流程可以归纳为三条主线:直接编辑(Markdown 与 URL 同路径、页面底部提供源文件链接)、本地验证(pnpm install && pnpm dev 实时预览)、生成器维护(authelia-gen 负责 CLI 参考、JSON Schema、docs/data 与 Front Matter 日期的自动化同步)。掌握 Front Matter 中 title、description、summary/lead、date、draft、weight、toc 等字段的含义,就能写出既对读者友好、又对搜索引擎与 AI 检索友好的高质量文档。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.21 K638- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python250
jforgamejforgame是一个一站式游戏服务器开发框架。包含游戏服务器开发所需要的各种组件,比如网关,socket服务端与客户端,自定义高效消息编解码,游戏热更新,游戏通用工具等等。包含游戏服,跨服,匹配服,后台管理系统等实现,同时提供大量业务案例以供学习。亦可用于其他socket应用,例如及时聊天等。Java301
fizz-gateway-nodeAn Aggregation API Gateway in Java . FizzGate 是一个基于 Java开发的微服务聚合网关,是拥有自主知识产权的应用网关国产化替代方案,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、回调管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。Java210
certd开源SSL证书管理工具;全自动证书申请、更新、续期;通配符证书,泛域名证书申请;证书自动化部署到阿里云、腾讯云、主机、群晖、宝塔;https证书,pfx证书,der证书,TLS证书,nginx证书自动续签自动部署JavaScript190
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python300