LINSTOR Distributed Storage
Set up DRBD-based block storage for Docker Swarm clusters (self-hosted only).
Overview
LINSTOR by LINBIT provides DRBD-based block-storage replication across Skitflow Swarm nodes. Once enabled, services can mount distributed volumes that survive a single-node loss without running a database cluster per app.
LINSTOR is self-hosted only.
Requirements
- OS: Ubuntu 22.04+, Debian 12+, Rocky Linux 9, AlmaLinux 9, RHEL 9, or CentOS Stream 9.
- Block devices: at least one unpartitioned disk per node (e.g.
/dev/sdb). Skitflow refuses to touch the root disk even withforceWipe. - Network: TCP 7000 (DRBD replication) and 3370 (LINSTOR controller API) open between nodes.
- Sudo / root SSH access (Skitflow already requires this for the standard deploy server install).
Enable LINSTOR on a node
LINSTOR runs on top of Docker Swarm, so a node can only enable it after it has joined your Swarm cluster. Add the server to the cluster first (see Cluster) — LINSTOR is offered only on servers that are already members of the Swarm.
Once the node is a cluster member, enable LINSTOR from its LINSTOR tab. The first node to enable it acts as the LINSTOR controller (a combined controller + satellite); every node you enable afterwards joins as a satellite.
When a node is ready it shows the Ready state along with its role, and its storage pool becomes available for placing replicated volumes.
Use a LINSTOR volume in a Compose service
In your docker-compose.yml:
services:
api:
image: my/api:latest
volumes:
- my-data:/var/lib/data
volumes:
my-data:
driver: linbit
driver_opts:
FS: ext4
size-kib: "10240"
replicas: "2"replicas: "2"places the volume on 2 nodes; Swarm picks where the container runs, LINSTOR routes the I/O.size-kibis the volume size in kibibytes.FSis the filesystem on top of the DRBD device (ext4/xfs).
Cluster overview dashboard
Navigate to /dashboard/swarm/linstor for:
- KPI cards: total capacity, used capacity, resource count, healthy nodes.
- Nodes table: role, online status, per-node free / total bytes.
- Volumes table: replica count, in-use indicator.
- Capacity-over-time area chart (1h / 24h / 7d).
- DRBD I/O throughput, replication-state donut, top-volumes bar, placement heatmap.
Disable LINSTOR on a node
- Satellite: toggle off, optionally wipe data. The double-confirmation checkbox prevents accidental data loss.
- Controller with active satellites: the dialog refuses and lists the satellites to disable first. The controller can only be removed once it is the last node.
Troubleshooting
DRBD kernel module failed to load
The DRBD module needs a kernel reboot on first install (DKMS rebuilds the module against the new kernel).
sudo rebootThen click Retry in the LINSTOR Storage tab.
Controller unreachable
The cluster overview shows this when the LINSTOR controller service is not reachable. Existing volumes continue serving I/O via DRBD — only create / delete of new volumes fails.
The controller is installed on the host as a systemd service (not a Docker container):
ssh <controller-node>
systemctl status linstor-controller
journalctl -u linstor-controller --no-pager -n 50If it is down, start it and re-check the overview:
sudo systemctl start linstor-controllerPool free-space mismatch
LINSTOR reports capacity in KiB internally; Skitflow converts to bytes for display. If pool sizes look off by 1024×, you may be on a pre-0.33.0 build — upgrade.
Limitations (v1)
- One storage pool per node (
skitflow-poolon LVM thin). - Single controller (no HA controller failover).
- DRBD diskless nodes not supported.
- No UI for creating volumes — all volume management is via
docker-compose.yml. - Snapshots and backups are not yet exposed in the UI.
replicationKbpsmetric is a placeholder (drbdsetup --jsondoes not expose a numeric rate field).