Run these rows top-to-bottom on the new Windows machine (Admin PowerShell). Every block is copy-paste.
GLM-XXXX-XXXX-XXXX → Panel → Team & Licenses → create → copy.
New-Item -ItemType Directory -Force -Path C:\gms\logs | Out-Null
if (-not (Get-Command node -ErrorAction SilentlyContinue)) { winget install OpenJS.NodeJS.LTS -e --accept-source-agreements --accept-package-agreements }
if (-not (Test-Path C:\gms\ffmpeg.exe)) {
iwr "https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-full.zip" -OutFile C:\gms\ff.zip
Expand-Archive C:\gms\ff.zip C:\gms\ffx -Force
Copy-Item (Get-ChildItem C:\gms\ffx -Recurse -Filter ffmpeg.exe | Select -First 1).FullName C:\gms\ffmpeg.exe -Force
}
if (-not (Test-Path C:\gms\mediamtx.exe)) {
$r = iwr "https://api.github.com/repos/bluenviron/mediamtx/releases/latest" -UseBasicParsing | ConvertFrom-Json
$a = $r.assets | Where-Object { $_.name -like "*windows_amd64*" } | Select -First 1
iwr $a.browser_download_url -OutFile C:\gms\mtx.zip
Expand-Archive C:\gms\mtx.zip C:\gms\mtx -Force
Copy-Item C:\gms\mtx\mediamtx.exe C:\gms\mediamtx.exe -Force
}
iwr "https://panel.glaukott.com/gms/agent.js" -OutFile C:\gms\agent.js
$env:Path += ";C:\gms"
[Environment]::SetEnvironmentVariable("Path", [Environment]::GetEnvironmentVariable("Path","Machine") + ";C:\gms", "Machine")
New-NetFirewallRule -DisplayName "GMS SRT ingest 5001" -Direction Inbound -Protocol UDP -LocalPort 5001 -Action Allow | Out-Null
New-NetFirewallRule -DisplayName "GMS RTMP 1936" -Direction Inbound -Protocol TCP -LocalPort 1936 -Action Allow | Out-Null
New-NetFirewallRule -DisplayName "GMS HLS 8095" -Direction Inbound -Protocol TCP -LocalPort 8095 -Action Allow | Out-Null
New-NetFirewallRule -DisplayName "GMS SRT outs 6000-6199" -Direction Inbound -Protocol UDP -LocalPort 6000-6199 -Action Allow | Out-Null
Write-Host "bootstrap done" -ForegroundColor Green
node C:\gms\agent.js --key GLM-XXXX-XXXX-XXXX
Expected: registered srv-… · [mediamtx] port 1936 ready · [heartbeat-ok] 200. Keep window open (or ROW 6).
Servers → this server → Streams → Add: name marlind · proto SRT · port 5001.
vMix then pushes to srt://PUBLIC_IP:5001.
| Purpose | Protocol | Port | Client URL |
|---|---|---|---|
| Single device, plain | SRT playback | 6005 | srt://IP:6005 |
| Many clients | SRT multi-client | 6006 | srt://IP:6006?streamid=read:marlind |
| Web / mobile (auto) | HLS | — | http://IP:8095/live/marlind/index.m3u8 |
| Boxes / encoders (auto) | RTMP | — | rtmp://IP:1936/live/marlind |
netstat -ano | findstr ":5001 :1936 :8095 :6005 :6006" ffmpeg -i "srt://127.0.0.1:6006?streamid=read:marlind" -f null -
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -WindowStyle Hidden -Command `"if (-not (Get-Process node -ErrorAction SilentlyContinue)) { Start-Process node -ArgumentList 'C:\gms\agent.js --key GLM-XXXX-XXXX-XXXX' -WindowStyle Hidden }`""
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName "GMS Agent Boot" -Action $action -Trigger $trigger -User SYSTEM -RunLevel Highest -Force
| Symptom | Fix |
|---|---|
| Server Offline in panel | agent not running → node C:\gms\agent.js --key … |
| port 1936 NOT ready | Remove-Item C:\gms\mediamtx.yml → restart agent |
| Output stuck on 6000 | old agent → re-download agent.js + restart node |
| Port busy | netstat -ano | findstr :PORT → kill PID → recreate output |