From ca6efdf0c3447f722d475c2cee71dfe04b5c64cf Mon Sep 17 00:00:00 2001
From: HouYunFei <1844025705@qq.com>
Date: Fri, 17 Jul 2026 11:24:22 +0800
Subject: [PATCH] feat(analytics): implement runtime configuration and
analytics tracking for GA4 and Baidu
---
Dockerfile | 2 +
docker-compose.yml | 4 +
.../local-codex-canvas.mdx | 0
docs/content/docs/overview/docker.mdx | 39 +++++++++
docs/content/docs/support/donate.mdx | 25 ------
nginx.conf | 5 ++
web/docker-entrypoint.sh | 22 +++++
web/index.html | 1 +
web/public/config.js | 3 +
.../components/layout/analytics-tracker.tsx | 15 ++++
web/src/constant/runtime-config.ts | 30 +++++++
web/src/lib/analytics.ts | 85 +++++++++++++++++++
web/src/main.tsx | 3 +
web/src/router.tsx | 2 +
web/src/vite-env.d.ts | 5 ++
15 files changed, 216 insertions(+), 25 deletions(-)
rename docs/content/docs/{overview => development}/local-codex-canvas.mdx (100%)
delete mode 100644 docs/content/docs/support/donate.mdx
create mode 100755 web/docker-entrypoint.sh
create mode 100644 web/public/config.js
create mode 100644 web/src/components/layout/analytics-tracker.tsx
create mode 100644 web/src/constant/runtime-config.ts
create mode 100644 web/src/lib/analytics.ts
diff --git a/Dockerfile b/Dockerfile
index 96dbe40..38d7005 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -14,5 +14,7 @@ FROM nginx:1.27-alpine
COPY --from=web-build /app/web/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
+COPY web/docker-entrypoint.sh /docker-entrypoint.d/40-runtime-config.sh
+RUN chmod +x /docker-entrypoint.d/40-runtime-config.sh
EXPOSE 3000
diff --git a/docker-compose.yml b/docker-compose.yml
index d60dc6a..cec8f23 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -5,3 +5,7 @@ services:
ports:
- "3000:3000"
restart: unless-stopped
+ # 统计分析(可选,默认关闭)。每家一个独立变量,填了谁就启用谁,可同时启用多家:
+ # environment:
+ # ANALYTICS_GA4_ID: G-XXXXXXXXXX # Google Analytics 4 衡量 ID
+ # ANALYTICS_BAIDU_ID: xxxxxxxxxxxxxxxxxxxxxxxxxxxx # 百度统计站点 ID
diff --git a/docs/content/docs/overview/local-codex-canvas.mdx b/docs/content/docs/development/local-codex-canvas.mdx
similarity index 100%
rename from docs/content/docs/overview/local-codex-canvas.mdx
rename to docs/content/docs/development/local-codex-canvas.mdx
diff --git a/docs/content/docs/overview/docker.mdx b/docs/content/docs/overview/docker.mdx
index a3331cb..da3d5ca 100644
--- a/docs/content/docs/overview/docker.mdx
+++ b/docs/content/docs/overview/docker.mdx
@@ -50,3 +50,42 @@ docker compose -f docker-compose.local.yml up -d --build
## 数据说明
当前主应用镜像只启动 Next.js。画布、我的素材、生成记录和 AI API Key 默认保存在浏览器本地;第三方提示词由浏览器前端直连拉取,不需要额外挂载数据目录。
+
+## 统计分析(可选)
+
+项目**默认不接入任何统计**:不设置下列环境变量时,页面不会加载任何统计脚本,也不会发送任何外部请求。你在自己的部署上想查看流量时,设置对应环境变量即可,无需修改代码或重新构建镜像——镜像启动时会据此生成运行期配置。
+
+统计按「每家一个独立变量」配置:**填了谁就启用谁,可同时启用多家**(例如 GA4 + 百度一起开)。仅支持 GA4 与百度,两者都只接受 ID,脚本地址由代码固定拼接,不接受任意脚本地址或内联 JS。
+
+| 变量 | 说明 |
+| --- | --- |
+| `ANALYTICS_GA4_ID` | Google Analytics 4 衡量 ID(`G-XXXX`) |
+| `ANALYTICS_BAIDU_ID` | 百度统计站点 ID(`hm.js?` 后面那串 hash) |
+
+在 `docker-compose.yml` 的 `environment` 中配置(文件内已附注释示例),下例同时启用 GA4 与百度:
+
+```yaml
+services:
+ app:
+ image: ghcr.io/basketikun/infinite-canvas:latest
+ ports:
+ - "3000:3000"
+ environment:
+ ANALYTICS_GA4_ID: G-XXXXXXXXXX
+ ANALYTICS_BAIDU_ID: e8263761cc5c32f5f7a855b8203b965a
+```
+
+或使用 `docker run`:
+
+```bash
+docker run -d -p 3000:3000 \
+ -e ANALYTICS_GA4_ID=G-XXXXXXXXXX \
+ -e ANALYTICS_BAIDU_ID=e8263761cc5c32f5f7a855b8203b965a \
+ ghcr.io/basketikun/infinite-canvas:latest
+```
+
+单页应用的路由切换会自动向所有已启用的统计上报 pageview。
+
+