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
Hub: nightly retention of resolved findings, the submission log and silent instances; delete-customer erases a customer's data and blocks its licenses; persistent data protection keys and trusted reverse proxies. Docker image and compose file with PostgreSQL. The agent refuses to send the license to a non-https hub. Documentation for the hub, for data processing (GDPR basis for a data processing agreement) and the README roadmap for phase 3. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
83 lines
3.4 KiB
Markdown
83 lines
3.4 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
dotnet publish src/SQLInsight.Hub -c Release -o /opt/sqlinsight/hub
|
|
```
|
|
|
|
`appsettings.json`:
|
|
|
|
```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.
|
|
|
|
## Licenser
|
|
|
|
```bash
|
|
# É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:
|
|
|
|
```bash
|
|
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](databehandling.md).
|