Implemented SignalR scaling using redis. Improved diagnose report generator. Added SignalR debug card in Diagnose page

This commit is contained in:
2025-09-16 08:02:53 +00:00
parent 8573fffaa2
commit efca9cf5d8
15 changed files with 193 additions and 70 deletions

View File

@@ -1,5 +1,6 @@
using System.Diagnostics;
using System.IO.Compression;
using System.Text.Json;
using MoonCore.Yaml;
using Moonlight.ApiServer.Configuration;
using Moonlight.ApiServer.Extensions;
using Moonlight.ApiServer.Interfaces;
@@ -8,11 +9,11 @@ namespace Moonlight.ApiServer.Implementations.Diagnose;
public class CoreConfigDiagnoseProvider : IDiagnoseProvider
{
private readonly AppConfiguration Config;
private readonly AppConfiguration Configuration;
public CoreConfigDiagnoseProvider(AppConfiguration config)
public CoreConfigDiagnoseProvider(AppConfiguration configuration)
{
Config = config;
Configuration = configuration;
}
private string CheckForNullOrEmpty(string? content)
@@ -22,29 +23,25 @@ public class CoreConfigDiagnoseProvider : IDiagnoseProvider
: "ISNOTEMPTY";
}
public async Task ModifyZipArchive(ZipArchive archive)
public async Task ModifyZipArchiveAsync(ZipArchive archive)
{
var json = JsonSerializer.Serialize(Config);
var config = JsonSerializer.Deserialize<AppConfiguration>(json);
if (config == null)
try
{
await archive.AddText("core/config.txt", "Could not fetch config.");
return;
var configString = YamlSerializer.Serialize(Configuration);
var configuration = YamlSerializer.Deserialize<AppConfiguration>(configString);
configuration.Database.Password = CheckForNullOrEmpty(configuration.Database.Password);
configuration.Authentication.Secret = CheckForNullOrEmpty(configuration.Authentication.Secret);
configuration.SignalR.RedisConnectionString = CheckForNullOrEmpty(configuration.SignalR.RedisConnectionString);
await archive.AddTextAsync(
"core/config.txt",
YamlSerializer.Serialize(configuration)
);
}
catch (Exception e)
{
await archive.AddTextAsync("core/config.txt", $"Unable to load config: {e.ToStringDemystified()}");
}
config.Database.Password = CheckForNullOrEmpty(config.Database.Password);
config.Authentication.Secret = CheckForNullOrEmpty(config.Authentication.Secret);
await archive.AddText(
"core/config.txt",
JsonSerializer.Serialize(
config,
new JsonSerializerOptions()
{
WriteIndented = true
}
)
);
}
}

View File

@@ -6,17 +6,16 @@ namespace Moonlight.ApiServer.Implementations.Diagnose;
public class LogsDiagnoseProvider : IDiagnoseProvider
{
public async Task ModifyZipArchive(ZipArchive archive)
public async Task ModifyZipArchiveAsync(ZipArchive archive)
{
var path = Path.Combine("storage", "logs", "latest.log");
var path = Path.Combine("storage", "logs", "moonlight.log");
if (!File.Exists(path))
if (File.Exists(path))
{
await archive.AddText("logs.txt", "Logs file latest.log has not been found");
return;
var logsContent = await File.ReadAllTextAsync(path);
await archive.AddTextAsync("logs.txt", logsContent);
}
var logsContent = await File.ReadAllTextAsync(path);
await archive.AddText("logs.txt", logsContent);
else
await archive.AddTextAsync("logs.txt", "Logs file moonlight.log has not been found");
}
}