fix:notification/moderation service healthcheck 配置错误

两个服务的 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 <noreply@anthropic.com>
This commit is contained in:
zerosaturation 2026-07-21 12:12:46 +08:00
parent 7bf4666cdb
commit cacc686e9a
2 changed files with 14 additions and 6 deletions

View File

@ -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"]

View File

@ -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: