简介

Umami提供了用户友好的界面和强大的网站分析功能,这使其成为许多开发者和网站所有者的热门选择。然而,当涉及到更长期的数据保留和更广泛的域名分析时,Umami Cloud的免费版本可能不够用。本教程将向您展示如何将数据从Umami Cloud迁移到自托管Umami。

Youtube视频教程
Github仓库
Huggingface空间

为什么要迁移?

Umami Cloud的免费版本虽然提供了捷的托管服务,但有两个明显的限制:

  1. 数据保留时间限制:数据只保留一年,之后将自动删除。
  2. 域名使用限制:最多只能分析三个域名。

对于想要长期保留数据并分析多个项目的用户来说,迁移到自托管版本是一个理想的选择。

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空间

在Umami的数据库中,涉及两种主要的数据类型:website_event和session。在导入数据时需要创建一个新的站点实例,并将旧的站点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)

# 用用户提供的网站ID更新website_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

步骤3. 导入数据

数据可以通过SQL命令行或使用数据库管理工具(如PG admin)导入。有关导入过程的详细信息,请参考以下教程链接。

您可以尝试以下方法之一点

将CSV文件导入MySQL表
https://www.mysqltutorial.org/mysql-basics/import-csv-file-mysql-table/

将CSV文件导入PostgreSQL表
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的session数据)

    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

感谢您的阅读,希望这对您有帮助。如有任何问题或建议,欢迎评论讨论。