Some checks are pending
CI / Build og unit tests (push) Waiting to run
CI / Integration (mcr.microsoft.com/mssql/server:2017-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2019-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2022-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2025-latest) (push) Blocked by required conditions
The hub records when an instance changes build and works out which findings went away within three days of an update and which were still there a week later (version rules excluded). Staff see every effect in the portal; effects seen at three or more customers, resolved more often than not, are served to licensed agents as anonymous counts (rule, major version, build, CU, customers, instances). The agent fetches them every six hours and the web UI shows them on matching findings: 'at 3 customers this went away after updating to CU21'. Data processing documentation covers the aggregation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
54 lines
2.4 KiB
C#
54 lines
2.4 KiB
C#
namespace SQLInsight.Hub;
|
|
|
|
public sealed class HubServerOptions
|
|
{
|
|
public const string SectionName = "SQLInsight:Hub";
|
|
|
|
/// <summary>Public keys trusted for licenses in addition to the embedded ones (key id → base64 SubjectPublicKeyInfo).</summary>
|
|
public IDictionary<string, string> TrustedKeys { get; } = new Dictionary<string, string>();
|
|
|
|
/// <summary>Largest accepted request body.</summary>
|
|
public long MaxRequestBytes { get; set; } = 5 * 1024 * 1024;
|
|
|
|
/// <summary>Most findings accepted per submission.</summary>
|
|
public int MaxFindingsPerSubmission { get; set; } = 2000;
|
|
|
|
/// <summary>Portal login attempts allowed per client IP per minute.</summary>
|
|
public int LoginAttemptsPerMinute { get; set; } = 10;
|
|
|
|
/// <summary>
|
|
/// Folder with the signed update feed (made with the vendor tool's publish command), served at /updates/.
|
|
/// Empty: the hub does not serve updates.
|
|
/// </summary>
|
|
public string? UpdateFeedPath { get; set; }
|
|
|
|
/// <summary>
|
|
/// Folder for the keys that protect login cookies and form tokens. Set it (and keep it) when running in a container
|
|
/// or on more than one server; otherwise staff are logged out on every restart.
|
|
/// </summary>
|
|
public string? DataProtectionKeysPath { get; set; }
|
|
|
|
/// <summary>
|
|
/// IP addresses of reverse proxies in front of the hub. Their X-Forwarded-For/-Proto headers are trusted, so login
|
|
/// rate limiting sees the real client address.
|
|
/// </summary>
|
|
public IList<string> KnownProxies { get; } = [];
|
|
|
|
public RetentionOptions Retention { get; set; } = new();
|
|
|
|
/// <summary>Upgrade insights shared with agents (aggregated, anonymous).</summary>
|
|
public Insights.InsightOptions Insights { get; set; } = new();
|
|
}
|
|
|
|
/// <summary>How long the hub keeps data it no longer needs. Applied once a day.</summary>
|
|
public sealed class RetentionOptions
|
|
{
|
|
/// <summary>Resolved findings are deleted this long after they were resolved (unless linked to an open support case).</summary>
|
|
public TimeSpan ResolvedFindings { get; set; } = TimeSpan.FromDays(365);
|
|
|
|
/// <summary>The submission log (when what was received) is deleted after this.</summary>
|
|
public TimeSpan Submissions { get; set; } = TimeSpan.FromDays(90);
|
|
|
|
/// <summary>Instances that have not reported for this long are deleted with their findings.</summary>
|
|
public TimeSpan SilentInstances { get; set; } = TimeSpan.FromDays(180);
|
|
}
|