Installing skaidb
Every release is published as compiled, signed packages at repo.dsys.org. Every bundle ships two binaries:
skaidb— the database server (binary + REST endpoints, clustering).skaidbsh— the unified shell and admin client: an interactive SQL shell that connects over the network (with nearest-node selection and failover), plus cluster membership and configuration commands (cluster,config,status,metrics) — see CLUSTERING.md. It can also open a data directory directly with--localfor offline use.
skaidb-mcp ships separately, as its own package and its own archive
(skaidb-mcp_X.Y.Z_amd64.deb, skaidb-mcp-X.Y.Z-<target>.tar.gz, and a raw
.exe on Windows). It is the MCP server that exposes a database to
an LLM, and it belongs on the machine running the LLM client — a laptop or
workstation — which is usually not a database host. Installing it does not
install a server, and installing a server does not install it.
Replace
X.Y.Zbelow with the release you want (e.g.0.320.9).
Contents
- System requirements
- Which download do I want?
- Package repository (apt / dnf)
- Verifying the download
- Linux
- Debian / Ubuntu (.deb)
- Fedora / RHEL / CentOS / Rocky / Alma (.rpm)
- openSUSE (.rpm)
- Any distro — tarball (glibc)
- Any distro / Alpine — static musl tarball
- macOS
- Disk image (.dmg)
- Tarball
- Windows
- Zip archive
- Standalone .exe
- Binary-only (no package, no build)
- Run it / verify the install
- Upgrading
- Uninstalling
System requirements
| Minimum | Recommended | |
|---|---|---|
| CPU | 1 core (x86-64 or ARM64) | 2+ cores |
| RAM | 512 MB | 2 GB+ |
| Disk | 1 GB free beyond your data | SSD/NVMe, 2–3× your expected data size |
- RAM: the default memtable alone budgets 256 MB. On boxes at or near
the minimum, set
storage.memory_target("auto", or an explicit"256MB"/"2GB") so the memtable, read cache, search-index writer heaps and the per-statement scan ceilings share one budget sized to this node instead of assuming a bigger machine."auto"reads the smallest memory limit that applies to the process — its own cgroup (aMemoryMax=on the unit counts), every parent cgroup, the container — so a service gets its own cap rather than its container's or the host's; an explicit target above that limit is clamped to half of it and logged with both numbers. That cap is only honest if the host can actually give it: a container limit above the host's free memory makes the host reclaim from the node. The node then releases its caches when it sees a memory stall (PSI) and logsmemory pressure from outside this process, but on an over-committed host set an explicitmemory_targetbelow what the host can really spare. A 3-node test cluster runs comfortably in 1 GB per node. - Disk: LSM compaction needs transient headroom (it rewrites
overlapping sstables before deleting the old ones), the WAL adds its own
footprint, and a full-text
SEARCH INDEXtypically adds another 0.5–1× the size of the text it indexes — hence 2–3× your expected live data. Watch real usage withSHOW STATUS(disk_bytes,wal_bytes,search.*.disk_bytes). - Cluster: the same figures apply per node; total storage scales with the replication factor (default 3 — every row is stored RF times).
When the disk fills up
skaidb keeps running on a full volume; it stops taking new data. Below the
iwm.disk_low_watermark of free space (default min(5%, 2GB)) — or the
moment any write actually fails with No space left on device — the node
enters IWM state 3: /ready answers 503, /status shows
iwm.disk_write_block: true, and INSERT/UPDATE/remote-write get the
retryable error disk full: node is blocking writes, retry (drivers treat
it like memory shedding: back off and retry, or fail over on a cluster).
Reads, DELETE, DDL, retention and compaction keep working: the node gives
back a reserve file it keeps for exactly this (iwm.disk_reserve, 64 MB by
default) so tombstones and compaction output have somewhere to go. A write
that had already committed is never lost to a full disk — it is in the WAL
and the memtable, and the flush it triggered is retried once space exists.
Restarting on a full disk is safe.
To recover, free space and wait ~10 s: drop or truncate a table you can
spare, lower a partitioned table's ttl so whole partitions drop, delete files that
are not skaidb's, or grow the volume. Once free space is back above
iwm.disk_resume_watermark (default twice the low watermark) plus the
reserve, the node logs writes resumed, /ready returns 200 and blocked
clients' retries succeed. Metrics to watch: skaidb_iwm_state,
skaidb_iwm_disk_enospc_trips_total (non-zero = the watermark was too low
for this node's compaction outputs; raise it) and
skaidb_storage_build_failures_total.
Which download do I want?
| Platform | CPU | Recommended | Also available |
|---|---|---|---|
| Debian, Ubuntu, Mint, … | x86-64 | skaidb_X.Y.Z_amd64.deb |
tarball |
| Debian, Ubuntu, … | ARM64 | skaidb_X.Y.Z_arm64.deb |
tarball |
| Fedora, RHEL, Rocky, Alma, openSUSE | x86-64 | skaidb-X.Y.Z-1.x86_64.rpm |
tarball |
| Fedora, RHEL, … | ARM64 | skaidb-X.Y.Z-1.aarch64.rpm |
tarball |
| Alpine / "any Linux, no deps" | x86-64 | skaidb-X.Y.Z-x86_64-unknown-linux-musl.tar.gz (static) |
— |
| Alpine / "any Linux, no deps" | ARM64 | skaidb-X.Y.Z-aarch64-unknown-linux-musl.tar.gz (static) |
— |
| Any Linux (glibc) | x86-64 | skaidb-X.Y.Z-x86_64-unknown-linux-gnu.tar.gz |
.deb/.rpm |
| Any Linux (glibc) | ARM64 | skaidb-X.Y.Z-aarch64-unknown-linux-gnu.tar.gz |
.deb/.rpm |
| macOS | Apple Silicon (M-series) | skaidb-X.Y.Z-aarch64-apple-darwin.dmg |
.tar.gz |
| macOS | Intel | skaidb-X.Y.Z-x86_64-apple-darwin.dmg |
.tar.gz |
| Windows | x86-64 | skaidb-X.Y.Z-x86_64-pc-windows-msvc.zip |
standalone .exe |
| Docker / compose | any | build from docker/ (DOCKER.md) — every config key as a SKAIDB_* env var |
— |
What releases actually publish today: the .deb and .rpm for x86-64 and
ARM64 (from the package repository), and the
static musl tarball for x86-64 (from
repo.dsys.org/dl/skaidb). The glibc
tarballs, the macOS builds and the Windows build are not currently produced —
on those platforms build from source, or run the server under
Docker.
Not sure of your CPU? uname -m on Linux/macOS (x86_64 → amd64/x86_64,
aarch64/arm64 → ARM64). On Apple Silicon Macs uname -m prints arm64.
Package repository (apt / dnf)
Every release is also published to a signed package repository at
repo.dsys.org, so apt/dnf handle installs and upgrades (no
manual downloads):
# Debian / Ubuntu
curl -fsSL https://repo.dsys.org/pubkey.gpg \
| sudo tee /etc/apt/keyrings/repo-dsys.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/repo-dsys.gpg] https://repo.dsys.org/deb stable main" \
| sudo tee /etc/apt/sources.list.d/repo-dsys.list
sudo apt update && sudo apt install skaidb
# Fedora / RHEL / Rocky / Alma
sudo tee /etc/yum.repos.d/repo-dsys.repo <<'EOF'
[repo-dsys]
name=repo.dsys.org
baseurl=https://repo.dsys.org/rpm
enabled=1
gpgcheck=0
repo_gpgcheck=1
gpgkey=https://repo.dsys.org/pubkey.gpg
EOF
sudo dnf install skaidb
Upgrades are then just apt upgrade / dnf upgrade (in a cluster, upgrade one
node at a time). The sections below cover installing directly from downloaded
package files instead.
Verifying the download (recommended)
Each release includes SHA256SUMS covering every asset, and
SHA256SUMS.minisig — a minisign
signature over it. Verifying the signature and then the checksums
authenticates every asset. The skaidb release public key:
RWRy23pp77/D3ct8mR6AjZBwdpha5AveYo3tvqcZf+ls9JeMRODnm92C
# 1. The signature (minisign, or rsign2 — same key/signature format).
minisign -Vm SHA256SUMS -P RWRy23pp77/D3ct8mR6AjZBwdpha5AveYo3tvqcZf+ls9JeMRODnm92C
# 2. The checksums.
# Linux
sha256sum -c SHA256SUMS --ignore-missing
# macOS
shasum -a 256 -c SHA256SUMS --ignore-missing
The trusted comment inside the signature names the release tag it was
made for — minisign -Vm prints it on success.
# Windows (PowerShell): compare the printed hash to the matching line in SHA256SUMS
Get-FileHash .\skaidb-X.Y.Z-x86_64-pc-windows-msvc.zip -Algorithm SHA256
Select-String skaidb-X.Y.Z-x86_64-pc-windows-msvc.zip .\SHA256SUMS
A ... : OK line (Linux/macOS) means the file is intact. (Releases are not
GPG-signed; verify over HTTPS from the official repo.)
Linux
The .deb/.rpm install skaidb and skaidbsh to /usr/bin and drop the
license + README under /usr/share/doc/skaidb/.
Debian / Ubuntu (.deb)
# x86-64
sudo apt install ./skaidb_X.Y.Z_amd64.deb
# ARM64
sudo apt install ./skaidb_X.Y.Z_arm64.deb
apt install ./file.deb resolves dependencies. On older systems without that
syntax, use sudo dpkg -i skaidb_X.Y.Z_amd64.deb (then sudo apt -f install if
it reports missing deps).
Fedora / RHEL / CentOS / Rocky / Alma (.rpm)
# x86-64
sudo dnf install ./skaidb-X.Y.Z-1.x86_64.rpm
# ARM64
sudo dnf install ./skaidb-X.Y.Z-1.aarch64.rpm
On older systems use sudo yum install ./skaidb-X.Y.Z-1.x86_64.rpm, or
sudo rpm -i skaidb-X.Y.Z-1.x86_64.rpm for a dependency-free install.
openSUSE (.rpm)
sudo zypper install ./skaidb-X.Y.Z-1.x86_64.rpm
Any distro — tarball (glibc)
For distros where you'd rather not use a package, or to install without root:
tar xzf skaidb-X.Y.Z-x86_64-unknown-linux-gnu.tar.gz # → skaidb, skaidbsh, LICENSE, README.md
sudo install -m 0755 skaidb skaidbsh /usr/local/bin/
# …or, no root, into your user path:
mkdir -p ~/.local/bin && install -m 0755 skaidb skaidbsh ~/.local/bin/
Use the aarch64-unknown-linux-gnu tarball on ARM64. The glibc build needs a
reasonably recent glibc; if you hit a GLIBC_… error, use the musl build below.
Any distro / Alpine — static musl tarball
A fully static build with no libc dependency — works on Alpine and anywhere the
glibc build won't. Tarballs are published at
repo.dsys.org/dl/skaidb — one directory per
version, plus latest/, each with a SHA256SUMS signed by the same key that
signs the apt/dnf metadata:
V=X.Y.Z
base="https://repo.dsys.org/dl/skaidb/$V"
curl -fLO "$base/skaidb-$V-x86_64-unknown-linux-musl.tar.gz"
curl -fLO "$base/SHA256SUMS"
sha256sum -c --ignore-missing SHA256SUMS
tar xzf "skaidb-$V-x86_64-unknown-linux-musl.tar.gz"
sudo install -m 0755 skaidb skaidbsh /usr/local/bin/
To check the signature too, import the repo key
(curl -fsSL https://repo.dsys.org/pubkey.asc | gpg --import) and run
gpg --verify SHA256SUMS.asc SHA256SUMS.
Run as a service (systemd)
The .deb / .rpm install a systemd unit and a default config, and create an
unprivileged skaidb system account that owns the data directory:
| Path | Purpose |
|---|---|
/lib/systemd/system/skaidb.service |
the service unit |
/etc/skaidb/skaidb.toml |
main configuration (not overwritten on upgrade) |
/etc/default/skaidb |
optional SKAIDB_* env overrides (win over the file) |
/var/lib/skaidb |
data directory, owned by the skaidb user |
Installing does not auto-start the server, so you can configure it first:
sudoedit /etc/skaidb/skaidb.toml # set bind_addr, cluster seeds, etc.
sudo systemctl enable --now skaidb # start now and on boot
systemctl status skaidb
journalctl -u skaidb -f # follow the logs
For a cluster, the per-host bits are easiest as env overrides in
/etc/default/skaidb (consistency levels are case-insensitive):
SKAIDB_BIND_ADDR=192.168.7.3
SKAIDB_SEEDS=192.168.7.3:7100,192.168.7.4:7100
SKAIDB_REPLICATION_FACTOR=2
SKAIDB_DEFAULT_READ_CONSISTENCY=ALL
SKAIDB_DEFAULT_WRITE_CONSISTENCY=ALL
Then sudo systemctl restart skaidb — after a package upgrade, run
skaidb --config /etc/skaidb/skaidb.toml --check-config first: the new
binary validates the live file (unknown keys warn, out-of-range values and
bad addresses refuse) without touching the data directory. Health is at
http://<bind_addr>:7080/health and metrics at :9090/metrics
(see METRICS.md). Uninstalling leaves /var/lib/skaidb and the
skaidb account in place so data is never destroyed by a package removal.
Memory limits. Memory protection is in-process: memory_target
sizes the caches against the limit the process runs under (the smallest
memory.max from the service's cgroup up to the container, else system
RAM), and the memory guard releases caches at 75% and sheds client writes
at 85% of that limit (see CLUSTER_OPERATIONS.md, "Memory-pressure release and
load shedding"). The package sets no kernel memory.high on the
service — the unit says MemoryHigh=infinity and ships no drop-in —
because memory.high is charged with page cache: on a node whose data exceeds its RAM a value
below the container's limit holds the service at the line permanently,
the kernel reclaims in the allocating thread and can put it to sleep
while it holds a lock. systemctl show skaidb -p MemoryHigh prints
infinity and the service cgroup's memory.high reads max. An upgrade
removes the /etc/systemd/system/skaidb.service.d/50-memory-high.conf an
older package generated (only that generated file; other drop-ins are
left alone) and reloads systemd before it restarts the service, so the
one restart of the upgrade runs without the limit. To add a kernel-side
limit of your own, put MemoryMax= (or MemoryHigh=) in a drop-in
(systemctl edit skaidb): the guard measures usage and stall pressure on
the container unless the service, or a slice above it, carries its own
memory.max — then on that cgroup — and a memory_target above such a
limit is clamped to it at start.
Thread stacks (RUST_MIN_STACK). Every connection, request and
maintenance thread is a plain Rust thread, and the server starts them with
8 MiB stacks (address space only; pages are committed as they are
touched) so that a statement at the SQL nesting cap, its evaluation and
the frames below them never run out of stack. Setting RUST_MIN_STACK
(bytes) in /etc/default/skaidb or the unit overrides that default; the
server only fills it in when it is unset.
Log rotation. The package installs /etc/logrotate.d/skaidb
(copytruncate, daily, maxsize 256M, rotate 140, maxage 14,
compressed) for every file under /var/log/skaidb — skaidb.log, and
query.log, slow.log, error.log, login.log when [observability]
splits them out. The server keeps its log files open in append mode and
reopens nothing on a signal, which is why the policy copies and truncates
in place; no restart or reload is involved. Because the distro's
logrotate timer runs only daily, the package also enables
skaidb-logrotate.timer, which runs skaidb's policy hourly so maxsize
acts within the hour (query logging is on by default and a busy node
writes 100+ MB of query.log an hour). The policy keeps 14 days of
every log: a quiet log rotates daily and maxage 14 drops rotations
older than that; a busy one rotates each time it passes 256 MB, and 140
rotations cover 14 days at 100 MB an hour. Disk budget: about 5 GB per
log at worst — 140 compressed rotations (masked SQL compresses 8:1 or
better, ≤ 32 MB each) plus two uncompressed files, the live one and the
newest rotation — which in practice only query.log approaches. A log
written faster than 256 MB an hour rotates once per hourly run, so its
rotations are larger and 140 of them span fewer than 14 days; where
/var/log cannot hold that, lower rotate in the policy file (a
conffile: your edit survives upgrades) or reduce query logging.
logrotate is a recommended, not required, package; without it the files
grow until you rotate them.
For the tarball installs above there is no service unit; either run skaidb
under your own process manager or copy the unit from the repo's
packaging/skaidb.service and adjust paths.
macOS
Builds are provided for both Apple Silicon (aarch64-apple-darwin) and
Intel (x86_64-apple-darwin). The binaries are not notarized, so macOS
Gatekeeper will warn the first time — clear the quarantine flag (shown below) or
right-click the binary in Finder and choose Open.
Disk image (.dmg)
# Mount, copy the binaries to a directory on your PATH, unmount.
hdiutil attach skaidb-X.Y.Z-aarch64-apple-darwin.dmg
vol="/Volumes/skaidb X.Y.Z"
sudo cp "$vol/skaidb" "$vol/skaidbsh" /usr/local/bin/
hdiutil detach "$vol"
# Clear the quarantine flag so Gatekeeper allows them to run.
sudo xattr -d com.apple.quarantine /usr/local/bin/skaidb /usr/local/bin/skaidbsh
(Use the x86_64-apple-darwin dmg on Intel Macs.) There is no Homebrew tap.
Tarball (macOS)
tar xzf skaidb-X.Y.Z-aarch64-apple-darwin.tar.gz
sudo install -m 0755 skaidb skaidbsh /usr/local/bin/
sudo xattr -d com.apple.quarantine /usr/local/bin/skaidb /usr/local/bin/skaidbsh
Windows
The binaries are not code-signed, so SmartScreen may warn on first run ("More info" → "Run anyway").
Zip archive
- Download
skaidb-X.Y.Z-x86_64-pc-windows-msvc.zipand extract it (it containsskaidb.exe,skaidbsh.exe,LICENSE,README.md). - Move the folder somewhere stable (e.g.
C:\Program Files\skaidb) and add it to yourPATH:
# Unblock the downloaded zip, extract, and add to PATH (per-user).
Unblock-File .\skaidb-X.Y.Z-x86_64-pc-windows-msvc.zip
Expand-Archive .\skaidb-X.Y.Z-x86_64-pc-windows-msvc.zip -DestinationPath "$env:LOCALAPPDATA\skaidb"
[Environment]::SetEnvironmentVariable(
"Path", $env:Path + ";$env:LOCALAPPDATA\skaidb", "User")
Open a new terminal so the PATH change takes effect.
Standalone .exe
If you only want one binary, download skaidb-X.Y.Z-x86_64-pc-windows-msvc.exe
(server) and/or skaidbsh-X.Y.Z-x86_64-pc-windows-msvc.exe, rename to
skaidb.exe / skaidbsh.exe, and put them on your PATH.
Binary-only (no package, no build)
If you just want the executable and nothing else (no system package, no system files), grab the tarball/zip for your platform and extract only the binary you need:
# Linux/macOS — extract just the server binary into the current directory.
tar xzf skaidb-X.Y.Z-x86_64-unknown-linux-gnu.tar.gz skaidb
./skaidb --version
# Windows — the standalone .exe is already binary-only; just run it.
.\skaidb-X.Y.Z-x86_64-pc-windows-msvc.exe --version
The binaries are self-contained: they create and manage their own data directory and have no runtime dependencies beyond the OS (the musl build has none at all).
Run it / verify the install
skaidb --version
skaidbsh --version
Start the server (creates the data dir if missing):
skaidb --data-dir ./data --bind-addr 127.0.0.1 --rest-port 7080
# Every option is also a flag/env var; print the effective config and exit:
skaidb --print-config
# Validate a config (file + env + flags) exactly as a start would, without
# starting: exit 0 = it would start, 1 = the fatal issues printed on stderr.
skaidb --config /etc/skaidb/skaidb.toml --check-config
Query it over REST:
curl -X POST 127.0.0.1:7080/query -d "CREATE TABLE users (PRIMARY KEY (id))"
curl -X POST 127.0.0.1:7080/query -d "INSERT INTO users (id, name) VALUES (1, 'ada')"
curl -X POST 127.0.0.1:7080/query -d '{"sql":"SELECT * FROM users"}'
curl 127.0.0.1:7080/metrics
Or use the shell. It connects over the network by default (picking the nearest
reachable node, with failover); --local opens a data directory directly with
no server:
skaidbsh --host 127.0.0.1 -e "SELECT COUNT(*) FROM users"
skaidbsh --host 127.0.0.1 # interactive REPL
skaidbsh --local ./data # offline, against the data dir
Optional listeners: enabling [mqtt] binds 1883 (plain/WebSocket) and,
with client TLS on, 8883 — open them in the firewall only if IoT clients
connect from outside the host (see MQTT.md).
To run multiple nodes, see CLUSTERING.md (seeds, ports, replication factor, consistency, adding/removing nodes). For the SQL surface, see QUERY_SYNTAX.md.
Upgrading
- .deb / .rpm: install the newer package the same way — it replaces the old
one (
sudo apt install ./skaidb_NEW_amd64.deb,sudo dnf install ./skaidb-NEW…rpm). If theskaidbservice is running, the package restarts it automatically so the new binary takes over (a stopped or never-enabled service is left untouched). In a multi-node cluster, upgrade one host at a time so the nodes don't all restart at once. - Tarball / zip / source: overwrite the binaries in place. The on-disk data format is forward-compatible within a release line; stop the server before swapping the binary.
Downgrades. Nothing checks versions at start, so an older binary opens
whatever data directory it is pointed at. What is supported: a patch
downgrade within a minor line (0.311.4 → 0.311.3) — the data format is
unchanged within the line — and a minor downgrade to the previous
minor line (0.311 → 0.310), provided no newer-only format was switched on.
The formats that are opt-in and rollback-sensitive are documented as such
on their key; today that is cluster.cas_paxos_compress: a binary without
the compressed layout reads a compressed CAS state as empty (it forgets
that key's promise and accepted value), so set it to false on every
member and let CAS traffic settle BEFORE rolling any member back, and turn
it on again only once no member will be rolled back. Downgrade the same
way you upgrade: one node at a time, keeping the previous package at hand
(apt install skaidb=<version> / dnf downgrade skaidb-<version>),
waiting for /ready?strict=1 between nodes; the mixed-version window is
the one a rolling upgrade produces and is supported. A downgrade across a
major version is not supported; restore a backup taken under the older
version instead. Markers and lock files newer binaries leave behind
(<data_dir>/.lock, a backup's BACKUP_COMPLETE) are ignored by older
ones.
skaidb uses SemVer.
Uninstalling
# Debian/Ubuntu
sudo apt remove skaidb
# Fedora/RHEL/openSUSE
sudo dnf remove skaidb # or: sudo rpm -e skaidb / sudo zypper remove skaidb
# Tarball install
sudo rm /usr/local/bin/skaidb /usr/local/bin/skaidbsh
# cargo install
cargo uninstall skaidb-server skaidb-cli
Your data directory (e.g. ./data) is never touched by uninstalling — remove it
manually if you want to delete the database.