Files
AIclinicalresearch/docs/05-部署文档/13-Node.js后端-镜像修复记录.md
HaHafeng 1b53ab9d52 feat(aia): Complete AIA V2.0 with universal streaming capabilities
Major Changes:
- Add StreamingService with OpenAI Compatible format
- Upgrade Chat component V2 with Ant Design X integration
- Implement AIA module with 12 intelligent agents
- Update API routes to unified /api/v1 prefix
- Update system documentation

Backend (~1300 lines):
- common/streaming: OpenAI Compatible adapter
- modules/aia: 12 agents, conversation service, streaming integration
- Update route versions (RVW, PKB to v1)

Frontend (~3500 lines):
- modules/aia: AgentHub + ChatWorkspace (100% prototype restoration)
- shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook
- Update API endpoints to v1

Documentation:
- AIA module status guide
- Universal capabilities catalog
- System overview updates
- All module documentation sync

Tested: Stream response verified, authentication working
Status: AIA V2.0 core completed (85%)
2026-01-14 19:15:01 +08:00

5.0 KiB
Raw Blame History

Node.js å<>Žç«¯ - 镜åƒ<C3A5>ä¿®å¤<C3A5>记录

**ä¿®å¤<C3A5>æ—¶é—´**ï¼?025-12-24 **问题原因**:Docker镜åƒ<C3A5>中缺å°configç®å½• 解决方案:é‡<EFBFBD>æ°æž„建镜åƒ<EFBFBD>v1.1


ðŸ<EFBFBD> 问题æ<CB9C><C3A6>è¿°

错误信æ<EFBFBD>¯

Error: ENOENT: no such file or directory, open '/app/config/agents.yaml'

根本原因

  • 应用å<EFBFBD>¯åŠ¨æ—¶éœ€è¦<EFBFBD>读å<EFBFBD>?/app/config/agents.yaml é…<C3A9>ç½®æ‡ä»¶
  • Dockerfile v1.0 中å<C2AD>ªå¤<C3A5>制äº?dist å’?prisma 目录
  • é<EFBFBD>—æ¼<EFBFBD>äº?config 目录

�解决方案

1. 修改Dockerfile

修改ä½<EFBFBD>ç½®1:构建阶段(ç¬?2行)

# 5. å¤<C3A5>制本地已ç¼è¯å¥½çš?dist æ‡ä»¶å¤¹ï¼ˆè·³è¿‡TypeScriptç¼è¯ï¼?
COPY dist ./dist

# 6. å¤<C3A5>制é…<C3A9>ç½®æ‡ä»¶ï¼ˆagents.yaml等)âœ?新增
COPY config ./config

修改ä½<EFBFBD>ç½®2:è¿<EFBFBD>行阶段(ç¬?1行)

# 从构建阶段å¤<C3A5>制产ç‰?
COPY --from=builder --chown=nodejs:nodejs /app/node_modules ./node_modules
COPY --from=builder --chown=nodejs:nodejs /app/dist ./dist
COPY --from=builder --chown=nodejs:nodejs /app/package*.json ./
COPY --from=builder --chown=nodejs:nodejs /app/prisma ./prisma
COPY --from=builder --chown=nodejs:nodejs /app/config ./config  �新增

2. é‡<C3A9>æ°æž„建镜åƒ<C3A5>

**构建命令**�

docker build -t crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.1 .

构建结果�

  • âœ?构建æˆ<C3A6>功
  • âœ?耗时ï¼?9.4ç§?
  • âœ?镜åƒ<C3A5>大å°<C3A5>:~186MB(åŽç¼©å<C2A9>Žï¼?

3. 推é€<C3A9>到ACR

**推é€<C3A9>å½ä»?*ï¼?

docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.1

**推é€<C3A9>结æž?*ï¼?

  • âœ?推é€<C3A9>æˆ<C3A6>åŠ?
  • âœ?Digest: sha256:f309cec92d2ebb7fd40c38916980d7fcc2d589e61d10a8875f2976c267eac890

📦 æ°ç‰ˆæœ¬é•œåƒ<C3A5>ä¿¡æ<C2A1>?

版本对比

项目 v1.0(旧版本� v1.1(新版本�
Dockerfile修改 â<EFBFBD>?缺å°config âœ?包å<E280A6>«config
镜åƒ<EFBFBD>大å°<EFBFBD> 838MB 838MB(基本一致)
构建时间 ~5åˆ†éŸ ~1分éŸï¼ˆç¼“存优åŒï¼‰
*状æ€? â<EFBFBD><>¯åŠ¨å¤±è´¥ âœ?待验è¯?

æ°ç‰ˆæœ¬é•œåƒ<EFBFBD>地å<EFBFBD>

**å…¬ç½åœ°å<C2B0>€**(用于本地æ‰å<E280B0>)ï¼?

crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.1

**VPC地å<C2B0>€**(SAE部署使用):

crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.1

🎯 ä¸ä¸€æ­¥æ“<C3A6>ä½?

步骤1:登录SAE控制å<EFBFBD>?

访问:https://sae.console.aliyun.com/

步骤2ï¼šæ´æ°åº”用镜åƒ<EFBFBD>版æœ?

  1. 找到应用:nodejs-backend-test
  2. ç¹å‡»ã€<EFBFBD>é…<EFBFBD>置管ç<EFBFBD>†ã€â†ã€<EFBFBD>部署é…<EFBFBD>ç½®ã€?
  3. 找到"镜åƒ<C3A5>设置"部分
  4. 修改镜åƒ<EFBFBD>版本ï¼?
    • 从:backend-service:v1.0
    • 改为:backend-service:v1.1 âœ?

步骤3:ä¿<EFBFBD>存并é‡<EFBFBD>æ°éƒ¨ç½²

  1. ç¹å‡»ã€<EFBFBD>ä¿<EFBFBD>å­˜ã€?
  2. ç¹å‡»ã€<EFBFBD>é‡<EFBFBD>æ°éƒ¨ç½²ã€?
  3. 等待3-5分éŸ
  4. 查看实时日志

�预期结果

æˆ<EFBFBD>功的日志输å‡?

============================================================
🚀 AI临床研究平å<C2B3>° - å<>Žç«¯æœ<C3A6>务器å<C2A8>¯åЍæˆ<C3A6>功ï¼<C3AF>
============================================================
ðŸ“<C5B8> æœ<C3A6>务地å<C2B0>€: http://0.0.0.0:3001
ðŸ”<C5B8> å<>¥åº·æ£€æŸ? http://0.0.0.0:3001/health
📡 APIå…¥å<C2A5>£: http://0.0.0.0:3001/api/v1
ðŸŒ<C5B8> è¿<C3A8>行环境: production
============================================================

[INFO] Server listening at http://0.0.0.0:3001
[INFO] Config loaded: /app/config/agents.yaml �
[INFO] Database connected successfully
[INFO] Health check endpoint available

关键验è¯<EFBFBD>ç?

  • 应用状æ€<EFBFBD>:è¿<EFBFBD>行中(绿色ï¼?
  • å<EFBFBD>¥åº·æ£€æŸ¥ï¼šé€šè¿‡ï¼ˆç»¿è‰²ï¼‰
  • 日志中出现:Config loaded: /app/config/agents.yaml âœ?
  • æ— ENOENT错误

ðŸ“<EFBFBD> ä¿®å¤<C3A5>总结

**问题根æº<C3A6>**:Dockerfileä¸<C3A4>完整,é<C592>—æ¼<C3A6>é…<C3A9>ç½®æ‡ä»¶ **ä¿®å¤<C3A5>æ¹å¼<C3A5>**:添åŠ?行COPY指令 **å½±å“<C3A5>范å´**:仅需é‡<C3A9>æ°æž„建åŒéƒ¨ç½²ï¼Œæ— éœ€ä¿®æ”¹ä»£ç <C3A7> **ä¿®å¤<C3A5>æ—¶é—´**:约5分éŸï¼ˆæž„å»?分钟 + 推é€?分钟 + 部署3分éŸï¼?


ðŸ”<EFBFBD> 预防措施

1. Dockerfile检查清å<E280A6>?

åˆå»ºå®Œæ•´çš„æ‡ä»¶å¤<EFBFBD>制清å<EFBFBD>•:

�COPY package*.json ./
�COPY prisma ./prisma/
�COPY dist ./dist/
âœ?COPY config ./config/  # ä¸<C3A4>è¦<C3A8>é<EFBFBD>—æ¼<C3A6>ï¼?
â<EFBFBD>?COPY public ./public/  # 妿žœæœ‰é<E280B0>™æ€<C3A6>æ‡ä»?
â<EFBFBD>?COPY scripts ./scripts/ # 妿žœæœ‰å<E280B0>¯åŠ¨è„šæœ?

2. 本地æµè¯•æµ<C3A6>ç¨

在推é€<EFBFBD>镜åƒ<EFBFBD>å‰<EFBFBD>,先在本地æµè¯•:

# 1. 构建镜åƒ<C3A5>
docker build -t backend-test:local .

# 2. 本地è¿<C3A8>行æµè¯•
docker run -p 3001:3001 \
  -e DATABASE_URL="..." \
  -e JWT_SECRET="..." \
  backend-test:local

# 3. 访问å<C2AE>¥åº·æ£€æŸ?
curl http://localhost:3001/health

# 4. 确认无错误å<C2AF>Žå†<C3A5>推é€?

3. CI/CD醿ˆ<C3A6>

建议在GitHub Actions中添加:

- name: Build Docker Image
  run: docker build -t backend:${{ github.sha }} .

- name: Test Docker Image
  run: |
    docker run -d -p 3001:3001 backend:${{ github.sha }}
    sleep 10
    curl http://localhost:3001/health

**文档创建时间**�025-12-24
**维护人员**:è¿<C3A8>ç»´å¢é˜?