Skip to content

Commit 2c890c5

Browse files
authored
Additional adjustments (#1)
1 parent 02f4b6e commit 2c890c5

File tree

11 files changed

+109
-46
lines changed

11 files changed

+109
-46
lines changed

.env.docker.example

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
PREMIUM_EMBEDDING_TOKEN="<your_enterprise_token>"
22
METABASE_JWT_SHARED_SECRET="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
33
METABASE_STATIC_EMBEDDING_SECRET="eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"
4-
METABASE_ADMIN_API_KEY="mb_NgLv2g7CFm1VDIhfensgdMhLPYvvKIz3cNxrW99/Cro="
4+
METABASE_ADMIN_EMAIL="rene@example.com"
5+
METABASE_ADMIN_FIRST_NAME="Rene"
6+
METABASE_ADMIN_LAST_NAME="Descartes"
7+
METABASE_ADMIN_PASSWORD="foobarbaz"
8+
METABASE_DASHBOARD_ID_TO_EMBED=1
59

610
MB_PORT=4300
711
SERVER_PORT=4400

.env.example

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,8 @@ PORT=3100
22
METABASE_INSTANCE_URL="http://localhost:3000"
33
METABASE_JWT_SHARED_SECRET="<shared_secret>"
44
METABASE_STATIC_EMBEDDING_SECRET="<static_embedding_secret>"
5+
METABASE_ADMIN_EMAIL="rene@example.com"
6+
METABASE_ADMIN_FIRST_NAME="Rene"
7+
METABASE_ADMIN_LAST_NAME="Descartes"
8+
METABASE_ADMIN_PASSWORD="foobarbaz"
9+
METABASE_DASHBOARD_ID_TO_EMBED=1

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ COPY server.js ./
77

88
RUN npm ci
99

10-
CMD ["npm", "run", "start"]
10+
CMD ["node", "server.js"]

README.md

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,18 +36,13 @@ npm run docker:up
3636

3737
### Running locally with an existing Metabase instance
3838

39-
Before running, ensure your Metabase instance is configured:
40-
41-
- Guest and modular embedding must be enabled in Admin > Embedding settings
42-
- Static embedding secret key must be set
43-
- JWT authentication must be enabled with a shared secret
44-
- A dashboard must be published via the Embed JS editor
39+
Before running, ensure your Metabase instance is configured following the [guest embedding setup guide](https://www.metabase.com/docs/latest/embedding/guest-embedding) and [SSO authentication guide](https://www.metabase.com/docs/latest/embedding/authentication).
4540

4641
1. Copy the environment file:
4742

4843
```bash
4944
cp .env.example .env
50-
# Edit .env with your Metabase instance URL and JWT secrets
45+
# Edit .env with your Metabase instance URL, JWT secrets, and dashboard ID
5146
```
5247

5348
2. Install dependencies and start the server:
@@ -56,9 +51,8 @@ cp .env.example .env
5651
npm install
5752
npm start
5853
```
59-
3. On your instance open any dashboard and publish it by going through EmbedJS Wizard => Guest embed setup
6054

61-
4. Open http://localhost:3100 in your browser
55+
3. Open http://localhost:3100 in your browser
6256

6357
## Project Structure
6458

@@ -76,7 +70,7 @@ npm start
7670

7771
### Guest Embed (Signed JWT)
7872

79-
Guest embeds use signed JWT tokens to provide anonymous access to specific dashboards or questions. The server signs a token containing the resource ID and parameters, which is then passed to the `<metabase-dashboard>` component.
73+
Guest embeds use signed JWT tokens to provide anonymous access to specific dashboards or questions. The server signs a token containing the resource ID and parameters, which is then passed to the `<metabase-dashboard>` component. See the [guest embedding docs](https://www.metabase.com/docs/latest/embedding/guest-embedding) for more details.
8074

8175
```javascript
8276
// Server generates a signed token
@@ -102,7 +96,7 @@ const token = jwt.sign(payload, METABASE_STATIC_EMBEDDING_SECRET);
10296

10397
### SSO Embed (JWT Authentication)
10498

105-
SSO embeds authenticate users via JWT, creating a full user session in Metabase. The server returns a JWT containing user information when the embed.js client requests authentication.
99+
SSO embeds authenticate users via JWT, creating a full user session in Metabase. The server returns a JWT containing user information when the embed.js client requests authentication. See the [authentication docs](https://www.metabase.com/docs/latest/embedding/authentication) for more details.
106100

107101
```javascript
108102
// Server returns user JWT at /auth/sso endpoint
@@ -140,6 +134,7 @@ res.json({ jwt: ssoToken });
140134
| `METABASE_INSTANCE_URL` | Metabase URL | `http://localhost:3000` |
141135
| `METABASE_JWT_SHARED_SECRET` | JWT signing secret for SSO authentication | - |
142136
| `METABASE_STATIC_EMBEDDING_SECRET` | JWT signing secret for guest embeds | - |
137+
| `METABASE_DASHBOARD_ID_TO_EMBED` | ID of the dashboard to embed | `1` |
143138
| `PREMIUM_EMBEDDING_TOKEN` | Metabase Enterprise license | - |
144139

145140
## Running E2E Tests

docker-compose.yml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ services:
1313
MB_RUN_MODE: "${MB_RUN_MODE}"
1414
METASTORE_DEV_SERVER_URL: "${METASTORE_DEV_SERVER_URL}"
1515
MB_JWT_IDENTITY_PROVIDER_URI: "http://localhost:${SERVER_PORT}/auth/sso"
16+
METABASE_ADMIN_EMAIL: "${METABASE_ADMIN_EMAIL}"
17+
METABASE_ADMIN_FIRST_NAME: "${METABASE_ADMIN_FIRST_NAME}"
18+
METABASE_ADMIN_LAST_NAME: "${METABASE_ADMIN_LAST_NAME}"
19+
METABASE_ADMIN_PASSWORD: "${METABASE_ADMIN_PASSWORD}"
1620
healthcheck:
1721
test: curl --fail -X GET -I "http://localhost:${MB_PORT}/api/health" || exit 1
1822
interval: 15s
@@ -30,7 +34,9 @@ services:
3034
condition: service_healthy
3135
environment:
3236
METABASE_INSTANCE_URL: "http://metabase:${MB_PORT}"
33-
METABASE_ADMIN_API_KEY: "${METABASE_ADMIN_API_KEY}"
37+
METABASE_ADMIN_EMAIL: "${METABASE_ADMIN_EMAIL}"
38+
METABASE_ADMIN_PASSWORD: "${METABASE_ADMIN_PASSWORD}"
39+
METABASE_DASHBOARD_ID_TO_EMBED: "${METABASE_DASHBOARD_ID_TO_EMBED}"
3440
volumes:
3541
- ./metabase/setup.sh:/setup.sh:ro
3642
entrypoint: ["/bin/sh", "/setup.sh"]
@@ -49,6 +55,10 @@ services:
4955
METABASE_INSTANCE_URL: "http://localhost:${MB_PORT}"
5056
METABASE_JWT_SHARED_SECRET: "${METABASE_JWT_SHARED_SECRET}"
5157
METABASE_STATIC_EMBEDDING_SECRET: "${METABASE_STATIC_EMBEDDING_SECRET}"
58+
METABASE_DASHBOARD_ID_TO_EMBED: "${METABASE_DASHBOARD_ID_TO_EMBED}"
59+
METABASE_ADMIN_EMAIL: "${METABASE_ADMIN_EMAIL}"
60+
METABASE_ADMIN_FIRST_NAME: "${METABASE_ADMIN_FIRST_NAME}"
61+
METABASE_ADMIN_LAST_NAME: "${METABASE_ADMIN_LAST_NAME}"
5262
healthcheck:
5363
test: curl --fail -X GET -I "http://localhost:${SERVER_PORT}/" || exit 1
5464
interval: 2s

e2e/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
"version": "0.0.0",
55
"devDependencies": {
66
"@testing-library/cypress": "^10.0.3",
7-
"cypress": "^14.0.3"
7+
"cypress": "^14.0.3",
8+
"env-cmd": "^10.1.0"
89
},
910
"scripts": {
1011
"cypress:open": "env-cmd -f ../.env.docker cypress open --config-file ./support/cypress.config.js --e2e",

metabase/config.yml

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
11
version: 1
22
config:
33
users:
4-
- first_name: Rene
5-
last_name: Descartes
6-
password: foobarbaz
7-
email: rene@example.com
8-
api-keys:
9-
- name: main
10-
key: "mb_NgLv2g7CFm1VDIhfensgdMhLPYvvKIz3cNxrW99/Cro="
11-
group: admin
12-
creator: rene@example.com
4+
- first_name: "{{ env METABASE_ADMIN_FIRST_NAME }}"
5+
last_name: "{{ env METABASE_ADMIN_LAST_NAME }}"
6+
password: "{{ env METABASE_ADMIN_PASSWORD }}"
7+
email: "{{ env METABASE_ADMIN_EMAIL }}"
138
settings:
149
enable-embedding-simple: true
1510
enable-embedding-static: true

metabase/setup.sh

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,34 @@
11
#!/bin/bash
22
set -e
33

4-
METABASE_INSTANCE_URL="${METABASE_INSTANCE_URL}"
5-
METABASE_ADMIN_API_KEY="${METABASE_ADMIN_API_KEY}"
6-
74
echo "Waiting for Metabase to be ready..."
85
until curl -sf "${METABASE_INSTANCE_URL}/api/health" > /dev/null 2>&1; do
96
sleep 2
107
done
118
echo "Metabase is ready!"
129

13-
echo "Enabling static embedding for dashboard 1..."
14-
curl -sf -X PUT "${METABASE_INSTANCE_URL}/api/dashboard/1" \
10+
echo "Getting session token..."
11+
SESSION_RESPONSE=$(curl -s -X POST \
12+
-H "Content-Type: application/json" \
13+
-d "{\"username\": \"${METABASE_ADMIN_EMAIL}\", \"password\": \"${METABASE_ADMIN_PASSWORD}\"}" \
14+
"${METABASE_INSTANCE_URL}/api/session")
15+
16+
SESSION_ID=$(echo "$SESSION_RESPONSE" | sed -n 's/.*"id":"\([^"]*\)".*/\1/p')
17+
18+
if [ -z "$SESSION_ID" ]; then
19+
echo "Failed to get session token. Response: $SESSION_RESPONSE"
20+
exit 1
21+
fi
22+
23+
echo "Enabling static embedding for dashboard ${METABASE_DASHBOARD_ID_TO_EMBED}..."
24+
RESPONSE=$(curl -s -X PUT "${METABASE_INSTANCE_URL}/api/dashboard/${METABASE_DASHBOARD_ID_TO_EMBED}" \
1525
-H "Content-Type: application/json" \
16-
-H "X-Api-Key: ${METABASE_ADMIN_API_KEY}" \
17-
-d '{"enable_embedding": true}'
26+
-H "X-Metabase-Session: ${SESSION_ID}" \
27+
-d '{"enable_embedding": true}')
28+
29+
if echo "$RESPONSE" | grep -q '"error"'; then
30+
echo "Failed to enable embedding. Response: $RESPONSE"
31+
exit 1
32+
fi
1833

19-
echo "Static embedding enabled for dashboard 1!"
34+
echo "Static embedding enabled for dashboard ${METABASE_DASHBOARD_ID_TO_EMBED}!"

package-lock.json

Lines changed: 27 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"docker:rm": "yarn docker:down --rmi all --volumes"
1313
},
1414
"dependencies": {
15+
"cors": "^2.8.5",
1516
"env-cmd": "^10.1.0",
1617
"express": "^4.21.0",
1718
"jsonwebtoken": "^9.0.2"

0 commit comments

Comments
 (0)