Before you begin
Use empty data and metadata paths. Production deployments need
static node addresses, synchronized time, trusted TLS, and a
deliberate encryption decision.
01
Prepare the host
- Supported 64-bit Linux, Windows, or macOS host
- Administrator/root access for service installation
- Unique node ID, public URL, and routable mesh address
- One or more empty object-data roots
- A separate durable metadata root
- TCP 8443 for clients and TCP 9443 between nodes
02
Download X2 Node, XC, and the installer
Select your OS and architecture. Commands are populated from
the signed release catalog.
03
Verify the binary
sha256sum ./x2-node
# Compare with the release manifest
chmod 0755 ./x2-node
Get-FileHash .\x2-node.exe -Algorithm SHA256
# Compare Hash with the release manifest
shasum -a 256 ./x2-node
# Compare with the release manifest
chmod 0755 ./x2-node
Do not install an artifact whose digest or size differs from
the immutable release manifest.
04
Choose paths and network identities
Replace every value enclosed in <...>.
Keep these variables in the same terminal while completing
the remaining steps. The configuration path is operator
selected; it is not required to use the platform default.
X2_CONFIG_PATH='/etc/x2/node.yaml'
X2_RUNTIME_ROOT='/var/lib/x2'
X2_DISK_PATHS='/data/x2/disk{1...4}'
X2_METADATA_PATH='/data/x2/metadata'
X2_PUBLIC_URL='https://<PUBLIC_DNS_OR_IP>:8443'
X2_MESH_ADVERTISE='<NODE_MESH_IP>:9443'
$X2ConfigPath = 'C:\ProgramData\X2\config\node.yaml'
$X2RuntimeRoot = 'C:\ProgramData\X2\runtime'
$X2DiskPaths = 'D:\x2\data{1...4}'
$X2MetadataPath = 'D:\x2\metadata'
$X2PublicUrl = 'https://<PUBLIC_DNS_OR_IP>:8443'
$X2MeshAdvertise = '<NODE_MESH_IP>:9443'
X2_CONFIG_PATH='/usr/local/etc/x2/node.yaml'
X2_RUNTIME_ROOT='/usr/local/var/lib/x2'
X2_DISK_PATHS='/Volumes/X2Data/disk{1...4}'
X2_METADATA_PATH='/Volumes/X2Metadata'
X2_PUBLIC_URL='https://<PUBLIC_DNS_OR_IP>:8443'
X2_MESH_ADVERTISE='<NODE_MESH_IP>:9443'
The public URL is the exact URL clients will use. Keep
:8443 for direct node access; omit the port when
an HTTPS proxy exposes X2 on the standard port 443. The mesh
advertise address is this node's stable inter-node address,
including port 9443 unless you intentionally
configured another mesh port.
05
Configure the first node
Encryption checkpointIf production data requires provider-backed encryption,
finish the
encryption guide before
starting this node.
chmod 0755 ./x2-node
sudo ./x2-node configure "${X2_DISK_PATHS}" \
--metadata "${X2_METADATA_PATH}" --root "${X2_RUNTIME_ROOT}" \
--address '0.0.0.0:8443' --public-url "${X2_PUBLIC_URL}" \
--internal-address '0.0.0.0:9443' --internal-advertise "${X2_MESH_ADVERTISE}" \
--admin-user admin --admin-password '<STRONG_ADMIN_PASSWORD>' \
--config "${X2_CONFIG_PATH}"
sudo test -s "${X2_CONFIG_PATH}"
.\x2-node.exe configure $X2DiskPaths `
--metadata $X2MetadataPath --root $X2RuntimeRoot `
--address '0.0.0.0:8443' --public-url $X2PublicUrl `
--internal-address '0.0.0.0:9443' --internal-advertise $X2MeshAdvertise `
--admin-user admin --admin-password '<STRONG_ADMIN_PASSWORD>' `
--config $X2ConfigPath
if (-not (Test-Path -LiteralPath $X2ConfigPath)) { throw 'Configuration was not created' }
chmod 0755 ./x2-node
sudo ./x2-node configure "${X2_DISK_PATHS}" \
--metadata "${X2_METADATA_PATH}" --root "${X2_RUNTIME_ROOT}" \
--address '0.0.0.0:8443' --public-url "${X2_PUBLIC_URL}" \
--internal-address '0.0.0.0:9443' --internal-advertise "${X2_MESH_ADVERTISE}" \
--admin-user admin --admin-password '<STRONG_ADMIN_PASSWORD>' \
--config "${X2_CONFIG_PATH}"
sudo test -s "${X2_CONFIG_PATH}"
This command creates the restart-safe snapshot containing the
disk and metadata roots. The service installer must receive
this same configuration path.
06
Install the operating-system service
Installation validates that the selected configuration exists
and registers the service without starting it. Running the
installer again replaces the installed binary and service
definition while preserving configuration and data; a
running service is restarted and a stopped service remains
stopped.
sudo bash ./install-x2-node.sh \
--binary "$(realpath ./x2-node)" \
--config "${X2_CONFIG_PATH}"
Set-ExecutionPolicy -Scope Process Bypass
.\install-x2-node-service.ps1 `
-BinaryPath (Resolve-Path .\x2-node.exe) `
-ConfigPath $X2ConfigPath
sudo bash ./install-x2-node.sh \
--binary "$PWD/x2-node" \
--config "${X2_CONFIG_PATH}"
Run the configured node in the foreground instead
./x2-node server --config="${X2_CONFIG_PATH}"
.\x2-node.exe server --config $X2ConfigPath
./x2-node server --config="${X2_CONFIG_PATH}"
07
Start and verify
sudo systemctl enable --now x2-node
systemctl status x2-node
curl --fail --cacert '<PUBLIC_CA_FILE>' "${X2_PUBLIC_URL}/health/ready"
Start-Service X2Node
Get-Service X2Node
Invoke-WebRequest "${X2PublicUrl}/health/ready"
sudo launchctl bootstrap system /Library/LaunchDaemons/com.edgedrive.x2-node.plist
sudo launchctl print system/com.edgedrive.x2-node
curl --fail --cacert '<PUBLIC_CA_FILE>' "${X2_PUBLIC_URL}/health/ready"
Open the public URL, sign in with the bootstrap administrator,
and confirm the node, metadata root, and disks are healthy.
08
Configure XC
chmod 0755 ./xc
./xc alias set x2 "${X2_PUBLIC_URL}" '<ACCESS_KEY>' '<SECRET_KEY>' --ca-file '<PUBLIC_CA_FILE>'
./xc admin info x2
.\xc.exe alias set x2 $X2PublicUrl '<ACCESS_KEY>' '<SECRET_KEY>' --ca-file '<PUBLIC_CA_FILE>'
.\xc.exe admin info x2
chmod 0755 ./xc
./xc alias set x2 "${X2_PUBLIC_URL}" '<ACCESS_KEY>' '<SECRET_KEY>' --ca-file '<PUBLIC_CA_FILE>'
./xc admin info x2
Installation complete
For additional nodes continue to the cluster guide. For
production encryption configure the provider before storing
data.
Add nodes →Enable encryption →