docs: 同步共享 etcd 与 PostgreSQL 部署验收及 IaC 来源
docs / check (push) Successful in 2m14s

This commit is contained in:
2026-09-25 19:36:30 +00:00
parent 409e350c83
commit 217a56f683
5 changed files with 150 additions and 2 deletions
+1
View File
@@ -13,6 +13,7 @@
| Ayatori Compute 复用 Node/Lease API,但不引入 Kubernetes workload plane | Compute Agent 实现 Node 状态;libvirt 是长期候选主路径,PVE 是 brownfield 过渡;Kata microVM 属于 Sandbox backend | [Ayatori 控制面边界](ayatori-control-plane.md) | | Ayatori Compute 复用 Node/Lease API,但不引入 Kubernetes workload plane | Compute Agent 实现 Node 状态;libvirt 是长期候选主路径,PVE 是 brownfield 过渡;Kata microVM 属于 Sandbox backend | [Ayatori 控制面边界](ayatori-control-plane.md) |
| Database 采用独立资源与用户申请分离 | Instance → Database → Tenant;Retain 保留资源并人工回收,显式导入,不维护 PG registry;替代旧所有权持久化合同 | [DBaaS 设计修订](../services/postgresql-tenant-operator.md#当前资源模型2026-09-24-已确认) | | Database 采用独立资源与用户申请分离 | Instance → Database → Tenant;Retain 保留资源并人工回收,显式导入,不维护 PG registry;替代旧所有权持久化合同 | [DBaaS 设计修订](../services/postgresql-tenant-operator.md#当前资源模型2026-09-24-已确认) |
| Samba AD、OCI、Proxmox 优先 IaC,以代码为准 | Ansible/Terraform 声明及任务优先于旧 README;声明不等于已验证部署 | 维护者于 2026-09-16 明确、各服务使用指南 | | Samba AD、OCI、Proxmox 优先 IaC,以代码为准 | Ansible/Terraform 声明及任务优先于旧 README;声明不等于已验证部署 | 维护者于 2026-09-16 明确、各服务使用指南 |
| 新建 etcd 按全 homelab 共享基础设施设计,PostgreSQL 为首个消费者 | 替代 PostgreSQL 专属 DCS 定位,避免每个服务重复部署;三成员及消费者 RBAC 隔离已部署,不迁移现有 k3s datastore | [共享 etcd](../services/shared-etcd.md),维护者于 2026-09-25 明确 |
| 服务独立部署,Terraform root/state 按服务隔离 | 避免认证和变更影响范围绑在一起 | `AGENTS.md`、`CLAUDE.md` | | 服务独立部署,Terraform root/state 按服务隔离 | 避免认证和变更影响范围绑在一起 | `AGENTS.md`、`CLAUDE.md` |
| OpenBao 恢复不能依赖 k3s 或读取自己内部的恢复凭据 | 先恢复信任根,再恢复消费者 | `infrastructure/openbao/README.md`、`CLAUDE.md` | | OpenBao 恢复不能依赖 k3s 或读取自己内部的恢复凭据 | 先恢复信任根,再恢复消费者 | `infrastructure/openbao/README.md`、`CLAUDE.md` |
| Terraform 管 API 配置,Ansible 管主机及不能安全纳管的密钥材料 | 不可读回秘密和根密钥不能靠反复重建实现收敛 | `infrastructure/openbao/README.md` | | Terraform 管 API 配置,Ansible 管主机及不能安全纳管的密钥材料 | 不可读回秘密和根密钥不能靠反复重建实现收敛 | `infrastructure/openbao/README.md` |
+2 -1
View File
@@ -27,7 +27,8 @@ SPIFFE/SPIRE 已按维护者授权补读 #34;LAN DNS 与 Authelia 已按维护
| [openviking](openviking.md) | 上下文检索服务 | `记录端口 1933 / 8020` | 配置与部署指南;未附上线记录 | `apps/openviking/README.md` | 已有导入、任务查询、检索与原文读取指南 | | [openviking](openviking.md) | 上下文检索服务 | `记录端口 1933 / 8020` | 配置与部署指南;未附上线记录 | `apps/openviking/README.md` | 已有导入、任务查询、检索与原文读取指南 |
| [ps3netsrv](ps3netsrv.md) | PS3 网络内容服务 | `宿主 TCP 38008;地址未记录` | Docker 运维文档记录运行 | `apps/ps3netsrv/docker-compose.yml` | 已有客户端与内容目录指南 | | [ps3netsrv](ps3netsrv.md) | PS3 网络内容服务 | `宿主 TCP 38008;地址未记录` | Docker 运维文档记录运行 | `apps/ps3netsrv/docker-compose.yml` | 已有客户端与内容目录指南 |
| [seaweedfs](seaweedfs.md) | S3 对象存储 | `s3.ad.ddupan.top` | zot 文档记录已使用 | `apps/seaweedfs/README.md` | 已有客户端读写指南与备份边界说明 | | [seaweedfs](seaweedfs.md) | S3 对象存储 | `s3.ad.ddupan.top` | zot 文档记录已使用 | `apps/seaweedfs/README.md` | 已有客户端读写指南与备份边界说明 |
| [shared-postgresql](shared-postgresql.md) | 共享 PostgreSQL / CNPG | `shared-db namespace` | 历史迁移记录已完成 | `apps/shared-postgresql/migration.md` | 已有连接、应用接入与共享资源边界指南 | | [shared-etcd](shared-etcd.md) | homelab 共享协调与选主存储 | 三个 mTLS endpoints,见服务页 | 三成员已部署并现场验证,experimental | `infrastructure/etcd/README.md` | 原生指标与规则已接入;自动续签已启用;备份/证书年龄告警待补 |
| [shared-postgresql](shared-postgresql.md) | CNPG 与新 k3s 外共享 PG | 旧 `shared-db`;新 `pg-prod` / `pg-dev.ad.ddupan.top` | 新生产主从与开发实例上线,旧应用未迁移 | `infrastructure/shared-postgresql/README.md`、旧 migration.md | 切换/备份恢复已验证;Ayatori 独立控制面仅备齐声明 |
| [smtp-relay](smtp-relay.md) | 应用经 Microsoft 365 发信 | `smtp-relay.smtp-relay.svc.cluster.local:25` | 有配置与测试指南;未附上线记录 | `apps/smtp-relay/README.md` | 已有应用参数、测试邮件与投递边界指南 | | [smtp-relay](smtp-relay.md) | 应用经 Microsoft 365 发信 | `smtp-relay.smtp-relay.svc.cluster.local:25` | 有配置与测试指南;未附上线记录 | `apps/smtp-relay/README.md` | 已有应用参数、测试邮件与投递边界指南 |
| [tailscale](tailscale.md) | 远程网络与子网路由 | `Tailscale 网络` | 有配置;本轮未读敏感安装脚本 | `apps/tailscale/subnet-routes.sh` | 已有远程访问与路由边界指南 | | [tailscale](tailscale.md) | 远程网络与子网路由 | `Tailscale 网络` | 有配置;本轮未读敏感安装脚本 | `apps/tailscale/subnet-routes.sh` | 已有远程访问与路由边界指南 |
| [vlmcsd](vlmcsd.md) | KMS 兼容服务,使用范围未记录 | `宿主 TCP 1688;地址未记录` | 仅发现配置 | `apps/vlmcsd/compose.yaml` | 已有协议入口与客户端指南;未查询现场 | | [vlmcsd](vlmcsd.md) | KMS 兼容服务,使用范围未记录 | `宿主 TCP 1688;地址未记录` | 仅发现配置 | `apps/vlmcsd/compose.yaml` | 已有协议入口与客户端指南;未查询现场 |
+71
View File
@@ -0,0 +1,71 @@
---
title: Homelab 共享 etcd
lifecycle: experimental
evidence: live-verified
last_reviewed: 2026-09-25
last_verified: 2026-09-25
---
# Homelab 共享 etcd
为 homelab 服务提供共享的配置、协调与选主存储。维护者已接受共享定位;首个消费者是
k3s 外 PostgreSQL 的 Patroni。三成员基础服务已部署,现有监控已接入,自动续签已启用;现有 k3s datastore 未迁移。
## 入口与第一次接入
部署拓扑为 laptop 原生 systemd、pve1/pve2 各一个无特权 LXC(150/151)。地址为
192.168.10.127、10.60.0.20、10.60.0.21,客户端端口 2379,三端点健康检查已通过。两个 LXC 的 rootfs 位于 `pve-rg` SSD DRBD 池。
实际接入前由管理流程交付三个 TLS endpoints、中央 CA、独立客户端证书和 Bao 秘密引用。
使用分配身份在自己的 prefix 内 put/get/delete 验证,并确认跨 prefix 被拒绝;不要使用管理员证书接应用。
证书由 OpenBao 中央 CA 签发,成员间 peer CN 受限。管理员原生 etcdctl 使用 CN=root 证书;
Patroni etcd3 gateway 使用无 CN 的 mTLS 证书加独立账号密码,不能复用管理员证书。
密码首次随机生成并存入 Bao,重复部署复用,缺失、读取失败或漂移均不静默重置。
首个消费者秘密路径为 `kv/infra/etcd/consumers/patroni-pg-prod`,授权 prefix 为
`/homelab/patroni/pg-prod/`;账号和随机密码已创建,真实 gateway 登录已验证;Patroni 已部署并通过自动切换验证。
## 依赖、维护与恢复
依赖主机网络、磁盘、systemd;证书签发及配置收敛依赖 Bao。运行使用本地证书,不要求 Bao 在线。
共享 etcd 的创建、维护和快照与数据库生命周期分离;删除 PostgreSQL 不删除 etcd。
全集群快照恢复必须协调所有消费者,不能作为单个业务的回滚。
源码实现提供每日每成员本地快照、独立认证初始化、消费者收敛和逐成员更新入口。
三个成员的原生指标已接入现有 VictoriaMetrics,不增加 exporter;内网 2381 listener 不提供 KV API。
六条规则覆盖成员采集、采集可见成员不足、无 leader、容量、fsync 和选举,现场三目标 up=1、规则 health=ok。
Alertmanager 已接入 [Telegram 通知](grafana.md#telegram-告警接入),warning/critical 可向外通知;备份年龄与证书到期告警尚待补齐。
自动续签已启用:维护者恢复 OIDC 管理会话后,独立 cert auth、受限 policy 与每日 timer 已部署。
登录使用 laptop 现有 peer 证书,按 DNS SAN 限制身份;无 CN gateway 证书不能用于 Bao cert
登录(identity alias 为空),不会改动 etcd gateway 的无 CN 要求。首次实际续签流程三成员均
`changed=0`、service Result=success;程序固定副本由 root 管理,短期 token 用后撤销。
运行仍只依赖本地证书;续签和恢复步骤见源码 README。
业务负载下的存储延迟与完整灾难恢复演练仍待完成。
故障时先查 `homelab-etcd` systemd 日志和三端点健康;成员替换不能通过删除数据目录、重跑初始化处理。
详细操作与验收边界见 homelab-infra `infrastructure/etcd/README.md`。
存储故障处理:单成员 `NoLeader` 与频繁选举告警可能来自底层 I/O,不能直接认定整个集群失去 quorum。
2026-09-25 CT150 的 DRBD 根卷短暂丢失 quorum,ext4 journal 写入失败后进入 `emergency_ro`;
另外两成员仍健康。保存快照后停止 CT150,以 PVE 离线 fsck 修复、复查干净再启动,三成员健康及
Raft term/index 一致已重新验证,两容器根卷与新增 mp0 均可写。不要在挂载中的卷上 fsck 或直接强制 remount。
本项目两块新 HDD 数据卷后台同步上限已通过 IaC 限制为各 10 MiB/s;限速后短期未再见 PingAck 超时,
但唯一根因和长期稳定性未确证。没有更改全局 DRBD quorum/协议。对应入口为
`infrastructure/shared-postgresql/ansible/limit-resync.yml`,重复执行无变更;详细恢复过程见上述 runbook。
频繁选举规则包含 15 分钟历史窗口,故障恢复后需结合当前健康及计数判断。
## 证据与阶段边界
2026-09-25 维护者指定 laptop + 两台 PVE 各一个新 LXC,并明确复用 Bao 中央 CA;旧 Vault 迁移后置。
现场部署已应用独立 Bao PKI roles/policies,创建 LXC 150/151 并启用三成员 mTLS、认证及消费者 RBAC。
PVE 两个 LXC 已直接迁移底层 rootfs 到 `pve-rg`;逐成员停机迁卷、启动后检查 quorum,未重建容器或数据库。
2026-09-25 现场核实两个 rootfs 的目标存储与运行状态,三个 endpoint 均成功提交健康探测。
当前 PVE LXC `move-volume` 要求容器停止;操作入口为源码 `ansible/move-storage.yml`。
本地临时三节点 etcd 3.7.2 测试通过:mTLS、认证和消费者幂等、prefix 隔离、gateway 登录/写入、
密码缺失/漂移失败关闭、快照离线恢复与停止一成员后的写入。假 Bao 测试不证明真实 PKI/policy 正确;
测试进程 RSS 约 37–40 MiB 不是生产容量承诺。Terraform validate 与 Ansible lint 通过。
证书签发、秘密创建、gateway 登录和机器身份续签均已在真实服务验证。
来源为维护者指令、只读前置核查及 homelab-infra `infrastructure/etcd/`;
文档已直接发布 main([文档 acd4b55](https://git.ddupan.top/panxiao81/homelab-infra/commit/acd4b55)),实现见 [IaC PR #159](https://git.ddupan.top/panxiao81/homelab-infra/pulls/159),尚未合并。与数据库的关系见[共享 PostgreSQL](shared-postgresql.md#共享-etcd-设计边界)。
+62 -1
View File
@@ -2,7 +2,7 @@
title: 共享 PostgreSQL 使用指南 title: 共享 PostgreSQL 使用指南
lifecycle: active lifecycle: active
evidence: documented evidence: documented
last_reviewed: 2026-09-16 last_reviewed: 2026-09-25
last_verified: null last_verified: null
--- ---
@@ -80,3 +80,64 @@ AI 接续任务时先确认操作范围,再执行现场查询;不能因为
服务依赖 Kubernetes、CNPG、集群 DNS 与持久存储;Tailscale 入口另依赖对应网络及授权。 服务依赖 Kubernetes、CNPG、集群 DNS 与持久存储;Tailscale 入口另依赖对应网络及授权。
来源文件的固定版本与工作区差异见[来源追溯](../sources.md#shared-postgresql)。 来源文件的固定版本与工作区差异见[来源追溯](../sources.md#shared-postgresql)。
## 共享 etcd 设计边界
2026-09-25 维护者确定:为计划中的 k3s 外 PostgreSQL 引入的 etcd,应作为全 homelab
共享基础设施建设,PostgreSQL 是首个消费者。该共享定位已实现并完成首期部署验收;既有应用尚未迁移,
不改变本页现有 CNPG 入口。原研究将 etcd 列入数据库部署角色,新边界将其生命周期独立,
以便多个服务共用,减少重复部署与维护。
首期三成员已跨 laptop 与两台 PVE 部署,可与其他服务物理共置;
独立 IaC 管成员、认证、维护和快照,消费者只取得自己的账号与 key prefix 权限。
数据库卸载不能删除共享 etcd,全集群快照恢复也不能用作单个数据库的回滚。
现有 k3s 内部 datastore 不包含在本次迁移范围;其他消费者按实际需要接入。
维护者同时确定 etcd mTLS 证书由 OpenBao 中央 CA 签发,复用现有信任根,不引入
Pigsty 自建 CA。签发角色、peer 身份限制及消费者认证已部署;自动续签身份和 timer 已启用;
证书本地保存,正常启动不要求实时访问 Bao,Bao 本身不依赖此共享 etcd。
Patroni 的 etcd3 gateway 路径不支持证书 CN 对应的 RBAC 登录;维护者确定其独立随机密码
存入 Bao,由 Ansible 执行时读取,重复部署复用,轮换显式执行。该 secret 已在共享 etcd 部署阶段创建并验证 gateway 登录;Patroni 已部署。
PVE 改为裸机目前仅为后续倾向,没有迁移决定。
来源为本轮维护者设计指令及 homelab-infra
`infrastructure/shared-postgresql/RESEARCH.md`;文档来源为 [文档 acd4b55](https://git.ddupan.top/panxiao81/homelab-infra/commit/acd4b55),实现由 [IaC PR #159](https://git.ddupan.top/panxiao81/homelab-infra/pulls/159) 跟踪。
本节记录数据库设计边界;共享 etcd 的现场部署与验证见独立服务页,本页 CNPG 的 `last_verified` 不因此更新。
共享 etcd 的首轮 IaC、隔离验证与部署前置条件见[共享 etcd](shared-etcd.md)。
### k3s 外实例的实现与验收边界(2026-09-25)
新 PostgreSQL 18.6 生产主从与独立开发实例已上线,现有 CNPG 应用数据尚未迁移。
生产稳定入口 `pg-prod.ad.ddupan.top:5432` 指向 VyOS `192.168.10.2` 上独立 HAProxy;
正常 primary 为 laptop SSD ZFS,PVE LXC150 为 standby。开发入口为
`pg-dev.ad.ddupan.top:5433`,同机独立用户/数据集。客户端要求中央 CA 与 verify-full TLS。
LXC151 的专属 HDD 卷存放 pgBackRest 仓库,真实 SSH/WAL 归档、首个 full 和每日 timer 已验收;
保留 3 个 full、本地连续 WAL,尚无异地备份,开发实例当前不备份。
真实备份已恢复到临时目录的隔离实例,SQL 可写与管理角色属性验证通过,未覆盖生产 PGDATA。
低负载停止 laptop 主库服务后,完整通过的一次演练约 9.2 秒恢复经稳定入口写入;旧主重新作为
replica 加入、计划回切 laptop 后复制与探针清理全部通过。这不是 SLA,也不覆盖冻结/网络分区等全部故障。
Bao PKI 与专用 `homelab-postgresql` SPIFFE 身份已通过 OIDC 管理会话首次创建;之后受限身份
完成签发、KV 读取与独立管理凭据交付。原始实例秘密不交给 Ayatori,控制面只读
`kv/infra/postgresql/ayatori/{prod,dev}` 中的 username/password。
生产与开发管理账号实际 TLS 登录和非 superuser CREATEDB/CREATEROLE 属性已验证。
配置、备份传输、代理与凭据重跑 `changed=0`;PG 每日续签已启用,实际 systemd 运行成功,
证书窗口检查与 SQL 验收无变更。只在续签后重载证书,不重启实例;尚未强制演练临期轮换。
数据库日常运行独立于 k3s;机器身份续签依赖现有 SPIRE 与 Bao,不等于运行时依赖。
生产 Patroni 原生指标已接入现有监控,两目标 up=1、五条 HA 规则 health=ok 且 inactive。
SQL 级 exporter、开发实例、备份年龄和证书到期告警尚未补齐。存储事故与持续观察边界见
[共享 etcd](shared-etcd.md#依赖维护与恢复),不以短期验收证明底层长期稳定。
维护者明确 Ayatori 沿用独立控制面规划:本轮只准备 Instance、ExternalSecret、公开 CA、
Kustomize 与专用 ESO 只读 policy,没有向现有 k3s 安装 controller/CRD 或应用这些声明。
独立控制面还需创建实际 SecretStore/认证绑定并验收 Instance Ready;完整 Database/Tenant
供应能力以 Ayatori 自身实施为准。不能把现有 SQL 验证当作 Ayatori 已接管。
源码为 homelab-infra `infrastructure/shared-postgresql/README.md` 与
`ayatori/README.md`;部署、切换、恢复、续签及凭据引用的具体入口在那里维护,文档已发布 main;IaC 见 [IaC PR #159](https://git.ddupan.top/panxiao81/homelab-infra/pulls/159),合并及 GitOps 接管仍待完成。
Terraform backend 已复用 `kv/k8s/seaweedfs-s3` 中受限 AK/SK;此前阻塞是 Bao 管理权限,已由
维护者重新 OIDC 登录解决,不是 S3 凭据缺失。旧 Ansible Vault 迁移仍后置。
+14
View File
@@ -124,3 +124,17 @@ controller、目标固定、finalizer 保留与生成 RBAC,真实 API server
事故报告与恢复手册在 wiki 统一维护,见[完整事故报告](incidents/2026-09-25-drbd-quorum-sandbox.md)。 事故报告与恢复手册在 wiki 统一维护,见[完整事故报告](incidents/2026-09-25-drbd-quorum-sandbox.md)。
取证引用的 etcd/shared-postgresql 源码当时尚未提交,固定版本关联待源码合并后补齐; 取证引用的 etcd/shared-postgresql 源码当时尚未提交,固定版本关联待源码合并后补齐;
服务恢复不等于全部整改完成。 服务恢复不等于全部整改完成。
## 共享 etcd 与 PostgreSQL 来源同步
2026-09-25 shared etcd 三成员、新 PG 生产主从与开发实例、稳定入口、本地备份已部署,
监控 CR 已现场应用。OIDC 恢复后,专用身份与 etcd/PG 每日续签均已启用;此前 Bao 权限阻塞已解除。
真实 PG 自动切换、回切、SQL/TLS、备份恢复与配置幂等通过,边界见
[共享 PostgreSQL](services/shared-postgresql.md#k3s-外实例的实现与验收边界2026-09-25)和
[共享 etcd](services/shared-etcd.md)。
源码 `infrastructure/etcd/`、`infrastructure/shared-postgresql/`、DNS 和监控已提交至 [IaC PR #159](https://git.ddupan.top/panxiao81/homelab-infra/pulls/159),尚未合并,
不能当作 Flux 已从 Git 接管。既有 CNPG 应用未迁移,异地备份后置;数据库细项告警仍待补齐。
Ayatori 按维护者决定继续使用独立控制面,本轮只准备接入材料,尚未验收 controller/Instance Ready。
两仓事实已同步,源码文档已直接推送 main:[文档 acd4b55](https://git.ddupan.top/panxiao81/homelab-infra/commit/acd4b55);IaC 固定版本为
[3a2fe5f](https://git.ddupan.top/panxiao81/homelab-infra/commit/3a2fe5f)。