Installatie van SQLio op Windows Server met IIS
| Component | Vereiste |
|---|---|
| Besturingssysteem | Windows Server 2016, 2019 of 2022 |
| IIS | Geïnstalleerd met WebSocket Protocol |
| .NET Runtime | 9.0 (ASP.NET Core Hosting Bundle) |
| SQL Server | 2016 of hoger (Express, Standard of Enterprise) |
| SSL Certificaat | Voor HTTPS (alleen bij directe toegang, niet bij DMZ) |
| Rechten | Administrator op de server, db_owner op SQL Server |
SQLio gebruikt WebSockets voor real-time communicatie. Controleer of dit is ingeschakeld:
SQLio verbindt met SQL Server via een eigen login: een SQL-login of een Windows-account (het account van de application pool). Het script in stap 2 maakt die login aan als hij nog niet bestaat. Maakt de DBA de login liever zelf aan, zie dan de handleiding "SQL Login Aanmaken".
Download en installeer de ASP.NET Core 9.0 Hosting Bundle:
https://dotnet.microsoft.com/download/dotnet/9.0iisreset
SQLio bewaart zijn configuratie in een eigen database: SQLioDB. De installatie bestaat uit vier scripts, die u in SQL Server Management Studio uitvoert als sysadmin (of met de rechten om databases en logins aan te maken).
| Script | Uitvoeren op | Omschrijving |
|---|---|---|
01_SQLioDB_Database.sql |
master | Database SQLioDB en de rol SQLioRole met rechten |
02a_SQLioDB_Login_SQL.sql |
master | Bij SQL Authentication: login en gebruiker voor SQLio |
02b_SQLioDB_Login_Windows.sql |
master | Bij Windows Authentication: het account van de application pool als gebruiker |
03_SQLioDB_Schema.sql |
SQLioDB | Alle tabellen, relaties en procedures |
Voer de scripts uit in deze volgorde: 01, dan 02a óf 02b, dan 03. Alle scripts staan in de map SQL\Installatie van het installatiepakket; 01, 02a en 02b staan hieronder ook, om te kopiëren.
SQLioDB in de scripts 01, 02a/02b en 03 door de gewenste naam.
Maakt de database en de rol SQLioRole aan. Het script mag vaker worden uitgevoerd: wat al bestaat wordt overgeslagen.
-- ============================================================================
-- 01_SQLioDB_Database.sql
-- SQLio v2 - nieuwe installatie, stap 1: configuratiedatabase en rol
--
-- Draaien op: master (SSMS), als sysadmin of met CREATE DATABASE-recht.
--
-- Maakt aan:
-- 1. De database SQLioDB (de configuratie van SQLio).
-- 2. De rol SQLioRole met lees-, schrijf- en EXECUTE-rechten op schema dbo.
--
-- Andere databasenaam? Vervang dan SQLioDB in de scripts 01, 02a/02b en 03.
--
-- Mag vaker gedraaid worden: wat al bestaat wordt overgeslagen.
-- Volgende stap: 02a (SQL-login) of 02b (Windows-account).
-- ============================================================================
USE [master]
GO
SET NOCOUNT ON
GO
PRINT 'SQLio v2 - stap 1: database en rol'
PRINT ''
IF DB_ID(N'SQLioDB') IS NULL
BEGIN
CREATE DATABASE [SQLioDB]
PRINT ' [OK] Database SQLioDB aangemaakt'
END
ELSE
PRINT ' [--] Database SQLioDB bestaat al'
GO
USE [SQLioDB]
GO
IF DATABASE_PRINCIPAL_ID(N'SQLioRole') IS NULL
BEGIN
CREATE ROLE [SQLioRole]
PRINT ' [OK] Rol SQLioRole aangemaakt'
END
ELSE
PRINT ' [--] Rol SQLioRole bestaat al'
GRANT SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo TO [SQLioRole]
GRANT EXECUTE ON SCHEMA::dbo TO [SQLioRole]
GRANT VIEW DEFINITION ON SCHEMA::dbo TO [SQLioRole]
PRINT ' [OK] Rechten op schema dbo voor SQLioRole'
PRINT ''
PRINT 'Klaar. Volgende stap: 02a_SQLioDB_Login_SQL.sql of 02b_SQLioDB_Login_Windows.sql'
GO
Vul bovenin de loginnaam en een eigen, sterk wachtwoord in. Het script stopt als u dat vergeet. Bestaat de login al, dan wordt alleen de gebruiker in SQLioDB aangemaakt; het wachtwoord blijft dan ongewijzigd.
-- ============================================================================
-- 02a_SQLioDB_Login_SQL.sql
-- SQLio v2 - nieuwe installatie, stap 2 (SQL-authenticatie)
--
-- Draaien op: master (SSMS), als sysadmin of met ALTER ANY LOGIN-recht.
-- Gebruik dit script als SQLio met een SQL-login verbindt. Verbindt SQLio met
-- een Windows-account (bijvoorbeeld de identiteit van de app pool), gebruik dan
-- 02b_SQLioDB_Login_Windows.sql.
--
-- Maakt aan:
-- 1. De SQL-login (als die nog niet bestaat).
-- 2. De gebruiker in SQLioDB, lid van SQLioRole.
--
-- Vul hieronder de loginnaam en een eigen, sterk wachtwoord in.
-- Mag vaker gedraaid worden: wat al bestaat wordt overgeslagen.
-- ============================================================================
SET NOCOUNT ON;
DECLARE @LoginName sysname = N'svc_SQLio';
DECLARE @Wachtwoord nvarchar(128) = N'<<wachtwoord>>';
-- ----------------------------------------------------------------------------
IF @Wachtwoord LIKE N'<<%'
THROW 50001, 'Vul bovenin eerst @Wachtwoord in.', 1;
IF DB_ID(N'SQLioDB') IS NULL
THROW 50002, 'Database SQLioDB bestaat niet. Draai eerst 01_SQLioDB_Database.sql.', 1;
PRINT 'SQLio v2 - stap 2: SQL-login ' + @LoginName;
PRINT '';
DECLARE @Sql nvarchar(max);
IF SUSER_ID(@LoginName) IS NULL
BEGIN
SET @Sql = N'CREATE LOGIN ' + QUOTENAME(@LoginName)
+ N' WITH PASSWORD = ' + QUOTENAME(@Wachtwoord, '''')
+ N', DEFAULT_DATABASE = [SQLioDB], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF;';
EXEC sys.sp_executesql @Sql;
PRINT ' [OK] Login ' + @LoginName + ' aangemaakt';
END
ELSE
PRINT ' [--] Login ' + @LoginName + ' bestaat al (wachtwoord niet gewijzigd)';
-- Gebruiker en rol in SQLioDB
SET @Sql = N'
IF DATABASE_PRINCIPAL_ID(@LoginName) IS NULL
BEGIN
EXEC (N''CREATE USER '' + @Quoted + N'' FOR LOGIN '' + @Quoted + N'';'');
PRINT '' [OK] Gebruiker '' + @LoginName + '' aangemaakt in SQLioDB'';
END
ELSE
PRINT '' [--] Gebruiker '' + @LoginName + '' bestaat al in SQLioDB'';
IF ISNULL(IS_ROLEMEMBER(N''SQLioRole'', @LoginName), 0) = 0
BEGIN
EXEC (N''ALTER ROLE [SQLioRole] ADD MEMBER '' + @Quoted + N'';'');
PRINT '' [OK] '' + @LoginName + '' is lid van SQLioRole'';
END
ELSE
PRINT '' [--] '' + @LoginName + '' is al lid van SQLioRole'';';
DECLARE @Quoted nvarchar(300) = QUOTENAME(@LoginName);
EXEC [SQLioDB].sys.sp_executesql @Sql, N'@LoginName sysname, @Quoted nvarchar(300)', @LoginName, @Quoted;
PRINT '';
PRINT 'Klaar. ConfigConnection voor appsettings.json:';
PRINT ' Server=<server>;Database=SQLioDB;User Id=' + @LoginName + ';Password=<wachtwoord>;TrustServerCertificate=True;Application Name=SQLio';
PRINT 'Volgende stap: 03_SQLioDB_Schema.sql';
Vul bovenin het Windows-account in waaronder de application pool van SQLio draait, bijvoorbeeld DOMEIN\svc_sqlio.
-- ============================================================================
-- 02b_SQLioDB_Login_Windows.sql
-- SQLio v2 - nieuwe installatie, stap 2 (Windows-authenticatie)
--
-- Draaien op: master (SSMS), als sysadmin of met ALTER ANY LOGIN-recht.
-- Gebruik dit script als SQLio verbindt met een Windows-account. Verbindt SQLio
-- met een SQL-login, gebruik dan 02a_SQLioDB_Login_SQL.sql.
--
-- Welk account? Het account waaronder de app pool van SQLio in IIS draait:
-- - domeinserviceaccount (aanbevolen): DOMEIN\svc_SQLio
-- - app pool-identiteit (SQL Server lokaal): IIS APPPOOL\SQLio
-- - computeraccount van de webserver: DOMEIN\WEBSERVER$
--
-- Maakt aan:
-- 1. De Windows-login (als die nog niet bestaat).
-- 2. De gebruiker in SQLioDB, lid van SQLioRole.
--
-- Mag vaker gedraaid worden: wat al bestaat wordt overgeslagen.
-- ============================================================================
SET NOCOUNT ON;
DECLARE @AccountName sysname = N'<<DOMEIN\account>>';
-- ----------------------------------------------------------------------------
IF @AccountName LIKE N'<<%'
THROW 50001, 'Vul bovenin eerst @AccountName in: het Windows-account van de app pool.', 1;
IF DB_ID(N'SQLioDB') IS NULL
THROW 50002, 'Database SQLioDB bestaat niet. Draai eerst 01_SQLioDB_Database.sql.', 1;
PRINT 'SQLio v2 - stap 2: Windows-login ' + @AccountName;
PRINT '';
DECLARE @Sql nvarchar(max);
IF SUSER_ID(@AccountName) IS NULL
BEGIN
SET @Sql = N'CREATE LOGIN ' + QUOTENAME(@AccountName) + N' FROM WINDOWS WITH DEFAULT_DATABASE = [SQLioDB];';
EXEC sys.sp_executesql @Sql; -- faalt als SQL Server het account niet kent
PRINT ' [OK] Login ' + @AccountName + ' aangemaakt';
END
ELSE
PRINT ' [--] Login ' + @AccountName + ' bestaat al';
-- Gebruiker en rol in SQLioDB
SET @Sql = N'
IF DATABASE_PRINCIPAL_ID(@AccountName) IS NULL
BEGIN
EXEC (N''CREATE USER '' + @Quoted + N'' FOR LOGIN '' + @Quoted + N'';'');
PRINT '' [OK] Gebruiker '' + @AccountName + '' aangemaakt in SQLioDB'';
END
ELSE
PRINT '' [--] Gebruiker '' + @AccountName + '' bestaat al in SQLioDB'';
IF ISNULL(IS_ROLEMEMBER(N''SQLioRole'', @AccountName), 0) = 0
BEGIN
EXEC (N''ALTER ROLE [SQLioRole] ADD MEMBER '' + @Quoted + N'';'');
PRINT '' [OK] '' + @AccountName + '' is lid van SQLioRole'';
END
ELSE
PRINT '' [--] '' + @AccountName + '' is al lid van SQLioRole'';';
DECLARE @Quoted nvarchar(300) = QUOTENAME(@AccountName);
EXEC [SQLioDB].sys.sp_executesql @Sql, N'@AccountName sysname, @Quoted nvarchar(300)', @AccountName, @Quoted;
PRINT '';
PRINT 'Klaar. ConfigConnection voor appsettings.json:';
PRINT ' Server=<server>;Database=SQLioDB;Integrated Security=True;TrustServerCertificate=True;Application Name=SQLio';
PRINT 'Stel in IIS de identiteit van de app pool in op ' + @AccountName + '.';
PRINT 'Volgende stap: 03_SQLioDB_Schema.sql';
Maakt alle tabellen, relaties en procedures aan. Het script staat in het installatiepakket. Voer het uit op SQLioDB.
04_ERP_Database.sql. Zie de handleiding "Target Database Setup".
C:\inetpub\wwwroot\sqlio aan| Instelling | Waarde |
|---|---|
| Name | SQLio |
| .NET CLR Version | No Managed Code |
| Managed pipeline mode | Integrated |
Bij gebruik van Windows Authentication:
DOMEIN\svc_sqlio met bijbehorend wachtwoordSQLio verwerkt webhooks via een achtergrondservice die continu binnen de applicatie draait. Standaard legt IIS een Application Pool stil zodra er een tijd geen webverkeer is. Daardoor stopt ook de achtergrondservice en worden webhooks pas weer opgepakt zodra de applicatie opnieuw wordt aangeroepen. Om dit te voorkomen moet de Application Pool altijd actief blijven.
Configureer via IIS Manager → Application Pools → SQLio → Advanced Settings de volgende waarden:
| Instelling | Gewenste waarde | Toelichting |
|---|---|---|
Start Mode (startMode) |
AlwaysRunning | De pool start automatisch mee met IIS in plaats van pas bij de eerste aanvraag. |
Idle Time-out (idleTimeout) |
00:00:00 (0 minuten) | Schakelt het automatisch afsluiten na inactiviteit volledig uit. |
| Preload Enabled (op de website) | True | Zorgt dat de applicatie direct wordt geladen zodra de pool start. |
Preload Enabled stelt u in op de website zelf: IIS Manager → Sites → SQLio → Advanced Settings → Preload Enabled = True.
OnDemand, dan wordt de achtergrondservice tussentijds stilgelegd. Dit is de bevestiging dat de webhook-verwerking hierdoor pauzeert.
iisreset uitvoeren. Controleer daarna of de achtergrondservice blijft draaien, ook wanneer er langere tijd geen webverkeer is.
Er zijn drie opties voor de website binding, afhankelijk van uw situatie:
Gebruik deze optie als SQLio direct (zonder DMZ/reverse proxy) bereikbaar moet zijn.
| Veld | Waarde |
|---|---|
| Site name | SQLio |
| Application pool | SQLio |
| Physical path | C:\inetpub\wwwroot\sqlio |
| Binding Type | https |
| Host name | sqlio.uwbedrijf.nl |
| SSL certificate | Selecteer uw certificaat |
Gebruik deze optie als u een DMZ met reverse proxy gebruikt. Het SSL-certificaat zit dan op de reverse proxy, niet op SQLio zelf.
| Veld | Waarde |
|---|---|
| Site name | SQLio |
| Application pool | SQLio |
| Physical path | C:\inetpub\wwwroot\sqlio |
| Binding Type | http |
| Port | 5000 |
| Veld | Waarde |
|---|---|
| Site name | SQLio |
| Application pool | SQLio |
| Physical path | C:\inetpub\wwwroot\sqlio |
| Binding Type | http |
| Port | Kies een vrije poort (bijv. 8080) |
Open C:\inetpub\wwwroot\sqlio\appsettings.json en vul bij ConfigConnection de connection string in. Scripts 02a en 02b tonen aan het eind de juiste string.
Windows Authentication:
{
"ConnectionStrings": {
"ConfigConnection": "Server=SERVERNAAM;Database=SQLioDB;Trusted_Connection=True;TrustServerCertificate=True;Application Name=SQLio;"
}
}
SQL Authentication:
{
"ConnectionStrings": {
"ConfigConnection": "Server=SERVERNAAM;Database=SQLioDB;User Id=svc_sqlio;Password=UW_WACHTWOORD;TrustServerCertificate=True;Application Name=SQLio;"
}
}
appsettingsBHS.json, kopieer die dan niet mee. SQLio maakt dit bestand bij de eerste start zelf aan en bewaart daarin de licentie, de encryptiesleutel en de instellingen van deze installatie. Bij een update laat u het bestaande bestand staan.
Het service account heeft lees- én schrijfrechten nodig op de applicatiemap: SQLio schrijft zijn instellingen in appsettingsBHS.json.
Bij Custom Account (Windows Authentication):
C:\inetpub\wwwroot\sqlio → Properties → SecurityDOMEIN\svc_sqlioBij ApplicationPoolIdentity (SQL Authentication):
C:\inetpub\wwwroot\sqlio → Properties → SecurityIIS AppPool\SQLiohttps://sqlio.uwbedrijf.nlhttp://servernaam:5000 (intern)http://localhost:poortSQLio versleutelt connection strings en wachtwoorden van externe systemen met een eigen sleutel. Stel die in vóór u omgevingen aanmaakt:
Vraag de licentie aan via info@bhssolutions.nl en vul de licentiesleutel in bij Instellingen.
Maak bij Gebruikersbeheer de gebruikers aan die SQLio gaan beheren.
Controleer:
Oorzaak: ASP.NET Core Module niet geïnstalleerd
Oplossing: Herinstalleer de .NET 9.0 Hosting Bundle
Oorzaak: Applicatie kan niet starten
Oplossing:
Oorzaken:
Oorzaak: Application Pool identity is niet correct ingesteld
Oplossing:
Oorzaak: De Application Pool valt in idle-stand, waardoor de webhook-achtergrondservice tussentijds wordt stilgelegd
Oplossing:
AlwaysRunning00:00:00 (0 minuten)TrueOorzaak: WebSocket Protocol niet ingeschakeld
Oplossing: Server Manager → Web Server (IIS) → Application Development → WebSocket Protocol
Oorzaak: Certificaat niet vertrouwd of hostname komt niet overeen
Oplossing:
C:\inetpub\logs\LogFiles en de Windows Event Viewer voor gedetailleerde foutmeldingen.
Na succesvolle installatie: