# CodeLInk
**Repository Path**: heavenly-number/efficiency-management-system
## Basic Information
- **Project Name**: CodeLInk
- **Description**: 使用C++设计并实现了一个前后端分离的多用户在线程序交流分享平台,采用微服务架构,包含Qt客户端、HTTP网关服务器和多个gRPC微服务。
- **Primary Language**: C++
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-10-13
- **Last Updated**: 2026-10-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# CodeLink — 模块化协作与即时通信基座
CodeLink 由三部分组成:一个 C++ 高并发 HTTP/WebSocket **Gateway**、一组按模块组合的
**Go 业务服务**(community / messaging / social / media / catalog / verify)、以及一个
**Qt 桌面客户端**。整套栈以容器交付,由 CI 九阶段流水线构建、验证并推送到预生产环境。
> 一句话定位:这是一个**按 composition 组合、可验证、可回滚**的微服务基座 ——
> 不是单点 demo,也不是"什么都能开"的一体化服务。
>
> 本文档是**现行事实来源**之一。历史文档已归档,见 [docs/archive/README.md](docs/archive/README.md)。
---
## 1. 当前拓扑
```mermaid
graph LR
QT["Qt 桌面客户端
view/"]
EDGE["tianshucode-edge
nginx(独立容器)"]
GW["gateway
C++ HTTP/WS 入口"]
COMM["community-rpc
Go"]
MSG["messaging-rpc
Go"]
SOCIAL["social-rpc
Go(参见 §2)"]
KC["keycloak + keycloak-db
OIDC 身份提供方"]
MYSQL[("mysql")]
REDIS[("redis")]
QT -->|HTTPS| EDGE
EDGE -->|proxy_pass| GW
GW -->|gRPC + 内部身份校验| COMM
GW -->|gRPC + 内部身份校验| MSG
GW -.->|设计态| SOCIAL
GW -->|OIDC JWT 校验| KC
COMM --> MYSQL
MSG --> MYSQL
GW --> REDIS
KC --> MYSQL
```
网关不直连业务库:业务查询走各服务的 gRPC 契约。
身份走 OIDC,Gateway 校验 `iss` / `aud` / `sub` / 租户与权限 claim,不读宿主账号库。
## 2. 生产 composition 是 10 个服务
`community-chat-desktop` 是生产使用的 composition,模块集是 5 个模块
(`codelink.platform`、`codelink.identity-adapter`、`codelink.community`、`codelink.messaging`、
`codelink.social`),`compose render` 渲染出来是 **10 个服务**:`gateway`、`community-rpc`、
`messaging-rpc`、`platform-rpc`、`social-rpc`、`mysql`、`redis`、`minio`、`keycloak`、
`keycloak-db`。
`codelink.social` 于 **2026-09-28 按其自身要求立正**:2026-09-19 那次"把 social 移出生产"的
降级裁决写明要按带容量规划的独立立项推进,四项评估(内存、库、备份面、回滚面)已在
`docs/backend/2026-09-28-social-立项评估.md` 补齐并撤销该裁决。代价是诚实的:任何部署
`community-chat-desktop` 的地方都必须同时起 `social-rpc`,dev 栈也一样。
> **验收记录已按真实部署回填**:2026-10-05 在 124 上走完一次**真实激活**
> (候选 `21087d44` / run `3293950`:10 容器、`/api/ready` 全模块 ready、`doctor` PASS),
> `modules/manifests/runtime-acceptance.json` 的 `community-chat-desktop` 更新为 10 服务 / 5 模块,
> `codelinkctl up` 不再以 `runtime_acceptance_services_mismatch` / `..._compose_plan_mismatch`
> fail-closed。详见 [ARCHITECTURE.md §10](ARCHITECTURE.md) 与 `docs/LOCAL_DEV.md`。
## 3. 目录结构(受跟踪的顶层)
| 路径 | 作用 |
|---|---|
| `gateway/` | C++ HTTP/WebSocket 网关(composition 路由、OIDC、RBAC、ready/metrics/drain) |
| `common/` | 网关与服务共享的 C++ 组件 |
| `platform/` | 平台级 C++ 能力(身份适配、TLS、信任边界) |
| `services/` | Go 业务服务:`community` / `messaging` / `social` / `verify-server` |
| `modules/` | 模块清单与 composition 定义(`manifests/`) |
| `schemas/` | 模块清单等 JSON Schema |
| `deploy/compose/` | 可选组合的 Compose 契约(见该目录 README) |
| `deploy/production/` | 生产用 Keycloak realm 模板等 |
| `database/` | DDL 包与执行计划(下游消费者,真源见 §6) |
| `sql/review/v2` | **数据库 DDL 真源** |
| `docker/` | 镜像构建:`Dockerfile.modular-build`、`Dockerfile.service-runtime` |
| `tools/codelinkctl/` | 本地栈编排 CLI(见其 README) |
| `scripts/ci/` | CI 各阶段脚本 |
| `.workflow/` | Gitee Go 流水线定义 |
| `tests/` | C++ 单测/合约测 + Python 回归套件 |
| `view/` | Qt 桌面客户端 |
| `docs/` | 现行文档;历史文档在 `docs/archive/` |
## 4. 快速开始
三条路径,按你要的深度选。**先看 [docs/LOCAL_DEV.md](docs/LOCAL_DEV.md)**,
那里有实测耗时、每步期望输出,以及起栈的已知阻塞。
### 路径 A:证明代码干净(约 7 分钟,零前置依赖)
```bash
docker build --file docker/Dockerfile.modular-build \
--build-arg CODELINK_COMPOSITION_FLAVOR=community-chat-desktop -t codelink/modular-build:check .
```
镜像内自带 `ctest` 与 flavor 符号断言。成功意味着:构建通过、17 个 C++ 测试全绿、
生产镜像里不存在被排除模块的符号。
### 路径 B:走一遍本地编排校验(约 2 分钟,不启动容器)
```bash
python tools/codelinkctl/codelinkctl.py init \
--instance-dir .local/dev --composition community-chat-desktop --project-name codelink-dev
# 按 init 的输出替换 .env 里的 REQUIRED_*(含 OIDC 五项),再:
python tools/codelinkctl/codelinkctl.py config validate --instance-dir .local/dev
python tools/codelinkctl/codelinkctl.py compose render \
--composition community-chat-desktop --instance-dir .local/dev --dev-ports
python tools/codelinkctl/codelinkctl.py doctor --composition community-chat-desktop --static
```
### 路径 C:真正把栈跑起来
需要**已存在的、按摘要/ID 固定的镜像集**(`codelinkctl up` 拒绝拉取镜像),
且当前 `runtime-acceptance.json` 的绑定与最新代码不一致 —— 见
[docs/LOCAL_DEV.md](docs/LOCAL_DEV.md) 的"起栈前置与已知阻塞"。
可复现的重路径是 `scripts/acceptance/run_community_oidc_keycloak.sh`
(建镜像、建库、起栈、负向矩阵与证据收口)。
## 5. 端口与探针
| 用途 | 地址 |
|---|---|
| Gateway HTTP | `127.0.0.1:8080`(开发 overlay 默认 `18190`) |
| Gateway 探针 | `/api/ping`、`/api/health`、`/api/ready`、`/api/metrics` |
| Gateway 生命周期 | `GET /api/build`、`POST /api/drain`(需 `lifecycle_token` Bearer) |
| Keycloak | `127.0.0.1:18086`(开发 overlay 默认 `18196`),管理端口 9000 |
| MySQL / Redis | 仅在内部网络,**不发布宿主端口**(开发 overlay 也只发布 Gateway 与 Keycloak) |
## 6. 数据层
- **DDL 真源是 `sql/review/v2`**。`database/packages/` 是它的下游消费者:
按字节流 + `DDL_MANIFEST.sha256` 固定,规划器在产出计划前校验两者。
- 数据库变更是**独立审批路径**:`codelinkctl db plan` 出计划 → 人审 → `db apply-local`
(只接受 `--empty-target`,不接受任何 DSN / 主机 / 口令参数)。
- 网关侧不持有业务库凭据;业务查询经各服务的 gRPC 契约。
## 7. CI 与门禁
两条 Gitee Go 流水线(定义在 `.workflow/`):
| 流水线 | 触发 | 阶段 |
|---|---|---|
| `rc8-branch-gate.yml` | push 到 `codex/`、`feature/` 前缀的分支 | 2 段:runner canary、Linux 质量门禁 |
| `rc8-release-pipeline.yml` | push 到 `master` | **9 段**,见下 |
`rc8-release-pipeline.yml` 阶段 1–4 自动、**5–9 是人工闸门**(`trigger: manual`),
需要在构建详情页点"手动执行":
1. Runner capacity canary(auto)
2. Linux C++ Go Compose gates(auto)
3. Build immutable candidate(auto)
4. Supply-chain gates(auto:SBOM、Trivy、cosign 签名与校验、secret scan、证据清单)
5. 121 打包预生产候选(**manual**)
6. 121 探活并传输到 124 受限入口(**manual**)
7. 124 部署状态机 dry-run(**manual**,`activation_enabled=false`、`mutation=none`)
8. 124 复验部署状态(**manual**)
9. 124 收口预生产证据(**manual**)
`activate` 从未在 CI 中执行;是否放行启用是人工裁决。
## 8. 历史与退路
旧的原生五服务栈(`boosttest` / `StatusServer` / `ChatServer1` / `ChatServer2`)与
旧部署路径(根 `docker-compose.yml`、`deploy/docker-compose.linux.yml`、`nginx/`、
`sql/init.sql` 等)已分两次退役(PR #1 部署路径、PR #2 源码栈)。
**可回滚退路**:Git 标签 `legacy-final`(`960cbce8c09761a7469920b742a037167f632d26`)
+ 离线 `git bundle`(sha256 `F04261FE07A36BCF0042C873E57907022E097B01753FCF2DA7C3579C779EE533`)。
恢复方式与语义变化见 [docs/legacy-retirement.md](docs/legacy-retirement.md)。
## 9. 推荐阅读
| 文档 | 内容 |
|---|---|
| [ARCHITECTURE.md](ARCHITECTURE.md) | 服务边界、链路、composition × 模块矩阵、已知缺口 |
| [docs/LOCAL_DEV.md](docs/LOCAL_DEV.md) | 本地栈从零到可验证,含实测耗时与阻塞说明 |
| [DEPLOY.md](DEPLOY.md) | 真实部署路径:121 构建 → CI 九阶段 → 124 受限通道 |
| [docs/文档导航.md](docs/文档导航.md) | 文档总入口 |
| [tools/codelinkctl/README.md](tools/codelinkctl/README.md) | 本地编排 CLI 的完整语义与安全边界 |
| [deploy/compose/README.md](deploy/compose/README.md) | Compose 契约与服务选择规则 |
| [docs/legacy-retirement.md](docs/legacy-retirement.md) | 两次退役删了什么、怎么回滚 |
## 10. 二次开发约定
1. 新能力先落到**模块清单**(`modules/manifests/`),再写代码;composition 是组合,不是分支。
2. 新增 HTTP 路由要同步补 composition 路由契约、RBAC 权限点与 metrics。
3. 跨服务调用统一走 gRPC 契约与内部身份校验,不新增裸内部接口。
4. 数据表变更走 `sql/review/v2` + `database/packages` 审批路径,不手改生产库。
5. 改动构建系统后必须用 `docker/Dockerfile.modular-build` 在**目标 flavor** 上验证 ——
它自带 ctest 与符号断言,是唯一可信的构建证据。