序列化:在新 Metabase 執行個體中預先載入儀表板

如何使用 Metabase 的序列化功能,將問題、儀表板、集合、設定等從一個 Metabase 執行個體複製到新的 Metabase 執行個體。

Metabase 序列化

序列化僅適用於 ProEnterprise 方案(包括自架託管和 Metabase Cloud)。

許多 Pro 和 Enterprise 方案的客戶在多租戶環境中使用 Metabase,需要上傳預定義的問題儀表板集,以設定新的 Metabase 執行個體或新的資料庫連線。

本文將介紹如何

  1. 建立預設的問題和儀表板集。
  2. 匯出這些儀表板。
  3. 將這些儀表板重新匯入到新的執行個體。

具體來說,我們將使用 Metabase 序列化功能中的 exportimport 命令來執行步驟二和三,再加上對匯出檔案進行少量手動整理。

我們將使用 Docker 執行來源和目標 Metabase,並使用 PostgresSQL 作為其應用程式資料庫。我們不建議在生產環境中使用預設的 H2 資料庫。

雖然本教學課程使用 Metabase exportimport 命令,但您也可以透過 API 序列化 Metabase 應用程式資料

計畫

我們將建立一個來源 Metabase、建立一個儀表板、匯出該儀表板,然後將該儀表板匯入到新的 Metabase(我們的目標)。以下是計畫

  1. 建立名為 metanet 的專用網路.
  2. 啟動兩個 Metabase:來源和目標.
  3. 在來源 Metabase 中建立儀表板和集合
  4. 從來源 Metabase 匯出資料.
  5. 將來源匯出匯入到目標 Metabase.
  6. 驗證我們的儀表板和集合已載入到目標 Metabase 中.

先決條件

您需要在您的電腦上安裝 Docker

步驟 1 - 建立專用網路

若要建立名為「metanet」的專用網路,請從您選擇的終端機執行以下命令

docker network create metanet

您可以使用以下命令確認網路已建立

docker network ls

該網路將具有本機範圍和橋接器驅動程式。

步驟 2 - 啟動兩個 Metabase:來源和目標

啟動兩個名為 metabase-sourcemetabase-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-targetmetabase-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 執行個體。

A fresh instance of Metabase.

登入後,啟用您的授權金鑰

步驟 3 - 在來源 Metabase 中建立儀表板和集合

我們需要一些應用程式資料才能匯出,因此讓我們使用 Metabase 隨附的範例資料庫建立一些儀表板。或者更確切地說,讓我們讓 Metabase 為我們建立一些儀表板!

在「根據您的資料試用這些 X 光」區段中,按一下帶有黃色閃電符號的卡片,上面寫著類似「產品概觀」的文字。Metabase 將為您產生一組問題,您可以將其儲存為儀表板。

An X-ray of the Products table in the Sample Database included with Metabase.

按一下「儲存此項」按鈕,Metabase 會將儀表板及其問題儲存在一個名為「產品概觀」的集合中。

此集合將儲存到名為「自動產生的儀表板」的父集合中。您可以按一下導覽列左上角的 Metabase 標誌以返回首頁,找到此集合。從首頁的「我們的分析」區段中,按一下「自動產生的儀表板」區段。從那裡您應該會看到「產品表格概觀」集合。

A collection titled A look at your Products table.

接下來,建立一個新的集合。您可以隨意命名;我們將使用令人興奮的名稱「預設集合」,並將其儲存到「我們的分析」集合中。

Creating a new collection, titled Default Collection.

然後,我們將「產品概觀」集合移動到我們新建立的「預設集合」中。在「產品概觀」集合頁面上,按一下省略符號 並選取「移動」。

步驟 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。

下一篇文章