Server configuration is stored in the .env file. Changes saved here are reference values — update .env and restart the server for changes to take effect.
Controlled access: Select which users/groups should have access
Click Save.
Step 3: Collect the Credentials
From the app's General tab, copy:
Client ID
Client Secret
Issuer URL: Go to Security → API → Authorization Servers and copy the Issuer URI. Default: https://dev-12345678.okta.com/oauth2/default
Step 4: Configure Group Claims (for role mapping)
To map Okta groups to roles, add a groups claim:
Option A — Via App Settings:
In the Okta app, go to Sign On → OpenID Connect ID Token
Under Groups claim type, select Filter
Claim name: groups, Filter: Matches regex.*
Option B — Via Authorization Server:
Go to Security → API → Authorization Servers → default → Claims
Add Claim: name groups, include in ID Token + Access Token, value type Groups, filter regex .*
Step 5: Add the Provider in MediaLive Nexus
Click "+ Add Provider" at the top of this page
Set Display Name to Okta
Set Protocol to OpenID Connect (OIDC)
Paste the Issuer URL, Client ID, and Client Secret
Set Scopes to openid profile email groups
Choose a Default Role and optionally add Group → Role Mappings
Check Enable this provider, then Save
Step 6: Test the Connection
Click the Test button on the provider card above
If successful, the OIDC discovery document was fetched
Open the login page — a login button should appear for the provider
Click it to verify the full authentication flow
Troubleshooting
invalid_client — Double-check Client ID and Secret. Regenerate in Okta if needed.
redirect_uri_mismatch — Sign-in redirect URI must match exactly: https://<your-domain>/auth/sso/oidc/callback
No groups in token — Verify the groups claim is configured (Step 4) and the groups scope is included.
SSO button missing — Make sure the provider is enabled.
BASE_URL mismatch — The server's BASE_URL env var must match your domain exactly.
Database Backups
Manage database backups with automatic daily scheduling and manual triggers
Create Backup
Create a manual backup of both databases. Includes user accounts, settings, Kinetica templates, library metadata, reference data, and all saved configurations.
Available Backups
Last 7 backups are retained. Daily automatic backups run at 3:00 AM.
Loading backups...
Filename
Size
Created
Actions
Loading...
Server Failover
Active-passive failover between primary and backup EC2 instances
Current Status
Failover is not configured. Set FAILOVER_MODE=primary or FAILOVER_MODE=backup in your environment.
-
Role
-
Partner
-
Last Sync
-
Sync Duration
Instance: -
Sync History
Time
Duration
Result
Loading...
Manual Controls
Manually trigger promotion or demotion. These actions are audited.
Setup Guide
Step-by-step guide to configure active-passive failover between two EC2 instances.
How It Works
Primary runs all services normally and uploads SQLite database snapshots + a heartbeat file to S3 every 15 seconds
Backup polls the primary's health endpoint every 3 seconds. It pre-downloads DB snapshots to stay warm
After 3 consecutive health check failures, the backup checks the S3 heartbeat. If stale (>30s), it promotes itself
Promotion downloads the latest DBs, reinitializes them, reassigns the Elastic IP, and starts all services (~1 second)
Clients (overlays, dashboards, automation) reconnect automatically via the Elastic IP
Split-brain prevention: when the old primary recovers, it reads the S3 heartbeat. If another instance owns it, it starts as backup
Step 1: AWS Resources
Elastic IP — Allocate one in EC2 → Elastic IPs. Associate it with the primary instance. Note the eipalloc-xxx allocation ID
S3 Bucket — Create a bucket in the same region (e.g. mlnexus-backup). No public access needed
IAM Role — Create an instance role with S3 read/write (s3:GetObject, s3:PutObject, s3:ListBucket) and EC2 EIP permissions (ec2:DescribeAddresses, ec2:AssociateAddress, ec2:DisassociateAddress). Attach to both instances
Step 2: Backup Instance
Launch a second EC2 instance (same type as primary, same VPC/subnet)
Both instances need port 8080 TCP open from the partner's private IP (for health check polling). Add inbound rules:
Primary SG: allow TCP 8080 from <backup-private-ip>/32
Backup SG: allow TCP 8080 from <primary-private-ip>/32
Both: 80/443 TCP from 0.0.0.0/0 (nginx), 22 TCP from your IP (SSH)
Step 5: Start & Verify
Start the primary first: pm2 restart all. Wait for "Sync complete" in the logs
Then start the backup: pm2 restart all. It should log "Starting in BACKUP mode"
Return to this page — the status tiles above should show Role: PRIMARY, Partner: Healthy
Test failover: stop the primary (pm2 stop all). Within ~9 seconds the backup should promote and the site stays live
Optional: Tuning
FAILOVER_SYNC_INTERVAL_MS
15000
DB upload frequency (min 5000)
FAILOVER_HEALTH_INTERVAL_MS
3000
Health poll frequency (min 1000)
FAILOVER_DEAD_THRESHOLD
3
Missed checks before promotion
FAILOVER_HEARTBEAT_STALE_MS
30000
Heartbeat age before considered stale
Troubleshooting
Partner shows "Down" — Check that port 8080 is open between instances. Test with: curl http://<partner-ip>:8080/health
Backup keeps trying to promote — The primary isn't running or hasn't written a heartbeat to S3 yet. Start the primary first
EIP reassignment fails — Check that the IAM role has ec2:AssociateAddress and ec2:DisassociateAddress permissions
SSH disconnects after failover — The EIP moved. Clear the old host key: ssh-keygen -R <eip>, then reconnect
Both instances in backup mode — Promote one manually via the button above or API: POST /api/failover/promote
AI Assistant
Configure the Claude AI integration for the Kinetica template builder
Claude API Key
Enter your Anthropic API key to enable the AI assistant in the builder. The key is stored server-side and never sent to the browser.
Model
Select which Claude model to use. Sonnet is recommended for most tasks — fast and precise. Opus is slower but more capable for complex template generation. Haiku is fastest and cheapest for simple edits.
User Management
Create, edit, and manage user accounts
-
Total
-
Admin
-
Manager
-
Operator
-
Viewer
Users
Username
Full Name
Email
Role
Last Login
Status
Actions
Loading...
Role Management
Configure roles with custom permission sets
Roles
Name
Description
Level
Permissions
Users
Type
Actions
Loading...
Audit Log
View all administrative actions and system events
Time
User
Action
Resource
Details
IP
Loading...
Page 1
Native Renderer
Download and manage the Kinetica native renderer for HDR fill+key output via NDI, OMT, or SDI
Download Installer
Install the native renderer on your render machine. It will connect to this Nexus server
and output graphics via NDI, OMT, or DeckLink/AJA SDI.
Version: —
Connected Instances
Active renderer instances connected to this server
Hostname
IP
Pipelines
Output Mode
Version
Uptime
No connected instances
Default Configuration
Default settings baked into new renderer installations