这个项目能做什么

这是一个将整个集群视为基础设施即代码(IaC)的个人 homelab 仓库。该技术栈运行在 k3s 上,以 Ansible playbooks、roles 和 inventory 作为可编辑的唯一事实来源;渲染后的 Docker Compose 目录仅存在于 Raspberry Pi 主机上。仓库记录显示,从 Docker Compose 到 k3s 的迁移已于 2026-08-14 完成,当时 Docker 已从主服务器节点卸载,分步迁移记录保存在 archive 文件夹中作为历史存档。 描述中包含三台主机。daniel-box 是 k3s 控制平面,运行几乎所有工作负载,包括 Traefik edge、Authelia SSO 和 OIDC 发行者、Pi-hole DNS、Longhorn 存储、CrowdSec 以及一个公共 WireGuard 端点;Ansible 也在其上运行。daniel-server 是一个 k3s agent 节点,配备 Intel iGPU 用于 Jellyfin/Tdarr 转码,并处理 LVM 存储和 UPS/NUT 关机管理。daniel-pi 是唯一剩余的 Docker 主机,仅限局域网访问,运行第二个 WireGuard 实例及一个小型的实用工具堆栈。 入口流量集中在 Traefik 上,通过 IngressRoute CRD 进行路由,Authelia 通过 forward-auth 中间件对受保护路由进行拦截,并为支持的应用发行 OIDC 令牌。Cloudflare 代理公共主机名,而局域网内的本地名称由 Pi-hole 解析。README 指出,网络分段并非全面强制执行:仅有少数 roles 定义了 NetworkPolicies,且在存在策略的地方,仅由集群 CNI 强制执行 ingress 规则。 部署分为 Docker play 和 k8s play,两者均由每台主机的 containers_list 驱动。Docker play 使用自定义的 toposort 过滤器和每个 role 的 meta/deps.yml 上游声明来解析依赖图,从而确保依赖项优先启动,且标记运行会拉取未满足的依赖。k8s play 对 roles 进行拓扑排序,并从 role 模板本身推导出指向 Traefik(用于 CRD 安装)和 Authelia(用于中间件)的边,对于模板未携带的边则使用显式的 depends_on。过滤器通过 pre-commit 钩中的 pytest 进行单元测试。文档记录了部署单个服务、干跑(dry run)、部署全部内容或仅部署 Pi 目标的命令,以及独立的启动(bring-up)和引导(bootstrap)playbooks。 横向关注点包括:在运行时解密的 SOPS/age 加密密钥,并在 pre-commit 中集成 gitleaks 以及带外密钥备份;由 Prometheus、Grafana、Loki 和 Tempo 组成的观测系统,且仪表盘以代码形式配置;Longhorn 定期备份至 Backblaze B2,并记录了逐卷分层和灾难恢复流程;由 Renovate 驱动的固定镜像版本和钩子修订的拉取请求;以及包括 Authelia TOTP/OIDC、带有每节点 agent 的 CrowdSec、fail2ban 和 UFW 默认拒绝入站的安全工具。 质量门禁通过 pre-commit 工具运行,涵盖 YAML/JSON lint、ansible-lint、gitleaks、渲染模板验证、密钥轮转注册表同步、ruff 和 pytest。指南中包含了添加新服务的方法,无论是作为渲染 Deployment/Service/IngressRoute/PVC 清单的 k8s roles,还是作为 Pi 的 Docker roles。