From cacc686e9a35f59c73826533d21952701a06a2ec Mon Sep 17 00:00:00 2001 From: zerosaturation Date: Tue, 21 Jul 2026 12:12:46 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9Anotification/moderation=20service?= =?UTF-8?q?=20healthcheck=20=E9=85=8D=E7=BD=AE=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 两个服务的 healthcheck 配置都有历史遗留 bug,导致 docker ps 一直显示 unhealthy / health: starting: 1) notificationService - 现象: docker-compose healthcheck 路径写 /healthz,但 pkg/health 只注册 /health (backend/pkg/health/health.go:29),wget 永远 404 - 修复: compose 路径 /healthz -> /health,Dockerfile HEALTHCHECK 同样改 /health (双保险,rebuild 后不会回退) 2) moderationService - 现象: main.go 没启 health server (只暴露 Dubbo Triple 协议), compose 原 healthcheck 端口 20011 永远 timeout, Dockerfile HEALTHCHECK 也指向 20011 同样错 - 修复: compose 用 healthcheck: test: ["NONE"] 显式覆盖 image HEALTHCHECK,Dockerfile 改成 HEALTHCHECK NONE (image-level 也禁掉,rebuild 后不会回退) gateway depends_on moderationservice: service_started (不依赖 healthy), 不影响入口可用性。健康状态靠 gateway 间接覆盖。 Co-Authored-By: Claude --- docker/Dockerfile.services | 9 ++++++--- docker/docker-compose.prod.yml | 11 ++++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/docker/Dockerfile.services b/docker/Dockerfile.services index bc163be..efcfa77 100644 --- a/docker/Dockerfile.services +++ b/docker/Dockerfile.services @@ -220,6 +220,7 @@ HEALTHCHECK --interval=10s --timeout=5s --start-period=15s --retries=3 \ ENTRYPOINT ["/app/statisticservice"] # ---- Runtime Stage: NotificationService (通知 + uniCloud 推送) ---- +# health 端点路径是 /health(不是 /healthz),见 backend/pkg/health/health.go:29 FROM --platform=linux/amd64 alpine:3.19 AS notificationservice RUN apk add --no-cache ca-certificates tzdata @@ -230,11 +231,14 @@ COPY --from=builder /tmp/notificationservice /app/notificationservice EXPOSE 20010 HEALTHCHECK --interval=10s --timeout=5s --start-period=15s --retries=3 \ - CMD wget --no-verbose --tries=1 --spider http://localhost:21010/healthz || exit 1 + CMD wget --no-verbose --tries=1 --spider http://localhost:21010/health || exit 1 ENTRYPOINT ["/app/notificationservice"] # ---- Runtime Stage: ModerationService (举报 / 反馈 / 自动隐藏) ---- +# moderationService main.go 没启 health server(只暴露 Dubbo Triple 协议), +# image-level HEALTHCHECK NONE 防 rebuild 后回退到错误的 20011 HEALTHCHECK。 +# 运行时 compose 用 healthcheck: test: ["NONE"] 显式覆盖,这里 NONE 是双保险。 FROM --platform=linux/amd64 alpine:3.19 AS moderationservice RUN apk add --no-cache ca-certificates tzdata @@ -244,8 +248,7 @@ COPY --from=builder /tmp/moderationservice /app/moderationservice EXPOSE 20011 -HEALTHCHECK --interval=10s --timeout=5s --start-period=15s --retries=3 \ - CMD wget --no-verbose --tries=1 --spider http://localhost:20011 || exit 1 +HEALTHCHECK NONE ENTRYPOINT ["/app/moderationservice"] diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml index 00ed17c..eb987ed 100644 --- a/docker/docker-compose.prod.yml +++ b/docker/docker-compose.prod.yml @@ -523,7 +523,7 @@ services: expose: - "20010" healthcheck: - test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:21010/healthz || exit 1"] + test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:21010/health || exit 1"] <<: *healthcheck deploy: resources: @@ -536,6 +536,12 @@ services: # 内容审核服务(举报 / 反馈 / 自动隐藏) # 依赖 user / asset / notification Dubbo 服务,以及 Postgres + Redis + # ⚠️ healthcheck: test: ["NONE"]:moderationService/main.go 没启 health server + # (只暴露 Dubbo Triple 协议在 20011),加 healthcheck 会永远 unhealthy。 + # Dockerfile.services 的 HEALTHCHECK 指向 20011 也是错的(指向 dubbo 端口), + # 必须用 test: NONE 在 compose 层显式覆盖 image 的 HEALTHCHECK。 + # gateway depends_on moderationservice: service_started(不依赖 healthy), + # 所以不影响入口。健康状态靠 gateway 间接覆盖。 moderationservice: image: topfans/moderationservice:latest build: @@ -572,8 +578,7 @@ services: expose: - "20011" healthcheck: - test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:20011 || exit 1"] - <<: *healthcheck + test: ["NONE"] deploy: resources: limits: