matomo analyticsを自サーバーに打ち込んでサイトをトラッキングする

# Matomoとは
> Matomo is the leading Free/Libre open analytics platform.
Matomo is a full-featured PHP MySQL software program that you download and install on your own webserver. At the end of the five-minute installation process, you will be given a JavaScript code. Simply copy and paste this tag on websites you wish to track and access your analytics reports in real-time.
Matomo aims to be a Free software alternative to Google Analytics and is already used on more than 1,400,000 websites. Privacy is built-in!

githubより抜粋。簡単に言うとGPLv3ライセンスのOpenSource Analyticsソフト、もしくはプラットフォームです。機能面においても結構充実しており、言語やフレームワーク別のSDKもあります。筆者が触っていたのがweb(reactjs)だけでしたが、iosやandroidにも対応しているらしい。

自前でAnalyticsデータを保有したい人、もしくはGoogle Analyticsが使えない環境などには最適かと。

# 前書き
手順は結構ややこしいので、何回やったとしてもちょこちょこ忘れて、こここれで良かったけ？みたいな状況に結構陥ってしまうのでメモがてら記事にします。

実行環境は `Debian11 + mariadb10 + nginx1.18` です。

便利のため直接 root としてコマンドを実行してます、rootじゃない方は適切にコマンドの前に`sudo`を付けてください。

# 前準備
インストールする前にまず **mysql** もしくは **mriadb** 、かつ **nginx** もしくは **appache** が必要なので、他の方の記事がいっぱいなので、ここでは割愛いたします。

筆者は`Debian11 + mariadb10 + nginx1.18 + matomo4.15.1`でやってます


# インストール

まず [公式ぺーじ](https://matomo.org/faq/on-premise/installing-matomo/) に行ってmatomoのダウンロードリンクをゲットします、リンク貰ったら wget でダウンロードします

```bash
wget https://builds.matomo.org/matomo.zip

# wget ない人はまず入れてから再度上のコマンドを実行しましょう
apt install wget
```

必要な依頼を打ち込みます
```bash
apt install php php-curl php-gd php-cli php-mysql php-xml php-mbstring
```

入れたら php のバージョンを一旦見ます
```bash
php --version
```

筆者は`7.4.33`なので`php7.4-fpm`を入れます
```bash
apt install php7.4-fpm
```

これで前準備は終わりです

先 download した matomo.zip を unzip します
```bash
# unzip 入ってないので一旦入れます
apt install unzip

# 解凍
unzip matomo.zip
```

解凍したら`'How to install Matomo.html'`のファイルと`matomo`のフォルダーが見えるはず

`'How to install Matomo.html'`と先ダウンロードした`matomo.zip`はにいらないので消します
```bash
rm 'How to install Matomo.html' matomo.zip
```

そして nginx の conf を変更します
```bash
vim /etc/nginx/sites-enabled/default
```
ただ筆者の癖で sites-enabled でサイトを管理しているだけで、直接 `/etc/nginx/nginx.conf`でやるのも一緒なので、好きな場所で構いません


このようなものを追加します。
セキュリティーなどの設定も色々したため長くなってますが、同じバージョンもmatomoを使っていればおそらく直接コピペでも使えると思います。（server_nameとsslの設定は自分のものに変更してください）
```nginx
server {
	listen 443 ssl;
	listen [::]:443 ssl;

	server_name <your_server_name>;
	
	access_log /var/log/nginx/matomo.access.log;
	error_log /var/log/nginx/matomo.error.log;

	ssl_certificate </path/to/ssl_certificate>;
	ssl_certificate_key </path/to/ssl_certificate_key>;
	ssl_protocols TLSv1.3;
	ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;

	add_header Referrer-Policy origin always;
	add_header X-Content-Type-Options "nosniff" always;
	add_header X-XSS-Protection "1; mode=block" always;

	root /var/www/matomo; 
	index index.php;

	location ~ ^/(index|matomo|piwik|js/index|plugins/HeatmapSessionRecording/configs)\.php$ {
		include snippets/fastcgi-php.conf;
		fastcgi_param HTTP_PROXY "";
		fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
	}

	location ~* ^.+\.php$ {
		deny all;
		return 403;
	}

	location ~ ^/(config|conf|tmp|core|lang) {
		deny all;
		return 403;
	}

	location ~ /\.ht {
		deny all;
		return 403;
	}

	location ~ js/container_.*_preview\.js$ {
		expires off;
		add_header Cache-Control 'private, no-cache, no-store';
	}

	location ~ \.(gif|ico|jpg|png|svg|js|css|htm|html|mp3|mp4|wav|ogg|avi|ttf|eot|woff|woff2)$ {
		allow all;
		expires 1h;
		add_header Pragma public;
		add_header Cache-Control "public";
	}

	location ~ ^/(libs|vendor|plugins|misc|node_modules) {
		deny all;
		return 403;
	}
}
```

終わったら保存して、文法に間違いはあるかどうかを確認する
```bash
nginx -t

# root じゃない人は
sudo nginx -t
```

---
**次のコマンドを実行すると web から matomo にアクセスできるようになります。これからの設定はほぼ全て web でマウスだけでできるが、最初の設定が終わるまで誰でもアクセス可能な状態なので、white-listなどを一旦nginxに付けて、設定が全て終わったらwhite-listを解除することをおすすめします。が、筆者のめんどくさがり屋なのでここではやりおりません**

---

問題なければ、先解凍で出てきた`matono`フォルダーを`/var/www/`に移動して、nginxを再起動しましょう
```bash
mv matomo /var/www && service nginx restart

# service cmdない人は
systemctl restart nginx
```

これで先書いた`<your_server_name>`をブラウザに打ち込むと matomo web にアクセスできるはずです。できない人はDNSはちゃんと設定されているかどうかなどを確認してみましょう。

で、入ったら指示に従っていれば良いので、筆者だとこのようなページが表示されました

![matomo_lecture_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476308/4d8e69c6-1149-ed73-8fe3-f123f78b7bae.png)

なので、
```bash
chown -R www-data:www-data /var/www/matomo
```
を実行します。

実行したらページをリロードするとこのようなページに入るはずです
![matomo_lecture_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476308/db4464c4-fa96-0466-ac6a-e7f0e0d7a755.png)

次をクリックしたらシステムチェックに入るが、おそらくオールグリーンではないはずです。もしエラーが出たら従って修復しましょう。

nginxとphp-fmpのwarningは無視しておkです。最初のnginx.confの時はすでにセキュリティー設定をしましたからです。

全てクリアしたらさらに次へとクリックしましょう。

![matomo_lecture_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476308/6a22a0bf-c0b2-138f-39d7-e53b0636538a.png)

このページでdbの設定をしますが、まだmysqlにmatomo専用のユーザー作ってないので一旦ターミナルに戻って操作します
```bash
# mysql へログイン
mysql -u root -p

# 入ったらまずなuserを作る、userとpasswordは自分のものに変えてください
> CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';

# 同じ名前の db を作ります
> CREATE DATABASE newuser;

# 先作ったユーザーに新たに作った db の権限を付与します
> GRANT ALL PRIVILEGES ON newuser.* TO 'newuser'@'localhost';

# リロード
> FLUSH PRIVILEGES;

# 退出
> exit;
```

そして先作ったユーザーの情報を入れます（サーバーに`:3306`のポートを追加している、他のポートでやっている人は適切に変えてください）
![matomo_lectrure_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476308/9c0c9ee5-fc7e-6d77-7ad5-7c672f31d3a0.png)

全て正常なら自動的にテーブルが作られるはずです。テーブル作成が成功したらさらに次へとクリックしましょう。

で、Super Userを作ってくださいって求められるので、適切に作ってください。スクショがちょっとめんどいので割愛です(

Super User作成の後、最初に追跡するWebページの設定を求められるので、同じく適切に設定しましょう。ない人は次へを押してスキップして大丈夫です。後でまた追加できますので。

さらに次はjsコードの埋め込みについての指示ですが同じくスキップして大丈夫です。後ほど追加します。

**おめでとうございます🥳**

これでインストールが全て完了です。nginxにwhite-listを設定している場合white-listを解除しても良いでしょう。

これから<your_server_name>にアクセスしに行く全ての人がまずsuper userのログインが要求されます、かつ機密ファイルはnginxレベルで全てのアクセスを防いてますので、安心して公開して大丈夫でしょう。まだ心細い場合はこのままwhite-listをonにしても構いません。他の動的セキュリティー措置を追加しても良いでしょう。