Files
Edu/services/content
SpecialX 566060fade feat(infra): p6 hardening - observability and deploy compose
- 5 NestJS services add /metrics endpoint via app.getHttpAdapter()
- prometheus.yml scales to 8 services with rule_files and alertmanager
- monitoring compose replaces blackbox with Loki+Promtail
- Grafana datasource adds Loki
- docker-compose.deploy.yml scales to 11 services
- deploy.env.example completes Neo4j/ES/ClickHouse/LLM vars
- teacher-bff adds health.controller
- CI removes continue-on-error on lint step
- teacher-portal lint script changed to eslint src
2026-07-09 10:21:06 +08:00
..

content 内容资源服务

版本:0.1(P4 骨架) 端口:3005

职责

内容资源限界上下文,管理 Textbook、Chapter、KnowledgePoint 聚合。 支持多存储:MySQL(教材/章节/知识点写模型)+ Neo4j(知识图谱前置依赖)+ Elasticsearch(题库全文检索,P4 后续补充)。

技术栈

  • NestJS 10.x + TypeScript 5.6(ESM)
  • Drizzle ORM(MySQL)
  • neo4j-driver(知识图谱)
  • Zod(运行时校验)
  • pino(日志)+ prom-client(指标)+ OpenTelemetry(追踪)

开发

pnpm install
pnpm dev        # 端口 3005
pnpm build
pnpm typecheck
pnpm lint
pnpm test

环境变量

变量 说明
PORT 服务端口(默认 3005)
DATABASE_URL MySQL 连接串
NEO4J_URL Neo4j Bolt 连接 URL
NEO4J_PASSWORD Neo4j 密码
ES_URL Elasticsearch 地址
JWT_SECRET JWT 密钥
OTEL_EXPORTER_OTLP_ENDPOINT OpenTelemetry OTLP 端点(可选)

模块结构

src/
├─ config/          # env、database(MySQL)、neo4j
├─ shared/
│  ├─ errors/       # ApplicationError + GlobalErrorFilter(CONTENT_* 前缀)
│  └─ observability/# logger、metrics、tracer
├─ textbooks/       # 教材/章节/知识点 + 知识图谱
├─ app.module.ts
└─ main.ts

关键端点

  • POST /textbooks 创建教材
  • GET /textbooks 教材列表
  • GET /textbooks/:id 教材详情
  • TextbooksService.createKnowledgeGraph 在 Neo4j 构建知识点前置依赖
  • TextbooksService.getPrerequisites 查询知识点前置链路

健康检查

端点 用途 鉴权
GET /healthz 存活探针(liveness),仅返回进程状态,不检查依赖 无
GET /readyz 就绪探针(readiness),检查 DB 连接,失败返回 503 无

实现见 src/shared/health/health.controller.ts,5 个 NestJS 服务(iam/core-edu/content/msg/classes)一致。

对外契约

gRPC 服务 TextbookService、KnowledgeGraphService 定义见 packages/shared-proto/proto/content.proto。