日志
- 2023-04-20:诈骗误报的处理方法
- 2023-02-16:添加Umami异常可能会导致Pjax失效的提醒。
- 2023-02-16:完善使用方法的教程。维护其它内容。
前言
Umami是一个统计网站流量信息的工具,界面大致如下:
后台可以观察访客(和登陆用户)的实时流量:
话不多说,我们用Docker布署一个自己的Umami。Let’s go!
测试环境
uname -a # Linux VM-12-8-ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
docker --version # Docker version 20.10.5, build 55c4c88
docker-compose --version # docker-compose version 1.28.6, build 5db8d86f
准备工作
按需修改工作目录:
work=~/docker/umami && mkdir -p $work && cd $work
按需修改端口,开启防火墙:
sudo ufw allow 3000/tcp comment 'umami' && sudo ufw reload
提前拉取镜像:
# 国内的小伙伴下载可能很慢
docker pull ghcr.io/mikecao/umami:postgresql-latest &&
docker pull postgres:12-alpine
配置yml文件
不了解docker的小伙伴请先看:《Docker系列 配置Docker全局环境》;《Docker系列 了解Docker Compose的配置文件》。
如果你使用了某个版本的postgres,建议试试用原来的tag而不是postgres:12-alpine
,以便节省镜像对磁盘容量的占用。
新建一个docker-compose文件,
vim $work/docker-compose.yml
填入以下内容:
---
version: '3'
services:
app:
image: ghcr.io/mikecao/umami:postgresql-latest
ports:
- "3000:3000" # 按需修改
environment:
# DATABASE_URL: postgresql://POSTGRES_USER:POSTGRES_PASSWORD@db:5432/POSTGRES_DB
# 按实际情况修改
DATABASE_URL: postgresql://umami:umamipassword@db:5432/umami # 按下面的信息修改
DATABASE_TYPE: postgresql
HASH_SALT: replace-me-with-a-random-string
depends_on:
- db
restart: always
networks:
- default
db:
image: postgres:12-alpine
environment:
POSTGRES_DB: umami # 数据库名,不建议改
POSTGRES_USER: umami # 数据库用户,不建议改
POSTGRES_PASSWORD: umamipassword # 数据库密码 按需修改
volumes:
- ./sql/schema.postgresql.sql:/docker-entrypoint-initdb.d/schema.postgresql.sql:ro
- ./data:/var/lib/postgresql/data
restart: always
networks:
- default
networks:
default:
name: umami
:wq
保存退出。
直接上线服务:
docker-compose up -d
映射sql
umami有一个特殊的trick。
有看到yml文件里的这个./sql/schema.postgresql.sql
项目吗?它默认是生成一个文件夹。
但实际上它是一个文件。所以我们要将默认生成的文件夹删除,并映射成系统需要的那个文件。文件的内容在这个链接里:https://github.com/mikecao/umami/blob/master/sql/schema.postgresql.sql
原内容如下,我直接copy过来的:
drop table if exists event;
drop table if exists pageview;
drop table if exists session;
drop table if exists website;
drop table if exists account;
create table account (
user_id serial primary key,
username varchar(255) unique not null,
password varchar(60) not null,
is_admin bool not null default false,
created_at timestamp with time zone default current_timestamp,
updated_at timestamp with time zone default current_timestamp
);
create table website (
website_id serial primary key,
website_uuid uuid unique not null,
user_id int not null references account(user_id) on delete cascade,
name varchar(100) not null,
domain varchar(500),
share_id varchar(64) unique,
created_at timestamp with time zone default current_timestamp
);
create table session (
session_id serial primary key,
session_uuid uuid unique not null,
website_id int not null references website(website_id) on delete cascade,
created_at timestamp with time zone default current_timestamp,
hostname varchar(100),
browser varchar(20),
os varchar(20),
device varchar(20),
screen varchar(11),
language varchar(35),
country char(2)
);
create table pageview (
view_id serial primary key,
website_id int not null references website(website_id) on delete cascade,
session_id int not null references session(session_id) on delete cascade,
created_at timestamp with time zone default current_timestamp,
url varchar(500) not null,
referrer varchar(500)
);
create table event (
event_id serial primary key,
website_id int not null references website(website_id) on delete cascade,
session_id int not null references session(session_id) on delete cascade,
created_at timestamp with time zone default current_timestamp,
url varchar(500) not null,
event_type varchar(50) not null,
event_value varchar(50) not null
);
create index website_user_id_idx on website(user_id);
create index session_created_at_idx on session(created_at);
create index session_website_id_idx on session(website_id);
create index pageview_created_at_idx on pageview(created_at);
create index pageview_website_id_idx on pageview(website_id);
create index pageview_session_id_idx on pageview(session_id);
create index pageview_website_id_created_at_idx on pageview(website_id, created_at);
create index pageview_website_id_session_id_created_at_idx on pageview(website_id, session_id, created_at);
create index event_created_at_idx on event(created_at);
create index event_website_id_idx on event(website_id);
create index event_session_id_idx on event(session_id);
insert into account (username, password, is_admin) values ('admin', '$2b$10$BUli0c.muyCW1ErNJc3jL.vFRFtFJWrT8/GcR4A.sUdCznaXiqFXa', true);
下面我们进行schema.postgresql.sql
的重新映射:
# 删除错误的文件夹
sudo rm -r $work/sql/schema.postgresql.sql
# 新建一个文件,填写新的内容
sudo vim $work/sql/schema.postgresql.sql # 粘贴上面所示的sql内容。按:wq保存
# 可以改一下这个文件的权限,以防出错。你可以不改试试
sudo chmod +666 $work/sql/schema.postgresql.sql
# 查看umami数据库的容器ID
docker ps -a | grep umami # 获得umami数据库的容器id。通常是umami-db-1或者umami_db_1。看你docker-compose的版本不同。
# 将文件映射出来
# 这个命令注意改umami_db_1。有的人是umami-db-1。
docker exec -i umami_db_1 psql -U umami -d umami < $work/sql/schema.postgresql.sql
重新上线服务:
cd $work && docker-compose down && docker-compose up -d
ddns-go & NPM
不了解Nginx Proxy Manager用法的小伙伴,请看《Docker系列 两大神器NPM和ddns-go的安装》。
在ddns-go或者域名托管商后台映射好域名umami.example.com
。
在NPM里进行反代。无特殊设置。如下图所示:
设置完后打开网站登陆即可:https://umami.example.com
。
默认帐户和密码:
帐户:admin
密码:umami
使用方法
进入后台,修改成简体中文后,添加一个网站:
比如,我自己的网站就是这样写:
然后,复制共享链接:
这个链接分享出去后,所有打开链接的人都可以看到Umami的基本统计信息。但是有一些信息是只有登陆后台才能查看的,比如某个访客正在看哪个网页。
然后就是获取跟踪代码:
对于Argon主题来说,有一个取巧的添加方法:
添加后保存Argon设置即可生效。
对于其它WordPress或者其它平台的网站,放在<head></head>
这个标签之内即可。比如,在Argon里面也可以这样添加:
它之所以要求放在该标签内,是因为一个网站首先加载的就是<head></head>
标签,添加在这里不容易遗漏某些不完整的访问;与之对应的,我的《特效》大多放在footer.php
,是因为footer.php
对应的标签<footer></footer>
往往是最后加载的,这样不影响文章等重要内容的加载。
注意事项
- Umami的监测链接有问题可能会导致网站Pjax失效,具体表现有:开发者窗口提示Umami collect失效;Pjax失效,比如点开链接后壁纸自动切换(Pjax生效时壁纸并不会自动切换)。这种情况可以尝试:检查VPS磁盘空间,适当释放空间;重启Umami的docker stack。
- umami.js位置错误导致Google危险标记:近期有小伙伴将umami.js放到网站的header部分,导致网站被Google标记为诈骗网站。处理方法是将umami.js放在上述正确的位置上,然后找Google站长恢复。
小结
没啥特别,就是文件那里有个小trick,所以要重新映射。我记得大致是这个步骤。我自己在别的服务器复现了一下流程,可以成功。还有其它类似的更强大的工具,比如Matomo,有兴趣的小伙伴可以了解一下。
如果有问题不懂,欢迎评论留言吧!
参考
---------------
完结,撒花!如果您点一下广告,可以养活苯苯😍😍😍
博客真好看
谢谢鼓励,欢迎多多交流喔! 可以加电报群讨论问题哈: https://t.me/benszhub
请问字体是什么呀
目前所用的字体叫汉仪唐美人简,这在《关于我》中也有提及。如果你想布署这个字体,可以看教程《特效》:
查看图片
谢谢啦
大佬您好,我在网站下添加了追踪代码等了几十分钟也没有数据显示,我的版本是1.31 ,我的服务在内网,站点是公网vps,您有遇到过这个问题嘛?
你是说,你的umami装在内网,然后你的博客网站之类的站点是放在公网vps上面吗?
找到原因了,是因为vps上站点是https的,链接请求失败