From 8fc4f260036f912d35ee99ad8596131c296b4083 Mon Sep 17 00:00:00 2001 From: sanex3339 Date: Fri, 30 Jan 2026 14:12:38 +0400 Subject: [PATCH 1/2] Adjust env vars and readme --- .env.docker.example | 20 ++++++++------------ .env.example | 16 ++++++++-------- DEV.md | 8 ++++++++ README.md | 16 ++++++++-------- docker-compose.yml | 42 +++++++++++++++++++++--------------------- metabase/config.yml | 8 ++++---- metabase/setup.sh | 12 ++++++------ server.js | 39 +++++++++++++++++++-------------------- 8 files changed, 82 insertions(+), 79 deletions(-) create mode 100644 DEV.md diff --git a/.env.docker.example b/.env.docker.example index 9b9c44f..a16a7c3 100644 --- a/.env.docker.example +++ b/.env.docker.example @@ -1,15 +1,11 @@ -PREMIUM_EMBEDDING_TOKEN="" -METABASE_JWT_SHARED_SECRET="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" -METABASE_STATIC_EMBEDDING_SECRET="eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" -METABASE_ADMIN_EMAIL="rene@example.com" -METABASE_ADMIN_FIRST_NAME="Rene" -METABASE_ADMIN_LAST_NAME="Descartes" -METABASE_ADMIN_PASSWORD="foobarbaz" -METABASE_DASHBOARD_ID_TO_EMBED=1 +MB_PREMIUM_EMBEDDING_TOKEN="" +MB_JWT_SHARED_SECRET="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" +MB_EMBEDDING_SECRET_KEY="eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee" +MB_ADMIN_EMAIL="rene@example.com" +MB_ADMIN_FIRST_NAME="Rene" +MB_ADMIN_LAST_NAME="Descartes" +MB_ADMIN_PASSWORD="foobarbaz" +MB_DASHBOARD_ID_TO_EMBED=1 MB_PORT=4300 SERVER_PORT=4400 - -# for development -# MB_RUN_MODE="dev" -# METASTORE_DEV_SERVER_URL="" diff --git a/.env.example b/.env.example index 5e62b14..17ea9f7 100644 --- a/.env.example +++ b/.env.example @@ -1,9 +1,9 @@ PORT=3100 -METABASE_INSTANCE_URL="http://localhost:3000" -METABASE_JWT_SHARED_SECRET="" -METABASE_STATIC_EMBEDDING_SECRET="" -METABASE_ADMIN_EMAIL="rene@example.com" -METABASE_ADMIN_FIRST_NAME="Rene" -METABASE_ADMIN_LAST_NAME="Descartes" -METABASE_ADMIN_PASSWORD="foobarbaz" -METABASE_DASHBOARD_ID_TO_EMBED=1 +MB_INSTANCE_URL="http://localhost:3000" +MB_JWT_SHARED_SECRET="" +MB_EMBEDDING_SECRET_KEY="" +MB_ADMIN_EMAIL="rene@example.com" +MB_ADMIN_FIRST_NAME="Rene" +MB_ADMIN_LAST_NAME="Descartes" +MB_ADMIN_PASSWORD="foobarbaz" +MB_DASHBOARD_ID_TO_EMBED=1 diff --git a/DEV.md b/DEV.md new file mode 100644 index 0000000..61edcda --- /dev/null +++ b/DEV.md @@ -0,0 +1,8 @@ +# Development info (for Metabase developers only) + +### Dev env variables +To test with Docker locally, define additional env variables in the `.env.docker` env file: +``` +MB_RUN_MODE="dev" +METASTORE_DEV_SERVER_URL="https://token-check.staging.metabase.com" +``` \ No newline at end of file diff --git a/README.md b/README.md index dab4ea2..77a4df5 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ A minimal sample demonstrating Metabase embedding using **embed.js** with Node.j ```bash cp .env.docker.example .env.docker -# Edit .env.docker and add your PREMIUM_EMBEDDING_TOKEN +# Edit .env.docker and add your MB_PREMIUM_EMBEDDING_TOKEN ``` 2. Start the containers: @@ -79,7 +79,7 @@ const payload = { params: {}, exp: Math.round(Date.now() / 1000) + 10 * 60, }; -const token = jwt.sign(payload, METABASE_STATIC_EMBEDDING_SECRET); +const token = jwt.sign(payload, MB_EMBEDDING_SECRET_KEY); ``` ```html @@ -107,7 +107,7 @@ const ssoPayload = { groups: ["Customer"], exp: Math.round(Date.now() / 1000) + 10 * 60, }; -const ssoToken = jwt.sign(ssoPayload, METABASE_JWT_SHARED_SECRET); +const ssoToken = jwt.sign(ssoPayload, MB_JWT_SHARED_SECRET); res.json({ jwt: ssoToken }); ``` @@ -131,11 +131,11 @@ res.json({ jwt: ssoToken }); | Variable | Description | Default | |----------|-------------|---------| | `PORT` | Server port | `3100` | -| `METABASE_INSTANCE_URL` | Metabase URL | `http://localhost:3000` | -| `METABASE_JWT_SHARED_SECRET` | JWT signing secret for SSO authentication | - | -| `METABASE_STATIC_EMBEDDING_SECRET` | JWT signing secret for guest embeds | - | -| `METABASE_DASHBOARD_ID_TO_EMBED` | ID of the dashboard to embed | `1` | -| `PREMIUM_EMBEDDING_TOKEN` | Metabase Enterprise license | - | +| `MB_INSTANCE_URL` | Metabase URL | `http://localhost:3000` | +| `MB_JWT_SHARED_SECRET` | JWT signing secret for SSO authentication | - | +| `MB_EMBEDDING_SECRET_KEY` | JWT signing secret for guest embeds | - | +| `MB_DASHBOARD_ID_TO_EMBED` | ID of the dashboard to embed | `1` | +| `MB_PREMIUM_EMBEDDING_TOKEN` | Metabase Enterprise license | - | ## Running E2E Tests diff --git a/docker-compose.yml b/docker-compose.yml index a13a79d..72add85 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,17 +6,17 @@ services: MB_JETTY_PORT: "${MB_PORT}" MB_EDITION: "ee" MB_SITE_URL: "http://localhost:${MB_PORT}/" - MB_JWT_SHARED_SECRET: "${METABASE_JWT_SHARED_SECRET}" - MB_EMBEDDING_SECRET_KEY: "${METABASE_STATIC_EMBEDDING_SECRET}" - MB_SETUP_TOKEN: "${PREMIUM_EMBEDDING_TOKEN}" - MB_PREMIUM_EMBEDDING_TOKEN: "${PREMIUM_EMBEDDING_TOKEN}" - MB_RUN_MODE: "${MB_RUN_MODE}" - METASTORE_DEV_SERVER_URL: "${METASTORE_DEV_SERVER_URL}" + MB_JWT_SHARED_SECRET: "${MB_JWT_SHARED_SECRET}" + MB_EMBEDDING_SECRET_KEY: "${MB_EMBEDDING_SECRET_KEY}" + MB_SETUP_TOKEN: "${MB_PREMIUM_EMBEDDING_TOKEN}" + MB_PREMIUM_EMBEDDING_TOKEN: "${MB_PREMIUM_EMBEDDING_TOKEN}" + MB_RUN_MODE: "${MB_RUN_MODE:-}" + METASTORE_DEV_SERVER_URL: "${METASTORE_DEV_SERVER_URL:-}" MB_JWT_IDENTITY_PROVIDER_URI: "http://localhost:${SERVER_PORT}/auth/sso" - METABASE_ADMIN_EMAIL: "${METABASE_ADMIN_EMAIL}" - METABASE_ADMIN_FIRST_NAME: "${METABASE_ADMIN_FIRST_NAME}" - METABASE_ADMIN_LAST_NAME: "${METABASE_ADMIN_LAST_NAME}" - METABASE_ADMIN_PASSWORD: "${METABASE_ADMIN_PASSWORD}" + MB_ADMIN_EMAIL: "${MB_ADMIN_EMAIL}" + MB_ADMIN_FIRST_NAME: "${MB_ADMIN_FIRST_NAME}" + MB_ADMIN_LAST_NAME: "${MB_ADMIN_LAST_NAME}" + MB_ADMIN_PASSWORD: "${MB_ADMIN_PASSWORD}" healthcheck: test: curl --fail -X GET -I "http://localhost:${MB_PORT}/api/health" || exit 1 interval: 15s @@ -33,10 +33,10 @@ services: metabase: condition: service_healthy environment: - METABASE_INSTANCE_URL: "http://metabase:${MB_PORT}" - METABASE_ADMIN_EMAIL: "${METABASE_ADMIN_EMAIL}" - METABASE_ADMIN_PASSWORD: "${METABASE_ADMIN_PASSWORD}" - METABASE_DASHBOARD_ID_TO_EMBED: "${METABASE_DASHBOARD_ID_TO_EMBED}" + MB_INSTANCE_URL: "http://metabase:${MB_PORT}" + MB_ADMIN_EMAIL: "${MB_ADMIN_EMAIL}" + MB_ADMIN_PASSWORD: "${MB_ADMIN_PASSWORD}" + MB_DASHBOARD_ID_TO_EMBED: "${MB_DASHBOARD_ID_TO_EMBED}" volumes: - ./metabase/setup.sh:/setup.sh:ro entrypoint: ["/bin/sh", "/setup.sh"] @@ -52,13 +52,13 @@ services: dockerfile: ./Dockerfile environment: PORT: "${SERVER_PORT}" - METABASE_INSTANCE_URL: "http://localhost:${MB_PORT}" - METABASE_JWT_SHARED_SECRET: "${METABASE_JWT_SHARED_SECRET}" - METABASE_STATIC_EMBEDDING_SECRET: "${METABASE_STATIC_EMBEDDING_SECRET}" - METABASE_DASHBOARD_ID_TO_EMBED: "${METABASE_DASHBOARD_ID_TO_EMBED}" - METABASE_ADMIN_EMAIL: "${METABASE_ADMIN_EMAIL}" - METABASE_ADMIN_FIRST_NAME: "${METABASE_ADMIN_FIRST_NAME}" - METABASE_ADMIN_LAST_NAME: "${METABASE_ADMIN_LAST_NAME}" + MB_INSTANCE_URL: "http://localhost:${MB_PORT}" + MB_JWT_SHARED_SECRET: "${MB_JWT_SHARED_SECRET}" + MB_EMBEDDING_SECRET_KEY: "${MB_EMBEDDING_SECRET_KEY}" + MB_DASHBOARD_ID_TO_EMBED: "${MB_DASHBOARD_ID_TO_EMBED}" + MB_ADMIN_EMAIL: "${MB_ADMIN_EMAIL}" + MB_ADMIN_FIRST_NAME: "${MB_ADMIN_FIRST_NAME}" + MB_ADMIN_LAST_NAME: "${MB_ADMIN_LAST_NAME}" healthcheck: test: curl --fail -X GET -I "http://localhost:${SERVER_PORT}/" || exit 1 interval: 2s diff --git a/metabase/config.yml b/metabase/config.yml index 8118ce1..af6328d 100644 --- a/metabase/config.yml +++ b/metabase/config.yml @@ -1,10 +1,10 @@ version: 1 config: users: - - first_name: "{{ env METABASE_ADMIN_FIRST_NAME }}" - last_name: "{{ env METABASE_ADMIN_LAST_NAME }}" - password: "{{ env METABASE_ADMIN_PASSWORD }}" - email: "{{ env METABASE_ADMIN_EMAIL }}" + - first_name: "{{ env MB_ADMIN_FIRST_NAME }}" + last_name: "{{ env MB_ADMIN_LAST_NAME }}" + password: "{{ env MB_ADMIN_PASSWORD }}" + email: "{{ env MB_ADMIN_EMAIL }}" settings: enable-embedding-simple: true enable-embedding-static: true diff --git a/metabase/setup.sh b/metabase/setup.sh index e559ec5..c618355 100755 --- a/metabase/setup.sh +++ b/metabase/setup.sh @@ -2,7 +2,7 @@ set -e echo "Waiting for Metabase to be ready..." -until curl -sf "${METABASE_INSTANCE_URL}/api/health" > /dev/null 2>&1; do +until curl -sf "${MB_INSTANCE_URL}/api/health" > /dev/null 2>&1; do sleep 2 done echo "Metabase is ready!" @@ -10,8 +10,8 @@ echo "Metabase is ready!" echo "Getting session token..." SESSION_RESPONSE=$(curl -s -X POST \ -H "Content-Type: application/json" \ - -d "{\"username\": \"${METABASE_ADMIN_EMAIL}\", \"password\": \"${METABASE_ADMIN_PASSWORD}\"}" \ - "${METABASE_INSTANCE_URL}/api/session") + -d "{\"username\": \"${MB_ADMIN_EMAIL}\", \"password\": \"${MB_ADMIN_PASSWORD}\"}" \ + "${MB_INSTANCE_URL}/api/session") SESSION_ID=$(echo "$SESSION_RESPONSE" | sed -n 's/.*"id":"\([^"]*\)".*/\1/p') @@ -20,8 +20,8 @@ if [ -z "$SESSION_ID" ]; then exit 1 fi -echo "Enabling static embedding for dashboard ${METABASE_DASHBOARD_ID_TO_EMBED}..." -RESPONSE=$(curl -s -X PUT "${METABASE_INSTANCE_URL}/api/dashboard/${METABASE_DASHBOARD_ID_TO_EMBED}" \ +echo "Enabling static embedding for dashboard ${MB_DASHBOARD_ID_TO_EMBED}..." +RESPONSE=$(curl -s -X PUT "${MB_INSTANCE_URL}/api/dashboard/${MB_DASHBOARD_ID_TO_EMBED}" \ -H "Content-Type: application/json" \ -H "X-Metabase-Session: ${SESSION_ID}" \ -d '{"enable_embedding": true}') @@ -31,4 +31,4 @@ if echo "$RESPONSE" | grep -q '"error"'; then exit 1 fi -echo "Static embedding enabled for dashboard ${METABASE_DASHBOARD_ID_TO_EMBED}!" +echo "Static embedding enabled for dashboard ${MB_DASHBOARD_ID_TO_EMBED}!" diff --git a/server.js b/server.js index aaaebc8..f55a52a 100644 --- a/server.js +++ b/server.js @@ -7,18 +7,17 @@ const port = process.env.PORT; app.use(cors({ credentials: true, origin: true })); -const METABASE_JWT_SHARED_SECRET = process.env.METABASE_JWT_SHARED_SECRET; -const METABASE_STATIC_EMBEDDING_SECRET = - process.env.METABASE_STATIC_EMBEDDING_SECRET; +const MB_JWT_SHARED_SECRET = process.env.MB_JWT_SHARED_SECRET; +const MB_EMBEDDING_SECRET_KEY = process.env.MB_EMBEDDING_SECRET_KEY; -const METABASE_SITE_URL = process.env.METABASE_INSTANCE_URL; -const METABASE_DASHBOARD_ID_TO_EMBED = process.env.METABASE_DASHBOARD_ID_TO_EMBED - ? parseInt(process.env.METABASE_DASHBOARD_ID_TO_EMBED) +const MB_SITE_URL = process.env.MB_INSTANCE_URL; +const MB_DASHBOARD_ID_TO_EMBED = process.env.MB_DASHBOARD_ID_TO_EMBED + ? parseInt(process.env.MB_DASHBOARD_ID_TO_EMBED) : 1; -const METABASE_ADMIN_EMAIL = process.env.METABASE_ADMIN_EMAIL || "rene@example.com"; -const METABASE_ADMIN_FIRST_NAME = process.env.METABASE_ADMIN_FIRST_NAME || "Rene"; -const METABASE_ADMIN_LAST_NAME = process.env.METABASE_ADMIN_LAST_NAME || "Descartes"; +const MB_ADMIN_EMAIL = process.env.MB_ADMIN_EMAIL || "rene@example.com"; +const MB_ADMIN_FIRST_NAME = process.env.MB_ADMIN_FIRST_NAME || "Rene"; +const MB_ADMIN_LAST_NAME = process.env.MB_ADMIN_LAST_NAME || "Descartes"; const JWT_PROVIDER_URI = `http://localhost:${port}/auth/sso`; @@ -48,7 +47,7 @@ const getPageLayout = (config, component, currentPath) => { }; defineMetabaseConfig(${JSON.stringify(config)}); - +