Files
Edu/services/content/Dockerfile
SpecialX 99580fa13a feat(content): docker 本地测试通过 + P5 ES 集成 + P6+ 审核工作流/可视化/可观测性
P5 ES 集成:
- config/elasticsearch.ts: 惰性初始化 + ik_max_word→standard 回退
- shared/sync/es-sync.worker.ts: Kafka 消费 question 事件并索引 ES
- questions search API: ES 优先, MySQL LIKE 降级
- ensureQuestionIndex() 幂等创建, IK 不可用回退 standard
- main.ts: 启动 ensureQuestionIndex + esSyncWorker 生命周期管理

P6+ 审核工作流/可视化/可观测性:
- Question 状态机: draft→pending_review→published→archived
- 非法转换拦截
- 知识图谱可视化 API: Neo4j 优先 + MySQL 降级
- Cypher 返回标量避免 Node 包装对象问题
- 教材版本管理: GET /textbooks/versions + archive
- 5 个 Prometheus 指标 + /readyz Outbox 积压检查

Docker 本地测试 (8 类全通过):
- healthz/readyz (5 依赖 ok)
- REST CRUD (textbook/chapter/kp/question)
- ES 全文检索命中
- 审核工作流状态机 (合法/非法转换)
- Outbox 事件驱动 (8 事件全 published)
- Neo4j 同步 (KnowledgePoint 节点创建)
- 可视化 (nodes/edges 正确)
- Prometheus 指标

docs/nextstep.md: 上游 (MySQL/Neo4j/Kafka/Redis/ES/ai)
+ 下游 (teacher-bff/student-bff/parent-bff/data-ana/api-gateway/ai)
2026-07-14 00:58:50 +08:00

47 lines
1.4 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Build stage
FROM node:20-alpine AS builder
WORKDIR /app
RUN npm install -g pnpm
# 复制 workspace 根配置
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml tsconfig.base.json ./
# 复制 shared-protoproto 文件运行时需要)
COPY packages/shared-proto/package.json packages/shared-proto/
COPY packages/shared-proto/proto packages/shared-proto/proto
# 复制 content 服务
COPY services/content/package.json services/content/tsconfig.json services/content/nest-cli.json ./services/content/
COPY services/content/src ./services/content/src
# 安装依赖(不执行 scripts
RUN pnpm install --frozen-lockfile --ignore-scripts
# 构建
RUN cd services/content && pnpm build
# Runtime stage
FROM node:20-alpine
WORKDIR /app
RUN npm install -g pnpm
# 复制 workspace 配置
COPY pnpm-workspace.yaml package.json pnpm-lock.yaml tsconfig.base.json ./
# 复制 shared-proto运行时加载 proto 文件)
COPY packages/shared-proto/package.json packages/shared-proto/
COPY packages/shared-proto/proto packages/shared-proto/proto
# 复制 content 服务 package.json
COPY services/content/package.json ./services/content/
# 安装生产依赖
RUN pnpm install --prod --frozen-lockfile --ignore-scripts
# 复制构建产物
COPY --from=builder /app/services/content/dist ./services/content/dist
EXPOSE 3005 50054
WORKDIR /app/services/content
CMD ["node", "dist/main.js"]