Skip to main content
Video pembelajaran di-host di Mux. API upload/manage pakai access token; playback ke browser pakai signed JWT (signing keys).
Logo Mux
Dashboard: dashboard.mux.com
Docs: mux.com/docs

Env di project

MUX_TOKEN_ID=...
MUX_TOKEN_SECRET=...
MUX_SIGNING_KEY_ID=...
MUX_SIGNING_KEY_PRIVATE_KEY=...          # PEM atau base64
MUX_SIGNING_KEY_PRIVATE_KEY_PKCS8=...    # format PKCS8 (dipakai signing)
Opsional (rotasi key): MUX_SIGNING_KEY_ID_NEW, MUX_SIGNING_KEY_PRIVATE_KEY_NEW, dll. Kode signing: apps/api/src/mux/mux-signing.ts, apps/api/src/mux/mux.service.ts

Setup

1

Buat Access Token

Dashboard → SettingsAccess TokensGenerate new token
  • Environment: Production
  • Permissions: Mux Video Read + Mux Video Write
  • Simpan Token ID + Token Secret (secret sekali tampil)
2

Buat Signing Key

Dashboard → SettingsSigning KeysCreateMux mengembalikan:
  • Key IDMUX_SIGNING_KEY_ID
  • Private key (base64 PEM) → MUX_SIGNING_KEY_PRIVATE_KEY / _PKCS8
Private key hanya ditampilkan sekali. Simpan di password manager sebelum tutup modal.
3

Upload video (manual tes)

# Setelah MUX_TOKEN_ID + MUX_TOKEN_SECRET di env
curl https://api.mux.com/video/v1/assets \
  -u "$MUX_TOKEN_ID:$MUX_TOKEN_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"input":[{"url":"https://storage.googleapis.com/muxdemofiles/mux-video-intro.mp4"}],"playback_policy":["signed"]}'
Response berisi playback_ids — dipakai untuk generate JWT playback.
4

Playback policy

Asset production sebaiknya signed (bukan public) — user hanya bisa nonton lewat JWT dari API TrainerHub.
5

Push secrets

./thub secrets check
./thub secrets push

Alur di aplikasi

Docs: Secure video playback · Signing JWTs

CLI Mux (opsional)

npm i -g @mux/cli
mux login   # Token ID + Secret
mux signing-keys create
mux sign <playback-id>

Troubleshooting

MasalahSolusi
Video tidak playCek playback policy signed + JWT valid
401 ke Mux APIToken ID/Secret salah atau permission kurang
Key rotationSet MUX_*_NEW vars, deploy, lalu ganti primary
Fitur video matiSemua MUX_* opsional — kosong = tanpa video streaming