Install the device client
The SuiFleet device client is the suifleet daemon. It runs on each device,
holds the device's own key, watches the network for deployments aimed at it and
reports results. The console links here from Get started, Devices and
Enrollment. This guide is also published in the public installation hub;
reading it does not require repository access.
A device needs five things:
- The
suifleetbinary and its service files. - A device key, generated on the device. The client prints its public address.
- The network manifest
deployment.jsonfor the fleet's network. - On Linux, the signing service's configuration,
/etc/suifleet/signer.toml. The signing service holds the device key; the daemon cannot start without it. - The daemon's configuration,
/etc/suifleet/config.toml.
Items 4 and 5 are written after the device is registered or enrolled, and
installed in that order: deployment.json, then signer.toml, then
config.toml last.
Get the client
The client is built from this repository's suifleet-edge crate. No
prebuilt download is published yet. The repository can produce signed,
reproducible release bundles (RELEASES.md), but none have been
released for operators to download. Ask your fleet operator for an authenticated
release bundle or use the source-build paths below. Verify signed bundles using release verification
and trust roots supplied through an authenticated channel before installation.
Do not install unverified binaries.
| Platform | How to get it | Status |
|---|---|---|
| Raspberry Pi and other Yocto targets | Yocto image and recipe | Image builds and QEMU boot recorded; physical Pi acceptance pending (SF-031) |
| macOS 15 on Apple silicon | macOS package | Validated on a hosted macOS 15 runner, not a physical Mac |
| Debian 12 / Ubuntu 24.04 (amd64, arm64; Linux ≥6.5) | Debian and Ubuntu | Buildable local-file packages; no public APT repository/download yet |
| Other Linux with systemd | Generic Linux | Manual install of the same files as the Yocto recipe; not a tested distribution package |
Windows and 32-bit x86 Linux have their own notes in WINDOWS_RUNTIME.md and LINUX_X86.md.
Never copy a device key between devices or into an image, package or repository. Each device generates its own at first boot or install.
Yocto image and recipe
A standalone public meta-suifleet repository and OpenEmbedded Layer Index
listing are not published yet. Do not guess a clone URL. Until those destinations
are published, obtain the pinned layer and kas profiles from your fleet operator
or a reviewed public source checkout. The commands below run from that checkout.
The meta-suifleet layer packages the client as the suifleet recipe, with
first-boot key provisioning and systemd services. Build a Raspberry Pi 3 Model
B+ SD image with kas 4.7 on Ubuntu 22.04:
export KAS_WORK_DIR=/absolute/path/to/yocto-work
export KAS_BUILD_DIR="$KAS_WORK_DIR/build-pi-image"
kas build kas/pi-image.yml:/absolute/path/to/private-access.yml
The private overlay adds your SSH public key; see PI_IMAGE.md
for it, flashing and first login. To add only the client to your own image,
add suifleet-edge/meta-suifleet to your layers and suifleet to the image's
packages; YOCTO_PACKAGING.md lists the pinned inputs and
package-only builds.
At first boot suifleet-provision.service generates the key, without
networking, and prints the address (see
Find the device address). The image includes
/etc/suifleet/signer.toml.example and /etc/suifleet/config.toml.example as
templates. The signing service stays stopped until /etc/suifleet/signer.toml
exists, and the daemon suifleet.service until /etc/suifleet/config.toml
exists.
macOS package
Build and install as root:
cargo build --locked --release --manifest-path suifleet-edge/Cargo.toml
sudo suifleet-edge/packaging/macos/install.sh suifleet-edge/target/release/suifleet
The installer creates the _suifleet account, installs
/usr/local/bin/suifleet and the LaunchDaemon, generates
/etc/suifleet/device.key once and prints the address. It writes no
configuration and starts nothing. After writing deployment.json and
config.toml (root-owned, 0644), start the service:
sudo launchctl bootstrap system /Library/LaunchDaemons/org.suifleet.daemon.plist
Service control, logs and limits are in MACOS_RUNTIME.md.
Debian and Ubuntu
There is no published .deb download or apt repository yet. Do not run an
invented apt install suifleet command or fetch packages from unofficial mirrors.
Local-file packages can be built for amd64 and arm64. See
Debian packaging for build, authenticated-bundle installation
and configuration instructions. Packages require systemd and Linux 6.5 or later;
Debian 12 needs a suitable newer/backports kernel, while Ubuntu 24.04 has a
suitable kernel. Obtain a verified bundle from your operator or use a reviewed
source checkout. The separate signing service and runtime identity protections
still apply. Generic Linux remains a manual evaluation option.
Package publication will provide architecture, supported distribution versions,
checksums and signature-verification instructions before a download is offered.
Generic Linux
These source commands require access to the public build inputs; they are an
optional evaluation path, not a requirement to browse the core repository to
configure a supplied client. Obtain source from your operator or clone
https://github.com/tyler-suifleet/suifleet.git, select a reviewed revision, and
run commands from the checkout root. If build inputs are unavailable, ask the
operator for a verified bundle rather than skipping signature checks.
On another systemd-based Linux, install the same binary, accounts and units as the Yocto recipe. From a checkout, with Rust 1.94.0:
cargo build --locked --release --manifest-path suifleet-edge/Cargo.toml
F=suifleet-edge/meta-suifleet/recipes-edge/suifleet/files
sudo useradd --system --no-create-home --home-dir /var/lib/suifleet --shell /usr/sbin/nologin --user-group suifleet
sudo useradd --system --no-create-home --home-dir /nonexistent --shell /usr/sbin/nologin --user-group suifleet-signer
sudo install -m 0755 suifleet-edge/target/release/suifleet /usr/bin/suifleet
sudo install -D -m 0755 "$F/suifleet-provision" /usr/libexec/suifleet-provision
sudo install -m 0644 "$F"/suifleet*.service "$F"/suifleet*.path "$F"/suifleet*.socket /etc/systemd/system/
sudo install -d -m 0750 -g suifleet /etc/suifleet
sudo systemctl daemon-reload
sudo systemctl enable --now suifleet-provision.service suifleet-enrollment.path suifleet-signer.socket
Copy the recipe's templates beside the real files, as the image does:
sudo install -m 0640 -g suifleet-signer "$F/signer.toml.example" /etc/suifleet/signer.toml.example
sudo install -m 0640 -g suifleet "$F/config.toml.example" /etc/suifleet/config.toml.example
They keep the key in the separate signing service
(KEY_ISOLATION.md); write signer.toml and then
config.toml from them as described below. The privileged firmware path is
optional; see OPERATIONS.md before
enabling suifleet-firmware.path.
Find the device address
The device address is the public Sui address of the device's own key. It is not your wallet address, and it is safe to share.
When the key is first created, the client prints one line:
SuiFleet device address: 0x3f2a… (0x followed by 64 hexadecimal characters)
You see this line from the macOS installer, and on Linux in the provisioning journal. Read it again at any time:
sudo cat /etc/suifleet/device.address
journalctl -u suifleet-provision.service # Yocto image and generic Linux
sudo suifleet --derive-address /etc/suifleet/device.key
Copy the whole value, from 0x to the end, into the console. Nothing else
printed by provisioning is secret, but device.key is: never display or copy
it.
Network manifest (deployment.json)
deployment.json names the network, the SuiFleet package and its shared
objects. The device refuses to start against a manifest for a different chain
or a superseded release. Get it from your fleet's operator or publisher:
- The console's Download deployment.json button saves the manifest this console was built with.
- Enrollment media downloaded from the Enrollment page already include it.
- A publisher's release directory
deployments/ENV/current/contains it (DEPLOYMENT_MANIFEST.md).
Install it first, as /etc/suifleet/deployment.json, root-owned. On Linux use
group suifleet, mode 0640.
Signing service configuration (signer.toml)
On Linux the device key belongs to the signing service
(suifleet-signer.service), not to the daemon, so components the daemon runs
cannot read it (KEY_ISOLATION.md). The daemon asks this
service for the device address when it starts, so install
/etc/suifleet/signer.toml before config.toml. Its appearance also
hands the key file to the service's user. A minimal file:
# /etc/suifleet/signer.toml
manifest_path = "deployment.json"
device_cap_id = "0x<DEVICE_CAP_ID>"
keypair_path = "/etc/suifleet/device.key"
caller_unit = "suifleet.service"
Use the same manifest_path and DeviceCap ID as config.toml. Write it from
/etc/suifleet/signer.toml.example, which also lists the optional Seal, fleet
budget and PKCS#11 settings, and install it root-owned, group
suifleet-signer, mode 0640:
sudo install -m 0640 -o root -g suifleet-signer signer.toml /etc/suifleet/signer.toml
macOS has no signing service: the daemon reads the key itself (see MACOS_RUNTIME.md), so skip this step there.
Configuration file
/etc/suifleet/config.toml names the manifest, the device's on-chain IDs and
how updates are applied. Install it last, after deployment.json and
signer.toml: on Linux, its appearance starts the daemon. A minimal Linux
configuration with the signing service:
# /etc/suifleet/config.toml
[sui]
manifest_path = "deployment.json"
[device]
device_object_id = "0x<DEVICE_OBJECT_ID>"
device_cap_id = "0x<DEVICE_CAP_ID>"
[device.signer]
kind = "service"
socket = "/run/suifleet-signer/sign.sock"
[apply]
command = "/usr/bin/false" # choose your installed updater explicitly
timeout_seconds = 600
allow_recipe_commands = false
[runtime]
state_dir = "/var/lib/suifleet"
Install it root-owned, group suifleet, mode 0640:
sudo install -m 0640 -o root -g suifleet config.toml /etc/suifleet/config.toml
On macOS, replace the [device.signer] table with
keypair_path = "/etc/suifleet/device.key" under [device], and install both
files root-owned, mode 0644.
The Device and DeviceCap IDs come from registration or enrollment. Every
option is documented in
suifleet-edge/config.example.toml.
suifleet --check-config PATH loads a configuration, verifies its manifest
against the network and prints Verified deployment configuration:
sudo suifleet --check-config /etc/suifleet/config.toml
First-boot enrollment
With Enrollment, the device registers itself; you copy no address. On the
Enrollment page, create a policy, reserve names and download the credential
media. Copy each device's enroll.toml, claim.key and deployment.json to
its provisioning media, then on the device after provisioning run:
sudo suifleet --enroll /path/to/enroll.toml
It prints JSON with device_address, device_object_id and device_cap_id.
Write the DeviceCap ID into signer.toml and both IDs into config.toml, then
install them in that order. Details, claim funding and
security are in ENROLLMENT.md.
Register by address
Without Enrollment, register one device at a time:
- Read the device address as above.
- In the console, use Get started, or Devices → Register by address. Paste the address and choose the architecture. Your wallet approves the transaction.
- Copy the Device object ID from the Devices page (show technical details).
Registration sends the DeviceCap to the device address, so read its ID from
the registration transaction's created objects in a Sui explorer, or list
the objects that address owns (
sui client objects DEVICE_ADDRESS). Put the DeviceCap ID intosigner.tomland both IDs intoconfig.toml, then install them in that order. - Give the device a little SUI for status reports, or enroll it in the fleet budget during registration.
Check that it is running
On Linux:
systemctl status suifleet.service
journalctl -u suifleet.service -f
On macOS, launchctl print system/org.suifleet.daemon and
/var/log/suifleet/daemon.log. The device shows as online on the Devices page
once it sends its first report. Registration alone does not mean the client is
installed or online.
To recover from a configuration error without losing the device identity or
its history, follow
troubleshooting without losing state.
Never delete device.key or /var/lib/suifleet to fix a network or
configuration problem.
Limits
- No prebuilt binaries, packages or images are published for download yet.
- Physical Raspberry Pi boot and recovery acceptance remain in SF-031.
- The generic Linux steps reuse the Yocto recipe's files; they have not been tested as a distribution package.
- Public docs hosting and distribution publication are separate from this guide
build. An operator can configure the console’s
NEXT_PUBLIC_DEVICE_DOCS_BASEto the deployed curated docs root (defaulthttps://docs.suifleet.io/). This setting is a documentation destination, never a package-download promise.
Source: Edit this page