这个项目能做什么
goatdash 是一款轻量级、注重隐私的 [GoatCounter](https://www.goatcounter.com/) 分析仪表盘。它以纯 JavaScript 完全在客户端运行,零依赖、无构建工具,也不依赖任何后端服务器。部署只需将几个静态文件复制到任意 Web 主机即可。
## 功能概览
仪表盘通过 HTTPS 连接到一个或多个 GoatCounter 实例的公开 v0 API,展示分析数据:
- **五大 KPI 卡片**:独立访客(含趋势)、页面浏览量、最热页面、已追踪路径和总事件数。
- **来源明细**:按渠道(直接访问、搜索引擎、营销活动、其他网站)分组显示流量,支持下钻查看单个来源及其带来的页面。
- **等值世界地图**:按访问量使用平方根比例着色国家,支持悬停提示、缩放、平移和重置。
- **全局下钻**:点击任意页面可查看其来源,点击任意来源可查看其驱动的页面,可查看浏览器/系统/设备版本、国家至地区详情,以及活动至来源 URL 详情。
- **灵活的日期范围**:今天、7 天、30 天、90 天或自定义起止日期。
## 多站点支持
goatdash 围绕多站点场景设计,每个站点拥有独立域名,但共享同一个 GoatCounter 账户。GoatCounter 通过 `Host` 头解析正确站点,因此仪表盘会跨域访问每个站点自身域名的数据。侧边栏列出 `/api/v0/sites` 中的所有站点,受 API 密钥权限限制。非活跃站点的后台预缓存使站点切换非常迅速。
## 架构与技术栈
- **纯原生 JS**:无 React,无打包器,无 CDN 调用。共七个静态文件。
- **无后端**:浏览器直接与 GoatCounter API 通信。无需修补服务器、备份数据库或维护服务。
- **Service Worker**:缓存应用壳和版本化资源以实现秒开;API 响应使用 stale-while-revalidate 策略缓存。
- **主题**:深色、浅色或自动模式,通过顶栏按钮切换,由外部 `theme.js` 脚本在渲染前应用,兼容严格 CSP(`default-src 'self'`)。
- **语言**:西班牙语、英语或自动检测,持久化存储于 `localStorage`。
- **演示模式**:无需 API 密钥即可加载真实感样本数据进行体验。
## 安装
无需安装脚本,无需编译。从任意 HTTP 服务器提供静态文件即可:
```sh
python3 -m http.server 8000
```
要求:静态 Web 服务器,以及浏览器可通过 HTTPS 访问其 v0 API 的 GoatCounter 实例。无需 Docker、Node 或构建工具。
对于生产环境的多站点部署,配置 Web 服务器从专用域名(如 `stats.example.com`)提供服务,并确保对索引 HTML 设置 `Cache-Control: no-store`。资源文件使用版本查询字符串(如 `app.js?v=3`),每次部署时需递增版本号以避免缓存过期问题。
项目提供了一个可选的基于 systemd 的每周自动更新脚本(`deploy/goatdash-update.sh`),可下载最新 GitHub 发布版、验证 SHA256 校验和、备份当前安装并替换为新版本。
## 配置
首次加载时,连接界面会要求提供:
- 您站点的 **GoatCounter URL**(如 `https://stats.cloudless.club`)。
- 在 GoatCounter 的「设置 > API」中创建的 **API 密钥**,至少需具备统计数据的「计数」和「读取」权限。
两个值均存储在浏览器的 `localStorage` 中,且仅通过 HTTPS 传输到您的 GoatCounter 实例。主题、语言、选定站点和日期范围也均在本地持久化。
对于多站点部署,每个站点必须有各自指向同一 GoatCounter 安装的独立域名。GoatCounter 会返回 `Access-Control-Allow-Origin: *`,无需代理即可启用跨域请求。注意:每次认证请求都会触发 `OPTIONS` 预检,导致每次 API 调用产生两次往返。
## 使用方法
打开页面并输入您的 GoatCounter URL 和 API 密钥,或点击**尝试演示**以样本数据探索。使用分段控件切换日期范围,使用齿轮菜单更改主题/语言或断开连接,点击任意指标卡片下钻查看相关数据。刷新菜单可清除缓存并重新获取所有内容。
## 开发
项目由 `index.html`、`styles.css`、`theme.js`、`app.js`、`fixtures.js` 和 `sw.js` 中的纯 HTML、CSS 和 JavaScript 组成。没有 `package.json`、打包器或测试框架。本地开发:
```sh
python3 -m http.server 8000
```
`fixtures.js` 中的演示样本数据与实际 API 响应结构保持一致。
## 许可证
AGPL-3.0。世界地图资源文件(`assets/world-map.js`)完整保留自 Abhishekh Singh 的 MIT 许可项目 goatcounter-dashboard,仍为 MIT 授权。
评论
0 评分人数达到10人后显示
登录后参与讨论。