はじめに

Umamiは、ユーザーフレンドリーなインターフェースと強力なウェブサイト分析機能を提供し、多くの開発者やウェブサイト所有者に人気のある選択肢となっています。しかし、長期的なデータ保持とより広範なドメイン分析に関しては、Umami Cloudの無料版では十分ではない場合があります。このチュートリアルでは、Umami Cloudからセルフホスト版Umamiへデータを移行する方法を説明します。

Youtubeビデオチュートリアル
Githubリポジトリ
Huggingface Space

なぜ移行するのか?

Umami Cloudの無料版は、便利なホスティングを提供していますが、2つの明確な制限があります:

  1. データ保持期間の制限:データは1年間のみ保持され、その後自動的に削除されます。
  2. ドメイン名使用の制限:最大3つのドメイン名までしか分析できません。

セルフホスト版への移行は、長期的なデータ保持と複数のプロジェクト分析を望むユーザーにとって理想的な選択肢です。

Screenshot 2024-04-30 at 10.19.52 AM.webp

ステップ1. データのエクスポート

Umami Cloudからのデータエクスポート

データを転送するには、まずUmami CloudからCSVデータをエクスポートする必要があります。

  1. Umami Cloudアカウントにログインします。
  2. データ管理ページに移動し、エクスポートが必要なウェブサイトデータを選択します。
  3. Umamiは選択したデータをパッケージ化し、準備が整うとダウンロードリンクをメールで送信します。

Screenshot 2024-04-30 at 10.33.04 AM.webp

ステップ2. データ処理

CSVファイルをダウンロードしたら、Pythonスクリプトを使用してデータベースにインポートできるように処理する必要があります。このスクリプトは、データの準備を支援し、セルフホスト版のデータベースにインポートできるようにします。このスクリプトはGitHubからダウンロードするか、Huggingface Spaceを使用できます。

Umamiのデータベースには、website_eventとsessionという2つの主要なデータタイプが含まれています。データをインポートする際には、新しいサイトインスタンスを作成し、古いサイトIDを新しいサイトIDに置き換える必要があります。

1
pip install pandas
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
37
38
39
import pandas as pd

# ユーザーがファイル名と新しいウェブサイトIDを入力
original_csv_file = input("元のCSVファイルのパスを入力してください: ")
new_website_id = input("新しいウェブサイトIDを入力してください: ")

# 元のCSVファイルを読み込む
df = pd.read_csv(original_csv_file)

# website_idカラムをユーザーが提供したIDで更新
df['website_id'] = new_website_id

# website_eventテーブルに必要なカラムを定義
website_event_columns = [
'event_id', 'website_id', 'session_id', 'created_at', 'url_path',
'url_query', 'referrer_path', 'referrer_query', 'referrer_domain',
'page_title', 'event_type', 'event_name', 'visit_id'
]

# 必要なカラムでwebsite_eventデータの新しいDataFrameを作成
df_website_event = df[website_event_columns]

# 新しいwebsite_eventデータをCSVファイルに保存
df_website_event.to_csv('website_event.csv', index=False)

# sessionテーブルに必要なカラムを定義
session_columns = [
'session_id', 'website_id', 'hostname', 'browser', 'os', 'device',
'screen', 'language', 'country', 'subdivision1', 'subdivision2',
'city', 'created_at'
]

# 必要なカラムでsessionデータの新しいDataFrameを作成
df_session = df[session_columns]

# 新しいsessionデータをCSVファイルに保存
df_session.to_csv('session.csv', index=False)

print("website_event.csvとsession.csvの生成に成功しました")

その前に、セルフホスト版UmamiのウェブサイトIDを、Umami Cloud上の古いウェブサイトIDと置き換える必要があります。ウェブサイトIDは、ウェブサイトの設定画面で確認できます。

Screenshot 2024-04-30 at 10.59.55 AM.webp

データを処理すると、website_event.csvsession.csvの2つのファイルが生成されます。

ステップ3. データのインポート

データは、SQLコマンドラインまたはPG adminなどのデータベース管理ツールを使用してインポートできます。インポートプロセスの詳細については、以下のチュートリアルリンクを参照してください。

以下のいずれかの方法を試すことができます:

MySQLテーブルへのCSVファイルのインポート
https://www.mysqltutorial.org/mysql-basics/import-csv-file-mysql-table/

PostgreSQLテーブルへのCSVファイルのインポート
https://www.postgresqltutorial.com/postgresql-tutorial/import-csv-file-into-posgresql-table/


まずwebsite_eventをインポートし、次にsessionをインポートできます。PGadminに切り替えてwebsite_eventフォームを選択し、データのインポートを実行します。ファイルのインポートが完了したらUmamiインターフェースを更新するだけで、新しいデータが表示されるはずです。次に、sessionデータのインポートを行います。session_idに関する問題が発生する可能性があります。この問題を解決するために、SQLコマンドを使用して関連する一意のインデックスを直接削除できます。より良い対処方法がある場合や困難に遭遇した場合は、記事の下のコメントセクションにメッセージを残してください。

  1. プライマリキー制約の削除: これにより、テーブルで重複するsession_id値が許可されます。以下のコマンドを実行します:

    1
    ALTER TABLE session DROP CONSTRAINT session_pkey;
  2. ユニークインデックスの削除: 以下のコマンドを実行して、session_idの一意性制約を削除します:

    1
    DROP INDEX session_session_id_key;

これらの制約を削除すると、テーブルは重複するsession_id値を受け入れることができるようになります。ただし、プライマリキーと一意のインデックスは通常、データの整合性を確保しパフォーマンスを最適化するために使用されるため、それらを削除すると他の問題が発生する可能性があることに注意してください。

Screenshot 2024-04-30 at 11.26.55 AM.webp

基本的なコマンド

  1. PostgreSQLのすべてのテーブルを表示

    1
    \dt

    より詳細な情報(テーブルサイズなど)を見たい場合は、以下を使用できます:

    1
    \dt+
  2. データベーステーブルの行数を確認

    1
    SELECT COUNT(*) FROM session;
  3. 特定の行を削除

    特定の条件を満たす行のみを削除する場合(例:website_idのセッションデータを削除)

    1
    DELETE FROM session WHERE website_id = '425f-95';

結論

最後に、ページを再度更新すると、すべてのデータが正しく表示されているはずです。この時点でデータ移行は完了し、新しいトラッキングコードの使用を開始できます。

GitHubで多くのユーザーが、Umamiにインターフェースから直接データをインポートする機能を追加するよう要請していることは注目に値します。開発チームがこの機能を検討しており、近い将来に実装されることを期待しています。

https://github.com/umami-software/umami/issues/2653#issuecomment-2040970801

https://github.com/umami-software/umami/issues/2456

ご覧いただきありがとうございます。このチュートリアルがお役に立てば幸いです。質問や提案がありましたら、コメントして議論してください。