碎碎念

我一直在找合适的访客统计系统,我曾推荐Umami,Umami的页面确实很美观简洁,我也非常喜欢他的风格,但是部署Umami需要部署两个容器,一个是PostgreSQL,一个是Umami本体,这两个占用都超过了200MB,我的服务器只有2GB,除去系统占用和已经部署的服务,剩下只有700MB了,为了服务器的稳定,我只能忍痛将其关闭,并使用揽星在评论区提到的统计系统:51La和统计鸟,但是这两个卧龙凤雏每天都加载不出来,严重影响访客统计数据,实在没办法,只能自行部署,于是我又开始在网上寻找更加轻量化的访客统计系统,最终找到了Shynet,总占用不到150MB,不过他也有些缺点,比如无法汉化,功能较少,但是这么小的占用,要什么自行车呢?最终决定使用这个并暂时维持,不过我还在寻找更好的替代品,如果有更合适的我将毫不犹豫地替换掉它。

统计鸟和51La又又又加载不出来啦!!!

功能概要

介绍

Shynet 是一个网络分析工具,与大多数其他工具不同的是,它不需要将访问者信息交给第三方公司。Shynet 的设计目标是既提供有用的信息,又尊重访问者的隐私。

特点

  • 隐私保护: Shynet完全自托管,不需向第三方公司提供访问者信息,由于其不使用 cookies 跟踪的特性,也避免了烦人的 cookie 提示。
  • 轻量级: 追踪脚本小巧,即使 JavaScript 不可用也能通过非脚本计算方式正常工作。
  • 开源自由: 使用 Django 构建,支持自定义,拓展度高(不过俺还不会呜呜呜)。
  • 多用户多站点支持: 一个 Shynet 实例可以支持多个用户,每个用户可以追踪多个不同的站点。
  • 灵活部署: 可以在单个小型 VPS 上以 Docker 容器方式运行,也可在大型 Kubernetes 集群上部署以应对更高的流量。

追踪指标

  • 页面访问量: 统计网站页面的打开/浏览次数。
  • 访问会话数: 统计网站被访问的次数。
  • 页面加载时间: 记录页面加载所需的时间。
  • 跳出率: 表示只访问了一个页面就离开的访问者的比例。
  • 停留时长: 记录访问者在网站停留的时长。
  • 来源: 统计访问者从哪些链接跳转而来。
  • 地理位置与网络: 根据 IP 地址推测访问者的地理位置与网络信息。
  • 操作系统与浏览器: 统计访问者使用的操作系统和浏览器信息。
  • 设备类型: 区分访问者使用的设备类型,如台式机、平板或手机。

页面展示

使用与部署

  • 提供详细的使用指南,支持 Docker、docker-compose、Heroku 或 Kubernetes 部署。
  • 支持灵活的账户管理,可以方便地分享服务和协作。

限制与建议

  • 适用于个人项目和中小型网站,对于超高流量的网站未经过充分测试。
  • 需要一定的技术知识来部署和维护,不适合需要一键式解决方案的用户。

以上就是在github官方介绍中对于shynet的简要概括,我使用中文阐述了一遍,具体内容可以查看官方英文文档:

安装教程

本次教程主要介绍第二种:docker-compose安装,因为docker方案需要设置--network='host',修改端口号可能不太方便(其实是我不会QwQ),而我的默认8080是被占用的状态,所以我选择docker-compose安装,这里也会着重讲解该方法,但是由于原文档是英文,所以我也会顺带着尽量详细的使用中文介绍一下第一种docker的安装方案,供大家参考。

配置模板文件

模板文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# 数据库设置(PostgreSQL)
DB_NAME=shynet_db # 数据库名称
DB_USER=shynet_db_user # 数据库用户名
DB_PASSWORD=shynet_db_user_password # 数据库密码
DB_HOST=db # 数据库主机地址
DB_PORT=5432 # 数据库端口

# 数据库设置(SQLite)- 注释掉 PostgreSQL 设置
# SQLITE=True
# DB_NAME=/var/local/shynet/db/db.sqlite3

# 邮件设置(可选)
EMAIL_HOST_USER=example # 邮件主机用户名
EMAIL_HOST_PASSWORD=example_password # 邮件主机密码
EMAIL_HOST=smtp.example.com # 邮件主机地址
EMAIL_PORT=465 # 邮件端口
EMAIL_USE_SSL=True # 使用 SSL 加密连接
# 如果你的 SMTP 服务器使用 TLS,请注释掉 EMAIL_USE_SSL 并取消注释 EMAIL_USE_TLS。
# EMAIL_USE_TLS=True
SERVER_EMAIL=Shynet <noreply@shynet.example.com> # 服务器邮箱

# 一般的 Django 设置 - 用于生成密钥,运行:python3 -c "import secrets; print(secrets.token_urlsafe())"
DJANGO_SECRET_KEY=random_string # Django 密钥

# 将这些设置为你的部署域名。两者都用逗号分隔,但 CSRF_TRUSTED_ORIGINS 还需要一个方案(例如,`https://`)。
ALLOWED_HOSTS=example.com # 允许访问的域名
CSRF_TRUSTED_ORIGINS=https://example.com # 允许跨站请求伪造的域名

# 本地化
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE=en-us # 语言设置为英文(美国)

# 如果你想让人们能够注册你的 Shynet 实例,请将此设置为 True(不建议)
ACCOUNT_SIGNUPS_ENABLED=False # 是否允许用户注册账号

# 用户邮箱地址是否需要验证?只有在你设置了邮件设置并允许公开注册时才将其设置为 `required`;否则,这是不必要的。
ACCOUNT_EMAIL_VERIFICATION=none # 账号邮箱验证设置

# 管理面板的时区。影响日期的显示。
# 这必须与 IANA 的 tz 数据库中的值匹配。
# 维基百科有一个有效字符串列表:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
TIME_ZONE=America/New_York # 时区设置为美国东部时间

# 设置为 "False" 如果你不打算通过 HTTPS 提供内容
SCRIPT_USE_HTTPS=True # 是否使用 HTTPS

# 监控脚本“报到”的频率是多少(以毫秒为单位)?
SCRIPT_HEARTBEAT_FREQUENCY=5000 # 监控脚本心跳频率

# 同一个用户的请求之间可以经过多长时间,然后创建一个新的会话,单位为秒?
SESSION_MEMORY_TIMEOUT=1800 # 会话内存超时时间

# 是否只有超级用户(管理员)能够创建服务?当你想邀请其他人加入你的 Shynet 实例但又不希望他们能够创建自己的服务时,这很有用。
ONLY_SUPERUSERS_CREATE=True # 是否只有超级用户能创建服务

# 是否在启动时执行检查和设置,包括应用未应用的迁移。对于大多数设置,建议值为 True。默认为 True。
# 如果值为 False,则会跳过。将会执行检查和设置。
PERFORM_CHECKS_AND_SETUP=True # 是否在启动时执行检查和设置

# Shynet 应绑定的端口。如果你在 Heroku 上部署,请不要设置此项。
PORT=8080 # Shynet 监听端口

# 如果你不希望在前端显示版本号,请将其设置为 "False"。
SHOW_SHYNET_VERSION=True # 是否在前端显示 Shynet 版本号

# Redis、队列和并行设置;对于单实例部署不必要。
# 不要取消注释这些,除非你知道你在做什么!
# NUM_WORKERS=1
# 如果你有多个前端工作节点/实例,请确保设置 REDIS_CACHE_LOCATION。
# REDIS_CACHE_LOCATION=redis://redis.default.svc.cluster.local/0
# 如果设置了 CELERY_BROKER_URL,请确保 CELERY_TASK_ALWAYS_EAGER 为 False,并
# 通过 `celeryworker.sh` 在某个地方运行一个独立的队列消费者。
# CELERY_TASK_ALWAYS_EAGER=False
# CELERY_BROKER_URL=redis://redis.default.svc.cluster.local/1

# Shynet 是否在仪表板中显示第三方图标?
SHOW_THIRD_PARTY_ICONS=True # 是否在仪表板中显示第三方图标

# 是否全局阻止 IP 地址的收集?
BLOCK_ALL_IPS=False # 是否全局阻止 IP 地址的收集

# 是否在哈希用户时包含日期和站点 ID?
# 这将阻止任何跨站跟踪的可能性,前提是还禁用了 IP 收集,且外部键(主键)未提供。它还将阻止会话跨越一天到另一天。
AGGRESSIVE_HASH_SALTING=True # 是否包含日期和站点 ID 在哈希用户时

# 在前端中链接到的自定义位置 URL。
# $LATITUDE 将被纬度替换,$LONGITUDE 将被经度替换。
# 示例:
# - https://www.openstreetmap.org/?mlat=$LATITUDE&mlon=$LONGITUDE (默认)
# - https://www.google.com/maps/search/?api=1&query=$LATITUDE,$LONGITUDE
# - https://www.mapquest.com/near-$LATITUDE,$LONGITUDE
LOCATION_URL=https://www.openstreetmap.org/?mlat=$$LATITUDE&mlon=$$LONGITUDE # 自定义位置 URL

# 仪表板页面上应显示多少个服务?
# 如果你根本不想进行分页,请设置为一个很大的数字。
DASHBOARD_PAGE_SIZE=5 # 仪表板页面显示服务数量

# 是否将背景条缩放到全宽度?
USE_RELATIVE_MAX_IN_BAR_VISUALIZATION=True # 背景条是否缩放到全宽度

以上是所有可选项的模板内容,这也忒长了!不过我们可以简化呀,我们只需要关键配置即可,其余的按照默认即可使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# PostgreSQL 数据库连接信息
DB_NAME=shynetdb
DB_USER=shynet
DB_PASSWORD=your-password
DB_HOST=127.0.0.1
DB_PORT=5432

# 如果不需要邮件功能的话可以直接注释掉
EMAIL_HOST_USER=nide@you.xiang
EMAIL_HOST_PASSWORD=bidabidoudoubidabibidou
EMAIL_HOST=smtp.exmail.qq.com
EMAIL_PORT=465
EMAIL_USE_SSL=True

# 默认为 *,建议修改为你准备部署的域名
ALLOWED_HOSTS=visitor.qyliu.top
CSRF_TRUSTED_ORIGINS=https://visitor.qyliu.top # 这里一定要改!一定要改!

# 时区设置,可以修改为 Asia/Shanghai
TIME_ZONE=Asia/Shanghai

# Localization
# https://docs.djangoproject.com/en/2.2/topics/i18n/
LANGUAGE_CODE=en-us # 有中文,但是建议不要中文,因为效果很差

如上所示,我们最需要的内容就是数据库,CSRF验证域名,时区设置,其他的都可以注释的,其中数据库我们稍后会讲到,CSRF验证域名一定要设置!否则会出现部署后无法使用的尴尬局面,如下:

烦,可搞了我半天时间!

安装PostgreSQL

  1. 打开终端,输入apt install postgresql,下载postgreSQL数据库。

  2. 如果一切顺利的话,下面就可以进行连接数据库了,输入su - postgres -c psql.

  3. 连接成功后先修改密码,输入ALTER USER postgres WITH PASSWORD 'your-password';,这样密码就修改成功了。

  4. 下面创建数据库和用户,输入以下内容:

    1
    2
    3
    CREATE USER shynet WITH PASSWORD 'your-password';
    CREATE DATABASE shynetdb OWNER shynet;
    GRANT ALL PRIVILEGES ON DATABASE shynetdb to shynet;

这样我们的数据库就创建好了,下面我们开始安装程序。

使用 Docker 安装

  1. 拉取最新版本的 Shynet:首先 运行 docker pull milesmcc/shynet:latest 命令拉取最新的镜像,如果没有安装 Docker,请先安装 Docker。

  2. 选择数据库:

    Shynet数据库支持两种数据库,为了稳定我选择了PostgreSQL数据库,我也建议大家使用PostgreSQL数据库。

    • 如果使用 PostgreSQL,需要准备一个 PostgreSQL 服务器,并设置好相关环境变量,比如用户名、密码、主机和端口等,当然端口默认都是5432。

    • 如果准备使用 SQLite,需创建一个 Docker volume 用于持久化数据库,并在运行容器时将该 volume 挂载到容器内(没看懂部分,这里附上原文)。

      SQLite部署过程

  3. 配置环境文件: 使用提供的模板文件 .env,设置数据库信息等必要配置。

  4. 首次启动 Shynet 服务器: 运行 docker run --env-file=<你的环境文件> milesmcc/shynet:latest 命令。如果一切正常,你会看到关于未设置管理员用户或主机的几条警告,这是正常现象。

  5. 创建管理员用户: 运行 docker run --env-file=<你的环境文件> milesmcc/shynet:latest ./manage.py registeradmin <你的邮箱> 命令,临时密码将会打印到控制台上。

  6. 设置 Shynet 实例的标识: 运行 docker run --env-file=<你的环境文件> milesmcc/shynet:latest ./manage.py whitelabel <标识> 命令,这个标识可以随意设置,用于重命名 Shynet 实例。

  7. 启动 Web 服务器: 运行 docker run --env-file=<你的环境文件> milesmcc/shynet:latest 命令。可能需要将 Docker 的端口 8080(Shynet 运行的端口)绑定到本地的端口 80(http),使用 -p 80:8080 参数。访问服务主页,使用步骤 5 中的凭据登录。

  8. 创建服务: 点击右上角的“+ 创建服务”,填写相关信息并点击“创建”,即可跳转到新服务的分析页面。

  9. 获取跟踪脚本代码: 在服务页面的右上角点击“管理”,即可获取跟踪脚本代码。将此代码插入到需要跟踪的页面上。

使用 Docker Compose 安装

  1. 确保安装了 docker-compose: 如果没有安装,请先安装 docker-compose。
  2. 克隆仓库: 克隆 Shynet 仓库到本地。
  3. 配置环境文件: 使用模板文件 .env,如上正常设置即可。
  4. 修改 nginx 配置: 在仓库根目录下的 nginx.conf 文件中,将 example.com 替换为你的主机名。然后在 docker-compose.yml 文件中的第38行,将端口号修改为你希望绑定的本地端口号。
  5. 首次启动 Shynet 服务器: 运行 docker-compose up -d 命令。如果出现 “permission denied” 或 “Couldn’t connect to Docker daemon” 错误,可以使用 sudo 前缀或将用户添加到 docker 组,不过一般不会出现,正常安装即可。
  6. 这样我们的主程序就创建成功了,下面进行登陆操作。
  7. 创建管理员用户: 运行 docker exec -it shynet_main ./manage.py registeradmin <你的邮箱> 命令,临时密码将会打印到控制台上,注意复制。
  • 下面是可选项,不进行也可以正常使用:
  1. 设置 Shynet 实例的标识: 运行 docker exec -it shynet_main ./manage.py whitelabel <标识> 命令,此标识用于重命名 Shynet 实例。

基本体验

功能方面

  1. 语言支持:虽然官方介绍支持设置语言,但是经过实测,如果设置为汉语会出现很难受的部分汉化,如下:

    部分汉化展示

    其中的左边注销汉化了,上方的月份汉化了,除此之外都没有汉化成功,如果你点开某个设置后会更加不堪入目,所以强烈不建议汉化,如果非要尝试,可以设置语言为zh-hans

  2. 总体来说,我不是很喜欢,但是奈何他轻量化,我又能要什么自行车呢?更何况页面也不算太难看,只是一些逻辑方面显得比较简陋,首先就是他的仪表盘:

    仪表盘展示

    可以展示多个站点的数据,看起来也很简洁,但是左边菜单栏看起来就很简陋了,可以看到,账户是分类,却和下面的按钮混在一起。

  3. 点开一个页面之后,该有的数据都有了,如访客统计:

    访客统计

    访客地图,访客来源:

    访客地图等功能

  4. 除此之外,refer统计,操作系统,设备等功能也是很齐全的,。足够我日常进行统计了,这里就不一一展示了。

优点

作为一个轻量化的系统,他的优点自然就是极为轻量化了,它的统计代码如下:

1
2
3
4
<noscript>
<img src="https://visitor.qyliu.top/ingress/aaaaaa-bbbbbb-cccccc-dddddd/pixel.gif">
</noscript>
<script defer src="https://visitor.qyliu.top/ingress/aaaaaa-bbbbbb-cccccc-dddddd/script.js"></script>

可以看到它支持两种统计方式,有脚本和无脚本,其中脚本大小为1.8KB,无脚本统计甚至只需要43字节

统计文件大小展示

并且由于其无需cookie的特性,它不会被各种拦截器所拦截,这也解决了统计鸟和51la的痛点,并且其内存占用也非常之小,强烈建议想要自行部署访客统计系统且内存不够的用户:

极为轻量化

缺点

首先这个大小放在这里,就可以让我忽略几乎所有的缺点,但是仍然有一点,那就是该系统的时间粒度默认为一个月,需要手动调整才能显示为最近七天或者当天数据:

时间粒度过长

并且无法修改默认显示时间粒度,除此之外,我可以包容它的一切缺点,不过我仍然在寻找更好的替代品,如果在我服务器的承受范围内,我将毫不犹豫替换掉他,因为我是一个外观主义者。

总结

在我寻找合适的访客统计系统的过程中,我经历了很多的尝试。从推荐的Umami到后来的51La和统计鸟,再到本次选择的Shynet,每一步都是为了找到一个符合服务器要求、易于部署、功能齐全的解决方案,Shynet作为一个自托管的网络分析工具,不仅保护了访客的隐私,而且在轻量化和功能性方面表现出色。尽管在汉化和用户界面设计方面有些不足,但其在技术层面的优势使其成为了一个可行的选择。如果你也在寻求一个及其轻量化的访客统计系统,不妨可以试试,相信不会让你失望!

本次教程到此结束,如果有什么问题欢迎在评论区留言!

参考教程

每日一图

超级喜欢的《完美世界》国漫小姐姐!

— 柳影曳曳,清酒孤灯,扬笔撒墨,心境如霜