Kuonen SQL

Installation

Mit Docker in einer Minute, oder direkt auf dem Rechner als Dienst, der mit dem System startet: unter Linux mit systemd, unter macOS mit launchd, unter Windows als Windows-Dienst. Jeder Weg führt Schritt für Schritt hin, die Dienstdateien liegen fertig bereit.

Der Server als Einzeldatei mit eingebauter .NET-Laufzeit, gestartet und überwacht von systemd: unter einem eigenen Benutzer ohne Anmeldung, schreiben darf er nur in seinen Datenordner. Läuft auf jeder Verteilung mit systemd (Debian, Ubuntu, Fedora, RHEL, SUSE).

  1. Die Einzeldatei

    Aus der Auslieferung (linux-x64 oder linux-arm64) - oder aus dem Quellstand gebaut, mit dem .NET 10 SDK und PowerShell 7. Die .NET-Laufzeit ist darin enthalten, auf dem Zielrechner muss nichts installiert sein. Die folgenden Schritte laufen im Ordner mit der Einzeldatei und den Dateien unten.

    bash
    pwsh dist/einzeldatei-bauen.ps1 -Plattform linux-x64
    cd einzeldatei/linux-x64
  2. Benutzer und Programm

    Ein Systembenutzer ohne Heimatverzeichnis und ohne Anmeldung; das Programm gehört root.

    bash
    sudo useradd --system --no-create-home --shell /usr/sbin/nologin kuonensql
    sudo install -d -m 755 /opt/kuonensql
    sudo install -m 755 Kuonen.Data.KuonenSql.Server /opt/kuonensql/
  3. Einstellungen

    Die Datei kann nur root lesen - das sa-Kennwort steht darin. Kennwort eintragen, wenn gewünscht weitere Ports.

    bash
    sudo install -d -m 755 /etc/kuonensql
    sudo install -m 600 kuonensql.env /etc/kuonensql/kuonensql.env
    sudoedit /etc/kuonensql/kuonensql.env
  4. Dienst einrichten und starten

    enable --now startet ihn sofort und bei jedem Systemstart. Den Datenordner /var/lib/kuonensql legt systemd selbst an.

    bash
    sudo install -m 644 kuonensql.service /etc/systemd/system/kuonensql.service
    sudo systemctl daemon-reload
    sudo systemctl enable --now kuonensql
  5. Prüfen

    „active (running)“ und im Protokoll „TDS-Server lauscht auf [::]:1433“.

    bash
    systemctl status kuonensql
  6. Firewall öffnen (wenn andere Rechner zugreifen)

    Je nach Verteilung ufw oder firewalld; nur die Ports, die gebraucht werden.

    bash
    sudo ufw allow 1433/tcp
    # oder: sudo firewall-cmd --permanent --add-port=1433/tcp && sudo firewall-cmd --reload

Die Dateien

kuonensql.service

Gehört nach /etc/systemd/system/kuonensql.service. Im Quellstand: dist/dienst/linux/kuonensql.service.

kuonensql.service
# KuonenSQL als systemd-Dienst (U19.10).
# Ablage: /etc/systemd/system/kuonensql.service - die Schritte stehen im Prüfstand unter Installation → Linux.
# Einstellungen (Ports, sa-Kennwort) gehören in /etc/kuonensql/kuonensql.env, nicht hierher: so bleibt diese Datei bei
# einer neuen Fassung austauschbar, und das Kennwort liegt in einer Datei, die nur root lesen kann.

[Unit]
Description=KuonenSQL Datenbankserver
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=kuonensql
Group=kuonensql
ExecStart=/opt/kuonensql/Kuonen.Data.KuonenSql.Server 1433 6379
WorkingDirectory=/var/lib/kuonensql
# Daten und Protokoll; die Einzeldatei entpackt ihre nativen Bibliotheken nach DOTNET_BUNDLE_EXTRACT_BASE_DIR (ohne die Angabe
# unter $HOME/.net - der Dienstbenutzer hat kein Heimatverzeichnis). Werte in der env-Datei gehen diesen beiden vor.
Environment=KUONENSQL_DATEN_PFAD=/var/lib/kuonensql
Environment=DOTNET_BUNDLE_EXTRACT_BASE_DIR=/var/cache/kuonensql
EnvironmentFile=-/etc/kuonensql/kuonensql.env
StateDirectory=kuonensql
StateDirectoryMode=0750
CacheDirectory=kuonensql
# Beenden mit SIGTERM: der Server schreibt einen Kontrollpunkt und meldet "Server ordnungsgemaess heruntergefahren".
TimeoutStopSec=60
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
# Härtung: schreiben darf der Dienst nur in /var/lib/kuonensql und /var/cache/kuonensql.
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
PrivateDevices=true
ProtectKernelTunables=true
ProtectControlGroups=true

[Install]
WantedBy=multi-user.target

kuonensql.env

Gehört nach /etc/kuonensql/kuonensql.env. Im Quellstand: dist/dienst/linux/kuonensql.env.

kuonensql.env
# Einstellungen des Dienstes kuonensql (U19.10). Ablage: /etc/kuonensql/kuonensql.env, Rechte 600 (root).
# Eine Zeile je Einstellung, NAME=Wert, ohne Anführungszeichen. Nach einer Änderung: sudo systemctl restart kuonensql

# Kennwort von sa. Es gilt ab dem Start und bleibt als Hash im Datenordner - die Zeile darf danach wieder leer werden.
KUONENSQL_SA_PASSWORD=

# KSQL: TDS mit dem Kern als Sprache und ehrlicher Kennung (K33.1); leer = aus.
KUONENSQL_KSQL_PORT=1333

# Weitere Zugänge auf dieselbe Ablage; leer = aus.
KUONENSQL_MYSQL_PORT=
KUONENSQL_MARIADB_PORT=
KUONENSQL_POSTGRESQL_PORT=
KUONENSQL_GRAPHQL_PORT=

# Sortierung von master, tempdb und jeder neuen Datenbank ohne eigenes COLLATE.
KUONENSQL_SORTIERUNG=SQL_Latin1_General_CP1_CI_AS

Im Betrieb

Protokoll laufend ansehen

bash
journalctl -u kuonensql -f

Neu starten (nach einer Änderung der Einstellungen)

bash
sudo systemctl restart kuonensql

Auf eine neue Fassung

bash
sudo systemctl stop kuonensql
sudo install -m 755 Kuonen.Data.KuonenSql.Server /opt/kuonensql/
sudo systemctl start kuonensql

Entfernen (die Daten in /var/lib/kuonensql bleiben)

bash
sudo systemctl disable --now kuonensql
sudo rm /etc/systemd/system/kuonensql.service
sudo systemctl daemon-reload

Gut zu wissen

  • Bricht der Start mit „Couldn't find a valid ICU package“ ab, fehlt ICU (siehe Voraussetzungen).
  • systemd beendet den Dienst mit SIGTERM und wartet bis zu 60 Sekunden; der Server schreibt in der Zeit seinen Kontrollpunkt.
  • Das Kennwort gilt ab dem Start und bleibt als Hash im Datenordner; die Zeile in kuonensql.env darf danach wieder leer werden.

Verbinden

Mit SSMS: Servername localhost,1433, SQL Server-Authentifizierung, Anmeldung sa, unter „Verbindungssicherheit“ Serverzertifikat vertrauen. Aus einer Anwendung:

Verbindungszeichenfolge
Server=localhost,1433;User Id=sa;Password=<Ihr-Kennwort>;TrustServerCertificate=True

Alle Zugänge mit ihren Werkzeugen stehen unter Zugriff.

Anmelden beim ersten Start

Das Kennwort von sa setzt KUONENSQL_SA_PASSWORD beim Start — wie MSSQL_SA_PASSWORD bei SQL Server. Es bleibt als Hash im Datenordner. Ohne jedes Kennwort ist sa offen, und der Start warnt. Später ändert es:

T-SQL
ALTER LOGIN sa WITH PASSWORD = 'Ein-Starkes-Kennwort!2026';

Umgebungsvariablen

NameBedeutungVorgabe
KUONENSQL_DATEIFREIGABEWelche Ordner der Server nach außen zeigt (sys.dm_os_enumerate_filesystem/-file_exists, der Durchsuchen-Dialog von SSMS): Keine, Daten, Protokoll, Sicherung, Serverordner, Alles - mehrere mit Komma verbunden.Serverordner
KUONENSQL_SORTIERUNGDie Sortierung von master/tempdb und jeder neuen Datenbank ohne eigenes COLLATE. Jeder Name aus sys.fn_helpcollations(); ein unbekannter Name wird übergangen.SQL_Latin1_General_CP1_CI_AS
KUONENSQL_RESTZIELEDie Zielliste für den Ruf nach draußen (S12.5, z. B. externe KI-Modelle) - ohne sie geht kein Byte hinaus.leer
KUONENSQL_KSQL_PORTDer KSQL-Port: derselbe TDS-Draht, aber die Sitzung spricht den Kern ohne die Beschränkungen anderer Systeme und nennt die echte Fassung und das echte Wirtssystem. Ohne diese Variable bleibt er AUS; die Dienstvorlagen setzen 1333.aus
KUONENSQL_MARIADB_PORTDer MariaDB-Port. Ohne diese Variable (oder ein drittes Startargument) bleibt der MariaDB-Draht AUS - eine zweite Tür geht nur auf, wer sie will.aus
KUONENSQL_GRAPHQL_PORTDer HTTP-Port für GraphQL (/graphql) und SPARQL (/sparql). Ohne ihn (oder ein viertes Startargument) bleiben beide AUS; angemeldet wird nur mit Kennwort.aus
KUONENSQL_MARIADB_ANMELDUNGDas MariaDB-Anmeldeverfahren (mysql_native_password, caching_sha2_password, client_ed25519).—
KUONENSQL_TLS_CERT_PATHPfad zu einem PFX-Serverzertifikat. Ohne Angabe erzeugt der Server beim ersten Verbindungsaufbau - wie SQL Server - ein selbstsigniertes Zertifikat (CN=KuonenSQL).—
KUONENSQL_TLS_CERT_PASSWORDDas Kennwort des PFX-Zertifikats.—
KUONENSQL_FORCE_ENCRYPTIONVerschlüsselung erzwingen - auch ein Client mit Encrypt=False bekommt dann die volle Verbindung verschlüsselt.false
KUONENSQL_VERSIONSTEXTErsetzt den Text von @@VERSION am T-SQL-Zugang, etwa durch "Kuonen SQL Server 2026 17.0". Die Produktversion bleibt 17.0; ob ein Werkzeug den Text liest, zeigt nur der Versuch.Ansage als SQL Server 2025
KUONENSQL_TLS_DISABLEDKeine Verschlüsselung anbieten; ein Client mit Encrypt=True wird abgewiesen.false
KUONENSQL_DATEN_PFADDer persistente Datenpfad auf dem Host (Bind-Mount nach /app/data)../Daten/kuonensql
KUONENSQL_PORTDer TDS-Port des Containers nach außen.1433
KUONENSQL_REDIS_PORTDer Redis-Port des Containers nach außen.6379

Verschlüsselung (TLS)

Ohne eigenes Zertifikat erzeugt der Server beim ersten Verbindungsaufbau — wie SQL Server — ein selbstsigniertes Zertifikat (CN=KuonenSQL). Clients brauchen dann TrustServerCertificate=True (in SSMS: „Serverzertifikat vertrauen“). Ein eigenes PFX-Zertifikat binden KUONENSQL_TLS_CERT_PATH und KUONENSQL_TLS_CERT_PASSWORD ein.

Lizenz

Das Docker-Abbild ist der geschützte Auslieferungsbau (dist/build-protected.sh): signiert, verschleiert und mit Lizenzprüfung vor dem Start. Der gewöhnliche Entwicklungsbau — auch die selbst gebaute Einzeldatei — prüft keine Lizenz.

Für Entwickler: aus dem Quellstand

Das Abbild selbst bauen: Die Befehle laufen im Ordner KuonenSQL des Repos Kuonen, der Bau-Kontext ist dessen Wurzel; docker-compose.yml, .env.beispiel und das mehrstufige Dockerfile liegen unter KuonenSQL/docker/ (siehe KuonenSQL/docker/README.md).

ZweckBefehl
Bauen und im Hintergrund startendocker-compose --project-directory . --env-file docker/.env -f docker/docker-compose.yml up -d --build
Protokolle ansehendocker-compose --project-directory . --env-file docker/.env -f docker/docker-compose.yml logs -f
Stoppendocker-compose --project-directory . --env-file docker/.env -f docker/docker-compose.yml down
Veröffentlichtes Abbild ziehen, statt selbst zu bauendocker pull kuomar/kuonensql:latest
Ohne Compose, mit den Vorgabeports 1433/6379docker run -d --name kuonensql-server -p 1433:1433 -p 6379:6379 -e KUONENSQL_SORTIERUNG=SQL_Latin1_General_CP1_CI_AS -v kuonensql-daten:/app/data kuomar/kuonensql:latest
Bauen (Windows x64, Vorgabe)powershell -ExecutionPolicy Bypass -File dist\einzeldatei-bauen.ps1
Bauen für eine andere Plattformpowershell -ExecutionPolicy Bypass -File dist\einzeldatei-bauen.ps1 -Plattform linux-x64
StartenKuonen.Data.KuonenSql.Server 1433 6379

Die Einzeldatei bringt die .NET-Laufzeit mit, verzichtet aber noch nicht auf den JIT (Native AOT, Roadmap L6.3). Für macOS ist sie unkomprimiert: Unter .NET 10.0.6 stürzt eine komprimierte Einzeldatei dort beim Annehmen von Verbindungen ab.