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%)
13 KiB
Node.js <20>𡒊垢 - Docker <20>𨅯<EFBFBD><F0A885AF><EFBFBD>遣<EFBFBD>滢<EFBFBD><E6BBA2>见<EFBFBD>
<EFBFBD><EFBFBD>﹝<EFBFBD><EFBFBD>𧋦: v1.0
<EFBFBD>𥕦遣<EFBFBD>園𡢿: 2024-12-24
<EFBFBD><EFBFBD>鍂<EFBFBD><EFBFBD>凒: AIclinicalresearch 撟喳蝱 - Node.js <20>𡒊垢<F0A1928A>滚𦛚
**<2A>格<EFBFBD>霂餉<E99C82>?*: 餈鞟輕撌亦<E6928C>撣<EFBFBD><E692A3><EFBFBD><EFBFBD>蝡臬<E89DA1><E887AC>穃極蝔见<E89D94>
<EFBFBD><EFBFBD> <20>桀<EFBFBD>
- <EFBFBD><EFBFBD>遣璁<EFBFBD>膩
- <EFBFBD>滨蔭<EFBFBD><EFBFBD><EFBFBD>
- <EFBFBD><EFBFBD>遣瘚<EFBFBD><EFBFBD>
- <EFBFBD>𨅯<EFBFBD>靽⊥<EFBFBD>
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>埝䰻
- [<5B><>雿喳<E99BBF>頝琶(#<23><>雿喳<E99BBF>頝?
1. <20><>遣璁<E981A3>膩
1.1 <20><>遣蝑𣇉裦
<EFBFBD>祆活<EFBFBD><EFBFBD>遣<EFBFBD><EFBFBD>鍂**<2A>寡<EFBFBD><E5AFA1><EFBFBD>䲮獢㇂嚗<E38782>𧋦<EFBFBD>啁<EFBFBD>霂?Docker<65>枏<EFBFBD>嚗?*嚗𣬚㮾瘥𥪯<E798A5>蝏<EFBFBD>䲮獢<E4B2AE><E78DA2>隞乩<E99A9E>隡睃飵嚗?
| 撖寞<EFBFBD>憿? | 隡删<EFBFBD><EFBFBD>寞<EFBFBD> | <EFBFBD>寡<EFBFBD><EFBFBD><EFBFBD>䲮獢㇂ |
|---|---|---|
| TypeScript蝻𤥁<EFBFBD> | Docker銝剜<EFBFBD>銵? | <EFBFBD>砍𧑐憸<EFBFBD><EFBFBD>霂?<3F>? |
| 靘肽<EFBFBD>摰㕑<EFBFBD> | 摰峕㟲靘肽<EFBFBD> | 隞<EFBFBD><EFBFBD>鈭找<EFBFBD>韏?<3F>? |
| 蝵𤑳<EFBFBD>靘肽<EFBFBD> | 擃矋<EFBFBD><EFBFBD>栞<EFBFBD><EFBFBD>塚<EFBFBD> | 雿𠬍<EFBFBD><EFBFBD>渡迅摰𡄯<EFBFBD> <20>? |
| <EFBFBD><EFBFBD>遣<EFBFBD>園𡢿 | ~10<31><30><EFBFBD> | ~5<><35><EFBFBD> <20>? |
| *撟喳蝱<EFBFBD>澆捆<EFBFBD>? | <EFBFBD>厰<EFBFBD><EFBFBD>? | <EFBFBD>𣳇<EFBFBD><EFBFBD>?<3F>? |
1.2 <20><>遣<EFBFBD>鞉<EFBFBD>
<EFBFBD>𨅯<EFBFBD><EFBFBD>滨妍: backend-service:v1.0
<0A>𨅯<EFBFBD>憭批<E686AD>: 838MB (<28>讠憬<E8AEA0>?~186MB)
<0A>𨅯<EFBFBD>ID: a4ffb61c15af
<0A><>遣<EFBFBD>園𡢿: ~5<><35><EFBFBD>
ACR<43>啣<EFBFBD>: crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
2. <20>滨蔭<E6BBA8><E894AD><EFBFBD>
2.1 <20>臬<EFBFBD>璉<EFBFBD><E79289>?
# 1. 璉<><E79289>主ocker<65>嗆<EFBFBD>?
docker --version
docker ps
# 2. 璉<><E79289>代ode.js<6A>臬<EFBFBD>
node --version # 摨磰砲<E7A3B0>曄內 v22.x
npm --version
# 3. 蝖株恕敶枏<E695B6><E69E8F>桀<EFBFBD>
cd D:\MyCursor\AIclinicalresearch\backend
2.2 隞<><E99A9E><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>?敹<>◆摰峕<E691B0><E5B395><EFBFBD>郊撉?
甇仿炊1嚗䥪risma<EFBFBD>滚<EFBFBD><EFBFBD>峕郊嚗<EFBFBD><EFBFBD>憿鳴<EFBFBD>
# 霈曄蔭銝湔𧒄RDS餈墧𦻖<E5A2A7>臬<EFBFBD><E887AC>㗛<EFBFBD>
$env:DATABASE_URL = "postgresql://airesearch:Xibahe%40fengzhibo117@pgm-2zex1m2y3r23hdn5oo.pg.rds.aliyuncs.com:5432/ai_clinical_research?connection_limit=18&pool_timeout=10"
# <20>扯<EFBFBD>Prisma<6D>滚<EFBFBD><E6BB9A>峕郊
npx prisma db pull
# 颲枏枂摨磰砲<E7A3B0>曄內嚗?
# <20>?Introspected 32 models and wrote them into prisma\schema.prisma
甇仿炊2嚗𡁶<EFBFBD><EFBFBD>辥risma Client
npx prisma generate
# 颲枏枂摨磰砲<E7A3B0>曄內嚗?
# <20>?Generated Prisma Client (v6.17.0)
甇仿炊3嚗関ypeScript蝻𤥁<EFBFBD>嚗<EFBFBD><EFBFBD>憿鳴<EFBFBD>
# 蝻𤥁<E89DBB>TypeScript隞<74><E99A9E>
npm run build
# <20>𣂼<EFBFBD>颲枏枂嚗?
# > ai-clinical-backend@1.0.0 build
# > tsc
# (<28>𣳇<EFBFBD>霂臭縑<E887AD>?
# 璉<><E79289>卡ist<73>桀<EFBFBD><E6A180>臬炏<E887AC><E7828F><EFBFBD>
ls dist
<EFBFBD>𩤃<EFBFBD> <EFBFBD>滩<EFBFBD><EFBFBD>鞟內嚗𡁜<EFBFBD><EFBFBD>𦦵<EFBFBD>霂穃仃韐伐<EFBFBD>敹<EFBFBD>◆<EFBFBD><EFBFBD>耨憭齿<EFBFBD><EFBFBD>凤ypeScript<EFBFBD>躰秤嚗?
3. <20><>遣瘚<E981A3><E7989A>
3.1 摰峕㟲<E5B395><E39FB2>遣甇仿炊
# 1. 蝖桐<E89D96><E6A190>灸ackend<6E>桀<EFBFBD>
cd D:\MyCursor\AIclinicalresearch\backend
# 2. 璉<><E79289>主ockerfile<6C>?dockerignore
ls Dockerfile
ls .dockerignore
# 3. 撘<>憪𧢲<E686AA>撱綽<E692B1><E7B6BD><EFBFBD>閬?<3F><><EFBFBD>嚗?
docker build -t backend-service:v1.0 .
# 4. <20>亦<EFBFBD><E4BAA6><EFBFBD>遣蝏𤘪<E89D8F>
docker images backend-service:v1.0
3.2 <20><>遣餈<E981A3><E9A488>霂湔<E99C82>
*<EFBFBD>嗆挾1嚗帋<EFBFBD>韏硋<EFBFBD>鋆<EFBFBD><EFBFBD>蝥?<3F><><EFBFBD>嚗?
FROM node:alpine AS builder
RUN apk add --no-cache openssl
COPY package*.json ./
COPY prisma ./prisma/
RUN npm ci --production # 隞<><E99A9E>鋆<EFBFBD><E98B86>鈭找<E988AD>韏?
RUN npx prisma generate # <20><><EFBFBD>Prisma Client
<EFBFBD>嗆挾2嚗𡁜<EFBFBD><EFBFBD>嗆𧋦<EFBFBD>啁<EFBFBD>霂𤑳<EFBFBD><EFBFBD>頣<EFBFBD>蝥?0蝘𡜐<E89D98>
COPY dist ./dist # 憭滚<E686AD><E6BB9A>砍𧑐撌脩<E6928C>霂𤑳<E99C82>TypeScript隞<74><E99A9E>
*<EFBFBD>嗆挾3嚗朞<EFBFBD>銵屸<EFBFBD><EFBFBD>𤩺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝥?<3F><><EFBFBD>嚗?
FROM node:alpine
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/prisma ./prisma
3.3 <20>券<EFBFBD><E588B8><EFBFBD>ACR
# 1. <20>餃<EFBFBD>ACR嚗<52>蝙<EFBFBD>其葵鈭箇<E988AD>摰硺<E691B0><E7A1BA>啣<EFBFBD>嚗?
echo "fengzhibo117" | docker login --username=gofeng117@163.com --password-stdin crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
# 颲枏枂嚗匁ogin Succeeded
# 2. <20>𤘪<EFBFBD>蝑?
docker tag backend-service:v1.0 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
docker tag backend-service:v1.0 crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest
# 3. <20>券<EFBFBD><E588B8><EFBFBD><EFBFBD>?
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest
# 颲枏枂嚗?
# v1.0: digest: sha256:a4ffb61c15af... size: 856
# latest: digest: sha256:a4ffb61c15af... size: 856
4. <20>𨅯<EFBFBD>靽⊥<E99DBD>
4.1 <20>𨅯<EFBFBD><F0A885AF>啣<EFBFBD>
VPC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>啣<EFBFBD>嚗𠄎AE<EFBFBD>函蔡雿輻鍂嚗㚁<EFBFBD>
crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
<EFBFBD>祉<EFBFBD><EFBFBD>啣<EFBFBD>嚗<EFBFBD>䰻<EFBFBD>见<EFBFBD><EFBFBD>匧<EFBFBD>嚗㚁<EFBFBD>
crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
4.2 <20>𨅯<EFBFBD>霂行<E99C82>
<EFBFBD>𨅯<EFBFBD><EFBFBD>䁅<EFBFBD>: sha256:a4ffb61c15af1cd1ed9de187b4464a1aab773918e5b41b4df5b8ad96514f9941
憭批<EFBFBD>: 838MB (<28>讠憬<E8AEA0>?~186MB)
<EFBFBD>嗆<EFBFBD>: linux/amd64
<EFBFBD>箇<EFBFBD><EFBFBD>𨅯<EFBFBD>: node:alpine
Node<EFBFBD><EFBFBD>𧋦: 22.x
<EFBFBD><EFBFBD>倌: v1.0, latest
4.3 <20>𨅯<EFBFBD><F0A885AF><EFBFBD>捆
/app/
<0A>鎿<EFBFBD><E98EBF><EFBFBD> node_modules/ # <20>煺漣靘肽<E99D98>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> dist/ # 蝻𤥁<E89DBB><F0A4A581>𡒊<EFBFBD>JS隞<53><E99A9E>
<0A>鎿<EFBFBD><E98EBF><EFBFBD> prisma/ # Prisma Schema
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> schema.prisma
<0A>鎿<EFBFBD><E98EBF><EFBFBD> package.json
<0A>婙<EFBFBD><E5A999><EFBFBD> uploads/ # 銝湔𧒄<E6B994><F0A79284>辣<EFBFBD>桀<EFBFBD>
4.4 <20>臬𢆡<E887AC>賭誘
CMD ["node", "dist/index.js"]
4.5 <20>亙熒璉<E78692><E79289>?
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD node -e "require('http').get('http://localhost:3001/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1); })"
5. <20><><EFBFBD><EFBFBD>埝䰻
5.1 撣貉<E692A3><E8B289>桅<EFBFBD>
<EFBFBD>?<3F>桅<EFBFBD>1嚗関ypeScript蝻𤥁<E89DBB>憭梯揖
*<EFBFBD><EFBFBD>𠶖嚗?
error TS2554: Expected 2-3 arguments, but got 1.
error TS2322: Type 'XXX' is not assignable to type 'YYY'.
*<EFBFBD>笔<EFBFBD>嚗?
- Prisma<EFBFBD>滚<EFBFBD><EFBFBD>峕郊<EFBFBD>𡒊撩撠穃<EFBFBD>蝟餃<EFBFBD>畾?
- 隞<EFBFBD><EFBFBD>銝窰risma<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>掩<EFBFBD>衤<EFBFBD><EFBFBD>寥<EFBFBD>
*閫<EFBFBD><EFBFBD><EFBFBD>寞<EFBFBD>嚗?
# 1. <20>齿鰵<E9BDBF>峕郊Prisma
npx prisma db pull
npx prisma generate
# 2. <20>齿鰵蝻𤥁<E89DBB>
npm run build
# 3. 憒<><E68692>餈䀹<E9A488><E480B9>躰秤嚗峕<E59A97><E5B395>另sconfig.json<6F>滨蔭
<EFBFBD>?<3F>桅<EFBFBD>2嚗鋽ocker<65><72>遣蝵𤑳<E89DB5>頞<EFBFBD>𧒄
*<EFBFBD><EFBFBD>𠶖嚗?
npm error code ECONNRESET
npm error network aborted
*<EFBFBD>笔<EFBFBD>嚗?
- npm<EFBFBD>𨅯<EFBFBD>皞鞟<EFBFBD>蝏靝<EFBFBD>蝔喳<EFBFBD>
- npm ci 銝贝蝸靘肽<E99D98>憭梯揖
*閫<EFBFBD><EFBFBD><EFBFBD>寞<EFBFBD>嚗? <0A>?*雿輻鍂<EFBFBD>寡<EFBFBD><EFBFBD><EFBFBD>䲮獢㇂嚗<EFBFBD>𧋦甈⊿<EFBFBD><EFBFBD>函<EFBFBD><EFBFBD>寞<EFBFBD>嚗?
- <EFBFBD>砍𧑐憸<EFBFBD><EFBFBD>霂𡢅<EFBFBD>頝唾<EFBFBD>Docker銝剔<EFBFBD>蝻𤥁<EFBFBD>甇仿炊
- <EFBFBD>芸<EFBFBD>鋆<EFBFBD><EFBFBD>鈭找<EFBFBD>韏吔<EFBFBD><EFBFBD>誩<EFBFBD>蝵𤑳<EFBFBD>隡㰘<EFBFBD>
<EFBFBD>?<3F>桅<EFBFBD>3嚗𡁏綫<F0A1818F><E7B6AB><EFBFBD>ACR憭梯揖嚗?03 Forbidden嚗?
*<EFBFBD><EFBFBD>𠶖嚗?
Error response from daemon: login attempt to https://registry.cn-beijing.aliyuncs.com/v2/ failed with status: 403 Forbidden
*<EFBFBD>笔<EFBFBD>嚗?
- 雿輻鍂鈭<EFBFBD><EFBFBD>霂舐<EFBFBD>ACR<EFBFBD>啣<EFBFBD>
- 摨磰砲雿輻鍂銝芯犖<EFBFBD><EFBFBD><EFBFBD>靘见𧑐<EFBFBD><EFBFBD>嚗䔶<EFBFBD><EFBFBD>臭<EFBFBD>銝𡁶<EFBFBD><EFBFBD>啣<EFBFBD>
*閫<EFBFBD><EFBFBD><EFBFBD>寞<EFBFBD>嚗?
# <20>?甇<>&<EFBFBD><EFBC86>蒈敶訫𧑐<E8A8AB><F0A79190>嚗<EFBFBD>葵鈭箇<E988AD>摰硺<E691B0>嚗?
docker login crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com
# <20>?<3F>躰秤<E8BAB0><E7A7A4>蒈敶訫𧑐<E8A8AB><F0A79190>嚗<EFBFBD><E59A97>銝𡁶<E98A9D>嚗?
docker login registry.cn-beijing.aliyuncs.com
<EFBFBD>?<3F>桅<EFBFBD>4嚗间PC<50><43><EFBFBD><EFBFBD>啣<EFBFBD><E595A3>券<EFBFBD><E588B8><EFBFBD><EFBFBD>?
*<EFBFBD><EFBFBD>𠶖嚗?
failed to do request: Head "https://crpi-cd5ij4pjt65mweeo-vpc.cn-beijing.personal.cr.aliyuncs.com/...": net/http: TLS handshake timeout
*<EFBFBD>笔<EFBFBD>嚗?
- VPC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>啣<EFBFBD><EFBFBD>芾<EFBFBD><EFBFBD>券燵<EFBFBD>䔶<EFBFBD>VPC<EFBFBD><EFBFBD>挪<EFBFBD>?
- <EFBFBD>砍𧑐撘<EFBFBD><EFBFBD>𤑳㴓憓<EFBFBD><EFBFBD>瘜閗挪<EFBFBD>姬PC<EFBFBD><EFBFBD><EFBFBD>
*閫<EFBFBD><EFBFBD><EFBFBD>寞<EFBFBD>嚗?
# <20>砍𧑐撘<F0A79190><E69298>𤑳㴓憓<E3B493>蝙<EFBFBD>典<EFBFBD>蝵穃𧑐<E7A983><F0A79190><EFBFBD>券<EFBFBD>?
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
# SAE<41>函蔡<E587BD>嗡蝙<E597A1>汲PC<50><43><EFBFBD><EFBFBD>啣<EFBFBD><E595A3>匧<EFBFBD>嚗<EFBFBD>銁SAE<41>批<EFBFBD><E689B9>圈<EFBFBD>蝵殷<E89DB5>
5.2 撉諹<E69289><E8ABB9>𨅯<EFBFBD>
# 1. 璉<><E79289>仿<EFBFBD><E4BBBF>𤩺糓<F0A4A9BA>血<EFBFBD><E8A180>?
docker images backend-service:v1.0
# 2. <20>亦<EFBFBD><E4BAA6>𨅯<EFBFBD>霂衣<E99C82>靽⊥<E99DBD>
docker inspect backend-service:v1.0
# 3. 瘚贝<E7989A>餈鞱<E9A488><E99EB1>𨅯<EFBFBD>嚗<EFBFBD>虾<EFBFBD>㚁<EFBFBD>
docker run -d `
--name backend-test `
-p 3001:3001 `
-e DATABASE_URL="postgresql://..." `
-e NODE_ENV=production `
backend-service:v1.0
# 4. <20>亦<EFBFBD>摰孵膥<E5ADB5>亙<EFBFBD>
docker logs backend-test
# 5. 瘚贝<E7989A><E8B49D>亙熒璉<E78692><E79289>?
curl http://localhost:3001/health
# 6. 皜<><E79A9C>瘚贝<E7989A>摰孵膥
docker stop backend-test
docker rm backend-test
6. <20><>雿喳<E99BBF>頝?
6.1 <20><>遣<EFBFBD>齿<EFBFBD><E9BDBF>交<EFBFBD><E4BAA4>?
- 撌脣<EFBFBD><EFBFBD>辥risma<EFBFBD>滚<EFBFBD><EFBFBD>峕郊嚗Ǒnpx prisma db pull`嚗?
- 撌脩<EFBFBD><EFBFBD>辥risma Client嚗Ǒnpx prisma generate`嚗?
- TypeScript蝻𤥁<EFBFBD><EFBFBD>𣂼<EFBFBD>嚗Ǒnpm run build`嚗?
- dist<EFBFBD>桀<EFBFBD>撌脩<EFBFBD><EFBFBD>𣂷<EFBFBD><EFBFBD><EFBFBD>鉄<EFBFBD><EFBFBD><EFBFBD>厩<EFBFBD>霂穃<EFBFBD><EFBFBD><EFBFBD>S<EFBFBD><EFBFBD>辣
- Docker Desktop撌脣鍳<E884A3>典僎餈鞱<E9A488>
- 蝵𤑳<EFBFBD>餈墧𦻖甇<EFBFBD>虜
6.2 <20><>𧋦蝞∠<E89D9E>
*<EFBFBD>𨅯<EFBFBD><EFBFBD><EFBFBD>倌閫<EFBFBD><EFBFBD>嚗?
v1.0 - <20>孵<EFBFBD><E5ADB5><EFBFBD>𧋦嚗<F0A78BA6>綫<EFBFBD>鞟鍂鈭𡒊<E988AD>鈭抒㴓憓<E3B493><E68693>
latest - <20><><EFBFBD>啁<EFBFBD><E59581>穿<EFBFBD><E7A9BF>其<EFBFBD>瘚贝<E7989A><E8B49D>臬<EFBFBD>嚗?
v1.0.1 - Bug靽桀<E99DBD><E6A180><EFBFBD>𧋦
v1.1.0 - <20>蠘<EFBFBD><E8A098>湔鰵<E6B994><E9B0B5>𧋦
<EFBFBD>券<EFBFBD><EFBFBD><EFBFBD><EFBFBD>伐<EFBFBD>
# <20>煺漣<E785BA>臬<EFBFBD><E887AC>函蔡嚗<E894A1>綫<EFBFBD><E7B6AB>鸌摰𡁶<E691B0><F0A181B6>穿<EFBFBD>
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
# 瘚贝<E7989A><E8B49D>臬<EFBFBD><E887AC>函蔡嚗<E894A1><E59A97><EFBFBD>嗆綫<E59786><E7B6AB>atest嚗?
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:v1.0
docker push crpi-cd5ij4pjt65mweeo.cn-beijing.personal.cr.aliyuncs.com/ai-clinical/backend-service:latest
6.3 <20><>遣隡睃<E99AA1>
1. <20>拍鍂Docker蝻枏<E89DBB>
# <20>?<3F><><EFBFBD><EFBFBD>酥ackage.json嚗<6E>⏚<EFBFBD>其<EFBFBD>韏𣇉<E99F8F>摮?
COPY package*.json ./
RUN npm ci --production
# <20>?<3F><><EFBFBD>𤾸<EFBFBD><F0A4BEB8>嗡誨<E597A1><E8AAA8><EFBFBD>隞<EFBFBD><E99A9E><EFBFBD>睃<EFBFBD>銝滚蔣<E6BB9A>滢<EFBFBD>韏硋<E99F8F>蝻枏<E89DBB>
COPY dist ./dist
2. 雿輻鍂.dockerignore
node_modules
.env
.env.*
dist # <20>砍𧑐dist<73>朞<EFBFBD>COPY<50>曉<EFBFBD>憭滚<E686AD>
test
tests
*.md
.git
*3. 憭𡁻𧫴畾菜<E795BE>撱?
# <20>嗆挾1嚗帋<E59A97>韏硋<E99F8F>鋆?
FROM node:alpine AS builder
...
# <20>嗆挾2嚗朞<E59A97>銵峕𧒄<E5B395>𨅯<EFBFBD>嚗<EFBFBD>凒撠𧶏<E692A0>
FROM node:alpine
COPY --from=builder ...
6.4 摰匧<E691B0>撱箄悅
-
銝滩<EFBFBD><EFBFBD>券<EFBFBD><EFBFBD>譍葉<EFBFBD><EFBFBD>鉄<EFBFBD>𤩺<EFBFBD>靽⊥<EFBFBD>
- <EFBFBD>?銝滩<E98A9D><E6BBA9>𢲩.env`<60><>辣憭滚<E686AD><E6BB9A>圈<EFBFBD><E59C88>?
- <EFBFBD>?雿輻鍂SAE<41>臬<EFBFBD><E887AC>㗛<EFBFBD>瘜典<E7989C><E585B8>滨蔭
-
雿輻鍂<EFBFBD>𡇙oot<EFBFBD>冽<EFBFBD>餈鞱<EFBFBD>
RUN addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 USER nodejs -
摰𡁏<EFBFBD><EFBFBD>湔鰵<EFBFBD>箇<EFBFBD><EFBFBD>𨅯<EFBFBD>
FROM node:alpine # 雿輻鍂<E8BCBB><E98D82><EFBFBD>啁<EFBFBD>Alpine<6E><65>𧋦
<EFBFBD><EFBFBD><EFBFBD>A嚗鋽ockerfile摰峕㟲<EFBFBD><EFBFBD>捆
# ==================== <20>嗆挾 1: 靘肽<E99D98>摰㕑<E691B0><E39591>嗆挾 ====================
FROM node:alpine AS builder
# <20>踵揢Alpine<6E>𨅯<EFBFBD>皞𣂷蛹<F0A382B7>輸<EFBFBD>鈭煾<E988AD><E785BE>𧶏<EFBFBD>閫<EFBFBD><E996AB>蝵𤑳<E89DB5><F0A491B3>桅<EFBFBD>嚗?
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 摰㕑<E691B0> Prisma 餈鞱<E9A488><E99EB1>嗡<EFBFBD>韏?
RUN apk add --no-cache openssl
WORKDIR /app
# 1. 憭滚<E686AD>靘肽<E99D98><E882BD><EFBFBD>辣
COPY package*.json ./
# 2. 憭滚<E686AD> Prisma Schema嚗<61>鍂鈭𡒊<E988AD><F0A1928A>辥risma Client嚗?
COPY prisma ./prisma/
# 3. <20>芸<EFBFBD>鋆<EFBFBD><E98B86>鈭找<E988AD>韏吔<E99F8F>憭批<E686AD><E689B9>誩<EFBFBD>蝵𤑳<E89DB5>隡㰘<E99AA1><E3B098><EFBFBD><EFBFBD>鋆<EFBFBD>𧒄<EFBFBD>湛<EFBFBD>
RUN npm config set registry https://registry.npmmirror.com && \
npm config set fetch-retry-mintimeout 20000 && \
npm config set fetch-retry-maxtimeout 120000 && \
npm config set fetch-retries 5 && \
npm ci --production --prefer-offline --no-audit
# 4. <20><><EFBFBD> Prisma Client嚗<74><E59A97>鈭抒㴓憓<E3B493><E68693>閬<EFBFBD><E996AC>
RUN npx prisma generate
# 5. 憭滚<E686AD><E6BB9A>砍𧑐撌脩<E6928C>霂穃末<E7A983>?dist <20><>辣憭對<E686AD>頝唾<E9A09D>TypeScript蝻𤥁<E89DBB>嚗?
COPY dist ./dist
# ==================== <20>嗆挾 2: 餈鞱<E9A488><E99EB1>嗆挾 ====================
FROM node:alpine
# <20>踵揢Alpine<6E>𨅯<EFBFBD>皞𣂷蛹<F0A382B7>輸<EFBFBD>鈭煾<E988AD><E785BE>𧶏<EFBFBD>閫<EFBFBD><E996AB>蝵𤑳<E89DB5><F0A491B3>桅<EFBFBD>嚗?
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 摰㕑<E691B0>餈鞱<E9A488><E99EB1>嗡<EFBFBD>韏?+ <20>嗅躹<E59785>唳旿
RUN apk add --no-cache \
openssl \
curl \
ca-certificates \
tzdata
# <20>𩤃<EFBFBD> 蝏煺<E89D8F><E785BA>嗅躹嚗鋫sia/Shanghai
ENV TZ=Asia/Shanghai
# <20>𥕦遣<F0A595A6>?root <20>冽<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>冽<EFBFBD>雿喳<E99BBF>頝蛛<E9A09D>
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
WORKDIR /app
# 隞擧<E99A9E>撱粹𧫴畾萄<E795BE><E89084>嗡漣<E597A1>?
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
# <20>𥕦遣銝𠹺<E98A9D><F0A0B9BA>桀<EFBFBD>嚗<EFBFBD>鍂鈭𦒘葩<F0A69298>嗆<EFBFBD>隞塚<E99A9E>
RUN mkdir -p /app/uploads && chown -R nodejs:nodejs /app/uploads
# <20><>揢<EFBFBD>圈<EFBFBD> root <20>冽<EFBFBD>
USER nodejs
# <20>亙熒璉<E78692><E79289>?
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD node -e "require('http').get('http://localhost:3001/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1); })"
# <20>湧蠧蝡臬藁
EXPOSE 3001
# <20>𤣳 <20>臬𢆡<E887AC>賭誘嚗<E8AA98><E59A97><EFBFBD>臬𢆡摨𠉛鍂嚗䔶<E59A97><E494B6>扯<EFBFBD><E689AF>唳旿摨栞<E691A8>蝘鳴<E89D98>
CMD ["node", "dist/index.js"]
<EFBFBD><EFBFBD><EFBFBD>B嚗?dockerignore摰峕㟲<E5B395><E39FB2>捆
# Node.js
node_modules
npm-debug.log
yarn-error.log
# 撘<><E69298>烐<EFBFBD>隞?
.env
.env.*
*.local
# <20><>遣鈭抒<E988AD>嚗<EFBFBD>㺿餈𥟇䲮獢㇂嚗帋蝙<E5B88B>冽𧋦<E586BD>啁<EFBFBD>霂穃末<E7A983><E69CAB>ist嚗?
# dist # <20><>𧒄瘜券<E7989C><E588B8>㚁<EFBFBD><E39A81><EFBFBD>捂憭滚<E686AD><E6BB9A>砍𧑐dist
# 瘚贝<E7989A><E8B49D><EFBFBD>辣
test
tests
*.test.ts
*.spec.ts
coverage
# <20><>﹝<EFBFBD>䔶葩<E494B6>嗆<EFBFBD>隞?
docs
*.md
.vscode
.idea
.DS_Store
Thumbs.db
# 銝𠹺<E98A9D><F0A0B9BA><EFBFBD>辣嚗<E8BEA3><E59A97>銵峕𧒄<E5B395><F0A79284><EFBFBD>嚗?
uploads/*
# Git
.git
.gitignore
# <20>亙<EFBFBD>
*.log
logs
# 銝湔𧒄<E6B994><F0A79284>辣
temp
tmp
*.swp
*.swo
*~
# <20>唳旿摨𤘪<E691A8>隞塚<E99A9E>SQLite嚗<65><E59A97><EFBFBD>𨀣<EFBFBD>嚗?
*.db
*.sqlite
# <20>𡁏𧋦<F0A1818F><F0A78BA6>辣嚗<E8BEA3><E59A97>撘<EFBFBD><E69298>睲蝙<E79DB2>剁<EFBFBD>
scripts/*.ts
*.bat
*.ps1
<EFBFBD><EFBFBD><EFBFBD>C嚗𡁶㮾<EFBFBD>單<EFBFBD>獢?
- Node.js<6A>𡒊垢-SAE摰孵膥<E5ADB5>函蔡<E587BD><E894A1><EFBFBD>
- <EFBFBD>函蔡餈𥕦漲<EFBFBD>餉<EFBFBD>
- [PostgreSQL<51>唳旿摨㯄<E691A8>蝵脫<E89DB5>雿𨀣<E99BBF><F0A880A3>䀉(./08-PostgreSQL<51>唳旿摨㯄<E691A8>蝵脫<E89DB5>雿𨀣<E99BBF><F0A880A3>?md)
- Python敺格<EFBFBD><EFBFBD>?SAE<41>函蔡<E587BD>滢<EFBFBD><E6BBA2>见<EFBFBD>
**<2A><>﹝蝏湔擪<E6B994>?: AI Assistant
**<2A><><EFBFBD>擧凒<E693A7>?: 2024-12-24
<EFBFBD><EFBFBD>𧋦: v1.0