cluster fabric for Rocky Linux 10
Turn a rack of machines into one computer.
You stop choosing which server runs what. You say what should run, and the cluster places it — and when a node dies, moves it.
Rocky Linux 10 · signed RPMs · MIT
$ one top
VIRTUAL HOST 3 nodes up / 3
CPU 48 cores load 1.32 3.66 5.40 2%
MEM 82G total 42G used 39G available
DISK 294G total 27G free
NAME DC RACK STATE CPU LOAD MEM
rk-01 par1 r1 alive 16 0.44 14G/27G
rk-02 par1 r2 alive 16 0.44 14G/27G
rk-03 par1 r3 alive 16 0.44 14G/27G
Three bare machines to an app served by every one
Recorded, not animated: the video is these commands run against three Rocky 10 machines with nothing on them but SSH, from a laptop. packaging/lab/tutorial.sh runs the same commands and checks every result.
-
1
Make them one cluster
one cluster form --cluster-id demo \ rk-01 rk-02 rk-03Installs soli-one from the signed channel, creates the trust material on the first, admits the others.
-
2
Install the runtimes everywhere
export SOLI_ONE_HOST=rk-01 one node install soli soli-proxy \ solidb solikvOne command for every node, from the same channel, packages signed.
-
3
A proxy on every node
one proxy enableEach proxy gets an admin key; every agent is told where all of them are.
-
4
SoliDB and SoliKV clusters
one datastore apply \ --spec db.toml --everywhereEvery member started in order and confirmed replicating. SoliKV's keyspace assigned.
-
5
Deploy from your laptop
one deploy ./hello --name hello \ --domain hello.test --replicas 2 \ -- soli serve . --port '$PORT'The tree travels over SSH, runs where the scheduler places it, and every proxy serves it.
Kill the agent. The workload doesn't notice.
Workloads run as transient systemd units, not as children of the agent.
So soli-oned can be killed, upgraded or restarted while
everything it placed keeps serving — and the replacement adopts them
instead of restarting them.
That is the property the design is built on, so it is not a promise: it is a test against the real binary, and an end-to-end run through the installed RPM on every push.
How workloads are supervised →$ kill -9 $(pidof soli-oned)
# web keeps serving: same MainPID
$ systemctl start soli-oned
# adopted, not restarted: same MainPID,
# same InvocationID
What runs today
Every card below is linked into soli-oned or one, and covered by tests that run on Rocky 10, and on 9, against a real systemd as PID 1.
Tell a node about one seed
SWIM gossip over an authenticated bus finds the rest. SWIM decides who is alive; the roster in Raft decides who is a member.
stateOne Raft group per region
Fsynced journal, snapshots, linearizable reads. Control nodes vote; workers hold no key that could.
schedulingPlacement, relocation, refusal
Rack spread and anti-affinity, a grace period before a dead node's work moves, and a refusal to place on a degraded view.
artifactsRedeploy one file, store 4%
BLAKE3 and content-defined chunking. Peers fetch only the chunks they lack, hash them on arrival, and replicate across racks.
idlePreviews that sleep
An idle workload is stopped and woken by the next request, so a preview environment stops holding RAM while nobody is looking at it.
trustA key per role
Separate gossip, fetch and control keys, and a node key per worker. Joining as a worker is no longer joining as everything.
cliCoreutils-shaped
top, free, df, ps, logs --all. -o json everywhere, and --host to drive it over SSH from a laptop.
The day-two parts
Sealed backups, secrets as systemd credentials, Prometheus metrics, and rolling upgrades that drain first and stop at the first failure.
packageBuilt on Rocky, for Rocky
Two RPMs with a hardened unit, SELinux contexts and a firewalld service, from a signed dnf channel with signed metadata.
An illusion that tells you where it ends
Summing free memory across a fleet is a real number and a useless one: you
cannot put a 400 GiB workload into it. So one free prints
the largest single node next to the total.
"Any node can take over any workload" is true for stateless work and false
for a database. one ps carries a mobility column, a database is
pinned to its node, and one node drain refuses to empty a node
holding pinned work without naming what it would interrupt.
One control plane
top, free, df, ps report the fleet. You run things without naming a host.
One network identity
A floating address per datacenter. The library is tested against real Raft and a real interface; no agent runs it yet.
One file namespace
Artifacts replicate today. The read-only /soli view over them is a tested library that nothing mounts yet.
Where the line is
Every docs page marks what works, what is built but not linked into a binary, and what is deliberately not built. CI fails the build if a page calls a shipped command missing, or a library-only crate shipped.
Built, tested, not wired in
- VIP failover —
soli-one-vip - The elected ACME orderer —
soli-one-acme - The read-only
/soliview —soli-one-fuse - OVHcloud provider —
soli-one-ovh
Deliberately not built
- Certificates in replicated state — a private key on every control node is a posture to choose, not to grow into
- Cross-region artifact gateways
- A writable
/soli
Start with three machines.
Or three agents on one workstation — the README has the loop.