sqlinsight-pro/docs/hub.md
Claude 4269f6f9e8
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
Fase 4: experience across customers
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
2026-09-29 10:33:37 +00:00

4 KiB

SQLInsight Hub (for SEOSoft)

SQLInsight Hub modtager fund fra betalende kunders agenter og samler dem i PostgreSQL. Portalen giver supporten overblik over kunder, kritiske fund, de mest udbredte problemer på tværs af kunder, supportsager og licenser. Hubben kan også servere opdateringsfeedet.

Kunder installerer ikke hubben. Den kører hos SEOSoft.

Krav

  • PostgreSQL 14 eller nyere (testet med 17)
  • .NET 10 runtime (ASP.NET Core), eller Docker
  • En reverse proxy med TLS foran. Agenter sender kun til https-adresser, fordi licensen er deres adgangsnøgle.

Med Docker Compose

cd deploy/hub
export HUB_DB_PASSWORD='<langt tilfældigt kodeord>'
docker compose up -d
docker compose exec hub dotnet SQLInsight.Hub.dll add-staff <brugernavn> "<fulde navn>"   # adgangskode på stdin, mindst 12 tegn

Ret docker-compose.yml:

  • SQLInsight__Hub__TrustedKeys__<kid>: den offentlige nøgle, licenserne er signeret med (fra keygen).
  • SQLInsight__Hub__KnownProxies__0: reverse proxyens adresse, så login-begrænsningen ser klientens rigtige IP.

Volumen hubdata indeholder nøglerne til login-cookies (/data/keys) og opdateringsfeedet (/data/feed). Tag backup af den og af PostgreSQL.

Uden Docker

dotnet publish src/SQLInsight.Hub -c Release -o /opt/sqlinsight/hub

appsettings.json:

{
  "ConnectionStrings": { "Hub": "Host=db01;Database=sqlinsight_hub;Username=sqlinsight_hub;Password=…" },
  "SQLInsight": {
    "Hub": {
      "TrustedKeys": { "k20260929": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE…" },
      "DataProtectionKeysPath": "/var/lib/sqlinsight-hub/keys",
      "UpdateFeedPath": "/var/lib/sqlinsight-hub/feed",
      "KnownProxies": [ "10.0.0.5" ],
      "Retention": { "ResolvedFindings": "365.00:00:00", "Submissions": "90.00:00:00", "SilentInstances": "180.00:00:00" }
    }
  }
}

Hubben kan køre som Windows-tjeneste eller systemd-enhed (Type=notify) på samme måde som agenten. Databaseskemaet oprettes og opgraderes ved start.

Erfaring på tværs af kunder

Hubben registrerer, når en instans skifter build, og beregner, hvilke fund der forsvinder inden for 3 dage efter en opdatering, og hvilke der stadig findes efter 7 dage. Under Opgraderinger i portalen ses alle sammenhænge, også dem med få kunder. Sammenhænge med mindst 3 kunder, hvor fundet oftest forsvandt, hentes af agenterne (GET /api/v1/insights, med licens) og vises på fundet i kundens webbrugerflade.

"Insights": { "MinCustomers": 3, "ResolvedWithin": "3.00:00:00", "PersistedAfter": "7.00:00:00" }

Regler om selve versionen (SQLI-VER-*) er udeladt, fordi de altid forsvinder ved en opdatering.

Licenser

# Én gang: nøglepar. Den private nøgle forlader aldrig SEOSofts maskine og må aldrig i git.
dotnet run --project tools/SQLInsight.LicenseTool -- keygen --out ~/sqlinsight-keys

# Pr. kunde
dotnet run --project tools/SQLInsight.LicenseTool -- issue --key ~/sqlinsight-keys/sqlinsight-k20260929.private.pem \
  --kid k20260929 --customer "Kunde A/S" --plan Professional --expires 2027-09-30 --instances 10

Den offentlige nøgle lægges i src/SQLInsight.Licensing/trusted-keys.json før en release, så agenterne kan verificere licensen offline. Hubben får den via TrustedKeys. Licenser kan spærres i portalen under Licenser. Agenten får så 403 ved næste afsendelse.

Opbevaring og sletning

Hver nat sletter hubben:

Data Efter
Løste fund (medmindre de hører til en åben supportsag) Retention:ResolvedFindings, 365 dage
Log over modtagelser Retention:Submissions, 90 dage
Instanser, der ikke har rapporteret, med deres fund Retention:SilentInstances, 180 dage

Når en aftale ophører, eller en kunde beder om sletning:

dotnet SQLInsight.Hub.dll delete-customer "Kunde A/S" --confirm

Alle kundens instanser, fund, regelstatus, modtagelser og supportsager slettes. Licenserne spærres, så agenterne ikke kan sende igen, og kunden omdøbes til "Slettet kunde #id". Se også databehandling.md.