使用 Umami 自建 Web Analytics 平台

介绍

Umami 是一个简单的网站统计工具,可以代替 Google Analytics
使用nodejs编写,需要配合 MySQL 或 Postgresql
使用起来很简单,比起 Google Analytics 比较直观,对SPA单页应用也支持不错

/mikecao/umami

Umami is a simple, fast, website analytics alternative to Google Analytics.

已经搭好的实例站点

My Blog Report Atelier Report

预览图

从源码安装

也可以直接使用docker安装,这里先介绍下用nodejs运行源码

安装nodejs

可以参考
https://github.com/nodesource/distributions/blob/master/README.md

CentOS 7

1
yum install nodejs -y

Debian / Ubuntu

1
2
curl -fsSL https://deb.nodesource.com/setup_14.x | bash -
apt-get install -y nodejs

从源码安装 Umami

下载源码并使用npm安装依赖

1
2
3
git clone https://github.com/mikecao/umami.git
cd umami
npm install

创建数据表

表结构在源码的sql目录下,导入就行

如果mysql导入的时候出现了这样的错误:
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

是因为老版本mysql不能定义多个DEFAULT CURRENT_TIMESTAMP,升级到5.6.5以上或者手动修改下吧

For MySQL:

1
mysql -u username -p databasename < sql/schema.mysql.sql

For Postgresql:

1
psql -h hostname -U username -d databasename -f sql/schema.postgresql.sql

配置 umami

根目录创建一个.env文件,填写下面内容
HASH_SALT是随机字符串,DATABASE_URL是连接字符串

1
2
DATABASE_URL=(connection url)
HASH_SALT=(any random string)

connection url 的参考格式

1
2
3
postgresql://username:mypassword@localhost:5432/mydb

mysql://username:mypassword@localhost:3306/mydb

构建 umami

如果以后使用了git pull更新了源码,需要再build一次

1
npm run build

运行

1
npm start

会默认运行在http://localhost:3000

Docker 安装

可以参考 Github 的说明
https://umami.is/docs/install

To build the umami container and start up a Postgres database, run:

1
docker-compose up

Alternatively, to pull just the Umami Docker image with PostgreSQL support:

1
docker pull ghcr.io/mikecao/umami:postgresql-latest

Or with MySQL support:

1
docker pull ghcr.io/mikecao/umami:mysql-latest

Nginx 反向代理

创建一个vhost , location 使用 proxy_pass即可

1
2
3
4
5
6
7
8
9
location / {
proxy_pass http://localhost:3000;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

这边还是给个完整实例可参考
如果配了域名,记得DNS记录也添加下

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
server
{
listen 443 ssl http2;
#listen [::]:443 ssl http2;
server_name akari.abyss.moe;
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/default;

ssl_certificate /usr/local/nginx/conf/ssl/abyss.moe/fullchain.cer;
ssl_certificate_key /usr/local/nginx/conf/ssl/abyss.moe/abyss.moe.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_session_cache builtin:1000 shared:SSL:10m;
# openssl dhparam -out /usr/local/nginx/conf/ssl/dhparam.pem 2048
ssl_dhparam /usr/local/nginx/conf/ssl/dhparam.pem;

#error_page 404 /404.html;

# Deny access to PHP files in specific directory
#location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; }

#include enable-php.conf;
location / {
proxy_pass http://localhost:3000;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}

access_log off;
}

添加网站

上面都没问题的话,在浏览器中打开,就可以看到登录界面
默认的用户名是admin,密码是umami

在Setting可以添加网站,添加好后,点Get tracking code获得嵌入代码
放到网站的head标签内就行了

设置里可以打开share URL,任何人都可以看到这个报告

使用 Systemd 运行

创建/etc/systemd/system/umami.service
下面是个参考,需要使用的的话记得改下ExecStart路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Node.js Server

[Service]
WorkingDirectory=/home/wwwroot/umami
Type=simple
ExecStart=/home/wwwroot/umami/node_modules/next/dist/bin/next start
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=node-server

[Install]
WantedBy=multi-user.target

编辑好后启动即可,无需干预可以在后台稳定运行了

1
systemctl enable umami && systemctl start umami