誰もが知っているデフォルトパスワード
これらのツールのうち1つは、地球上のすべてのインストールで同じ管理者認証情報を出荷している。残りのツールは、最初に登録した者に所有権を渡す。ホスト名は、TLSが機能した瞬間に証明書の透明性ログで公開される。ログインし、それを変更し、登録を締め切ること——最初の5分の内に、明日ではなく。

アナリティクスは、ほとんどの人が残している最後のサードパーティタグであり、あなたが所有せず監査もできないシステムの上で、すべてのページ、すべての読者、すべての時間帯を見届ける唯一の存在である。それを自分専用のカウンター——Umami、Plausible Community Edition、Matomo、あるいはサーバーログだけ——に置き換える6つのステップを、本人確認書類なしで借りたNordicのマシン上で実行する。デフォルトでクッキーレス、議論の余地がある同意バナーもなく、読者データが第三国へ転送されることもない。月額$3.90から。Debian 12で動作確認済み。
選ぶ
4つのツール、1つの正直な比較表
プロビジョニング
1つのサブドメイン、3つのポート
デプロイ
Compose、Caddy、初回ログイン
計測する
1つのタグと、ファーストパーティの経路
遵守する
2つの法律、1つではない
Keep
保持期間、バックアップ、忘れられたログ
訪問者を数えることには本当に意味があり、それを望むことに何ら不穏なところはない。書き直しが効果を上げたかどうか、実際にどの記事を読者が最後まで読んでいるか、どのリファラーが直帰ではなく読者を送り込んでいるか、そして昨夜のデプロイが特定のブラウザでチェックアウトを静かに壊していないかを知る必要がある。これらの問いはいずれも、ページビューのテーブル1つで答えが出るものであり、そのどれもが計測する正当な理由である。
正面から見る価値があるのは、その答えを得るためにほとんど全員が受け入れてきた仕組みである。標準的なアナリティクスタグは、広告会社によって書かれた一片のコードであり、あなたはそれをサイトのすべてのページに置き、読者のブラウザ内で実行するよう指示する。それはページのアドレス、リファラー、画面、言語、デバイスを読み取り、デバイス上の識別子を設定または読み取り、それらすべてを、自分では検査できないシステムへ、自分が選んだわけではない規則を持つ国へ送信し、そして出来上がったファイルを、人々の行動を知ることで収益を得ている会社に引き渡す。サイトの運営者が得るのはダッシュボードである。ダッシュボードは、この取引のうち、より小さな半分に過ぎない。
その代償は4回の支払いに分けてやってくるが、明白なのはそのうち1つだけである。まず同意バナーがある。これはほぼ完全にこのタグ1つのために存在し、入口で測定可能な割合の訪問者を失わせ、その管理のためにさらに別のベンダーへ料金を払うことになる。次に移転の問題がある。読者のデータが第三国へ出ていくため、それがなぜ合法なのかを、いずれ誰かが書き記さなければならない。そしてデータそのものがある。それはあなたの読者層であるにもかかわらず、提供されるレポートを通す以外にクエリできないデータベースの中にある。そして依存がある。そのプロダクトは、他人のスケジュールで廃止され、名前を変えられ、あるいは再構築される。そして前回それが起きたときには、過去の計測値もともに失われた。
セルフホスティングは、この4つすべてを一度に取り除いてくれるが、それは大した作業ではない。ソフトウェアは成熟していて、無料で、面白みがないほど安定している。マシンは月に数ドルで済み、作業は一晩で終わる。手に入るのは、自分で選んだ法域のハードウェア上にある、自分自身が所有するテーブルであり、開示すべきサードパーティもなく——ほとんどの構成では——議論の余地がある同意バナーもない。何人があなたのサイトを読んでいるかを知る4つの方法と、それぞれのコストは次のとおりである。
| 項目 | あの大手の無料アナリティクスタグ | プライバシー重視のアナリティクスSaaS | 同じソフトウェアを、自分のVPSで |
|---|---|---|---|
| 読者データのテーブルを保持しているのは誰か | 広告会社 | 契約に基づくベンダー | あなた自身、ディスク上に |
| 同意バナーが必要 | はい、実務上は常に | 通常はしない | 通常はしない——ステップ05を参照 |
| データがEEAの外へ出る | はい、設計上そうなっている | ベンダーによる | その外にあるマシンを選んだ場合のみ |
| 開示すべきサードパーティ | 少なくとも1社、それに加えてそのサブプロセッサ | プロセッサ1社 | なし |
| フィルターリストによりブロック | 大きく | 多くの場合、ホスト名によって | ファーストパーティ化した後は、まれにしか起きない |
| 自分で使える生データ | いいえ——レポートのみ | 支払いを続けている間は、APIを通じて | それはあなた自身のデータベースである |
| 100kビューでの月額コスト | 金銭的なコストはゼロ | 数十ドル、トラフィックに応じて上昇 | $3.90–$7.90、一律 |
| 選ぶ場面 | 広告プラットフォーム連携が必要で、それ以外を受け入れられる場合 | 何も運用せずに、倫理面だけを満たしたい場合 | 読者層はあなたのものであり、テーブルもそうである |
第三の列は藁人形論法ではなく、本物の答えである。ホスト型のプライバシー重視ベンダーは、サーバーを運用するべきでない人々にとって、同じ問題の大半を取り除いてくれる。そして、そうしたベンダーに料金を払うことは、広告タグを使い続けるよりも良い結果になる。このガイドは、すでにマシンを借りている、あるいは借りようとしていた場合を対象にしている。
この4つは、同じものの4つのバリエーションではない。データを何に保存するかが異なり、その1つの選択が、メモリ使用量、ディスクの増加、アップグレードのリスク、レポートの深さを決めている。まずストレージの列を読み、次に機能の列を読むこと。それが、実際に決断が下される順序である。
| ツール | スタックとストレージ | 妥当なティア | 選ぶ理由 |
|---|---|---|---|
| Umami | Nodeアプリケーション + PostgreSQLまたはMySQL。2つのコンテナ。 | Sentinel · $3.90 | 既定の答え。軽量で、読みやすく、クッキーレスで、マルチサイト対応、MITライセンス。 |
| Plausible Community Edition | Elixirアプリケーション + PostgreSQL + ClickHouse。4つのコンテナ。 | Garrison · $7.90 | ゴール、ファネル、公開ダッシュボード。大量データでも高速なクエリ。 |
| Matomo | PHPアプリケーション + MariaDB、それにスケジュール実行されるアーカイブジョブ。 | Garrison · $7.90 | 既存ツールとの機能的同等性——セグメント、コホート、eコマース、ログインポート。 |
| GoAccess | ウェブサーバーのアクセスログを読む、1つのバイナリ。データベースなし。 | すでに使っているものは何でも | JavaScriptを一切使わない——静的サイト、ドキュメント、API向け。 |
Umamiは、あえて避ける理由がない限り、まず手に取るべきものである。単一のリレーショナルデータベース上で動くNodeアプリケーションで、メモリは1ギガバイトで満足し、スキーマはひと握りのテーブルにまとまっていて自分でクエリできる。レポートはほとんどの人がダッシュボードを開いて見たいもの——ページ、リファラー、国、デバイス、そして必要に応じたカスタムイベント——を網羅している。デフォルトでクッキーレスであり、それを設定する必要すらない。
Plausible Community Editionは、ホスト型プロダクトのセルフホスト可能版であり、追加で必要になるのがClickHouse——数千万行に及ぶ集計クエリを即時的に感じさせるカラムストアで、与えた分だけメモリを使い切る。これは月間数百万ビューを超える規模では割の良い取引だが、それ未満では不釣り合いなものになる。デプロイする前にプロジェクトのライセンス条項を読むこと。community editionは自分自身のアナリティクスを運用するためのものであり、サービスとして再販するためのものではない。
Matomoは、四つの中で唯一、既存ツールを機能面で真に置き換えられるものであり、その言葉の正直さは両方向に効いてくる。セグメント、ファネル、コホート、eコマースアトリビューション、プラグインによるヒートマップ、そして自前のサーバーログを取り込む機能が手に入る一方で、生テーブルが急速に肥大化し、レポートは自分でスケジュールしなければならないアーカイブジョブによって事前計算される、大規模なPHPアプリケーションも手に入る。それでも一考の価値がある理由が二つある。一つはクッキーを一切設定しないように構成できること、もう一つはオーディエンス測定向けの構成が同意不要なツールとして規制当局の公開リストに掲載された例があることだ——ブログ記事ではなく最新のリストを確認してほしいが、これは書面上、確かな強みである。
GoAccessは、誰も勧めないが多くの人が選ぶべき選択肢である。すでにウェブサーバーが書き出しているアクセスログを読み込み、それをターミナルレポートまたは単一の自己完結型HTMLページとして描画する。ブラウザ内では何も実行されず、デバイスには何も保存されず、収集されるものがリクエストそのものを超えないため、同意を問う必要もない。その代わりに失われるのは、ページ内で起きるすべての出来事と、リクエストではなく人を数えるという望みである。ドキュメントサイトや静的なブログにとっては、これはしばしば割の良い取引であり——他のツールを置き換えるのではなく、それと組み合わせるのに向いている。
PlausibleやMatomoから必要な機能の名前を挙げられないなら、必要なのはUmamiである。20分でデプロイし、1か月動かし、自分が答えられずにいる問いそのものに、移行すべきかどうかを教えてもらう。後から移行しても失うのは履歴だけであり、それ以外は何も失わない。そして失う履歴といっても、たかだか1か月分である。
VPSを注文し、読者がいる場所と、データを置きたい場所に基づいて拠点を選ぶこと——Stockholm、Helsinki、Oslo、ReykjavíkはいずれもEEAの内側にあり、それこそが要点である。それから、他の何かがそのマシンに触れる前に、最初の1時間のハードニングを行うこと。鍵のみのSSH、変更したポート、デフォルト拒否のファイアウォール、無人アップグレードである。これはこのシリーズのすべてのガイドに共通する同じ40分であり、誰かの1年分の読者データを保持することになるマシンでは、省略できるものではない。
次にホスト名を確定させること。それは計測するすべてのサイトの、すべてのページにあるトラッキングスニペットに焼き込まれるため、後から変更するということは、古い名前がまだヒットを受け続けている間に、それらすべてを編集することを意味する。うまくいく形は2つある。1つは、計測対象のサイトの専用サブドメインである——アナリティクスのマシン上のリバースプロキシがそれに応答し、これが機能する中で最も単純な方法である。もう1つは、それ自身のドメイン上の中立的な名前であり、1つのインスタンスが互いに無関係な複数のサイトに対応し、各サイトのソースが他のサイトを教えてしまわないようにしたい場合に使う。先に進む前に、レコードを作成して解決できる状態にしておくこと。プロキシは初回起動時に証明機関へ証明書を要求し、その機関は外部からその名前を確認するからである。
dig +short stats.example.com # must return the VPS address before you deploy
ufw default deny incoming
ufw allow 47222/tcp # administrative SSH, moved off 22
ufw allow 80/tcp # ACME challenge and the redirect to 443
ufw allow 443/tcp # the dashboard and the collection endpoint
ufw enable && ufw status numbered
3つのポート、それ以外は何もなし。データベースは公開してはならない。それはDockerの内部ネットワーク上にあり、アプリケーションコンテナからは到達可能だが、インターネット上の誰からも到達できない。これは、セルフホスト型のアナリティクスマシンがスキャン結果に登場してしまう、最も一般的な原因である——チュートリアルのComposeファイルに、ローカル開発用に入っていたポートマッピングのせいで、PostgreSQLやMySQLのポートが公開アドレスに紐づいてしまうのである。
サイズ選びについては、過剰に大きいものを買いたくなる気持ちを抑えること。Sentinel——2 vCPU、4 GB、120 GB NVMe、月額$3.90——はUmamiとPostgresを余裕を持って動かせ、月間ビュー数が6桁に達するサイトでも、数年分のイベントを保持できる。Plausibleを選んだ場合はGarrison——4 vCPU、8 GB、240 GB——に一段上げること。ClickHouseがそちらのほうが快適に動くからである。あるいはMatomoの場合も同様で、アーカイブジョブがより多くのコアを欲しがるためである。帯域幅はどのティアでも無制限であり、アナリティクスのトラフィックはそれに対して誤差程度に過ぎない。各ヒットはわずか数百バイトである。
以下のリファレンス構成はUmamiを用いている。ほとんどの読者が動かすべきものだからであり、またその形が一般化できるからである。アプリケーションコンテナ、それがアクセスできて他の誰もアクセスできないデータベースコンテナ、そして証明書を保持するリバースプロキシである。PlausibleとMatomoはコンテナの数や変数名が異なるだけで、構造そのものは変わらない——それぞれの公式Composeファイルを取り、同じ3つのルールを適用すればよい。
3つのルールを、無視した場合のコストが大きい順に挙げる。すべてのイメージを厳密なタグに固定すること。変動するタグには絶対に固定しないこと。無関係な再起動の際に、アナリティクススタックが新しいメジャーバージョンを黙って取り込んでしまえば、それはスケジュールしていなかったスキーマ移行になる。アプリケーションのシークレットを本物のランダムソースから生成すること、そしてそれを保管しておくこと——それはセッション情報を暗号化しており、後からそれを変更すれば、良くても全員がログアウトされる。データベースのポートは公開しないこと。2つのコンテナは1つのネットワークを共有しており、それが必要とするアクセス制御のすべてである。
mkdir -p /srv/analytics && cd /srv/analytics
openssl rand -base64 32 > .app_secret # keep this file; back it up with the database
openssl rand -base64 24 > .db_password
chmod 600 .app_secret .db_password
Composeファイル。2つのサービス、1つのプライベートネットワーク、データベース用の1つの名前付きボリューム、そして公開されたポートは1つもない——外部と話すのはプロキシだけである。
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-v2.x.y # an exact tag, never :latest
environment:
DATABASE_URL: postgresql://umami:CHANGE_ME@db:5432/umami
APP_SECRET: CHANGE_ME # the openssl output above
depends_on: [db]
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: CHANGE_ME
volumes:
- umami-db:/var/lib/postgresql/data
restart: unless-stopped
volumes:
umami-db:
Caddyは、ここで正しいTLS設定に至る最短の道である。設定はわずか2行、証明書はcronジョブなしで取得・更新され、自分で調べなくても済むモダンなデフォルト設定が備わっている。すでにそのマシンでnginxを動かしているなら、nginxを使い続けてよい——必要なのは手前に置くプロキシであって、この特定のプロキシそのものではない。どちらの場合も、アナリティクスアプリケーションが443番ポートを直接リッスンする側になってはならない。
# Caddyfile — Caddy runs as a third service in the same Compose project, so
# "umami" resolves on the internal network. It is the only service that
# publishes ports (80 and 443).
stats.example.com {
encode zstd gzip
reverse_proxy umami:3000
}
立ち上げてから、本当に時間的制約のある1つのことを行う。docker compose up -dを実行し、マイグレーションを待って、ダッシュボードを開く。これらのツールはいずれも、文書化されたデフォルトの管理者アカウントか、オープンな初回登録画面のいずれかを備えており、証明書が発行された瞬間に、そのホスト名は公知の事実になっている。なぜなら、証明書の透明性ログは公開されており、絶えずスクレイピングされているからである。デフォルトのパスワードを変更し、初回ロードが成功してから数分以内に登録を締め切ること、明日ではなく。
docker compose up -d
docker compose logs -f umami # wait for the schema migration to finish
docker compose ps # both services healthy, no published ports listed
ss -tlnp | grep -E ':(5432|3306)' # must print nothing at all
Umamiは、地球上のすべてのインストールで同じパスワードを持つ、文書化された管理者アカウントを備えて出荷される。Plausibleでは、環境で登録が無効化されていない限り、最初の訪問者が所有者になる。Matomoは最初の訪問者をインストーラーに導き、そこでスーパーユーザーが作成される。3つのケースいずれにおいても、「証明書が存在する」時点と「自分がログインした」時点の間には、代わりに他の誰かがログインできてしまう間隔がある——そして相手はホスト名を推測する必要さえない。それは相手のために公開されているからである。まず自分でログインし、認証情報を変更し、それから登録のスイッチを閉じる設定にして、ページを再読み込みし、それが反映されたことを確認すること。
ダッシュボードでサイトを登録し、そこで発行される識別子をコピーし、テンプレートに1つの遅延スクリプトタグを置く——headの中でもbodyの末尾でも、あまり差はないが、いずれの場合もページを絶対に遅らせないよう遅延させておくこと。これで連携作業のすべてが完了する。タグマネージャーもなく、コンテナもなく、データレイヤーもなく、同意モードの配線もない。その不在こそが、あなたがここに来た目的のほとんどを占めている。
<script defer src="https://stats.example.com/script.js"
data-website-id="00000000-0000-0000-0000-000000000000"></script>
サイトのページを1つ読み込み、ダッシュボードを見る。ヒットは数秒以内に反映されるはずである。反映されない場合、ブラウザのコンソールとネットワークタブが1分足らずで答えを教えてくれる——2つの典型的な失敗は、タイプミスした識別子によってリクエストは受理されつつも捨てられるケースと、リクエストがそもそも送信されないケースであり、後者は拡張機能に食われたことを意味する。数字を読み始める前に、自分自身のトラフィックを除外しておくこと。そうしなければ、1週間はあなた自身のリロードがトップのリファラーになってしまう。
ここで、考える価値のある決断が出てくる。上のスニペットは、そのサイト自身のものではないホスト名へリクエストを送っており、訪問者の一部は、そうしたリクエストをパターンでブロックするソフトウェアを使っている。リストが捕まえるのは、よく知られたファイル名——ベンダー自身のスクリプト名で終わるもの全般——と、よく知られたホスティングドメインであり、それがどのサーバーを指しているかは関係がない。対処法は2つの部分からなる。スクリプトファイルと収集用エンドポイントの名前を、トラッカーらしくない名前に変更すること——これはここで挙げたツールのすべてが対応している——そしてそれらを既存のプロキシが転送するパスを通じて、サイト自身のオリジンから配信することである。これで、ブロックされるべきサードパーティのリクエストは残らなくなる。
# On the site's own web server — the two paths the tracker needs, first-party:
example.com {
handle /p/s.js { reverse_proxy https://stats.example.com { header_up Host stats.example.com } }
handle /p/collect { reverse_proxy https://stats.example.com { header_up Host stats.example.com } }
# ... the rest of the site
}
これが中途半端にではなく、きちんと機能するかどうかを決める、2つの詳細がある。プロキシは、訪問者のアドレスを、アナリティクスアプリケーションが信頼するよう設定されたヘッダーで転送しなければならない。そうしなければ、すべてのヒットが自分自身のウェブサーバーに帰属してしまい、国別レポートは1本の棒グラフになってしまう。そして、トラッカーには、データをどこへ送るべきかを伝えなければならない。これは3つのツールいずれにおいても、スクリプトタグ上のdata属性である——エンドポイントを再指定せずにファイル名だけを変更すると、読み込まれはするがどこにも報告しないスクリプトができあがる。
それもまた、計測というものの誠実な限界である。JavaScriptを無効にしている訪問者や、厳格なリストに加えてファーストパーティ向けの見た目のルールまで使っている訪問者は数えられず、それを追いかけるためにエンジニアリングの労力を費やすべきではない——ネットワークレベルのフィルターは明示された選好であり、それに対する礼儀正しい応答は、余分なものを何も収集せずに数えてくれるサーバーログである。イベントとシングルページアプリケーションは、計測のもう半分である。どのツールも、カスタムイベント用の小さな関数を提供しており、いずれもルート変化時に明示的な呼び出しが必要である。ナビゲーションを伴わずにビューを切り替えるフレームワークは、スクリプトが気づけるページロードを発生させないからである。
アナリティクスに同意バナーが必要かどうかについて人々が合意できない理由は、実は2つの異なるルールを、あたかも1つであるかのように議論しているからである。それらを分離すれば、答えは扱いやすくなる。eプライバシー指令第5条(3)——すべての加盟国の国内法に置き換えられており、同意バナーの実際の出どころである——は、加入者の端末設備に情報を保存すること、またはそこに既に保存されている情報にアクセスすることは、加入者が明確に求めたサービスを提供するために厳密に必要な場合を除き、その同意を必要とすると定めている。この条文が何を言っていないかに注目してほしい。クッキーとは言っていないし、個人データとも言っていない。これはlocalStorageを捕捉し、デバイスフィンガープリンティングを捕捉し、誰も識別しない値にさえ適用される。
GDPRは二番目のルールであり、異なる問いを規律する。すなわち、個人データを手に入れた後にそれをどう扱ってよいかという問いである。これはデバイスに何かを保存しているかどうかに関わらず、あなたのアナリティクスに適用される。というのも、ウェブリクエストは必然的にIPアドレスを届け、欧州司法裁判所はBreyer判決(C-582/14)で、IPアドレスはウェブサイト運営者の手元では個人データとなり得ると判断したからである。したがって二つのルールは積み重なる。5(3)はデバイスへの書き込みを行ったかを問い、GDPRは届いたものをどう扱ったかを問う。
クッキーレスなアナリティクスサーバーは、その両方に狙いを絞って答えるように作られている。デバイスには何も保存しない——クッキーもなく、localStorageの項目もなく、いかなる識別子もない——ため、5(3)は関係しなくなる。保存も、保存へのアクセスも存在しないからである。そして、必然的に受け取るIPアドレスを、ユーザーエージェントとサイトと毎日ローテーションされる秘密のソルトと組み合わせ、その結果をハッシュ化し、ハッシュだけを保持してアドレスは破棄する。そのハッシュがあれば、一日の範囲内で二人の訪問者を区別できるが、ソルトがローテーションされた瞬間に役に立たなくなる。だからこそ、同じ人物が翌日には新規訪問者として数えられるのである。この処理は本物であり、処理としてはこれ以上ないほど小さい。
残るのは、その狭い処理業務のための法的根拠であり、実務上、運営者は第6条(1)(f)に基づく正当な利益に依拠している。それは、事実が単純であるがゆえに短くまとめられる比較衡量によって文書化される。プロファイリングなし、共有なし、クロスサイト追跡なし、毎日失効する仮名、定められた保持期間である。複数の監督機関はさらに進んで、厳密に限定されたオーディエンス測定が同意の対象から完全に除外される基準を公表している——その基準は国によって異なり、更新されるものであり、あなたにとって重要なのは自分の国のものである。これは法的助言ではない。これは、どの法的文書が適用されるかを示す地図であり、それによって、あなたが受ける助言が、問題の一般的な形についてではなく、あなた自身の状況についてのものになる。
| 問い | アドテック系アナリティクスタグ | クッキーレスで、EEA内にセルフホスト |
|---|---|---|
| 訪問者のデバイスに書き込むか? | はい——したがって第5条(3)の同意が適用される | いいえ——5(3)は発動しない |
| 永続的な識別子は保持されるか? | サイトをまたいで数か月から数年 | 毎日失効するソルト付きハッシュ |
| 第三国への移転を文書化する必要は? | はい、維持すべき移転の仕組みを伴う | なし——マシンはEEA内にある |
| 名前を挙げて契約すべきプロセッサ | ベンダーとそのサブプロセッサ | ハードウェアについてはホスティング事業者、それ以外は誰でもない |
| データ主体からのアクセス請求に応じられるのは誰か | あなた自身、存在するエクスポート機能を介して | あなた自身、SQLを使って——そして、返すべきものが何もないことも多い |
もう1行、記録に残すべきことがある。それは、これに取り組む理由を静かに支えている論点だからである。ヨーロッパの訪問者のデータを米国のアナリティクスサービスへ送ることの合法性は、10年にわたって争われてきた。欧州司法裁判所は2020年にSchrems II判決(C-311/18)で従来の移転の枠組みを無効とし、複数の国の監督機関がその根拠に基づいて2022年に標準的なアナリティクスタグに対する違法判断を下した——1月にオーストリア、2月にフランス、6月にイタリア、その後も他国が続いた——そして新たな十分性認定である「EU-US Data Privacy Framework」が2023年7月に移転の経路を復活させたが、これ自体も現在異議を申し立てられている。この行き着く先について自分なりの見解を持つ必要はない。Helsinkiにあるマシンは、この論点を記録から永久に取り除いてくれる。そしてそれは、現状について正しい見解を持っていることよりも価値がある。
保持期間は初日に設定すること。まだそれが抽象的な数字であり、思い入れのある1年分のデータになっていないうちに、である。これらのツールはいずれも、生のイベントをスケジュールに従って削除し、集計済みのサマリーだけを残すことができる。詳細データを12か月保持すれば、ほとんどの用途には十分すぎるほどであり、「どれくらいの期間保持しているか」という問いに対する誠実な答えが、「無期限」ではなく具体的な数字になる。これはまた、ディスクの問題が始まる前にそれを解決することにもなり、生テーブルが肥大化していくMatomoにとって、これが最も重要である。
データベースは、このマシン以外の場所にバックアップし、送り出す際に暗号化すること——バックアップガイドが全体を詳しく扱っているが、短く言えば、毎晩のダンプを、できれば別の法域にある2台目のマシン上の追記専用リポジトリへパイプで送り込む、という方法である。アプリケーションのシークレットも一緒にバックアップすること。データベースは復元できるがシークレットは復元できない、というのでは、誰もログインできないダッシュボードが残るだけである。そして、必要になる前に、意図的に一度、使い捨てのVPSへ復元しておくこと。
docker compose exec -T db pg_dump -U umami umami | zstd -q -o /srv/backup/umami-$(date -u +%F).sql.zst
restic -r sftp:backup@bastion-2:/srv/repo backup /srv/backup /srv/analytics/.app_secret
restic -r sftp:backup@bastion-2:/srv/repo forget --keep-daily 7 --keep-weekly 8 --prune
アップグレードは、普通のコンテナ更新よりも少し余分な注意を払うに値する。これらのアプリケーションはスキーマを所有しているからである。乗り越えるメジャーバージョンのリリースノートを読み、バックアップは後ではなく先に取り、それから固定していたタグを変更し、ログを見ながらスタックを立ち上げること——途中で失敗する移行は、前夜のダンプがあれば復旧できるが、それがなければ非常に厄介である。最新リリースが出たその週に乗る必要はなく、乗らないほうがよい理由のほうが十分にある。
あなたはたった今、意図的にIPアドレスを一切保存しないスタックをデプロイした。しかし2メートル先では、あなたのリバースプロキシが、すべての訪問者の完全なIPアドレスを平文でアクセスログに書き込み、デフォルトのローテーション設定が定める期間だけ保持している——それはアナリティクスのマシンでも、実際のサイトの手前にあるウェブサーバーでも同様である。そのログはアナリティクスのデータベースよりも大きく、より機微なデータセットであり、説明責任を負うべき処理業務であるにもかかわらず、ほとんど誰もそれを覚えていない。それを何のために使うのかを決めること。デバッグ目的だけであれば、ログの形式で末尾のオクテットを切り詰めるかマスクし、積極的にローテーションすること。ログに基づく計測のために使いたいのであれば、ポリシーにそう明記し、実際の保持期間を設定すること。してはならないのは、デフォルトのままにしておきながら、自分のサイトはIPアドレスを収集していないと説明することである。
最後に、正直に認めておくべき限界がある。セルフホスト型のカウンターは、取り除いたものを厳密に上回る上位互換ではないからである。デバイスをまたいだ識別、日をまたいだ識別は失われるため、リピーターが意味するものは以前より狭くなる。広告プラットフォームとの連携も失われる。これはトラフィックを購入している場合には重要だが、していないなら関係がない——Search Consoleのデータは別のプロダクトであり、影響を受けない。アップグレードとバックアップという、夜の時間で測られる実質的な継続コストを負うことになる。そして、そのマシン自体が守るべきものになる。あなたの読者データを保持し、公開インターネット上に存在しているからであり、ハードニングチェックリストとダッシュボードへのプライベートな経路という2つの対策が、それを平穏なままに保つ。
これらのツールのうち1つは、地球上のすべてのインストールで同じ管理者認証情報を出荷している。残りのツールは、最初に登録した者に所有権を渡す。ホスト名は、TLSが機能した瞬間に証明書の透明性ログで公開される。ログインし、それを変更し、登録を締め切ること——最初の5分の内に、明日ではなく。
ラップトップ用に書かれたComposeファイルは、作者がGUIから接続できるように5432番や3306番ポートを公開していることが多い。それをそのまま公開サーバーにコピーすれば、読者データのテーブルはパスワードの当て推量ひとつで手が届く距離になる。アプリケーションコンテナはデータベースに内部ネットワーク経由で到達する。公開する必要があるのはプロキシだけである。
ソフトウェアを自分のマシンに移すことは、移転の問題と処理者の問題には答える。しかし、そこでデバイスに書き込む機能を有効にしてしまえば第5条(3)には答えないし、プライバシーポリシーを書いてくれるわけでもない。適用除外はホスティングの性質ではなく、設定の性質なのである。
クライアントアドレスを転送しないリバースプロキシを使うと、すべてのヒットがプロキシ自身から来たように見えてしまう。ダッシュボードは埋まり、合計は正しく見えるが、地域と一意性の列は静かに架空の値になっている。国別の集計は初日に確認すること、四半期レビューで気づくのでは遅い。
このスタックを選んだのは、IPアドレスを一切保存しないからである。しかし、その手前にあるプロキシは、デフォルトで、そのすべてを平文で保存しており、実際のサイトの手前にあるウェブサーバーも同様である。意図的にマスクするかローテーションし、それをポリシーに記述すること——さもなければ、それらを収集していないと主張するのはやめることである。
新しい合計値は古い値と一致せず、どのような設定にしても一致させることはできない。数え方のルールが異なり、ブロックされる割合も異なり、サンプルをふるいにかけるバナーも存在しない。2週間を使って自分なりの比率を把握し、その後は新しい数値を基準として扱い、2つの定義を突き合わせるのはやめること。
これを行う際に出てくる11の疑問——誰もが両方向に誤解しがちな問いから始める。
多くの場合はイエスであり、その理由は「セルフホストだから大丈夫」よりもう少し精密である。ここには2つの別個のルールが関わっている。eプライバシー指令第5条(3)——誰もが「クッキー法」と呼ぶもの——は、訪問者が求めたサービスに厳密に必要な場合を除き、訪問者のデバイスに情報を保存すること、またはそこから情報を読み取ることに同意を要求する。これはクッキーに適用されるが、localStorageやsessionStorage、その他あなたが残していくものすべてにも適用され、そのデータが個人データであるかどうかにかかわらず適用される。デバイスに何も書き込まないツールは、単純にこれを発動させない。GDPRは2番目のルールであり、これは消えてなくならない。すべてのリクエストで、あなたは依然としてIPアドレスとユーザーエージェント文字列を受け取っており、IPアドレスはウェブサイト運営者の手元にあるとき個人データである(欧州司法裁判所、Breyer判決、C-582/14)。クッキーレスなアナリティクスサーバーが行っているのは、そのIPを毎日ローテーションされるソルトでハッシュ化し、その後破棄することであり、データベースに残るのは、人物ではなく、日単位・サイト単位の仮名である。これは狙いの絞られた、十分に文書化された処理業務であり、多くの運営者は正当な利益を根拠としており、複数の監督機関が、純粋なオーディエンス測定が同意の対象外となる基準を公表している。これは弁護可能な立場であって、魔法の言葉ではない。何を、なぜ、どれだけの期間収集するのかを書き留め、ベンダーのランディングページではなく自分の監督機関のガイダンスを読むこと。このページの内容は法的助言ではない。
Umamiである。単一のNodeアプリケーションと1つのPostgreSQLデータベースであり、1 GBのメモリの中で余裕を持って動き、ダッシュボードは最初に訪れた時点で読みやすく、標準でクッキーレスであり、1つのインスタンスが自分が所有するすべてのサイトを問題なく処理してくれる。ブログ、ドキュメントサイト、店舗、あるいは企業サイトでGoogle Analyticsを置き換えようとしている大多数の人にとって、これが正しい答えであり、残りの3つは、そもそも交わす必要のなかった議論である。代わりにPlausible Community Editionを選ぶのは、ファネル、収益ゴール、より強力な公開ダッシュボードが欲しく、そのためにClickHouseを動かす覚悟がある場合である。Matomoを選ぶのは、Google Analyticsの機能セット——セグメント、コホート、カスタムレポート、eコマースアトリビューション、生ログのインポート——を本当に必要としており、スケジュール実行されるアーカイブジョブを持つ大規模なPHPアプリケーションを運用することを受け入れられる場合である。GoAccessを選ぶのは、ページ上にJavaScriptを一切置きたくない場合である。
なぜなら、両者は異なるものを数えており、そのずれは両方向に同時に生じているからである。上振れの要因その一。同意バナーの背後にあるGoogle Analyticsは、「同意する」を押した訪問者しか見ておらず、ヨーロッパではそれが全体の半数程度になるのが日常的だが、バナーのないクッキーレスなカウンターは全員を見ている。上振れの要因その二。新しいエンドポイントは自分自身のドメイン上にあり、よく知られたトラッカーへのリクエストを捨てるフィルターリストには載っていない。下振れの要因その一。日次でローテーションするハッシュは、同じ人物を翌日には認識できないため、月曜日と木曜日に訪れた読者は、1人のリピーターではなく2人の訪問者として数えられる——セッションは1日の範囲内でのみつなぎ合わされ、日をまたいだり、デバイスをまたいだりすることは決してない。下振れの要因その二。ほとんどのセルフホスト型ツールは、控えめなボットフィルターを標準搭載しており、Discoverのような膨張は起きない。実践的な助言は、数字を突き合わせるのをやめることである。両方を2週間動かして自分なりの比率を把握し、それを付箋に書き留め、それからGoogleのタグを削除して、新しい数値を今後の基準として使う。意思決定にとって重要なのは、トレンドの形状とページや参照元の相対的な順位であり、そのどちらも、この移行を経てそのまま生き残る。
部分的にはそうであり、その仕組みを正確に知っておく価値がある。人々が思っているよりも、この仕組みは単純だからである。大規模なフィルターリストはパターンで動作する。ホスティングサービスのホスト名と、よく知られたファイル名・パス名の集合である——plausible.js、umami.js、matomo.phpのいずれかで終わるリクエストは、どのサーバーへ向かうものであれ識別可能である。ソフトウェアを標準のファイル名のままstats.example.comに移しても、技術に詳しい層の一部は依然として失われる。誠実な対処法は2つあり、それらは積み重ねられる。スクリプトと収集用エンドポイントを、トラッカーらしくない名前に変更すること——これらのツールはいずれもそれを許しており、設定1行分のコストで済む。それらを、リバースプロキシが転送するメインドメイン上のパスを通じて、サイト自体と同じオリジンから配信すること。これで、ブロックされるべきサードパーティのリクエストは残らなくなる。両方を組み合わせれば、失われた分の大半を取り戻せる。すべてを取り戻すことはできないし、それを望むべきでもない。厳格なリストとJavaScript無効化を組み合わせている訪問者は、それを選んだのであり、それに対する正しい応答は軍拡競争ではなく、サーバーログである。
その問いには答える価値があり、答えはそのブロッカーが何を守っていたかによって決まる。フィルターリストは1つの鈍い道具しか持たず、それが向けられる対象は2種類、まったく性質の異なるものである。1万のサイトを横断して人を追跡し、プロファイルを構築するアドテックネットワークと、あるサイトのオーナーに、そのドキュメントページが昨日400回読まれたと伝えるだけのカウンターである。前者をブロックするのは、監視に対して自分自身を守る行為である。後者をブロックするのは、両者を区別できないルールによる巻き添え被害である。自分のカウンターを自分のドメインから配信することは、トラッカーを防御の網をすり抜けて密輸することではなく、そもそも存在すべきでなかったサードパーティのリクエストを取り除くことであり、同じ訪問はいずれにせよあなたのアクセスログに1行を生み出す。この立場が正当化できなくなるのは、プロキシしている対象がここで説明したものとは異なるものになった瞬間である——クロスサイトの識別子、フィンガープリンティング、あるいは広告プラットフォームへのパイプラインを追加するなら、ブロッカーは正しく、そのプロキシは欺瞞である。テストは単純であり、一度は自分自身に適用する価値がある。このエンドポイントが正確に何を収集しているかを説明するページを公開できるか、そして読者はそれを見て肩をすくめるだけで済むか。答えがイエスなら、プロキシしてよい。ノーなら、問題はプロキシそのものではない。
恐れているより小さくて済み、例外は1つだけである。UmamiはNodeプロセスとPostgresデータベースであり、通常のサイトなら1 GB未満のメモリに収まり、データベースはページビューごとにおよそテキスト1行分の大きさで増えていくため、Sentinel——2 vCPU、4 GB、120 GB NVMe、月額$3.90——には数年分の余裕がある。GoAccessは誤差のようなものである。Matomoはその中間に位置する。PHPとMariaDBはアーカイブジョブが走るまでは要求が少ないが、そのジョブこそがサイズを見積もる際に考慮すべきCPUスパイクであり、生テーブルは1ヒットあたりに保持する情報が多い分、他より速く肥大化する。例外はPlausible Community Editionであり、その理由はPlausible自体ではなくClickHouseにある。カラムストアはクエリ速度のためにメモリを使うように作られており、置いてあるものは何でも使い切ってしまう。出荷時設定でキャッシュに上限を設ければ4 GBでも動くが、8 GBあれば余裕がある——これが、$7.90のGarrisonティアがそのツールにとって妥当な下限である理由である。いずれの場合も、最終的にアップグレードを迫るのはメモリではなくディスクであり、ステップ06はそれを止める方法である。
できる。そしてそれが、これらを運用する通常の方法である。3つのJavaScriptツールはいずれも、最初からマルチサイト対応として設計されている。ダッシュボードで各ドメインを登録すれば、それぞれが自分専用の識別子を得て、同じスクリプトエンドポイントがそのすべてのヒットを受け付けながら、レポートは別々に保たれる。1台のマシン、1つの証明書、1つのバックアップ、1つのアップグレード——それで20サイトを処理できる。リストが増えていくにつれて、留意すべき点が2つある。レポートはサイトごとに分かれているため、クライアントのサイトを管理しているなら、全員に管理者アカウントを渡すのではなく、そのツール自身のユーザー権限とチーム権限を使うこと。そして、共有インスタンスが何を意味するのかを、契約でそれに同意する前に確認すること。あなたは、彼らの訪問者データを保持する当事者になるのである。そしてトラッキングエンドポイントは共有される名前であるため、それを配信するドメインが、リスト上のすべてのサイトのソースに現れることになる——これは、競合他社がページソースを読むようなクライアントに伝える価値のある事実であり、ステップ04のファーストパーティの経路を選ぶ根拠にもなる。
多くの種類のサイトにとっては、ログだけで十分であり、それは手に入る中で最も誠実な計測手段である。行はすでに存在しているのだから、余分なものは何も収集しないからである。GoAccessはウェブサーバーのアクセスログを読み込み、ターミナルレポートまたは自己完結型のHTMLダッシュボードを生成する——上位ページ、リファラー、ステータスコード、帯域、応答時間、ユーザーエージェント——静的サイトやドキュメント集、APIにとっては、これがスクリプトタグが教えてくれるはずだったことのほとんどである。それが自分にとって十分かどうかは、2つの限界によって決まる。ログはページの内部で起きることを見ることができない。スクロール量も、外部リンクのクリックも、ボタンイベントも、シングルページアプリケーションのルート変化も、どれもサーバーに触れないため記録されない。そしてログは人ではなくリクエストを数えるため、キャッシュと、今では生トラフィックの過半数を占めるボット群の言いなりになる——フィルタリングは、セットアップの一手順ではなく、恒久的な保守作業である。さらに、予想とは逆方向のプライバシーの落とし穴もあり、それはステップ06で扱う。分析しているそのログには完全なIPアドレスが記録されており、それは拒否したはずのJavaScriptツールが保持していたものより、多くの個人データを含んでいるのである。
現実的には、できないと考え、それを前提に計画したほうが、抗うよりもうまくいく。4つのうちインポートについて何かしら真剣な手段を持つのはMatomoだけであり、そこでも現実的な方法は、自分のウェブサーバーログをインポートすることと、古いMatomoインスタンス向けの移行ツールを使うことであって、Googleが処理済みのレポートをそのまま移すことではない。UmamiとPlausible Community Editionは、マッピングを自分で書く覚悟があれば、APIを通じた一括読み込みを受け付けられるが、それは集計済みのエクスポートからセッションや訪問者を作り出すことになり、結果として、連続しているように見えて実際には接合点をまたいで比較できないグラフができあがる。実際に効果があるのは次の方法である。プロパティが消える前に、気にかけているレポート——月間合計、上位ページ、上位参照元、コンバージョン数——をCSVとしてGoogleからエクスポートし、それを他の記録と同じ場所に保管し、新しいツールは、書き留めた日付を起点とする新しいベースラインとして始めることである。その古いエクスポートを参照するのは最初の1年に2度ほどで、その後は二度と見返さないだろう。そこに含まれるどの数字も、どうせ別の定義で計測されたものなのだから。
思っているより少なくて済み、その短さこそが要点である——自分で説明しきれる1段落は、どこかからコピーした1ページに勝る。そのツールが何であり、自分自身で運用していることを述べる。サーバーの所在地と法的な運営者名を明記すること。「フィンランドで借りているマシン上で」と言えること自体が、この取り組み全体の利点だからである。訪問ごとに記録される内容を述べる。ページ、リファラー、国、デバイスとブラウザの系列、そして毎日変わるソルトを使ってIPアドレスとユーザーエージェントから導出される、元のIPを復元できない仮名の識別子である。記録されないものも述べる。クッキーはなく、クロスサイトの識別子もなく、プロファイルもなく、データの販売や共有もない。依拠する法的根拠と保持期間を明記し、そこに書く数字がツールに実際に設定されている数字と一致していることを確認する。リバースプロキシがアクセスログを保持しているなら、それは独自の保持期間を持つ別個の処理業務であるため、それについても言及すること。これは人々が忘れがちな点である。そして、その文章を設定内容と同期させ続けること。2年前の構成を説明したままのポリシーは、曖昧なポリシーより悪い。
なぜなら、「ページビューだけ」という表現は、アナリティクスデータベースが本当は何であるかを過小に言い表しているからである。1年分を集計すれば、それはあなたのサイトの読者層そのものである。どのページを、どの順番で、どの国から、何時に、どのリンクから来て読んだか——小規模な出版者やニッチな店舗にとっては、これは事業計画と取引先リストが1つのテーブルに収まっているに等しい。また、法域という観点で見れば、これはまさに、敵対的な当事者があなたに尋ねるのではなくプロバイダに尋ねる類のデータである。そこから二つの性質が導かれる。まず、マシンがどこにあるかによって、どの法的手続がそこに及ぶかが決まる。StockholmやHelsinki、Oslo、Reykjavíkにあるマシンは、EEAの内側にあり、それによって国際移転の論点はコンプライアンス上の検討事項から完全に外れ、さらに、報道の自由の伝統が強い4つの立憲体制の内側にもある。次に、アカウントに誰の名前が載っているかによって、そのアカウント自体が何を明らかにするかが決まる。NordBastionでは本人確認書類も、法的な氏名も、カードもなく、請求はMoneroまたはBitcoinで決済され、あなたの読者データを保持するマシンは、どこかの顧客データベースにパスポート情報付きで記録された一行ではない。法域ガイドが、四つそれぞれの法的な最低水準を詳しく扱っている。
Sentinel——2 vCPU、4 GB、120 GBのNVMeを月額$3.90で、Helsinki、Stockholm、Oslo、Reykjavíkのいずれかで——は、Umamiとそのデータベースを、数年分のイベントに十分な余裕を持って動かせる。PlausibleまたはMatomoを選んだ場合は、$7.90のGarrisonに一段上げること。登録時のメールアドレスも、本人確認書類も、カードも不要であり、あなたのサイトを読んだことのある全員のリストを握る第三者もいない。
最終レビュー · 2026-10-12 · 出典 · Umami、Plausible Community Edition、Matomo、GoAccessの各ドキュメント、eプライバシー指令2002/58/EC第5条(3)、規則(EU) 2016/679、欧州司法裁判所のBreyer判決(C-582/14)およびSchrems II判決(C-311/18)、2023年7月のEU-US Data Privacy Framework十分性認定 · 頻度 · 年次
This guide is one spoke of a larger series. The pillar walks the three privacy layers end to end — the sibling spokes below dive into the specifics.
Three independent layers — signup, payment, network — explained, legal context included, common mistakes flagged.
Bitwarden-compatible password vault under your own control.
Files, calendar, contacts, photos — owned, not rented.
Postfix, Dovecot, SPF/DKIM/DMARC — deliverability included.
A meta search engine that does not log you — because you own it.
プライベートホスティング、北欧で構築。