From c5787020d24d742f05037981f137ab7580158bb7 Mon Sep 17 00:00:00 2001 From: hailin Date: Fri, 20 Feb 2026 05:39:25 -0800 Subject: [PATCH] =?UTF-8?q?feat(health):=20=E4=B8=BA=E5=85=A8=E9=83=A812?= =?UTF-8?q?=E4=B8=AA=E5=BE=AE=E6=9C=8D=E5=8A=A1=E6=B7=BB=E5=8A=A0Docker?= =?UTF-8?q?=E5=81=A5=E5=BA=B7=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 变更概要 所有后端微服务均增加 Docker HEALTHCHECK 指令,统一通过 GET /health 端点检测服务存活状态。解决 `docker ps` 中13个容器无 (healthy) 状态的问题。 ## NestJS 服务 (9个) - auth-service (:3010), user-service (:3001), issuer-service (:3002), clearing-service (:3004), compliance-service (:3005), ai-service (:3006), notification-service (:3008), telemetry-service (:3011), admin-service (:3012) - 7个服务的 app.module.ts 新增 `import { HealthModule } from '@genex/common'` 注册标准健康检查控制器 (GET /health, /health/ready, /health/live) - telemetry-service 和 admin-service 已有自建 HealthController,无需导入 - Dockerfile: HEALTHCHECK --interval=30s --start-period=15s --retries=3 ## Go 服务 (3个) - trading-service (:3003), translate-service (:3007), chain-indexer (:3009) - 已有 /health 端点 (Gin 路由),仅 Dockerfile 添加 HEALTHCHECK - Dockerfile: HEALTHCHECK --interval=30s --start-period=10s --retries=3 ## Kafka Connect - docker-compose.yml 添加 healthcheck (curl http://localhost:8083/) ## 健康检查方式 - 所有服务统一使用 `wget --spider http://localhost:PORT/health` (node:20-alpine 和 alpine:3.19 均自带 BusyBox wget) Co-Authored-By: Claude Opus 4.6 --- backend/docker-compose.yml | 6 ++++++ backend/services/admin-service/Dockerfile | 2 ++ backend/services/ai-service/Dockerfile | 2 ++ backend/services/ai-service/src/app.module.ts | 2 ++ backend/services/auth-service/Dockerfile | 2 ++ backend/services/auth-service/src/app.module.ts | 2 ++ backend/services/chain-indexer/Dockerfile | 2 ++ backend/services/clearing-service/Dockerfile | 2 ++ backend/services/clearing-service/src/app.module.ts | 2 ++ backend/services/compliance-service/Dockerfile | 2 ++ backend/services/compliance-service/src/app.module.ts | 2 ++ backend/services/issuer-service/Dockerfile | 2 ++ backend/services/issuer-service/src/app.module.ts | 2 ++ backend/services/notification-service/Dockerfile | 2 ++ backend/services/notification-service/src/app.module.ts | 2 ++ backend/services/telemetry-service/Dockerfile | 2 ++ backend/services/trading-service/Dockerfile | 2 ++ backend/services/translate-service/Dockerfile | 2 ++ backend/services/user-service/Dockerfile | 2 ++ backend/services/user-service/src/app.module.ts | 2 ++ 20 files changed, 44 insertions(+) diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index 344530e..12da7e5 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -154,6 +154,12 @@ services: OFFSET_FLUSH_TIMEOUT_MS: 5000 ports: - "127.0.0.1:48083:8083" + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:8083/ || exit 1"] + interval: 30s + timeout: 10s + start_period: 30s + retries: 3 depends_on: kafka: condition: service_healthy diff --git a/backend/services/admin-service/Dockerfile b/backend/services/admin-service/Dockerfile index f98dc1c..70c7fa8 100644 --- a/backend/services/admin-service/Dockerfile +++ b/backend/services/admin-service/Dockerfile @@ -29,4 +29,6 @@ COPY --from=builder /app/services/admin-service/node_modules ./node_modules COPY --from=builder /app/services/admin-service/package.json ./ USER node EXPOSE 3012 +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3012/health || exit 1 CMD ["dumb-init", "node", "dist/main"] diff --git a/backend/services/ai-service/Dockerfile b/backend/services/ai-service/Dockerfile index 8bb1bf4..f6c7968 100644 --- a/backend/services/ai-service/Dockerfile +++ b/backend/services/ai-service/Dockerfile @@ -29,4 +29,6 @@ COPY --from=builder /app/services/ai-service/node_modules ./node_modules COPY --from=builder /app/services/ai-service/package.json ./ USER node EXPOSE 3006 +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3006/health || exit 1 CMD ["dumb-init", "node", "dist/main"] diff --git a/backend/services/ai-service/src/app.module.ts b/backend/services/ai-service/src/app.module.ts index ba2e2a4..ffe7269 100644 --- a/backend/services/ai-service/src/app.module.ts +++ b/backend/services/ai-service/src/app.module.ts @@ -2,10 +2,12 @@ import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule } from '@nestjs/throttler'; +import { HealthModule } from '@genex/common'; import { AiModule } from './ai.module'; @Module({ imports: [ + HealthModule, ConfigModule.forRoot({ isGlobal: true }), TypeOrmModule.forRoot({ type: 'postgres', diff --git a/backend/services/auth-service/Dockerfile b/backend/services/auth-service/Dockerfile index fed004d..05ce872 100644 --- a/backend/services/auth-service/Dockerfile +++ b/backend/services/auth-service/Dockerfile @@ -29,4 +29,6 @@ COPY --from=builder /app/services/auth-service/node_modules ./node_modules COPY --from=builder /app/services/auth-service/package.json ./ USER node EXPOSE 3010 +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3010/health || exit 1 CMD ["dumb-init", "node", "dist/main"] diff --git a/backend/services/auth-service/src/app.module.ts b/backend/services/auth-service/src/app.module.ts index d6abff1..f324b1b 100644 --- a/backend/services/auth-service/src/app.module.ts +++ b/backend/services/auth-service/src/app.module.ts @@ -1,10 +1,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule } from '@nestjs/throttler'; +import { HealthModule } from '@genex/common'; import { AuthModule } from './auth.module'; @Module({ imports: [ + HealthModule, TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST || 'localhost', diff --git a/backend/services/chain-indexer/Dockerfile b/backend/services/chain-indexer/Dockerfile index 6c7ef02..99004e2 100644 --- a/backend/services/chain-indexer/Dockerfile +++ b/backend/services/chain-indexer/Dockerfile @@ -11,4 +11,6 @@ WORKDIR /app COPY --from=builder /server . USER nobody:nobody EXPOSE 3009 +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3009/health || exit 1 CMD ["./server"] diff --git a/backend/services/clearing-service/Dockerfile b/backend/services/clearing-service/Dockerfile index ba04882..54e2544 100644 --- a/backend/services/clearing-service/Dockerfile +++ b/backend/services/clearing-service/Dockerfile @@ -29,4 +29,6 @@ COPY --from=builder /app/services/clearing-service/node_modules ./node_modules COPY --from=builder /app/services/clearing-service/package.json ./ USER node EXPOSE 3004 +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3004/health || exit 1 CMD ["dumb-init", "node", "dist/main"] diff --git a/backend/services/clearing-service/src/app.module.ts b/backend/services/clearing-service/src/app.module.ts index 81a459c..83e4111 100644 --- a/backend/services/clearing-service/src/app.module.ts +++ b/backend/services/clearing-service/src/app.module.ts @@ -1,10 +1,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule } from '@nestjs/throttler'; +import { HealthModule } from '@genex/common'; import { ClearingModule } from './clearing.module'; @Module({ imports: [ + HealthModule, TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST || 'localhost', diff --git a/backend/services/compliance-service/Dockerfile b/backend/services/compliance-service/Dockerfile index 1afa173..f3eb9aa 100644 --- a/backend/services/compliance-service/Dockerfile +++ b/backend/services/compliance-service/Dockerfile @@ -29,4 +29,6 @@ COPY --from=builder /app/services/compliance-service/node_modules ./node_modules COPY --from=builder /app/services/compliance-service/package.json ./ USER node EXPOSE 3005 +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3005/health || exit 1 CMD ["dumb-init", "node", "dist/main"] diff --git a/backend/services/compliance-service/src/app.module.ts b/backend/services/compliance-service/src/app.module.ts index 9ed350b..af65083 100644 --- a/backend/services/compliance-service/src/app.module.ts +++ b/backend/services/compliance-service/src/app.module.ts @@ -1,10 +1,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule } from '@nestjs/throttler'; +import { HealthModule } from '@genex/common'; import { ComplianceModule } from './compliance.module'; @Module({ imports: [ + HealthModule, TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST || 'localhost', diff --git a/backend/services/issuer-service/Dockerfile b/backend/services/issuer-service/Dockerfile index 4defb44..e1fb1f3 100644 --- a/backend/services/issuer-service/Dockerfile +++ b/backend/services/issuer-service/Dockerfile @@ -29,4 +29,6 @@ COPY --from=builder /app/services/issuer-service/node_modules ./node_modules COPY --from=builder /app/services/issuer-service/package.json ./ USER node EXPOSE 3002 +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3002/health || exit 1 CMD ["dumb-init", "node", "dist/main"] diff --git a/backend/services/issuer-service/src/app.module.ts b/backend/services/issuer-service/src/app.module.ts index ebc52cd..cc24fbe 100644 --- a/backend/services/issuer-service/src/app.module.ts +++ b/backend/services/issuer-service/src/app.module.ts @@ -1,10 +1,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule } from '@nestjs/throttler'; +import { HealthModule } from '@genex/common'; import { IssuerModule } from './issuer.module'; @Module({ imports: [ + HealthModule, TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST || 'localhost', diff --git a/backend/services/notification-service/Dockerfile b/backend/services/notification-service/Dockerfile index a840482..42dfc3f 100644 --- a/backend/services/notification-service/Dockerfile +++ b/backend/services/notification-service/Dockerfile @@ -29,4 +29,6 @@ COPY --from=builder /app/services/notification-service/node_modules ./node_modul COPY --from=builder /app/services/notification-service/package.json ./ USER node EXPOSE 3008 +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3008/health || exit 1 CMD ["dumb-init", "node", "dist/main"] diff --git a/backend/services/notification-service/src/app.module.ts b/backend/services/notification-service/src/app.module.ts index 99de8b9..9d2fbc5 100644 --- a/backend/services/notification-service/src/app.module.ts +++ b/backend/services/notification-service/src/app.module.ts @@ -1,10 +1,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule } from '@nestjs/throttler'; +import { HealthModule } from '@genex/common'; import { NotificationModule } from './notification.module'; @Module({ imports: [ + HealthModule, TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST || 'localhost', diff --git a/backend/services/telemetry-service/Dockerfile b/backend/services/telemetry-service/Dockerfile index d88d2fc..2072b30 100644 --- a/backend/services/telemetry-service/Dockerfile +++ b/backend/services/telemetry-service/Dockerfile @@ -29,4 +29,6 @@ COPY --from=builder /app/services/telemetry-service/node_modules ./node_modules COPY --from=builder /app/services/telemetry-service/package.json ./ USER node EXPOSE 3011 +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3011/health || exit 1 CMD ["dumb-init", "node", "dist/main"] diff --git a/backend/services/trading-service/Dockerfile b/backend/services/trading-service/Dockerfile index e561cfb..bb68246 100644 --- a/backend/services/trading-service/Dockerfile +++ b/backend/services/trading-service/Dockerfile @@ -11,4 +11,6 @@ WORKDIR /app COPY --from=builder /server . USER nobody:nobody EXPOSE 3003 +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3003/health || exit 1 CMD ["./server"] diff --git a/backend/services/translate-service/Dockerfile b/backend/services/translate-service/Dockerfile index e093cc9..53930ab 100644 --- a/backend/services/translate-service/Dockerfile +++ b/backend/services/translate-service/Dockerfile @@ -11,4 +11,6 @@ WORKDIR /app COPY --from=builder /server . USER nobody:nobody EXPOSE 3007 +HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3007/health || exit 1 CMD ["./server"] diff --git a/backend/services/user-service/Dockerfile b/backend/services/user-service/Dockerfile index 551d5de..8984d78 100644 --- a/backend/services/user-service/Dockerfile +++ b/backend/services/user-service/Dockerfile @@ -29,4 +29,6 @@ COPY --from=builder /app/services/user-service/node_modules ./node_modules COPY --from=builder /app/services/user-service/package.json ./ USER node EXPOSE 3001 +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:3001/health || exit 1 CMD ["dumb-init", "node", "dist/main"] diff --git a/backend/services/user-service/src/app.module.ts b/backend/services/user-service/src/app.module.ts index c932a59..8b04431 100644 --- a/backend/services/user-service/src/app.module.ts +++ b/backend/services/user-service/src/app.module.ts @@ -1,10 +1,12 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { ThrottlerModule } from '@nestjs/throttler'; +import { HealthModule } from '@genex/common'; import { UserModule } from './user.module'; @Module({ imports: [ + HealthModule, TypeOrmModule.forRoot({ type: 'postgres', host: process.env.DB_HOST || 'localhost',