From 011e7ddb9840037360549f2262a87d5cacf1ec77 Mon Sep 17 00:00:00 2001 From: Fam Zheng Date: Mon, 4 May 2026 11:08:01 +0100 Subject: [PATCH] =?UTF-8?q?README:=20=E5=B9=B3=E5=8F=B0=E7=BA=A6=E5=AE=9A?= =?UTF-8?q?=EF=BC=88=E6=A0=88/=E9=83=A8=E7=BD=B2/CI=20=E4=B8=80=E9=94=85?= =?UTF-8?q?=E7=AB=AF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把脚手架决策定下来,作为 cube 上所有 app 必须遵守的"宪法": - 域名:.famzheng.me,零 DNS 操作 - 后端:Rust + Axum,每 app 独立仓库,cube-core crate 复用样板 - 前端:Vite + Vue 3 + TS(选 Vue 是因为 AI 写得稳) - 构建:host musl 编译 + scratch 容器 - Registry:gitea 自带(registry.famzheng.me 反代 /v2/*) - CI:gitea Actions + 现有 instance-level act_runner - 通用约定:/healthz, stdout JSON log, env+Secret 配置, 禁 config 文件挂载 --- README.md | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 104 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 2e37279..226f269 100644 --- a/README.md +++ b/README.md @@ -8,24 +8,120 @@ Fam 的小 app 平台。 主要任务:把目前散落在 `oci.euphon.net`(Oracle Cloud ARM VM)上**值得留下**的 Fam 个人小 app 迁过来。oci 主机本身不退役,留给 Hera 同学继续用。 +设计目标:反 Karpathy "web app 像拼宜家家具" 的困境 —— 全部自有基础设施,**零跨 dashboard 配置**,新 app 上线压缩到 5 分钟内。 + +--- + +## 平台约定 + +> 这是 cube 上所有 app 的"宪法",所有 app 必须遵守,破例必须改这份文档并经 Fam 拍板。 + +### 部署目标 + +单一目标:famzheng.me 节点的 k3s(`kubectl context default`),不双轨。 +- 每 app 一个 k8s namespace(ns 名 = app 名,不加 cube- 前缀) +- traefik ingress + 通配符 LE 证书自动签 + +### 域名 + +- `.famzheng.me`,wildcard A 记录已配,**零 DNS 操作** +- 不嵌 `cube` 子域(冲突检查 = 起新 ingress 时 traefik 自然报错,不需要额外心智) +- 旧域名(如 `portfolio.oci.euphon.net`)让 oci ingress 兜底 308 redirect 到新地址,过渡期后下掉 + +### 后端:Rust + Axum,每 app 独立仓库 + +- gitea repo `fam/`,单 axum 服务 +- 公共代码通过 `cube-core` crate 复用:`cube-core = { git = "https://famzheng.me/gitea/fam/cube-core", tag = "v0.x" }` +- `cube-core` 提供: + - `/healthz` router(200 = ok) + - `ServeDir` 静态前端 fallback 到 `index.html` + - `tracing` 配 JSON stdout + - SIGTERM graceful shutdown + - env → struct 配置加载(`envy` crate) +- 业务 app 只写 `/api/*` 路由 + handler: + ```rust + Router::new() + .merge(cube_core::base("dist")) + .nest("/api", api_routes()) + ``` +- 不上 cargo workspace —— 每 app 一个 repo 彻底分 + +### 前端:Vite + Vue 3 + +- 默认栈:**Vite + Vue 3 + TypeScript + Pinia + Vue Router** +- 选 Vue 而不是 Svelte 的原因:AI(Claude / GPT)写 Vue 3 `