Installatie Handleiding

Installatie van SQLio op Windows Server met IIS

Versie 2.0 — September 2026

Inhoudsopgave

  1. Vereisten
  2. Stap 1: .NET 9.0 Runtime Installeren
  3. Stap 2: SQLio Database Aanmaken
  4. Stap 3: SQLio Applicatie Installeren
  5. Stap 4: Configuratie
  6. Stap 5: Eerste start
  7. Probleemoplossing
  8. Volgende Stappen

Vereisten

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

WebSocket Protocol controleren

SQLio gebruikt WebSockets voor real-time communicatie. Controleer of dit is ingeschakeld:

  1. Open Server Manager → Add Roles and Features
  2. Ga naar Server Roles → Web Server (IIS) → Application Development
  3. Controleer of WebSocket Protocol is aangevinkt

Voorbereidende stap: SQL Login

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".

Stap 1: .NET 9.0 Runtime Installeren

Download en installeer de ASP.NET Core 9.0 Hosting Bundle:

  1. Ga naar https://dotnet.microsoft.com/download/dotnet/9.0
  2. Download de ASP.NET Core Runtime - Hosting Bundle
  3. Voer de installer uit op de webserver
  4. Herstart IIS na installatie:
iisreset
Belangrijk: Installeer de Hosting Bundle, niet alleen de Runtime. De Hosting Bundle bevat zowel de Runtime als de ASP.NET Core Module voor IIS.

Stap 2: SQLio Database Aanmaken

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.

Andere databasenaam? Vervang dan SQLioDB in de scripts 01, 02a/02b en 03 door de gewenste naam.

01_SQLioDB_Database.sql

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

02a_SQLioDB_Login_SQL.sql (SQL Authentication)

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';

02b_SQLioDB_Login_Windows.sql (Windows Authentication)

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';

03_SQLioDB_Schema.sql

Maakt alle tabellen, relaties en procedures aan. Het script staat in het installatiepakket. Voer het uit op SQLioDB.

Alleen op een lege database: Staan er al SQLio-tabellen in de database, dan stopt het script zonder iets te wijzigen. Een bestaande installatie werkt u bij met de migratiescripts van de nieuwe versie. Loopt het script halverwege vast, verwijder dan de database, los de oorzaak op en begin opnieuw bij 01.
ERP-databases: De databases waar SQLio mee werkt (bijvoorbeeld het ERP) richt u in met 04_ERP_Database.sql. Zie de handleiding "Target Database Setup".

Stap 3: SQLio Applicatie Installeren

Bestanden plaatsen

  1. Maak de map C:\inetpub\wwwroot\sqlio aan
  2. Pak het SQLio installatie bestand uit naar deze map

Application Pool aanmaken

  1. Open IIS Manager
  2. Rechtsklik op Application Pools → Add Application Pool
  3. Configureer:
Instelling Waarde
Name SQLio
.NET CLR Version No Managed Code
Managed pipeline mode Integrated
Tip: De instelling "No Managed Code" is correct voor .NET Core/.NET 5+ applicaties. De ASP.NET Core Module fungeert als reverse proxy naar de Kestrel webserver.

Application Pool Identity instellen

Bij gebruik van Windows Authentication:

  1. Rechtsklik op de SQLio Application Pool → Advanced Settings
  2. Onder Process Model, klik op Identity
  3. Kies Custom account
  4. Vul in: DOMEIN\svc_sqlio met bijbehorend wachtwoord
Let op: Bij SQL Authentication kunt u de standaard ApplicationPoolIdentity gebruiken. De authenticatie verloopt dan via de connection string.

Application Pool altijd actief houden

SQLio 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.

Belangrijk: Zonder onderstaande instellingen valt de webhook-achtergrondservice tussentijds stil en worden wachtende webhooks niet verwerkt totdat de applicatie weer wordt benaderd.

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.

Herkenning van het probleem: Staat Idle Time-out op de standaardwaarde van 20 minuten en Start Mode op OnDemand, dan wordt de achtergrondservice tussentijds stilgelegd. Dit is de bevestiging dat de webhook-verwerking hierdoor pauzeert.
Tip: Na het wijzigen van deze instellingen kunt u de pool recyclen (rechtsklik → Recycle) of iisreset uitvoeren. Controleer daarna of de achtergrondservice blijft draaien, ook wanneer er langere tijd geen webverkeer is.

Website aanmaken

Er zijn drie opties voor de website binding, afhankelijk van uw situatie:

Optie A: HTTPS met certificaat (directe toegang)

Gebruik deze optie als SQLio direct (zonder DMZ/reverse proxy) bereikbaar moet zijn.

  1. Rechtsklik op Sites → Add Website
  2. Configureer:
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

Optie B: HTTP intern (bij DMZ met reverse proxy)

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
Tip: Voor API toegang vanuit internet zie de handleidingen "API Publicatie" (zonder DMZ, direct in IIS) of "Publicatie via DMZ" (met reverse proxy). Bij DMZ moet de poort overeenkomen met de reverse proxy configuratie.

Optie C: HTTP op alternatieve poort (alleen voor test)

Alleen voor testdoeleinden! Gebruik deze optie alleen in een testomgeving. In productie is HTTPS verplicht voor de beveiliging van API's en data.
Veld Waarde
Site name SQLio
Application pool SQLio
Physical path C:\inetpub\wwwroot\sqlio
Binding Type http
Port Kies een vrije poort (bijv. 8080)

Stap 4: Configuratie

Connection String instellen

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 niet overnemen: Staat er in het installatiepakket een 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.

Bestandsrechten instellen

Het service account heeft lees- én schrijfrechten nodig op de applicatiemap: SQLio schrijft zijn instellingen in appsettingsBHS.json.

Bij Custom Account (Windows Authentication):

  1. Rechtsklik op de map C:\inetpub\wwwroot\sqlio → Properties → Security
  2. Klik Edit → Add
  3. Voer in: DOMEIN\svc_sqlio
  4. Geef Modify rechten

Bij ApplicationPoolIdentity (SQL Authentication):

  1. Rechtsklik op de map C:\inetpub\wwwroot\sqlio → Properties → Security
  2. Klik Edit → Add
  3. Type handmatig: IIS AppPool\SQLio
  4. Geef Modify rechten

Stap 5: Eerste start

  1. Start de SQLio website in IIS Manager
  2. Open een browser
  3. Ga naar de juiste URL:
  4. Log in. Bij de eerste installatie doet BHS Solutions dit met het beheeraccount.

Encryptiesleutel

SQLio versleutelt connection strings en wachtwoorden van externe systemen met een eigen sleutel. Stel die in vóór u omgevingen aanmaakt:

  1. Ga naar Instellingen
  2. Klik bij Encryptie Sleutel op Genereer nieuwe sleutel en sla op
Bewaar de sleutel veilig: Zonder deze sleutel is de opgeslagen configuratie niet meer te ontsleutelen. Wijzig hem niet meer als er al omgevingen zijn ingericht.

Licentie

Vraag de licentie aan via info@bhssolutions.nl en vul de licentiesleutel in bij Instellingen.

Gebruikers

Maak bij Gebruikersbeheer de gebruikers aan die SQLio gaan beheren.

Controleer:

Probleemoplossing

HTTP Error 500.19

Oorzaak: ASP.NET Core Module niet geïnstalleerd

Oplossing: Herinstalleer de .NET 9.0 Hosting Bundle

HTTP Error 502.5

Oorzaak: Applicatie kan niet starten

Oplossing:

Database Connection Failed

Oorzaken:

Login failed for user 'IIS APPPOOL\SQLio'

Oorzaak: Application Pool identity is niet correct ingesteld

Oplossing:

Webhooks worden niet (op tijd) verwerkt

Oorzaak: De Application Pool valt in idle-stand, waardoor de webhook-achtergrondservice tussentijds wordt stilgelegd

Oplossing:

Styling/CSS werkt niet correct

Oorzaak: WebSocket Protocol niet ingeschakeld

Oplossing: Server Manager → Web Server (IIS) → Application Development → WebSocket Protocol

Certificaat foutmelding (alleen Optie A)

Oorzaak: Certificaat niet vertrouwd of hostname komt niet overeen

Oplossing:

Tip: Bekijk de IIS logs in C:\inetpub\logs\LogFiles en de Windows Event Viewer voor gedetailleerde foutmeldingen.

Volgende Stappen

Na succesvolle installatie:

  1. ERP-databases klaarmaken — Zie handleiding "Target Database Setup"
  2. Omgevingen inrichten — Zie handleiding "Omgevingen"
  3. E-mail notificaties — Zie handleiding "Azure AD App Registration Setup"
  4. API toegang vanuit internet — Kies één van de volgende opties: