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).
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.
bashpwsh dist/einzeldatei-bauen.ps1 -Plattform linux-x64 cd einzeldatei/linux-x64Benutzer und Programm
Ein Systembenutzer ohne Heimatverzeichnis und ohne Anmeldung; das Programm gehört root.
bashsudo 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/Einstellungen
Die Datei kann nur root lesen - das sa-Kennwort steht darin. Kennwort eintragen, wenn gewünscht weitere Ports.
bashsudo install -d -m 755 /etc/kuonensql sudo install -m 600 kuonensql.env /etc/kuonensql/kuonensql.env sudoedit /etc/kuonensql/kuonensql.envDienst einrichten und starten
enable --now startet ihn sofort und bei jedem Systemstart. Den Datenordner /var/lib/kuonensql legt systemd selbst an.
bashsudo install -m 644 kuonensql.service /etc/systemd/system/kuonensql.service sudo systemctl daemon-reload sudo systemctl enable --now kuonensqlPrüfen
„active (running)“ und im Protokoll „TDS-Server lauscht auf [::]:1433“.
bashsystemctl status kuonensqlFirewall öffnen (wenn andere Rechner zugreifen)
Je nach Verteilung ufw oder firewalld; nur die Ports, die gebraucht werden.
bashsudo 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 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.
# 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
journalctl -u kuonensql -fNeu starten (nach einer Änderung der Einstellungen)
sudo systemctl restart kuonensqlAuf eine neue Fassung
sudo systemctl stop kuonensql
sudo install -m 755 Kuonen.Data.KuonenSql.Server /opt/kuonensql/
sudo systemctl start kuonensqlEntfernen (die Daten in /var/lib/kuonensql bleiben)
sudo systemctl disable --now kuonensql
sudo rm /etc/systemd/system/kuonensql.service
sudo systemctl daemon-reloadGut 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:
Server=localhost,1433;User Id=sa;Password=<Ihr-Kennwort>;TrustServerCertificate=TrueAlle 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:
ALTER LOGIN sa WITH PASSWORD = 'Ein-Starkes-Kennwort!2026';Umgebungsvariablen
| Name | Bedeutung | Vorgabe |
|---|---|---|
KUONENSQL_DATEIFREIGABE | Welche 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_SORTIERUNG | Die 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_RESTZIELE | Die Zielliste für den Ruf nach draußen (S12.5, z. B. externe KI-Modelle) - ohne sie geht kein Byte hinaus. | leer |
KUONENSQL_KSQL_PORT | Der 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_PORT | Der 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_PORT | Der 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_ANMELDUNG | Das MariaDB-Anmeldeverfahren (mysql_native_password, caching_sha2_password, client_ed25519). | — |
KUONENSQL_TLS_CERT_PATH | Pfad zu einem PFX-Serverzertifikat. Ohne Angabe erzeugt der Server beim ersten Verbindungsaufbau - wie SQL Server - ein selbstsigniertes Zertifikat (CN=KuonenSQL). | — |
KUONENSQL_TLS_CERT_PASSWORD | Das Kennwort des PFX-Zertifikats. | — |
KUONENSQL_FORCE_ENCRYPTION | Verschlüsselung erzwingen - auch ein Client mit Encrypt=False bekommt dann die volle Verbindung verschlüsselt. | false |
KUONENSQL_VERSIONSTEXT | Ersetzt 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_DISABLED | Keine Verschlüsselung anbieten; ein Client mit Encrypt=True wird abgewiesen. | false |
KUONENSQL_DATEN_PFAD | Der persistente Datenpfad auf dem Host (Bind-Mount nach /app/data). | ./Daten/kuonensql |
KUONENSQL_PORT | Der TDS-Port des Containers nach außen. | 1433 |
KUONENSQL_REDIS_PORT | Der 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).
| Zweck | Befehl |
|---|---|
| Bauen und im Hintergrund starten | docker-compose --project-directory . --env-file docker/.env -f docker/docker-compose.yml up -d --build |
| Protokolle ansehen | docker-compose --project-directory . --env-file docker/.env -f docker/docker-compose.yml logs -f |
| Stoppen | docker-compose --project-directory . --env-file docker/.env -f docker/docker-compose.yml down |
| Veröffentlichtes Abbild ziehen, statt selbst zu bauen | docker pull kuomar/kuonensql:latest |
| Ohne Compose, mit den Vorgabeports 1433/6379 | docker 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 Plattform | powershell -ExecutionPolicy Bypass -File dist\einzeldatei-bauen.ps1 -Plattform linux-x64 |
| Starten | Kuonen.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.