From 8be40ae6dc5acc58aef5f65e0a90e9af4a64c1fe Mon Sep 17 00:00:00 2001 From: "3371392206@qq.com" <3371392206@qq.com> Date: Thu, 27 Aug 2026 11:44:44 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20embed=20health.html=20=E5=88=B0=20bina?= =?UTF-8?q?ry,=E5=8D=95=E6=96=87=E4=BB=B6=E5=88=86=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 把 health.html 从外部依赖改为 //go:embed 内嵌, 实现真正的"单 exe 分发"。 - 新建 router/dashboard.go,用 //go:embed 嵌入 health.html - router/router.go:/dashboard handler 改为 w.Write(dashboardHTML) - setting/config.go:删 CheckStaticFiles(无需文件检查) - main.go:删 setting.CheckStaticFiles() 调用 - Dockerfile:删 COPY health.html 步骤(已嵌入) - .gitignore:加 release/(build 产物不入 git) - 物理移动 health.html 到 router/(embed 限制:同包或子包) 效果: - 之前: release 包 = tts-api.exe + health.html (2 个文件) - 之后: release 包 = tts-api.exe (1 个文件,~7 MB) - 用户部署无需额外文件,/dashboard 路由直接工作 --- .gitignore | 5 ++++- Dockerfile | 2 +- main.go | 1 - router/dashboard.go | 6 ++++++ health.html => router/health.html | 0 router/router.go | 3 ++- setting/config.go | 7 ------- 7 files changed, 13 insertions(+), 11 deletions(-) create mode 100644 router/dashboard.go rename health.html => router/health.html (100%) diff --git a/.gitignore b/.gitignore index 0ecf443..d90b205 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,7 @@ Thumbs.db !.env.example # Local-only working notes (use task board for shared tracking) -TODO.md \ No newline at end of file +TODO.md + +# Release artifacts (build output) +release/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 95f50e1..18a4b54 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,7 @@ RUN apk --no-cache add ca-certificates tzdata \ WORKDIR /app COPY --from=builder /app/tts-api . -COPY --from=builder /app/health.html . +# health.html 已通过 //go:embed 嵌入 binary,无需单独复制 RUN chown -R appuser:appgroup /app diff --git a/main.go b/main.go index 25dc991..27674ab 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,6 @@ func main() { setting.InitAllConfigs() metrics.Init() middleware.InitRateLimiter() - setting.CheckStaticFiles() controller.InitController() setting.LogStartupSummary() diff --git a/router/dashboard.go b/router/dashboard.go new file mode 100644 index 0000000..43d1f25 --- /dev/null +++ b/router/dashboard.go @@ -0,0 +1,6 @@ +package router + +import _ "embed" + +//go:embed health.html +var dashboardHTML []byte \ No newline at end of file diff --git a/health.html b/router/health.html similarity index 100% rename from health.html rename to router/health.html diff --git a/router/router.go b/router/router.go index e06a38d..14bda65 100644 --- a/router/router.go +++ b/router/router.go @@ -20,7 +20,8 @@ func Setup() *mux.Router { r.HandleFunc("/v1/audio/speech", controller.OpenaiTTSHandler).Methods("POST", "OPTIONS") r.HandleFunc("/health", controller.HealthHandler).Methods("GET") r.HandleFunc("/dashboard", func(w http.ResponseWriter, r *http.Request) { - http.ServeFile(w, r, "health.html") + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Write(dashboardHTML) }).Methods("GET") r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/dashboard", http.StatusFound) diff --git a/setting/config.go b/setting/config.go index 38ea45f..da957d2 100644 --- a/setting/config.go +++ b/setting/config.go @@ -309,10 +309,3 @@ func maskAPIKey(key string) string { } return key[:4] + "****" + key[len(key)-4:] } - -// CheckStaticFiles 检查 /dashboard 路由依赖的 health.html 是否存在。 -func CheckStaticFiles() { - if _, err := os.Stat("health.html"); os.IsNotExist(err) { - log.Println("警告: health.html 不存在,/dashboard 路由将返回 404") - } -}