Some checks are pending
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 / Build og unit tests (push) Waiting to run
CI / MSI-installer (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2017-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2025-latest) (push) Blocked by required conditions
installer/SQLInsight.wxs (WiX 3 syntax) builds on Linux with wixl (installer/build-msi.sh) and in Forgejo CI on every v* tag. Agent and Web are installed self-contained as Windows services under virtual service accounts (or a gMSA), with a settings page in the wizard or MSI properties for silent installs; the values go to sqlinsight.ini, read after appsettings.json. The data folder is locked to SYSTEM, Administrators and the agent account, the event log source is registered, the web port is opened in the firewall, and the automatic update task is an optional feature. Upgrades happen in place, keep edited settings and the chosen features; uninstall keeps the settings. msi-tables.py writes what wixl lacks (component and feature conditions, Permanent/NeverOverwrite, vital services, REG_EXPAND_SZ) and verify-msi.py checks the result (sequencing, deferred actions, ASCII only). test-msi-wine.sh runs install, upgrade and uninstall under Wine. Installations made with the MSI get new versions as MSI packages run by the update task, so Windows Installer stays in charge of the files. The example instance is removed from the shipped appsettings.json, and the CLI writes UTF-8 to the console. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
171 lines
10 KiB
Markdown
171 lines
10 KiB
Markdown
# Installation
|
|
|
|
SQLInsight Pro består af to programmer, som begge installeres hos jer (on-prem):
|
|
|
|
| Del | Hvad den gør | Kører som |
|
|
|---|---|---|
|
|
| **SQLInsight Agent** | Overvåger SQL Server-instanserne og gemmer fund i repository-databasen | Windows-tjeneste (eller systemd på Linux) |
|
|
| **SQLInsight Web** | Lokalt websted, der viser fund, trends og anbefalinger | IIS-websted **eller** selvstændig Windows-tjeneste med indbygget webserver (Kestrel) |
|
|
|
|
Begge bruger en **repository-database** på en SQL Server 2016+-instans, der helst ikke er en af de overvågede.
|
|
|
|
> Installationstrinene er skrevet ud fra Microsofts dokumentation for ASP.NET Core-hosting. De er endnu ikke gennemtestet på en ren Windows Server. Meld gerne afvigelser tilbage som issue.
|
|
|
|
## Hurtigst: MSI-installeren
|
|
|
|
`SQLInsight-Pro-<version>-x64.msi` installerer agent og web som Windows-tjenester. .NET er indbygget, så serveren behøver ingen runtime. Opret først repository-databasen (trin 2) og giv rettigheder (trin 3). Kør derefter installeren som administrator:
|
|
|
|
- **Med installationsguiden:** Første side spørger om forbindelsesstrengen til repositoriet, den første SQL Server, tjenestekonti og port.
|
|
- **Stille, fx med SCCM/Intune:**
|
|
|
|
```powershell
|
|
msiexec /i SQLInsight-Pro-1.0.0-x64.msi /qn /l*v install.log `
|
|
REPOSITORY_CONNECTION="Server=sqlmon01;Database=SQLInsight;Integrated Security=true;Encrypt=true" `
|
|
MONITOR_SERVER="sql01" `
|
|
AGENT_ACCOUNT="DOMÆNE\svc-sqlinsight$" WEB_ACCOUNT="DOMÆNE\svc-sqlinsight-web$" WEB_PORT=5080 `
|
|
ADDLOCAL=ALL
|
|
```
|
|
|
|
| Egenskab | Standard | |
|
|
|---|---|---|
|
|
| `REPOSITORY_CONNECTION` | (ingen) | Forbindelsesstreng til repository-databasen. Uden den installeres tjenesterne, men startes ikke |
|
|
| `MONITOR_SERVER` | (ingen) | Første instans, der skal overvåges. Flere tilføjes i `appsettings.json` |
|
|
| `AGENT_ACCOUNT` | `NT SERVICE\SQLInsight Agent` | Tjenestekonto til agenten. Den virtuelle konto når andre servere som computerkontoen (`DOMÆNE\SERVER$`), så det er den, der skal have login og rettigheder på de overvågede instanser. En gMSA angives som `DOMÆNE\navn$` |
|
|
| `WEB_ACCOUNT` | `NT SERVICE\SQLInsight Web` | Tjenestekonto til web. Skal have `db_datareader` på repositoriet |
|
|
| `WEB_PORT` | `5080` | Port til webbrugerfladen. Installeren åbner den i Windows Firewall |
|
|
| `ADDLOCAL` | `Agent,Web` | `Agent`, `Web` og `UpdateTask` (planlagt opgave, der installerer hentede opdateringer som SYSTEM, se [opdatering.md](opdatering.md)). `ALL` = alle tre |
|
|
|
|
Installeren gør følgende:
|
|
|
|
- Programmerne lægges i `C:\Program Files\SQLInsight\Agent` og `\Web`, og tjenesterne `SQLInsight Agent` og `SQLInsight Web` oprettes med automatisk start.
|
|
- Værdierne fra installationen skrives i `sqlinsight.ini` ved siden af programmerne. Den læses efter `appsettings.json`, så begge filer kan redigeres bagefter. Genstart tjenesten efter en ændring.
|
|
- `C:\ProgramData\SQLInsight` oprettes med adgang for kun SYSTEM, Administrators og agentens konto. Mappen indeholder lokale regler, regelpakker og ventende opdateringer.
|
|
- Kilden `SQLInsight Pro` registreres i hændelsesloggen (se [integration.md](integration.md#scom-og-windows-hændelseslog)).
|
|
|
|
**Opgradering:** Kør en nyere MSI; der skal ingen parametre med. `appsettings.json` og `sqlinsight.ini` bevares, og det samme gælder de valgte dele (fx opdateringsopgaven).
|
|
|
|
**Afinstallation:** Brug *Programmer og funktioner* eller `msiexec /x`. Tjenester, programfiler, firewallregel og opdateringsopgave fjernes. `appsettings.json`, `sqlinsight.ini` og `C:\ProgramData\SQLInsight` bliver liggende, så en geninstallation beholder indstillingerne.
|
|
|
|
Web kører her på Kestrel over http med Windows-login. Skal den bruge https eller køre i IIS, så se trin 5a/5b.
|
|
|
|
**Til SEOSoft:** MSI'en bygges på Linux med `installer/build-msi.sh <version>` (kræver `apt install wixl msitools`) og bygges også af CI ved hvert tag `v*`. Scriptet kontrollerer selv MSI-tabellerne. `installer/test-msi-wine.sh` afprøver installation, opgradering og afinstallation under Wine.
|
|
|
|
## 1. Forudsætninger
|
|
|
|
- Windows Server 2016 eller nyere (eller Linux til agenten)
|
|
- Ved manuel installation (ikke MSI): [.NET 10 Runtime](https://dotnet.microsoft.com/download/dotnet/10.0) på agent-serveren; **ASP.NET Core Hosting Bundle** på webserveren, hvis IIS bruges
|
|
- To tjenestekonti, gerne gMSA: én til agenten og én til web-UI'et
|
|
- Til SQL Server 2000: en Windows-agent med en ODBC-driver, der understøtter 2000 (se [legacy-versions.md](legacy-versions.md))
|
|
|
|
## 2. Repository-databasen
|
|
|
|
```sql
|
|
CREATE DATABASE SQLInsight;
|
|
GO
|
|
USE SQLInsight;
|
|
CREATE LOGIN [DOMÆNE\svc-sqlinsight-agent$] FROM WINDOWS;
|
|
CREATE USER [DOMÆNE\svc-sqlinsight-agent$];
|
|
ALTER ROLE db_owner ADD MEMBER [DOMÆNE\svc-sqlinsight-agent$]; -- agenten opretter og opgraderer skemaet
|
|
|
|
CREATE LOGIN [DOMÆNE\svc-sqlinsight-web$] FROM WINDOWS;
|
|
CREATE USER [DOMÆNE\svc-sqlinsight-web$];
|
|
ALTER ROLE db_datareader ADD MEMBER [DOMÆNE\svc-sqlinsight-web$]; -- web-UI'et læser kun
|
|
```
|
|
|
|
Agenten opretter tabellerne selv ved første start.
|
|
|
|
## 3. Rettigheder på de overvågede instanser
|
|
|
|
Kør [`db/permissions/grant-least-privilege.sql`](../db/permissions/grant-least-privilege.sql) på hver instans efter at have oprettet agentens login. Agenten bliver aldrig sysadmin.
|
|
|
|
## 4. Agenten som Windows-tjeneste
|
|
|
|
```powershell
|
|
dotnet publish src/SQLInsight.Agent -c Release -r win-x64 --self-contained false -o C:\Program Files\SQLInsight\Agent
|
|
```
|
|
|
|
Ret `C:\Program Files\SQLInsight\Agent\appsettings.json`: `SQLInsight:Repository:ConnectionString` og listen `SQLInsight:Instances`. Opret derefter tjenesten:
|
|
|
|
```powershell
|
|
sc.exe create "SQLInsight Agent" binPath= "\"C:\Program Files\SQLInsight\Agent\SQLInsight.Agent.exe\"" obj= "DOMÆNE\svc-sqlinsight-agent$" start= delayed-auto
|
|
sc.exe description "SQLInsight Agent" "Overvåger SQL Server og gemmer fund i SQLInsight-repositoriet."
|
|
sc.exe start "SQLInsight Agent"
|
|
```
|
|
|
|
For en gMSA angives ingen adgangskode. Loggen kan ses i Windows' Event Viewer under *Application*.
|
|
|
|
## 5a. Web-UI'et på IIS
|
|
|
|
1. Installér **ASP.NET Core Hosting Bundle** for .NET 10, og kør `iisreset`.
|
|
2. Publicér:
|
|
```powershell
|
|
dotnet publish src/SQLInsight.Web -c Release -o C:\inetpub\SQLInsight
|
|
```
|
|
Publiceringen danner en `web.config` med ASP.NET Core Module (in-process).
|
|
3. Opret en **application pool** med *.NET CLR version = No Managed Code*, og sæt dens identitet til `DOMÆNE\svc-sqlinsight-web$`.
|
|
4. Opret et websted, der peger på `C:\inetpub\SQLInsight`, med en **HTTPS-binding** og et certifikat fra jeres interne CA.
|
|
5. Under *Authentication*: slå **Windows Authentication** til og **Anonymous Authentication** fra.
|
|
6. Ret `appsettings.json`: `SQLInsight:Repository:ConnectionString` (Integrated Security, så app pool-identiteten bruges), eventuelt `SQLInsight:Web:AllowedGroups`, fx `["DOMÆNE\\SQL-Admins"]`.
|
|
|
|
## 5b. Web-UI'et som selvstændig Windows-tjeneste (uden IIS)
|
|
|
|
Web-UI'et har sin egen webserver (Kestrel) og kan køre som tjeneste på en server uden IIS.
|
|
|
|
```powershell
|
|
dotnet publish src/SQLInsight.Web -c Release -r win-x64 --self-contained false -o "C:\Program Files\SQLInsight\Web"
|
|
```
|
|
|
|
Tilføj et HTTPS-endpoint i `appsettings.json` med et certifikat fra maskinens certifikatlager:
|
|
|
|
```json
|
|
"Kestrel": {
|
|
"Endpoints": {
|
|
"Https": {
|
|
"Url": "https://*:8443",
|
|
"Certificate": { "Subject": "sqlinsight.domæne.local", "Store": "My", "Location": "LocalMachine" }
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
Opret tjenesten og en SPN, så Kerberos-login virker:
|
|
|
|
```powershell
|
|
sc.exe create "SQLInsight Web" binPath= "\"C:\Program Files\SQLInsight\Web\SQLInsight.Web.exe\"" obj= "DOMÆNE\svc-sqlinsight-web$" start= delayed-auto
|
|
setspn -S HTTP/sqlinsight.domæne.local DOMÆNE\svc-sqlinsight-web$
|
|
sc.exe start "SQLInsight Web"
|
|
```
|
|
|
|
Åbn porten i Windows Firewall for de brugere, der skal se UI'et.
|
|
|
|
## Notifikationer
|
|
|
|
Agenten kan give besked om nye og løste fund, og når en instans ikke kan nås. Det sættes op under `SQLInsight:Notifications` i agentens `appsettings.json`:
|
|
|
|
| Kanal | Opsætning |
|
|
|---|---|
|
|
| E-mail | `Email:Enabled`, `Host`, `Port`, `Security` (`StartTls`, `SslOnConnect` eller `None`), `From`, `To`, eventuelt `UserName`/`Password` |
|
|
| Microsoft Teams | Opret i Teams et workflow "Post to a channel when a webhook request is received", og sæt URL'en i `Teams:WebhookUrl` |
|
|
| Webhook | `Webhook:Url` og eventuelt `Secret`. Så har hver request headeren `X-SQLInsight-Signature: sha256=<HMAC-SHA256 af body>` |
|
|
|
|
Hver kanal har sin egen `MinSeverity` (standard: `High` til e-mail og Teams, `Medium` til webhook). En instans, der ikke kan nås, meldes altid. Sæt `WebUrl` til adressen på SQLInsight Web, så beskederne linker direkte til fundet. `MaxMessagesPerHour` begrænser antallet af beskeder pr. kanal.
|
|
|
|
## Azure SQL Managed Instance
|
|
|
|
Tilføj instansen som en almindelig instans. Log ind med Microsoft Entra ID:
|
|
|
|
```json
|
|
{ "Name": "mi-prod", "Server": "mi-prod.abc123.database.windows.net", "Authentication": "EntraManagedIdentity" }
|
|
```
|
|
|
|
Mulighederne er `EntraManagedIdentity` (agentens managed identity; `UserName` kan være client id for en user-assigned identity), `EntraServicePrincipal` (`UserName` = client id, `Password` = secret, `TenantId`) og `EntraDefault`. Opret login'et med `CREATE LOGIN [navn] FROM EXTERNAL PROVIDER`, og kør derefter `grant-least-privilege.sql`.
|
|
|
|
På Managed Instance håndterer Azure backup, patching, filer, tempdb og hukommelse. De regler vises derfor som "Håndteres af Azure" og ikke som fund. MI-understøttelsen er bygget ud fra Microsofts dokumentation, men er endnu ikke testet mod en rigtig Managed Instance.
|
|
|
|
## Linux (systemd)
|
|
|
|
Begge programmer understøtter systemd (`Type=notify`). Windows-login på Linux kræver en Kerberos keytab; se Microsofts dokumentation for Negotiate-autentificering på Linux.
|
|
|
|
## Opdatering
|
|
|
|
Se [opdatering.md](opdatering.md): regelpakken opdateres automatisk, og nye versioner kan installeres med `SQLInsight.Agent update apply` eller automatisk af en planlagt opgave. Manuelt: stop tjenesten (eller app poolen), kopiér de nye filer ind uden at overskrive `appsettings.json`, og start igen. Agenten opgraderer repository-skemaet selv.
|