11个版本 (5个重大变更)
0.10.2 | 2024年5月8日 |
---|---|
0.10.1 | 2024年1月28日 |
0.9.2 | 2023年11月21日 |
0.3.0 |
|
#1 在 #traffic
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