我一直在找合适的访客统计系统,我曾推荐Umami,Umami的页面确实很美观简洁,我也非常喜欢他的风格,但是部署Umami需要部署两个容器,一个是PostgreSQL,一个是Umami本体,这两个占用都超过了200MB,我的服务器只有2GB,除去系统占用和已经部署的服务,剩下只有700MB了,为了服务器的稳定,我只能忍痛将其关闭,并使用揽星在评论区提到的统计系统:51La和统计鸟,但是这两个卧龙凤雏每天都加载不出来,严重影响访客统计数据,实在没办法,只能自行部署,于是我又开始在网上寻找更加轻量化的访客统计系统,最终找到了Shynet,总占用不到150MB,不过他也有些缺点,比如无法汉化,功能较少,但是这么小的占用,要什么自行车呢?最终决定使用这个并暂时维持,不过我还在寻找更好的替代品,如果有更合适的我将毫不犹豫地替换掉它。
Shynet 是一个网络分析工具,与大多数其他工具不同的是,它不需要将访问者信息交给第三方公司。Shynet 的设计目标是既提供有用的信息,又尊重访问者的隐私。
以上就是在github官方介绍中对于shynet的简要概括,我使用中文阐述了一遍,具体内容可以查看官方英文文档:
本次教程主要介绍第二种:docker-compose安装,因为docker方案需要设置--network='host'
,修改端口号可能不太方便(其实是我不会QwQ),而我的默认8080是被占用的状态,所以我选择docker-compose安装,这里也会着重讲解该方法,但是由于原文档是英文,所以我也会顺带着尽量详细的使用中文介绍一下第一种docker的安装方案,供大家参考。
模板文件如下:
# 数据库设置(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 # 背景条是否缩放到全宽度
以上是所有可选项的模板内容,这也忒长了!不过我们可以简化呀,我们只需要关键配置即可,其余的按照默认即可使用:
# 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验证域名一定要设置!否则会出现部署后无法使用的尴尬局面,如下:
打开终端,输入apt install postgresql
,下载postgreSQL数据库。
如果一切顺利的话,下面就可以进行连接数据库了,输入su - postgres -c psql
.
连接成功后先修改密码,输入ALTER USER postgres WITH PASSWORD 'your-password';
,这样密码就修改成功了。
下面创建数据库和用户,输入以下内容:
CREATE USER shynet WITH PASSWORD 'your-password';
CREATE DATABASE shynetdb OWNER shynet;
GRANT ALL PRIVILEGES ON DATABASE shynetdb to shynet;
这样我们的数据库就创建好了,下面我们开始安装程序。
docker pull milesmcc/shynet:latest
命令拉取最新的镜像,如果没有安装 Docker,请先安装 Docker。.env
,设置数据库信息等必要配置。docker run --env-file=<你的环境文件> milesmcc/shynet:latest
命令。如果一切正常,你会看到关于未设置管理员用户或主机的几条警告,这是正常现象。docker run --env-file=<你的环境文件> milesmcc/shynet:latest ./manage.py registeradmin <你的邮箱>
命令,临时密码将会打印到控制台上。docker run --env-file=<你的环境文件> milesmcc/shynet:latest ./manage.py whitelabel <标识>
命令,这个标识可以随意设置,用于重命名 Shynet 实例。docker run --env-file=<你的环境文件> milesmcc/shynet:latest
命令。可能需要将 Docker 的端口 8080(Shynet 运行的端口)绑定到本地的端口 80(http),使用 -p 80:8080
参数。访问服务主页,使用步骤 5 中的凭据登录。.env
,如上正常设置即可。nginx.conf
文件中,将 example.com
替换为你的主机名。然后在 docker-compose.yml
文件中的第38行,将端口号修改为你希望绑定的本地端口号。docker-compose up -d
命令。如果出现 “permission denied” 或 “Couldn’t connect to Docker daemon” 错误,可以使用 sudo 前缀或将用户添加到 docker 组,不过一般不会出现,正常安装即可。docker exec -it shynet_main ./manage.py registeradmin <你的邮箱>
命令,临时密码将会打印到控制台上,注意复制。docker exec -it shynet_main ./manage.py whitelabel <标识>
命令,此标识用于重命名 Shynet 实例。
其中的左边注销汉化了,上方的月份汉化了,除此之外都没有汉化成功,如果你点开某个设置后会更加不堪入目,所以强烈不建议汉化,如果非要尝试,可以设置语言为zh-hans
。
可以展示多个站点的数据,看起来也很简洁,但是左边菜单栏看起来就很简陋了,可以看到,账户是分类,却和下面的按钮混在一起。
访客地图,访客来源:
作为一个轻量化的系统,他的优点自然就是极为轻量化了,它的统计代码如下:
<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作为一个自托管的网络分析工具,不仅保护了访客的隐私,而且在轻量化和功能性方面表现出色。尽管在汉化和用户界面设计方面有些不足,但其在技术层面的优势使其成为了一个可行的选择。如果你也在寻求一个及其轻量化的访客统计系统,不妨可以试试,相信不会让你失望!
本次教程到此结束,如果有什么问题欢迎在评论区留言!