# k01 业务集群

该目录是 juwan-backend 所有 k3s 节点的初始化配置。公网入口由 center 的 Caddy 接管——`/wt/*` 走 UDP 直达 chat-api，其余路径反代到 envoy-gateway NodePort 30080。

第一台机器按以下步骤初始化为 k3s server；后续加入的 k02、k03 只运行 `install.sh agent`，其他步骤在 server 上执行一次即可。

## 前置条件

- Ubuntu 26.04 LTS，root
- center 已部署，`registry.juwan.xhttp.zip` 可推可拉
- 已从 Gitea 拉取仓库：`git clone https://git.juwan.xhttp.zip/juwan/juwan-backend.git`
- `/root/registry-password` 文件存放 zot admin 密码（`chmod 600`）
- `.env` 已按 `.env.example` 填好（zot admin 密码、Brevo SMTP、Garage S3 凭据）

如果还没 `.env`：先 `cp .env.example .env && nano .env`，再跑 `secrets.sh`。

## k3s server 初始化

```bash
cd /root/juwan-backend/deploy/k01

bash install.sh          # k3s + Helm + 四个 Operator
bash secrets.sh          # 生成所有 k8s Secret
bash apply-infra.sh      # 数据层 + envoy + ratelimit，分批等待 Ready
bash apply-schema.sh     # 向 CNPG 写入 schema 与 fixture
bash apply-services.sh   # 启动业务 Deployment

# 可以用 `bash teardown.sh` 来卸载数据层和业务层
```

## 做什么

控制面是 k3s server，跑着 CNPG / Strimzi / Redis / MongoDB 四个 Operator 管理有状态服务。

数据层 11 个 per-domain PostgreSQL Cluster + 12 个 RedisReplication + 1 个 MongoDBCommunity + Strimzi KRaft Kafka。

业务层 27 个 Go 服务镜像指向 `registry.juwan.xhttp.zip/juwan/<name>:latest`，每个 domain 一套 rpc + api，外加 snowflake、authz-adapter、email-mq 和 frontend。所有 Deployment 带 `imagePullSecrets: registry-creds`，containerd 的 `registries.yaml` 配了 zot admin 凭据。

email-api 跟 user-rpc 共用 user-redis 实例，因为注册和重置密码的验证码 key 跨服务读写。

chat-api 的 WebTransport 走 UDP 8443 hostPort，center Caddy 的 PR 7669 fork 在中心握手后反向代理 WebTransport 连接到 chat-api。

## 生成的 Secret

`secrets.sh` 生成随机密码写入 `secrets/` 目录，同时 `kubectl create secret` 到 `juwan` namespace。需要手动填的是 `.env` 里的 zot admin 密码、Brevo SMTP key 和 Garage S3 access key。

CNPG 每个 Cluster Ready 后自动生成 `<cluster>-app` Secret（username/password/dbname/host/port），业务 pod 的 env 由这些 Secret 提供。

## 加节点

在 server 上取 token：

```bash
cat /var/lib/rancher/k3s/server/node-token
```

新机器上执行：

```bash
cd /root/juwan-backend/deploy/k01
echo "<zot-admin-password>" > /root/registry-password && chmod 600 /root/registry-password

K3S_URL=https://<server-ip>:6443 K3S_TOKEN=<token> bash install.sh agent
```

## 日常操作

```bash
kubectl -n juwan get pods -o wide
kubectl -n juwan rollout restart deploy/user-rpc
kubectl -n kafka get kafka,kafkatopic,kafkanodepool
```
