Files
pikasTech-unidesk/docs/reference/pikaoa.md
T
2026-07-18 17:59:04 +02:00

9.9 KiB
Raw Blame History

PikaOA 运行与交付

配置真相

  • PikaOA 运维配置的唯一真相是 config/pikaoa.yaml
  • 稳定开发运行面由 config/pikaoa.yaml#developmentRuntime.targets.NC01 声明:
    • source branchmaster
    • consumerpikaoa-dev-nc01
    • runtime namespacepikaoa-dev
    • CI namespacepikaoa-ci
    • GitOps branchnc01-pikaoa-dev-gitops
    • Argo Applicationpikaoa-dev-nc01
    • 公网入口:https://oa-dev.hwpod.com
    • NodePort32080
  • 生产运行面由 config/pikaoa.yaml#releaseRuntime.targets.NC01 声明:
    • source branchrelease
    • consumerpikaoa-nc01
    • runtime namespacepikaoa
    • CI namespacepikaoa-ci
    • GitOps branchnc01-pikaoa-gitops
    • Argo Applicationpikaoa-nc01
    • 公网入口:https://oa.hwpod.com
    • NodePort32096
  • development 与 production 必须保持独立:
    • PostgreSQL role/database
    • Kubernetes Secret
    • 附件 PVC
    • GitOps branch
    • Argo Application
    • namespace 与公网入口。
  • 已退役路径不得恢复:
    • testRuntime
    • pikaoa-test namespace
    • pikaoa-test-nc01 consumer/Repository
    • pikaoa test-target CLI
    • 动态测试 namespace
    • namespace-local PostgreSQL。

对象与模块边界

  • PikaOA 是可扩展企业办公平台:
    • 模块通过 descriptor 注册;
    • 模块拥有自己的 schema 初始化、HTTP route、outbox event 和 worker
    • 新模块复用 identity、附件、审计、可观测性和 API 错误合同。
  • 业务对象均为平级 REST 资源:
    • 伙伴、伙伴分类、合同、合同版本、发票和附件都使用服务端生成的 UUIDv7;
    • 对象之间只保存 typed ID 关联;
    • 不把伙伴、合同或发票建模为另一个对象的从属资源。
  • 合同版本关系:
    • 每个合同版本拥有独立全局 ID
    • contractIdpreviousVersionId 和当前版本投影建立版本链;
    • 发票可分别关联合同 ID 与合同版本 ID。
  • 首版审计与一致性:
    • 跨模块关联未完成一致性核验时只返回 blocking=false warning
    • 完整身份/RBAC、严格审计门禁和强一致性校验不作为 MVP 上线前置。

数据库与 Secret

  • development 与 production 都使用 NC01 host PostgreSQL
    • owning YAMLconfig/platform-db/postgres-nc01.yaml
    • development role/databasepikaoa_dev
    • production role/databasepikaoa
    • 业务 schemapikaoa
    • development exportplatform-infra/pikaoa-dev.env
    • production exportplatform-infra/pikaoa.env
  • 不迁移旧 test 数据:
    • development 使用全新 role/database
    • 旧 test 数据、namespace 和运行对象可直接丢弃;
    • 不增加兼容、回填或双写路径。
  • Secret 分发的唯一真相是 config/secrets-distribution.yaml
    • development scopepikaoa-dev
    • development Secretpikaoa-dev-runtime
    • production scopepikaoa
    • production Secretpikaoa-runtime
  • runtime Secret 只包含敏感键:
    • DATABASE_URL
    • PIKAOA_SESSION_SECRET
    • OA_ADMIN_TOKEN
    • PIKAOA_BOOTSTRAP_ADMIN_PASSWORD
    • PIKAOA_BOOTSTRAP_EMPLOYEE_PASSWORD
  • 非敏感 pikaoa.yamlpikaoa-runtime-config ConfigMap 提供:
    • API、Worker 和 initializer 从 ConfigMap 挂载配置;
    • DATABASE_URL 在应用校验前由环境变量覆盖空配置值;
    • 禁止把 pikaoa.yaml 写入 runtime Secret。
  • Secret 来源和运行面输出必须脱敏:
    • 只披露 sourceRef、key、presence、fingerprint 和摘要;
    • 禁止从 Kubernetes Secret、Pod 环境、日志或数据库反解值;
    • 禁止在命令参数、issue、截图或报告中写入 token、密码或完整 DSN。

首次引导

  • 首次创建 development 数据库与导出:

    bun scripts/cli.ts platform-db postgres plan \
      --config config/platform-db/postgres-nc01.yaml
    bun scripts/cli.ts platform-db postgres apply \
      --config config/platform-db/postgres-nc01.yaml \
      --confirm --wait
    bun scripts/cli.ts platform-db postgres export-secrets \
      --config config/platform-db/postgres-nc01.yaml \
      --confirm
    
  • 首次同步 development Secret

    bun scripts/cli.ts secrets plan \
      --config config/secrets-distribution.yaml \
      --scope pikaoa-dev
    bun scripts/cli.ts secrets sync \
      --config config/secrets-distribution.yaml \
      --scope pikaoa-dev \
      --confirm
    
  • PaC consumer 只在首次引导时执行 bootstrap:

    bun scripts/cli.ts platform-infra pipelines-as-code bootstrap \
      --target NC01 \
      --consumer pikaoa-dev-nc01 \
      --dry-run
    bun scripts/cli.ts platform-infra pipelines-as-code bootstrap \
      --target NC01 \
      --consumer pikaoa-dev-nc01 \
      --confirm
    
  • bootstrap 完成后不得再次用于 source delivery、恢复或补跑。

  • 旧 Repository CR 与新声明使用同一 URL 时:

    • 先精确确认旧对象属于已退役 PikaOA test consumer
    • 只退役该旧对象;
    • 立即由已合并 owning YAML 的 bootstrap 创建新对象;
    • 禁止修改共享 PaC controller、admission 或其他 consumer。

自动交付

  • development 和 production 都使用 PaC 自动交付:

    • GitHub source PR merge
    • GitHub webhook
    • Gitea controlled mirror 与 immutable snapshot
    • PaC/Tekton
    • GitOps branch
    • Argo 自动同步;
    • runtime readiness 与 /healthz
  • 正常交付的唯一触发:

    • development:合并 pikainc/pikaoa@master PR
    • production:合并 pikainc/pikaoa@release PR。
  • .tekton 制品必须由 UniDesk source-artifact renderer 生成:

    bun scripts/cli.ts platform-infra pipelines-as-code source-artifact write \
      --target NC01 \
      --consumer pikaoa-dev-nc01 \
      --source-worktree <clean-pikaoa-worktree> \
      --confirm --json
    bun scripts/cli.ts platform-infra pipelines-as-code source-artifact check \
      --target NC01 \
      --consumer pikaoa-dev-nc01 \
      --source-worktree <clean-pikaoa-worktree> \
      --json
    
  • 自动链禁止人工补齐:

    • 不人工创建 PipelineRun
    • 不人工 mirror sync
    • 不人工 Argo sync/refresh
    • 不在 source PR merge 后再次 bootstrap/apply。
  • 自动链失败时:

    • 使用 platform-infra pipelines-as-code status|history|debug-step 只读归因;
    • consumer 私有缺陷回到 owning YAML、renderer 或 source artifact 修复;
    • 共享 PaC/controller/admission 故障只报告,不在 PikaOA 任务中修改公共 CI/CD 基础设施。

公网入口

  • 公网入口的聚合真相是 config/platform-infra/public-edge.yaml#targets.NC01

  • 产品 hostname、NodePort 和 health path 只从 config/pikaoa.yaml 的 configRef/path 解析。

  • 受控入口:

    bun scripts/cli.ts platform-infra public-edge plan --target NC01
    bun scripts/cli.ts platform-infra public-edge apply --target NC01 --dry-run
    bun scripts/cli.ts platform-infra public-edge status --target NC01
    
  • 公网入口 mutation 只由 master merge 触发的唯一 PaC authority执行;PikaOA任务和 L1 会话不得执行 apply --confirm、内部 reconcile 或直接改写 Caddy。

  • NC01 共享 edge 约束:

    • 复用唯一 Caddy 80/443 listener
    • 不访问 PK01
    • 保留 UDP 443
    • 单站探针失败只输出 blocking=false warning
    • 禁止为 PikaOA 启动第二个独立 80/443 proxy。

CLI-first 验收

  • 所有业务功能先使用 PikaOA CLI 验收:
    • CLI 只调用与 Web 相同的公开 HTTP API
    • development endpoint 使用 https://oa-dev.hwpod.com
    • production endpoint 使用 https://oa.hwpod.com
    • OA_ADMIN_TOKEN 只通过进程环境注入,不创建 session 文件;
    • CLI 输出不得打印 token。
  • 最小顺序:
    • health
    • health --ready
    • metrics
    • modules
    • whoami
    • 员工与角色;
    • 伙伴分类与伙伴;
    • 合同 v1
    • 合同 v2 版本链;
    • 发票关联与废弃;
    • 附件与审计;
    • 合同和发票 PDF import-preview
  • PDF import-preview 约束:
    • 原 PDF 作为附件保留;
    • 自动提取结果包含置信度与 manualReviewRequired
    • 用户可人工校对后再创建或更新业务对象;
    • 提取 warning 不阻塞手工校对流程。
  • CLI 通过后才进入 Web 验收:
    • 只使用 $unidesk-webdevweb-probe
    • 禁止裸 Playwright
    • 验证管理员登录、合同/发票/PDF 校对主路径和移动视口。

可观测性

  • OTel 从第一版启用:
    • API、Worker 与 CLI 使用 OpenTelemetry
    • runtime endpoint 由 config/pikaoa.yaml 声明;
    • exporter 失败只记录 blocking=false warning
    • trace 不记录 Secret、完整 DSN、PDF 内容或业务敏感字段。
  • Prometheus 从第一版启用:
    • API 与 Worker 使用 owning YAML 的 label selector 和 scrape annotation
    • API 与 Worker 都提供 /metrics
    • 重点核验数据库、迁移、HTTP、pgx pool、Worker 周期和业务模块指标。
  • 受控验收入口:
    • OTel/Tempo 使用 $unidesk-otel
    • Prometheus 与 Web 哨兵使用 $unidesk-monitor
    • 指标、trace 或版本一致性漂移不得改变业务 ready 终态。

退役与推广

  • development 验收通过后退役旧 test 对象:
    • pikaoa-test namespace
    • 旧 test Repository/Argo/GitOps 资源;
    • 旧 test Secret source 与数据库 role/database
    • 旧 test CLI 状态目录。
  • 退役必须精确限定旧 test 对象:
    • 禁止删除 pikaoa production namespace
    • 禁止删除 pikaoa-ci
    • 禁止删除 pikaoa-dev
    • 禁止触碰其他 PaC consumer。
  • production 推广:
    • 先完成 development CLI/Web/OTel/Prometheus 验收;
    • 再通过正常 master -> release PR 推广;
    • release PR merge 是生产自动交付的唯一触发;
    • 生产推广不复制 development 数据。