#self-hosted #traffic #analytics #json-api

app oxitraffic

自托管、简单且尊重隐私的网站流量跟踪器

11个版本 (5个重大变更)

0.10.2 2024年5月8日
0.10.1 2024年1月28日
0.9.2 2023年11月21日
0.3.0 2023年7月31日

#1#traffic

AGPL-3.0

400KB
2K SLoC

OxiTraffic

自托管、简单且尊重隐私的网站流量跟踪器 🌐

➡️ 演示 ⬅️

特性

  • ❌ 不计短访问
    • ✅ 只计有意义的访问
    • 🤖 减少由网络爬虫计数的可能性
  • 🥷🏼 尊重隐私(不记录个人信息或IP地址)
  • 🍪 没有cookie
  • 📈 自托管
  • 📈 访问历史可视化
  • 💻️ 访问历史和计数的API
  • 🏅 低内存使用(约12 MiB)
  • 📦️ 首类容器支持
  • 🔀 异步和多线程
  • 🆓 免费 & 开源(AGPLv3)
  • 🦀 使用Rust编写(氧化)

演示

这里是一个演示,它跟踪了我的网站(mo8it.com)。

工作原理

您需要在您的网站中添加以下脚本标签,并用您的OxiTraffic实例的基本URL替换 OXITRAFFIC_BASE_URL

<script type="module" src="https://OXITRAFFIC_BASE_URL/count.js"></script>

该脚本运行一个微小的脚本 count.js

该脚本调用 /register?path=PATH 以接收访客ID。 PATH 是您所在的页面路径。

在最小延迟(配置选项 min_delay_secs)之后,该ID用于调用 /post-sleep/VISITOR_ID 以记录访问。

页面离开时,将向 /page-left/VISITOR_ID 发送请求以记录总花费时间。

路径验证

氧流量如何知道新请求的路径是您跟踪网站的合法路径?

只有对新的路径的第一个请求,氧流量会向该路径发送带有配置选项 tracked_origin_callback 的前缀的请求。如果状态码在200-299范围内(成功),则将该路径添加到数据库中。否则,请求将被拒绝。

设置

容器化

您可以使用在 Docker Hub 上发布的容器镜像。

您可以使用Docker提取该镜像。

docker pull mo8it/oxitraffic:latest

或使用Podman

podman pull docker.io/mo8it/oxitraffic:latest

容器镜像期望将配置文件挂载为(只读),位于容器内部 /volumes/config.toml(卷不必是目录,也可以是文件)。

默认情况下,容器监听 端口 80

非容器化

您也可以使用通过Cargo安装的二进制文件直接托管OxiTraffic

cargo install oxitraffic --locked

在使用二进制文件时,请确保提供环境变量 OXITRAFFIC_CONFIG_FILE(见下文配置部分)。

数据库

在两种情况下(容器或二进制文件),您都需要一个PostgreSQL数据库。互联网上有许多指南解释了如何在容器或直接在主机上托管一个。您可以参考我关于使用Podman托管PostgreSQL的博客文章:https://mo8it.com/blog/containerized-postgresql-with-rootless-podman/

配置

二进制文件期望环境变量 OXITRAFFIC_CONFIG_FILE 指向TOML配置文件 config.toml。在容器镜像中,此环境变量设置为 /volumes/config.toml

下表显示了配置文件的配置参数。您可以使用环境变量来设置或覆盖配置文件中的参数。

参数 描述 默认值 环境变量
socket_address 本地测试时使用 127.0.0.1:8080。在容器中使用时,0.0.0.0 是重要的,但您可以选择另一个端口。 "0.0.0.0:80" OXITRAFFIC_SOCKET_ADDRESS
base_url 您的OxiTraffic实例的基本URL。用于构建 count.js 脚本。 OXITRAFFIC_BASE_URL
tracked_origin 您的被追踪网站的 ,用于允许 CORS请求count.js 脚本到OxiTraffic。 OXITRAFFIC_TRACKED_ORIGIN
tracked_origin_callback 您的被追踪网站的 ,用于验证如上所述的新请求路径。此选项的存在是为了能够在本地网络内部进行这些请求。 tracked_origin OXITRAFFIC_TRACKED_ORIGIN_CALLBACK
min_delay_secs 在访问网站后能够调用 /post-sleep 来计数访问的最小延迟时间(以秒为单位)。建议在1秒后调用 /post-sleep。低值不仅会计数无意义的访问,还使得网络爬虫的访问更容易被计数。 19 OXITRAFFIC_MIN_DELAY_SECS
db.host PostgreSQL主机 OXITRAFFIC_DB__HOST
db.port PostgreSQL端口 OXITRAFFIC_DB__PORT
db.username PostgreSQL用户名 OXITRAFFIC_DB__USERNAME
db.password PostgreSQL密码 OXITRAFFIC_DB__PASSWORD
db.database PostgreSQL数据库 OXITRAFFIC_DB__DATABASE
utc_offset.小时 您的UTC偏移量的小时数 0 OXITRAFFIC_UTC_OFFSET__HOURS
utc_offset.分钟 您的UTC偏移量的分钟数 0 OXITRAFFIC_UTC_OFFSET__MINUTES

示例配置

以下是一个配置文件 config.toml 的示例

# Can be omitted because this is the default value.
socket_address = "0.0.0.0:80"

base_url = "https://oxitraffic.your_domain.com"

tracked_origin = "https://your_domain.com"
# In case both OxiTraffic and your website are in a local network and `website` can be resolved to the local IP address of the your website.
# Omit this option to use the value of `tracked_origin` instead.
tracked_origin_callback = "http://website"

[db]
host = "127.0.0.1"
port = 5432
username = "postgres"
password = "CHANGE_ME"
database = "postgres"

[utc_offset]
hours = 2
# Can be omitted because 0 is the default.
minutes = 0

日志记录

Oxitraffic将日志记录到stdout。默认日志级别是 info,但您可以选择以下其他级别之一

  • off
  • error
  • warn
  • info
  • debug
  • trace

这些级别按无日志到详细日志排序。您可以通过设置环境变量RUST_LOG为级别名称来更改默认级别。

端点

仪表板

端点 描述 返回
/ 注册路径的访问历史记录列表。 HTML
/stats?path=PATH 特定路径的访问历史统计。 HTML

JSON API

端点 描述 返回
/api/counts 每个注册路径的访问次数。 JSON([{"path": 字符串, "count": i64}])
/api/count?path=PATH 指定路径的访问次数。 JSON(i64)
/api/history?path=PATH 特定路径的访问时间戳,包括可空的来源和全局UTC偏移。您可以使用此端点进行自己的分析和绘图。 JSON({"utc_offset": 字符串, "访问": [{"注册时间": 字符串, "来源": 可选<字符串>, "花费时间(秒)": 可选<i64>}]})

脚本

端点 描述 返回
/register?path=PATH 注册以接收访问PATH(例如 //blog/rust-vs-julia)的页面的VISITOR_ID JSON(u16)
/post-sleep/VISITOR_ID 在访问的最小延迟min_delay_secs后使用访客ID,以使访问被计算。 只有成功时状态码为200
/page-left/VISITOR_ID/TIME_ON_PAGE_SEC 在离开页面时使用访客ID,以报告在页面上花费的总时间(以秒计 TIME_ON_PAGE_SEC)。 只有成功时状态码为200

限制

并发访客数量

如果您的网站有超过 2^16 = 65536 并发访客,计数将失败。

原因是注册ID是周期性分配的。这意味着访客 65537 将获得访客 1 的ID。当旧访客尝试使用该ID与OxiTraffic通信时,通信将失败或被解释为新访客。

可以通过避免此限制来解决这个问题,但这会导致更高的RAM使用量和略微较差的性能。

话虽如此,如果您真的有超过 65536 的并发访客,请提交一个问题 😉

单实例

OxiTraffic设计为一个轻量级单实例应用程序。尽管它使用数据库,但它仍然是为了性能和简化自托管而具有状态的,避免使用Redis等额外依赖。对于单个网站来说,单个实例就足够了。

防止单个网站有多个实例的状态是到达最小延迟前的访问缓存。

话虽如此,如果您仍然需要水平扩展,请提交一个关于添加Redis等内容的请求。

有问题吗?

请随时提交问题 ^^

贡献

欢迎您为该项目做出贡献!

您始终可以提交一个问题。在开始拉取请求之前,请等待对该问题的回复(被拒绝的拉取请求非常令人沮丧)。

在提交代码之前请使用Clippy和rustfmt :)

依赖项

~65MB
~1M SLoC