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, gestartet von launchd beim Systemstart - noch bevor sich jemand anmeldet - und nach einem Absturz neu. Er läuft unter Ihrem Konto; Daten und Protokoll liegen unter /usr/local/var.

  1. Die Einzeldatei

    Aus der Auslieferung (osx-arm64 oder osx-x64) - 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 osx-arm64
    cd einzeldatei/osx-arm64
  2. Programm, Daten und Protokoll

    Das Programm gehört root, Daten und Protokoll Ihrem Konto.

    bash
    sudo install -d -m 755 /usr/local/kuonensql /usr/local/var/log
    sudo install -m 755 Kuonen.Data.KuonenSql.Server /usr/local/kuonensql/
    sudo install -d -o "$(whoami)" -m 700 /usr/local/var/kuonensql
    sudo touch /usr/local/var/log/kuonensql.log && sudo chown "$(whoami)" /usr/local/var/log/kuonensql.log
  3. Dienstdatei

    Setzt Ihr Konto ein; die Datei kann nur root lesen - das sa-Kennwort steht darin. Kennwort unter KUONENSQL_SA_PASSWORD eintragen, wenn gewünscht weitere Ports.

    bash
    sed "s/BENUTZER/$(whoami)/" kuonensql.plist | sudo tee /Library/LaunchDaemons/kuonensql.plist > /dev/null
    sudo chown root:wheel /Library/LaunchDaemons/kuonensql.plist
    sudo chmod 600 /Library/LaunchDaemons/kuonensql.plist
    sudo nano /Library/LaunchDaemons/kuonensql.plist
  4. Starten

    Ab jetzt startet launchd den Server auch bei jedem Systemstart.

    bash
    sudo launchctl bootstrap system /Library/LaunchDaemons/kuonensql.plist
  5. Prüfen

    „state = running“ und im Protokoll „TDS-Server lauscht auf [::]:1433“.

    bash
    sudo launchctl print system/kuonensql | grep -E 'state|pid'
    tail -n 20 /usr/local/var/log/kuonensql.log

Die Dateien

kuonensql.plist

Gehört nach /Library/LaunchDaemons/kuonensql.plist. Im Quellstand: dist/dienst/macos/kuonensql.plist.

kuonensql.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
  KuonenSQL als launchd-Dienst (U19.10). Ablage: /Library/LaunchDaemons/kuonensql.plist, Besitzer root:wheel, Rechte 600
  (das sa-Kennwort steht hier). Den Platzhalter unter UserName ersetzt der Installationsschritt durch das Konto, unter dem der
  Server läuft - die Schritte stehen im Prüfstand unter Installation → macOS.
-->
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>kuonensql</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/kuonensql/Kuonen.Data.KuonenSql.Server</string>
        <string>1433</string>
        <string>6379</string>
    </array>
    <key>UserName</key>
    <string>BENUTZER</string>
    <key>WorkingDirectory</key>
    <string>/usr/local/var/kuonensql</string>
    <key>EnvironmentVariables</key>
    <dict>
        <key>KUONENSQL_DATEN_PFAD</key>
        <string>/usr/local/var/kuonensql</string>
        <!-- Die Einzeldatei entpackt ihre nativen Bibliotheken hierhin (ohne die Angabe unter $HOME/.net). -->
        <key>DOTNET_BUNDLE_EXTRACT_BASE_DIR</key>
        <string>/usr/local/var/kuonensql/.net</string>
        <!-- Kennwort von sa: gilt ab dem Start und bleibt als Hash im Datenordner; danach darf der Eintrag wieder leer werden. -->
        <key>KUONENSQL_SA_PASSWORD</key>
        <string></string>
        <!-- KSQL: TDS mit dem Kern als Sprache und ehrlicher Kennung (K33.1); leer = aus. -->
        <key>KUONENSQL_KSQL_PORT</key>
        <string>1333</string>
        <!-- Weitere Zugänge auf dieselbe Ablage; leer = aus. -->
        <key>KUONENSQL_MYSQL_PORT</key>
        <string></string>
        <key>KUONENSQL_POSTGRESQL_PORT</key>
        <string></string>
        <key>KUONENSQL_GRAPHQL_PORT</key>
        <string></string>
    </dict>
    <key>RunAtLoad</key>
    <true/>
    <!-- Nach einem Absturz neu starten, nach einem gewollten Ende (launchctl bootout) nicht. -->
    <key>KeepAlive</key>
    <dict>
        <key>SuccessfulExit</key>
        <false/>
    </dict>
    <!-- launchd beendet mit SIGTERM; so lange darf der Server seinen Kontrollpunkt schreiben. -->
    <key>ExitTimeOut</key>
    <integer>60</integer>
    <key>SoftResourceLimits</key>
    <dict>
        <key>NumberOfFiles</key>
        <integer>65536</integer>
    </dict>
    <key>StandardOutPath</key>
    <string>/usr/local/var/log/kuonensql.log</string>
    <key>StandardErrorPath</key>
    <string>/usr/local/var/log/kuonensql.log</string>
</dict>
</plist>

Im Betrieb

Protokoll laufend ansehen

bash
tail -f /usr/local/var/log/kuonensql.log

Neu starten

bash
sudo launchctl kickstart -k system/kuonensql

Auf eine neue Fassung

bash
sudo launchctl bootout system/kuonensql
sudo install -m 755 Kuonen.Data.KuonenSql.Server /usr/local/kuonensql/
sudo launchctl bootstrap system /Library/LaunchDaemons/kuonensql.plist

Entfernen (die Daten in /usr/local/var/kuonensql bleiben)

bash
sudo launchctl bootout system/kuonensql
sudo rm /Library/LaunchDaemons/kuonensql.plist

Gut zu wissen

  • Eine heruntergeladene Einzeldatei hält Gatekeeper zurück: vor dem Kopieren xattr -d com.apple.quarantine Kuonen.Data.KuonenSql.Server.
  • Unter Windows oder Linux für macOS gebaut, fehlt die Signatur: codesign --force --sign - Kuonen.Data.KuonenSql.Server.
  • Ist die Firewall von macOS an, Zugriffe von anderen Rechnern erlauben: sudo /usr/libexec/ApplicationFirewall/socketfilterfw --add /usr/local/kuonensql/Kuonen.Data.KuonenSql.Server.
  • launchd beendet den Dienst mit SIGTERM und wartet bis zu 60 Sekunden (ExitTimeOut); der Server schreibt in der Zeit seinen Kontrollpunkt.

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.