Dozzle 匿名使用数据收集机制解析:Beacon 采集范围、存储方式与完全退出指南
【免费下载链接】dozzleRealtime log viewer for containers. Supports Docker, Swarm and K8s.项目地址: https://gitcode.com/GitHub_Trending/do/dozzle
Dozzle 是一个开源的容器实时日志查看工具(支持 Docker、Swarm 与 Kubernetes)。作为无资金支持的开源项目,Dozzle 通过一个轻量的 "beacon"(信标)机制收集匿名使用数据,用于指导功能优先级与缺陷修复的资源投入方向。本文基于官方文档与仓库源码,完整解析 Dozzle 匿名统计的采集字段、发送时机、存储位置,并给出通过命令行参数或环境变量彻底退出的实操方案。
为什么要收集匿名统计数据
Dozzle 是一个没有商业资金注入的开源项目,也没有专门的人力去开展正式的用户调研。在这样的前提下,匿名使用数据是团队判断"应该把开发精力投到哪里"的主要信号:
- 哪些部署模式(server、swarm、k8s、agent)被大量使用;
- 哪些认证方式被实际启用;
- 哪些功能开关(actions、shell)被打开;
- 用户环境的 Docker 引擎版本分布。
这些数据帮助维护者优先修复高频问题、优化热门特性。相关说明可见 README.md,其中明确提到统计数据完全公开、并强调"禁用统计请使用--no-analytics标志"。
具体采集哪些内容
根据官方文档 docs/fr/guide/analytics.md(英文原版见 docs/guide/analytics.md),beacon 所携带的信息包括:
- Dozzle 版本号;
- 部署模式:server、swarm、k8s、agent;
- 启用的认证提供方(auth provider,如 none、simple、oidc 等);
- 若干功能开关状态(如是否启用了 actions、shell);
- Docker 引擎版本;
- 少量计数:主机数量、容器数量、过滤器(filter)数量;
- 每次安装随机生成的实例 ID,用于事件去重。
文档特别强调:日志内容、容器名称、镜像名称、IP 地址、用户标识符永远不会被发送。字段集合会随版本演进,权威来源是 types/beacon.go,发送实现位于 internal/analytics/http_beacon.go。
源码视角:BeaconEvent 的完整字段定义
从仓库的 types/beacon.go 可以看到 beacon 事件结构的全部字段,逐字段说明如下:
| JSON 字段 | Go 类型 | 含义 |
|---|---|---|
name | string | 事件名称,如start(启动)或events(前端建立事件流) |
version | string | Dozzle 版本 |
browser | string | 浏览器 User-Agent(仅events事件携带) |
authProvider | string | 启用的认证提供方 |
filterLength | int | 配置的过滤器数量 |
clients | int | 主机数量 |
hasCustomAddress | bool | 是否使用了非默认监听地址(:8080) |
hasCustomBase | bool | 是否设置了非默认 base 路径(/) |
hasHostname | bool | 是否配置了自定义 hostname |
runningContainers | int | 运行中容器数量 |
hasActions | bool | 是否启用容器操作(actions) |
hasShell | bool | 是否启用容器 shell 访问 |
isSwarmMode | bool | 是否 Swarm 模式 |
serverVersion | string | Docker 引擎版本 |
serverID | string | 每次安装随机生成的 ID(用于去重) |
mode | string | 部署模式(server / swarm / k8s / agent) |
remoteAgents | int | 远程 agent 数量 |
remoteClients | int | 远程主机数量 |
subCommand | string | 子命令(如 agent、generate、generate-certs) |
可以看到,所有字段都是版本、模式、开关状态、数量计数这类聚合性元数据,不包含任何与具体业务内容相关的敏感信息,与文档描述完全一致。
发送实现:一次简单的 HTTP POST
发送逻辑在 internal/analytics/http_beacon.go 中实现:事件对象被json.Marshal序列化后,以POST方式发送到https://b.dozzle.dev/event。若返回状态码非 2xx,则以 Debug 级别记录错误并返回;发送失败不会影响 Dozzle 主流程(错误仅在 trace/debug 日志中体现)。
数据存储在哪里
beacon 事件被发送到https://b.dozzle.dev/event。根据官方文档描述,这是一个部署在 DigitalOcean 上的小型 Go 服务,收到事件后将其写入扁平文件(flat file),供后续离线处理使用——不做实时分析,只做批量聚合。
两次关键发送时机:启动事件与前端事件流
从源码结构看,beacon 并不是定时或持续发送,而是在两个明确的时机各发送一次:
1. 服务启动时(start 事件)
在服务启动流程中调用cli.StartEvent(实现见 internal/support/cli/analytics.go),其分支覆盖了各种运行入口:
- server 模式:internal/support/cli/clients.go 中
go StartEvent(args, "server", localClient, ""); - swarm 模式:main.go 中
go cli.StartEvent(args, "swarm", localClient, ""); - k8s 模式:main.go 中
go cli.StartEvent(args, "k8s", localClient, ""); - agent 子命令:internal/support/cli/agent_command.go;
- generate / generate-certs 子命令:internal/support/cli/generate_command.go、internal/support/cli/generate_certs_command.go。
该事件携带mode、remoteAgents、remoteClients、subCommand、filterLength、serverVersion、isSwarmMode等字段。注意:StartEvent开头就会检查args.NoAnalytics,为true时直接返回、不发送任何请求(internal/support/cli/analytics.go)。
2. 前端建立事件流时(events 事件)
当浏览器前端建立 SSE 事件流连接时,internal/web/events.go 中的sendBeaconEvent会以 goroutine 方式异步发送events事件(调用点见 internal/web/events.go)。该函数同样首先检查h.config.NoAnalytics并直接返回(internal/web/events.go),随后填充AuthProvider、Browser(来自请求的 User-Agent)、Clients、HasActions、HasCustomAddress、HasCustomBase、HasHostname、RunningContainers、Version,并尽力获取本地主机 ID 作为ServerID。异步发送(go)保证了 beacon 请求不会阻塞前端首屏数据流。
如何完全退出(Opting Out)
官方文档提供了两种等效的退出方式,任一即可彻底关闭匿名统计,之后不会发出任何 beacon 请求:
方式一:命令行参数
启动 Dozzle 时附加--no-analytics:
dozzle --no-analytics方式二:环境变量
设置环境变量DOZZLE_NO_ANALYTICS=true:
DOZZLE_NO_ANALYTICS=true dozzle在 docker-compose 场景下,官方文档给出的配置如下(摘自 docs/fr/guide/analytics.md):
services: dozzle: image: amir20/dozzle:latest environment: DOZZLE_NO_ANALYTICS: "true"源码视角:参数如何生效
该参数的定义位于 internal/support/cli/args.go:
NoAnalytics bool `arg:"--no-analytics,env:DOZZLE_NO_ANALYTICS" help:"disables anonymous analytics"`这意味着:
- 命令行标志名是
--no-analytics; - 对应的环境变量名是
DOZZLE_NO_ANALYTICS; - 它支持"12-factor"风格的配置方式,即标志与环境变量等效,任一途径都能关闭统计;
- 该参数默认值为
false,即默认开启匿名统计(参见 docs/guide/supported-env-vars.md 的参数对照表,其中明确列出默认值false)。
关闭开关在两条发送路径上均被强制校验:启动事件(StartEvent)与前端事件流事件(sendBeaconEvent)在构建并发送 beacon 之前都会先检查NoAnalytics并直接返回,因此退出后不会产生任何对外统计请求。
仓库自带的 docker-compose.yml 中所有示例服务均统一设置了
DOZZLE_NO_ANALYTICS=1,可作为生产部署时默认关闭统计的参考模板。
适用前提与限制说明
- 上述采集字段与发送行为均以当前仓库代码为准(types/beacon.go、internal/analytics/http_beacon.go),官方文档明确指出字段集合会随时间演进,具体以权威源码为准;
--no-analytics/DOZZLE_NO_ANALYTICS仅影响匿名统计 beacon,不影响 Dozzle 的容器日志查看、认证、远程主机(remote-host)、agent 等核心功能;- 关闭统计后,项目维护者将无法获知你所在环境的版本分布与功能使用情况——这是隐私偏好与项目发展之间的权衡,按需选择即可。
小结
Dozzle 的匿名统计采用"轻量 beacon + 聚合元数据"的设计:仅在启动与前端连接两个时机发送少量版本、模式、开关与计数信息,不采集任何日志内容、容器名、镜像名、IP 或用户标识;数据经b.dozzle.dev/event写入扁平文件用于后续处理。无论是出于隐私偏好还是合规要求,只需添加--no-analytics标志或设置DOZZLE_NO_ANALYTICS=true,即可在两条发送路径上彻底关闭这一机制。
【免费下载链接】dozzleRealtime log viewer for containers. Supports Docker, Swarm and K8s.项目地址: https://gitcode.com/GitHub_Trending/do/dozzle
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考