前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shynet:极为轻量化的访客监控系统

Shynet:极为轻量化的访客监控系统

作者头像
柳神
发布2024-05-30 21:18:46
2570
发布2024-05-30 21:18:46
举报
文章被收录于专栏:清羽飞扬

碎碎念

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

统计鸟和51La又又又加载不出来啦!!!
统计鸟和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的安装方案,供大家参考。

配置模板文件

模板文件如下:

代码语言:javascript
复制
# 数据库设置(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  # 背景条是否缩放到全宽度

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

代码语言:javascript
复制
# 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

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

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

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

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

代码语言:javascript
复制
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部署过程
    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

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

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

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

访客地图,访客来源:

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

优点

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

代码语言:javascript
复制
<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作为一个自托管的网络分析工具,不仅保护了访客的隐私,而且在轻量化和功能性方面表现出色。尽管在汉化和用户界面设计方面有些不足,但其在技术层面的优势使其成为了一个可行的选择。如果你也在寻求一个及其轻量化的访客统计系统,不妨可以试试,相信不会让你失望!

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 碎碎念
  • 功能概要
    • 介绍
      • 特点
        • 追踪指标
          • 使用与部署
            • 限制与建议
            • 安装教程
              • 配置模板文件
                • 安装PostgreSQL
                  • 使用 Docker 安装
                    • 使用 Docker Compose 安装
                    • 基本体验
                      • 功能方面
                        • 优点
                          • 缺点
                          • 总结
                          相关产品与服务
                          数据库
                          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档