Beyond the Blackwall
REDSYNC
- Cyberpunk 2077 multiplayer. Install, pick the USA relay, jack in.
+ Cyberpunk 2077 multiplayer. Install, pick Official or BETA, jack in. Live player counts in the launcher.
Short page: /rs ·
- Run RedSyncLauncher.exe after unzip ·
+ Run RedSyncLauncher.exe · RELAYS + PLAYERS ONLINE tabs ·
+ Official :2077 · BETA :2177 · cap 2000 ·
same package (alt name)
diff --git a/release/ops/Deploy-BetaServer.ps1 b/release/ops/Deploy-BetaServer.ps1
new file mode 100644
index 00000000..6d728960
--- /dev/null
+++ b/release/ops/Deploy-BetaServer.ps1
@@ -0,0 +1,48 @@
+# Deploy RedSync BETA as a real Pelican/Wings server (not standalone docker).
+# Uses xerox.pri when it works; otherwise falls back to password prompts.
+param(
+ [string]$KeyPath = "c:\Users\mattb\Downloads\xerox.pri",
+ [string]$HostName = "88.214.59.166",
+ [string]$User = "root",
+ [int]$BetaPort = 2177,
+ [string]$RepoDir = "$env:TEMP\RedSync-ops"
+)
+
+$ErrorActionPreference = "Stop"
+$remote = "${User}@${HostName}"
+
+if (-not (Test-Path (Join-Path $RepoDir "release\ops\create-pelican-beta-panel.sh"))) {
+ if (Test-Path $RepoDir) { Remove-Item -Recurse -Force $RepoDir }
+ git clone --depth 1 -b cursor/pelican-beta-server-5b75 https://github.com/nobody71004/RedSync.git $RepoDir
+} else {
+ git -C $RepoDir fetch origin cursor/pelican-beta-server-5b75
+ git -C $RepoDir checkout cursor/pelican-beta-server-5b75
+ git -C $RepoDir pull origin cursor/pelican-beta-server-5b75
+}
+
+# Prefer key, but DO NOT use BatchMode (that blocked password auth last time).
+$sshBase = @("-o", "StrictHostKeyChecking=accept-new")
+if (Test-Path $KeyPath) {
+ $sshBase = @("-i", $KeyPath, "-o", "IdentitiesOnly=yes") + $sshBase
+ Write-Host "Using key: $KeyPath (password prompt is OK if key is rejected)"
+} else {
+ Write-Host "Key not found at $KeyPath — will use password auth"
+}
+
+$scriptLocal = Join-Path $RepoDir "release\ops\create-pelican-beta-panel.sh"
+if (-not (Test-Path $scriptLocal)) { throw "Missing $scriptLocal — pull the branch first" }
+
+Write-Host "Uploading create-pelican-beta-panel.sh ..."
+& ssh.exe @sshBase $remote "rm -rf /tmp/redsync-ops-beta; mkdir -p /tmp/redsync-ops-beta"
+if ($LASTEXITCODE -ne 0) { throw "ssh mkdir failed (exit $LASTEXITCODE)" }
+
+& scp.exe @sshBase $scriptLocal "${remote}:/tmp/redsync-ops-beta/create-pelican-beta-panel.sh"
+if ($LASTEXITCODE -ne 0) { throw "scp failed (exit $LASTEXITCODE) — panel create did NOT run" }
+
+Write-Host "Creating Pelican BETA server on :$BetaPort ..."
+& ssh.exe @sshBase -t $remote "sed -i 's/\r`$//' /tmp/redsync-ops-beta/create-pelican-beta-panel.sh; chmod +x /tmp/redsync-ops-beta/create-pelican-beta-panel.sh; BETA_PORT=$BetaPort bash /tmp/redsync-ops-beta/create-pelican-beta-panel.sh"
+if ($LASTEXITCODE -ne 0) { throw "create-pelican-beta-panel.sh failed (exit $LASTEXITCODE)" }
+
+Write-Host ""
+Write-Host "Open https://panel.xbuniverse.duckdns.org and look for 'RedSync BETA'."
+Write-Host "Launcher: 88.214.59.166:$BetaPort"
diff --git a/release/ops/Publish-Cdn.ps1 b/release/ops/Publish-Cdn.ps1
new file mode 100644
index 00000000..36bad7b2
--- /dev/null
+++ b/release/ops/Publish-Cdn.ps1
@@ -0,0 +1,150 @@
+#Requires -Version 5.1
+# Rebuild RedSyncLauncher.zip and publish to the VPS CDN/media dirs.
+param(
+ [string]$KeyPath = "c:\Users\mattb\Downloads\xerox.pri",
+ [string]$HostName = "88.214.59.166",
+ [string]$User = "root",
+ [string]$RepoDir = ""
+)
+
+$ErrorActionPreference = "Stop"
+
+if (-not $RepoDir) {
+ $here = Split-Path -Parent $MyInvocation.MyCommand.Path
+ $guess = Resolve-Path (Join-Path $here "..\..") -ErrorAction SilentlyContinue
+ if ($guess -and (Test-Path (Join-Path $guess.Path "release\RedSyncLauncher\RedSyncLauncher.csproj"))) {
+ $RepoDir = $guess.Path
+ } else {
+ $RepoDir = Join-Path $env:TEMP "RedSync-ops"
+ }
+}
+
+$release = Join-Path $RepoDir "release"
+$launcher = Join-Path $release "RedSyncLauncher"
+$csproj = Join-Path $launcher "RedSyncLauncher.csproj"
+if (-not (Test-Path $csproj)) {
+ throw ("Launcher project not found under {0}. Clone branch cursor/max-players-launcher-tab-5b75 first." -f $launcher)
+}
+
+Write-Host "==> Building RedSyncLauncher.exe (win-x64 self-contained)"
+& powershell.exe -NoProfile -ExecutionPolicy Bypass -File (Join-Path $launcher "Build-Launcher-Exe.ps1")
+$exe = Join-Path $launcher "RedSyncLauncher.exe"
+if (-not (Test-Path $exe)) {
+ throw "Build failed: missing $exe (Build-Launcher-Exe.ps1 exit=$LASTEXITCODE)"
+}
+Write-Host ("==> Built OK: {0} ({1:N0} bytes)" -f $exe, (Get-Item $exe).Length)
+
+$stage = Join-Path $env:TEMP ("redsync-cdn-stage-" + [guid]::NewGuid().ToString("n"))
+$outDir = Join-Path $env:TEMP "redsync-cdn"
+New-Item -ItemType Directory -Force -Path $stage | Out-Null
+New-Item -ItemType Directory -Force -Path $outDir | Out-Null
+
+$packageFiles = @(
+ "Install-All.ps1", "Install-All.bat",
+ "Install-Client.ps1", "Install-Client.bat",
+ "Install-NPV-Template.ps1", "Install-NPV-Template.bat",
+ "NPV-DEFAULT-V.txt", "GamePath.ps1",
+ "Verify-Install.ps1", "Verify-Install.bat",
+ "Clean-Legacy.ps1", "Clean-Legacy.bat",
+ "Repair-ScriptCache.ps1", "Repair-ScriptCache.bat",
+ "Fix-ScriptCompile.ps1", "Fix-ScriptCompile.bat",
+ "VoiceClient.ps1",
+ "game-path.cfg.example", "server-address.cfg.example"
+)
+
+Write-Host "==> Staging package"
+foreach ($f in $packageFiles) {
+ $src = Join-Path $release $f
+ if (-not (Test-Path $src)) { throw "Missing $src" }
+ Copy-Item -LiteralPath $src -Destination (Join-Path $stage $f) -Force
+}
+foreach ($extra in @("admin.secret.example", "DO-NOT-COPY-FROM-OTHER-PC.txt")) {
+ $src = Join-Path $release $extra
+ if (Test-Path $src) {
+ Copy-Item -LiteralPath $src -Destination (Join-Path $stage $extra) -Force
+ }
+}
+Copy-Item -LiteralPath (Join-Path $release "client") -Destination (Join-Path $stage "client") -Recurse -Force
+Copy-Item -LiteralPath (Join-Path $release "client-deps") -Destination (Join-Path $stage "client-deps") -Recurse -Force
+Copy-Item -LiteralPath $exe -Destination (Join-Path $stage "RedSyncLauncher.exe") -Force
+Copy-Item -LiteralPath (Join-Path $launcher "servers.json") -Destination (Join-Path $stage "servers.json") -Force
+Copy-Item -LiteralPath (Join-Path $launcher "README.txt") -Destination (Join-Path $stage "README-LAUNCHER.txt") -Force
+
+$startHere = @(
+ "RedSync Launcher Package",
+ "========================",
+ ("Built: {0}" -f (Get-Date -Format "yyyy-MM-dd HH:mm")),
+ "Official: 88.214.59.166:2077 (max 2000)",
+ "BETA: 88.214.59.166:2177 (max 2000)",
+ "",
+ "1. Unzip",
+ "2. Run RedSyncLauncher.exe",
+ "3. Install deps if prompted",
+ "4. RELAYS tab to connect; PLAYERS ONLINE tab for live headcount"
+) -join "`r`n"
+Set-Content -LiteralPath (Join-Path $stage "START-HERE.txt") -Value $startHere -Encoding Ascii
+
+$clientZip = Join-Path $outDir "RedSync-Tester-Client.zip"
+$launcherZip = Join-Path $outDir "RedSyncLauncher.zip"
+$fullZip = Join-Path $outDir "RedSync-Tester-Package.zip"
+Remove-Item -LiteralPath $clientZip, $launcherZip, $fullZip -Force -ErrorAction SilentlyContinue
+
+Write-Host "==> Zipping $clientZip"
+if (Test-Path $clientZip) { Remove-Item -LiteralPath $clientZip -Force }
+Add-Type -AssemblyName System.IO.Compression.FileSystem
+[System.IO.Compression.ZipFile]::CreateFromDirectory($stage, $clientZip)
+Copy-Item -LiteralPath $clientZip -Destination $launcherZip -Force
+
+$stage2 = Join-Path $env:TEMP ("redsync-cdn-full-" + [guid]::NewGuid().ToString("n"))
+New-Item -ItemType Directory -Force -Path $stage2 | Out-Null
+Copy-Item -Path (Join-Path $stage "*") -Destination $stage2 -Recurse -Force
+if (Test-Path (Join-Path $release "server")) {
+ Copy-Item -LiteralPath (Join-Path $release "server") -Destination (Join-Path $stage2 "server") -Recurse -Force
+}
+Write-Host "==> Zipping $fullZip"
+if (Test-Path $fullZip) { Remove-Item -LiteralPath $fullZip -Force }
+[System.IO.Compression.ZipFile]::CreateFromDirectory($stage2, $fullZip)
+
+$html = Join-Path $launcher "www\index.html"
+if (-not (Test-Path $html)) { throw "Missing $html" }
+
+$remote = "${User}@${HostName}"
+$sshBase = New-Object System.Collections.Generic.List[string]
+$sshBase.Add("-o") | Out-Null
+$sshBase.Add("StrictHostKeyChecking=accept-new") | Out-Null
+if (Test-Path $KeyPath) {
+ $sshBase.Insert(0, "IdentitiesOnly=yes") | Out-Null
+ $sshBase.Insert(0, "-o") | Out-Null
+ $sshBase.Insert(0, $KeyPath) | Out-Null
+ $sshBase.Insert(0, "-i") | Out-Null
+ Write-Host "Using key $KeyPath (password OK if key rejected)"
+}
+$sshArgs = $sshBase.ToArray()
+
+$media = "/opt/music-player/xbuniverse_server/videos"
+$www = "/opt/redsync-data/www"
+
+Write-Host "==> Uploading zips + HTML to $HostName"
+& ssh.exe @sshArgs $remote ("mkdir -p '{0}' '{1}'" -f $media, $www)
+if ($LASTEXITCODE -ne 0) { throw "ssh mkdir failed" }
+
+& scp.exe @sshArgs $launcherZip $clientZip $fullZip ("{0}:{1}/" -f $remote, $media)
+if ($LASTEXITCODE -ne 0) { throw "scp zips failed" }
+
+& scp.exe @sshArgs $html ("{0}:{1}/RedSync.html" -f $remote, $media)
+& scp.exe @sshArgs $html ("{0}:{1}/rs.html" -f $remote, $media)
+& scp.exe @sshArgs $html ("{0}:{1}/RedSync.html" -f $remote, $www)
+& scp.exe @sshArgs $html ("{0}:{1}/rs.html" -f $remote, $www)
+& scp.exe @sshArgs $launcherZip ("{0}:{1}/RedSyncLauncher.zip" -f $remote, $www)
+
+# Single-line remote check (avoid CRLF breaking bash on the VPS)
+$remoteCheck = "ls -lh $media/RedSyncLauncher.zip $media/rs.html; curl -sI http://127.0.0.1:5005/api/media/RedSyncLauncher.zip | sed -n '1,8p'; curl -sI http://127.0.0.1:5005/api/media/rs.html | sed -n '1,8p'"
+& ssh.exe @sshArgs $remote $remoteCheck
+
+Remove-Item -Recurse -Force $stage, $stage2 -ErrorAction SilentlyContinue
+
+Write-Host ""
+Write-Host "Published:"
+Write-Host " https://xbuniverse.duckdns.org/api/media/RedSyncLauncher.zip"
+Write-Host " https://xbuniverse.duckdns.org/rs"
+Write-Host " https://xbuniverse.duckdns.org/api/media/RedSync.html"
diff --git a/release/ops/README.md b/release/ops/README.md
index d241cf1c..62e955fb 100644
--- a/release/ops/README.md
+++ b/release/ops/README.md
@@ -1,4 +1,29 @@
-# RedSync ops — short URL, anti-regression, 24/7 heal bot
+# RedSync ops — short URL, anti-regression, 24/7 heal bot, beta server
+
+## 0) Pelican BETA server (real Wings/panel clone)
+
+Keeps Official on `:2077` and creates a second **Pelican panel** server with the
+same egg/resources on `:2177` for test builds.
+
+On Windows (uses your VPS key):
+
+```powershell
+powershell -ExecutionPolicy Bypass -File "$env:TEMP\RedSync-ops\release\ops\Deploy-BetaServer.ps1"
+```
+
+Or on the VPS as root:
+
+```bash
+bash create-pelican-beta-panel.sh
+```
+
+- Panel: https://panel.xbuniverse.duckdns.org → **RedSync BETA**
+- Volume: `/var/lib/pelican/volumes/