序列化:在新 Metabase 執行個體中預先載入儀表板
如何使用 Metabase 的序列化功能,將問題、儀表板、集合、設定等從一個 Metabase 執行個體複製到新的 Metabase 執行個體。
Metabase 序列化
序列化僅適用於 Pro 和 Enterprise 方案(包括自架託管和 Metabase Cloud)。
許多 Pro 和 Enterprise 方案的客戶在多租戶環境中使用 Metabase,需要上傳預定義的問題或儀表板集,以設定新的 Metabase 執行個體或新的資料庫連線。
本文將介紹如何
- 建立預設的問題和儀表板集。
- 匯出這些儀表板。
- 將這些儀表板重新匯入到新的執行個體。
具體來說,我們將使用 Metabase 序列化功能中的 export
和 import
命令來執行步驟二和三,再加上對匯出檔案進行少量手動整理。
我們將使用 Docker 執行來源和目標 Metabase,並使用 PostgresSQL 作為其應用程式資料庫。我們不建議在生產環境中使用預設的 H2 資料庫。
雖然本教學課程使用 Metabase export
和 import
命令,但您也可以透過 API 序列化 Metabase 應用程式資料。
計畫
我們將建立一個來源 Metabase、建立一個儀表板、匯出該儀表板,然後將該儀表板匯入到新的 Metabase(我們的目標)。以下是計畫
- 建立名為 metanet 的專用網路.
- 啟動兩個 Metabase:來源和目標.
- 在來源 Metabase 中建立儀表板和集合
- 從來源 Metabase 匯出資料.
- 將來源匯出匯入到目標 Metabase.
- 驗證我們的儀表板和集合已載入到目標 Metabase 中.
先決條件
您需要在您的電腦上安裝 Docker。
步驟 1 - 建立專用網路
若要建立名為「metanet」的專用網路,請從您選擇的終端機執行以下命令
docker network create metanet
您可以使用以下命令確認網路已建立
docker network ls
該網路將具有本機範圍和橋接器驅動程式。
步驟 2 - 啟動兩個 Metabase:來源和目標
啟動兩個名為 metabase-source
和 metabase-target
的 Metabase(雖然您可以隨意命名這些環境)。請注意,我們在建立這些 Docker 容器時使用 --rm -d
,以便在您停止它們並在背景執行時將它們移除。您可以隨時變更這些旗標以修改該行為。
來源 Metabase
建立 Postgres 資料庫
docker run --rm -d --name postgres \
-p 5433:5432 \
-e POSTGRES_USER=metabase \
-e POSTGRES_PASSWORD=knockknock \
--network metanet \
postgres:12
建立我們的來源 Metabase,並將其連線到我們剛建立的 Postgres 資料庫
docker run --rm -d --name metabase-source \
-p 5001:3000 \
-e MB_DB_TYPE=postgres \
-e MB_DB_DBNAME=metabase \
-e MB_DB_PORT=5432 \
-e MB_DB_USER=metabase \
-e MB_DB_PASS=knockknock \
-e MB_DB_HOST=postgres \
--network metanet \
metabase/metabase-enterprise:v1.53.2
您可以查看容器的日誌以檢視容器的進度
docker logs metabase-source
一旦您看到包含「Metabase initialization COMPLETE」的行,您就可以開啟瀏覽器至 https://127.0.0.1:5001
以檢視您的 Metabase 執行個體。
目標 Metabase
設定目標 Metabase 的方式類似。在我們的 metanet 網路上,我們將設定一個 Postgres 資料庫作為我們的應用程式資料庫,然後在另一個 Docker 容器中啟動另一個 Metabase。
請注意以下變更
- Postgres (5434) 和 Metabase 伺服器 (5002) 的連接埠
- 執行個體名稱:
postgres-target
和metabase-target
應用程式資料庫
docker run --rm -d --name postgres-target \
-p 5434:5432 \
-e POSTGRES_USER=metabase \
-e POSTGRES_PASSWORD=knockknock \
--network metanet postgres:12
Metabase 執行個體
docker run --rm -d --name metabase-target \
-p 5002:3000 \
-e MB_DB_TYPE=postgres \
-e MB_DB_DBNAME=metabase \
-e MB_DB_PORT=5432 \
-e MB_DB_USER=metabase \
-e MB_DB_PASS=knockknock \
-e MB_DB_HOST=postgres-target \
--network metanet \
metabase/metabase-enterprise:v1.53.2
在我們的 Metabase 執行個體完成初始化後(請耐心等候,這可能需要一到兩分鐘),我們現在應該有兩個 Metabase 正在執行
metabase-source
位於https://127.0.0.1:5001
metabase-target
位於https://127.0.0.1:5002
將使用者新增至我們的來源 Metabase
讓我們將一個管理員帳戶和兩個基本使用者新增至我們的 metabase-source
執行個體。
您可以手動將使用者新增至您的 Metabase(即在 Metabase 應用程式中),但這裡有一個快速的 bash 指令碼,可建立一個管理員使用者(初始使用者)和兩個基本使用者
您需要安裝 jq 才能處理此指令碼中的 JSON。
#!/bin/sh
ADMIN_EMAIL=${MB_ADMIN_EMAIL:-admin@metabase.local}
ADMIN_PASSWORD=${MB_ADMIN_PASSWORD:-Metapass123}
METABASE_HOST=${MB_HOSTNAME}
METABASE_PORT=${MB_PORT:-3000}
echo "⌚︎ Waiting for Metabase to start"
while (! curl -s -m 5 http://${METABASE_HOST}:${METABASE_PORT}/api/session/properties -o /dev/null); do sleep 5; done
echo "😎 Creating admin user"
SETUP_TOKEN=$(curl -s -m 5 -X GET \
-H "Content-Type: application/json" \
http://${METABASE_HOST}:${METABASE_PORT}/api/session/properties \
| jq -r '.["setup-token"]'
)
MB_TOKEN=$(curl -s -X POST \
-H "Content-type: application/json" \
http://${METABASE_HOST}:${METABASE_PORT}/api/setup \
-d '{
"token": "'${SETUP_TOKEN}'",
"user": {
"email": "'${ADMIN_EMAIL}'",
"first_name": "Metabase",
"last_name": "Admin",
"password": "'${ADMIN_PASSWORD}'"
},
"prefs": {
"allow_tracking": false,
"site_name": "Metawhat"
}
}' | jq -r '.id')
echo -e "\n👥 Creating some basic users: "
curl -s "http://${METABASE_HOST}:${METABASE_PORT}/api/user" \
-H 'Content-Type: application/json' \
-H "X-Metabase-Session: ${MB_TOKEN}" \
-d '{"first_name":"Basic","last_name":"User","email":"basic@somewhere.com","login_attributes":{"region_filter":"WA"},"password":"'${ADMIN_PASSWORD}'"}'
curl -s "http://${METABASE_HOST}:${METABASE_PORT}/api/user" \
-H 'Content-Type: application/json' \
-H "X-Metabase-Session: ${MB_TOKEN}" \
-d '{"first_name":"Basic 2","last_name":"User","email":"basic2@somewhere.com","login_attributes":{"region_filter":"CA"},"password":"'${ADMIN_PASSWORD}'"}'
echo -e "\n👥 Basic users created!"
將上述程式碼另存為 create_users.sh
,並使其可執行
chmod +x create_users.sh
然後執行
MB_HOSTNAME=localhost MB_PORT=5001 ./create_users.sh
在您的 metabase-source
執行個體啟動且使用者建立完成後,開啟 https://127.0.0.1:5001
並以您建立的管理員使用者身分登入。使用者 ID 是 admin@metabase.local
,密碼是 Metapass123
。
您應該會看到一個全新的 Metabase 執行個體。
登入後,啟用您的授權金鑰。
步驟 3 - 在來源 Metabase 中建立儀表板和集合
我們需要一些應用程式資料才能匯出,因此讓我們使用 Metabase 隨附的範例資料庫建立一些儀表板。或者更確切地說,讓我們讓 Metabase 為我們建立一些儀表板!
在「根據您的資料試用這些 X 光
」區段中,按一下帶有黃色閃電符號的卡片,上面寫著類似「產品概觀
」的文字。Metabase 將為您產生一組問題,您可以將其儲存為儀表板。
按一下「儲存此項」按鈕,Metabase 會將儀表板及其問題儲存在一個名為「產品概觀
」的集合中。
此集合將儲存到名為「自動產生的儀表板
」的父集合中。您可以按一下導覽列左上角的 Metabase 標誌以返回首頁,找到此集合。從首頁的「我們的分析」區段中,按一下「自動產生的儀表板
」區段。從那裡您應該會看到「產品表格概觀
」集合。
接下來,建立一個新的集合。您可以隨意命名;我們將使用令人興奮的名稱「預設集合
」,並將其儲存到「我們的分析」集合中。
然後,我們將「產品概觀
」集合移動到我們新建立的「預設集合
」中。在「產品概觀
」集合頁面上,按一下省略符號 … 並選取「移動」。
步驟 4 - 從來源 Metabase 匯出
這裡是我們實際開始使用 Metabase 的序列化功能的地方。
在我們的 metabase-source
執行個體設定了一些問題後,現在是時候匯出此資料並將其匯入到我們的 metabase-target
中。這樣我們就不必在目標 Metabase 中手動重新建立我們的預設集合。
讓我們首先在我們的 /tmp
目錄中建立一個名為 metabase_data
的目錄,以儲存我們的匯出
cd /tmp
mkdir metabase_data
接下來,我們將執行匯出命令。
docker run --rm --name metabase-export \
--network metanet \
-e MB_DB_CONNECTION_URI="postgres://postgres:5432/metabase?user=metabase&password=knockknock" \
-v "/tmp/metabase_data:/target" \
metabase/metabase-enterprise:v1.53.2 "export /target"
此命令會建立一個名為 metabase-export
的暫時性 Metabase 執行個體。此暫時性 Metabase 將連線到我們來源 Metabase 的 Postgres 應用程式資料庫,並匯出其應用程式資料。
如果一切順利,幾秒鐘後您應該會看到一些輸出,然後在您的終端機中看到一則訊息,指出 serialization.cmd :: 匯出到 '/target' 完成! 🚛💨 📦
若要驗證匯出,請 cd
到您的目錄:/tmp/metabase_data
。您應該會看到類似兩個目錄和三個 YAML 檔案的內容
設定
設定檔包含許多選項,您可以在設定新執行個體時進行設定。它看起來會像這樣
aggregated-query-row-limit: null
application-colors: null
application-favicon-url: null
application-font: null
application-font-files: null
application-logo-url: null
application-name: null
available-fonts: null
available-locales: null
available-timezones: null
breakout-bins-num: null
custom-formatting: null
custom-geojson: null
custom-geojson-enabled: null
default-maps-enabled: null
enable-embedding: null
enable-nested-queries: null
enable-sandboxes?: null
enable-whitelabeling?: null
enable-xrays: null
hide-embed-branding?: null
humanization-strategy: null
landing-page: null
loading-message: null
native-query-autocomplete-match-style: null
persisted-models-enabled: null
report-timezone: null
report-timezone-long: null
report-timezone-short: null
search-typeahead-enabled: null
show-homepage-data: null
show-homepage-pin-message: null
show-homepage-xrays: null
show-lighthouse-illustration: null
show-metabot: null
show-static-embed-terms: null
site-locale: null
site-name: Metawhat
source-address-header: null
start-of-week: null
subscription-allowed-domains: null
unaggregated-query-row-limit: null
uploads-database-id: null
uploads-enabled: null
uploads-schema-name: null
資料庫
此目錄包含您連線資料庫的所有中繼資料設定。在本例中,我們只有 Metabase 隨附的範例資料庫。
集合
在 collections 目錄中是我們設定的集合、儀表板和問題。eDuYBjvKEwhFg6QxtBziP_default_collection
目錄具有子集合和其他項目。每個項目都以程式碼作為前置字串,以避免命名衝突。
這是集合 yaml 檔案的概觀
name: Default collection
description: null
entity_id: qmJu_4D1gviNjHUCcn978
slug: default_collection
created_at: "2024-03-12T15:01:45.955848Z"
archived: false
type: null
parent_id: null
personal_owner_id: null
namespace: null
authority_level: null
serdes/meta:
- id: qmJu_4D1gviNjHUCcn978
label: default_collection
model: Collection
這是名為「每個類別的產品
」的範例問題(稱為卡片)的預覽
ame: Products per Category
description: null
entity_id: bnghENFKtgeKRMfU3sF7y
created_at: "2024-03-12T14:59:01.795343Z"
creator_id: admin@metabase.local
display: row
archived: false
collection_id: JI0l2T_O-_EhdAxk2pdin
collection_preview: true
collection_position: null
query_type: query
dataset: false
cache_ttl: null
database_id: Sample Database
table_id:
- Sample Database
- PUBLIC
- PRODUCTS
enable_embedding: false
embedding_params: null
made_public_by_id: null
public_uuid: null
parameters: []
parameter_mappings: []
dataset_query:
database: Sample Database
query:
aggregation:
- - count
breakout:
- - field
- - Sample Database
- PUBLIC
- PRODUCTS
- CATEGORY
- null
source-table:
- Sample Database
- PUBLIC
- PRODUCTS
type: query
result_metadata: null
visualization_settings:
column_settings: null
graph.colors:
- "#EF8C8C"
graph.dimensions:
- CATEGORY
graph.metrics:
- count
graph.series_labels:
- null
serdes/meta:
- id: bnghENFKtgeKRMfU3sF7y
label: products_per_category
model: Card
initially_published_at: null
metabase_version: v1.49.0
type: question
步驟 5 - 匯入到目標 Metabase
您需要至少一個管理員帳戶載入到我們的目標 Metabase 中,才能上傳匯出。您可以透過應用程式登入以建立該使用者,或使用我們上面使用的指令碼:只需記住將 MB_PORT
變更為 5002
,因為那是我們指派給目標 Metabase 的連接埠。例如,cd
到您儲存 create_users.sh 指令碼的目錄,然後執行
MB_HOSTNAME=localhost MB_PORT=5002 ./create_users.sh
我們可以將所有這些設定上傳到目標 Metabase 中,但讓我們假設我們只想匯入我們的預設集合。
讓我們複製我們的 /tmp/metabase_data
目錄,以便我們可以保留原始內容並對副本進行變更。
cp -r /tmp/metabase_data /tmp/serialize_import
由於每個 Metabase 執行個體都包含範例資料庫,而且我們沒有對中繼資料進行任何變更,因此讓我們刪除 databases 目錄。執行
rm -r /tmp/serialize_import/databases
若要驗證變更,您可以執行 diff
以查看原始 serialized_data 目錄與您將用來匯入到目標 Metabase 的 serialized_load 目錄之間的變更
cd /tmp
diff -r metabase_data serialize_import
您應該會看到以下內容
Only in metabase_data: databases
在將資料匯入到目標 Metabase 之前,您需要啟用您的授權。
現在,在設定好我們的 /tmp/serialize_import
目錄後,我們可以執行匯入命令,將中繼資料匯入到我們的目標 Metabase。
docker run --rm --name metabase-export \
--network metanet \
-e MB_DB_CONNECTION_URI="postgres://postgres-target:5432/metabase?user=metabase&password=knockknock" \
-v "/tmp/serialize_import:/target" \
metabase/metabase-enterprise:v1.53.2 "import /target"
步驟 6 - 驗證目標 Metabase 中的儀表板和集合
現在,如果您登入位於 https://127.0.0.1:5002
的目標 Metabase,您應該會看到我們的 預設集合
已準備就緒,其中包含我們的「產品表格概觀
」集合。
就是這樣:您已使用包含滿載問題的儀表板的集合預先載入了一個全新的 Metabase 執行個體!
序列化限制
請注意,序列化傾印不包含特定資料
- 權限設定
- 使用者帳戶或設定
- 已儲存問題的警示
- 個人集合或其內容
透過 API 進行序列化
您也可以透過 API 匯入和匯出 Metabase 應用程式資料。請參閱透過 API 序列化 Metabase。透過 API 匯入和匯出對於 Metabase Cloud 上的執行個體(您無法存取環境)可能很有用。
序列化的其他使用案例
使用序列化功能匯出問題和儀表板開啟了一些很酷的可能性,包括
- 將版本控制新增至問題和儀表板。您可以將下載的中繼資料簽入儲存庫,並透過版本控制軟體(如 git)管理對該資料的變更。
- 為 Metabase 設定預備環境。您可以先在預備環境中試用,直到對變更感到滿意,然後匯出中繼資料,並將其上傳到生產環境。
請試用序列化功能,並在我們的論壇上告訴我們您如何使用它。
下一步:設定以 Git 為基礎的工作流程
在預備 Metabase 中建立模型、問題和儀表板,將您的變更提交到儲存庫,並將這些變更推送至您的生產 Metabase。