A practical guide to ZEDEDA CLI (ZCLI), the command-line way to manage ZEDEDA Cloud.
docker run -it zededa/zcli:latest
First run pulls the image from ZEDEDA's registry, so it takes a moment. After that you're dropped into a zcli> prompt.
Two ways to authenticate: username/password, or a session token.
zcli configurezedcontrol.zededa.net)zcli loginzcli configurezcli login<name> is a value you supply[–title=<title>] is optional[–clear-text=<true|false>] means pick one of the listed choices
If you leave out something required, ZCLI tells you plainly, e.g. Missing required option –dstype.
zcli by itself lists every command group.zcli <command> –help shows syntax for that command.man zcli-<command> opens the full manual page (press q to exit).| Key | Action |
|---|---|
| Space / Page Down | scroll down a page |
| b / Page Up | scroll up a page |
| j / Down Arrow | scroll down a line |
| k / Up Arrow | scroll up a line |
| / then text | search forward |
| Command | What it manages |
|---|---|
| edge-node | Create, update, activate, reboot, delete edge nodes |
| project | Resource groups that edge nodes and apps live in |
| network | Networking objects assigned to edge node adapters |
| network-instance | App-facing networking within an edge node |
| edge-app | Application manifests |
| edge-app-instance | Running app instances on edge nodes |
| datastore | Image storage locations |
| image | App images inside datastores |
| volume-instance | Storage volumes |
| events | Device events and user action logs |
| job | Long-running tasks across nodes/instances |
| user / role / auth-profile | Access control |
The GUI onboarding wizard bundles network and project setup for you. In ZCLI you do those pieces yourself, in order:
zcli project create <name> …zcli network create (defines the subnet/DHCP mode the node's adapter will use)zcli edge-node create MY_EDGE_NODE --project=MY_PROJECT --model=SYS-E100-9APP \ --network=eth0:management:MY_STATIC_NET:192.168.1.100:adapterLabel1
zcli edge-node show MY_EDGE_NODEzcli edge-node update MY_EDGE_NODE –title=NEW_TITLEFor anything beyond a single static IP, ZCLI uses a JSON template workflow instead of a giant flag list.
zcli edge-node copy-adapter-config-templateadapter-net-config.json (the one you edit) plus .jsonc and .md reference copies, to /root/zcli/adapter-net-config-templates by defaultzcli edge-node create MY_EDGE_NODE --project=MY_PROJECT --model=Advantech-2012 \ --adapter-network-config=adapter-net-config-templates/adapter-net-config.json
zcli edge-node export-adapter-config MY_EDGE_NODE| Task | Command |
|---|---|
| Reboot | zcli edge-node reboot -f MY_EDGE_NODE |
| Graceful shutdown prep | zcli edge-node prepare-poweroff MY_EDGE_NODE -f |
| Deactivate (stops app instances) | zcli edge-node deactivate MY_EDGE_NODE |
| Reactivate | zcli edge-node activate MY_EDGE_NODE |
| Update EVE-OS image | zcli edge-node eveimage-update MY_EDGE_NODE -f |
| Remove an old EVE-OS image | zcli edge-node eveimage-remove MY_EDGE_NODE –image=<image> |
| Pull current config to a file | zcli edge-node get-config MY_EDGE_NODE |
| Force a config regen from cloud | zcli edge-node gen-config MY_EDGE_NODE |
| Pull TPM PCR values | zcli edge-node get-pcr MY_EDGE_NODE |
| Delete | zcli edge-node delete MY_EDGE_NODE -f |
-f skips the confirmation prompt. Leave it off if you want the safety check.
Default output is human-readable text. Force JSON for scripting with the global flag:
zcli -o json edge-node show MY_EDGE_NODE
SSH access to EVE-OS is off by default. You turn it on by pushing your public key to the node's debug.enable.ssh property through ZCLI. This was originally meant for EVE developer debugging, not production use, keep that in mind before leaving it on.
cat ~/.ssh/id_rsa.pub
If that's empty, generate one first:
ssh-keygen -b 2048 -t rsa
zcli edge-node update EDGE_NODE --config=debug.enable.ssh:"YOUR_PUBLIC_KEY"
Or pull the key straight from the file instead of pasting it:
zcli edge-node update EDGE_NODE --config="debug.enable.ssh:$(cat ~/.ssh/id_rsa.pub)"
Note: this survives until you clear it, but if you re-onboard or re-image the device, the key gets wiped and you'll need to push it again.
Pull it from zcli edge-node show EDGE_NODE –detail, or from the GUI's device status page.
ssh -i ~/.ssh/id_rsa root@<edge-node-ip>
zcli edge-node update EDGE_NODE --config=debug.enable.ssh:""
An empty string clears every authorized key. Verify it actually cleared before you walk away from the box.
ZEDEDA recommends Edge View over raw SSH for production environments. It adds policy control at the node/project/enterprise level, session time limits, and audit logs, things plain SSH doesn't give you. Worth using instead of SSH unless you specifically need a raw shell.
Same –config pattern used for SSH above:
zcli edge-node update EDGE_NODE --config="KEY:VALUE"
Changes sync on the node's next config check (default every 60 seconds, tunable via timer.config.interval).
| Knob | Type | Default | What it does |
|---|---|---|---|
| debug.enable.ssh | SSH pubkey string | “” | Allows SSH when a key is set; empty disables it |
| debug.enable.usb | boolean | false | Allows USB devices (keyboards, etc.) on the node |
| debug.enable.vga | boolean | false | Allows VGA console output |
| debug.enable.console | boolean | false | Allows console access to EVE-OS; needs a reboot to turn back off |
| debug.enable.vnc.shim.vm | boolean | false | Allows VNC into the container app shim VM; needs a reboot to turn back off |
A separate, unrelated command turns on raw metrics collection rather than a –config property:
zcli edge-node enable-debug-knob EDGE_NODE [--expiry=<expiry>] zcli edge-node disable-debug-knob EDGE_NODE [--expiry=<expiry>]
That one is specifically for storing raw metrics on the device, don't confuse it with the debug.enable.* config properties above.
| Knob | Type | Default | What it does |
|---|---|---|---|
| storage.dom0.disk.minusage.percent | integer | 20 | Minimum percent of the persist partition reserved for the EVE-OS base system |
| storage.zfs.reserved.percent | integer | 20 | Minimum percent of the persist partition reserved for ZFS |
| storage.apps.ignore.disk.check | boolean | false | Lets edge containers create images larger than available disk space, can cause out-of-disk errors, use carefully |
| timer.gc.vdisk | seconds | 3600 | How often EVE-OS garbage collects unused container virtual disks |
| timer.defer.content.delete | seconds | 0 | Keeps deleted content trees around for reuse for this long; 0 deletes immediately |
This is a different thing from the knobs above. A volume instance is persistent or scratch storage you attach to an app running on a specific edge node, not a debug switch.
zcli volume-instance create MY-VOL-INST --volume-type=CONTENT_TREE --project=MY-PROJECT \ --edge-node=MY-EDGE-NODE --size=100 --access-mode=READWRITE
For an edge node cluster instead of a single node, swap –edge-node for –edge-node-cluster.
zcli volume-instance show --edge-node=MY-EDGE-NODE
zcli volume-instance update MY-VOL-INST --title=NEW-TITLE zcli volume-instance delete MY-VOL-INST -f
Volume instances are created the same way regardless. What decides persistence is the Purge setting on the edge app that consumes the volume: leave Purge unchecked and the volume survives app updates and restarts. Check it, and the volume gets wiped on purge/update.
One catch: a persistent volume instance belongs to the specific edge node it was created on. Same behavior on multiple nodes means a separate volume instance per node, it doesn't automatically replicate.
| Goal | Tool |
|---|---|
| Get a shell on the node | zcli edge-node update … –config=debug.enable.ssh:… |
| Turn on/off USB, VGA, console, VNC shim access | zcli edge-node update … –config=debug.enable.X:… |
| Turn on raw metrics storage | zcli edge-node enable-debug-knob |
| Give an app persistent or scratch disk space | zcli volume-instance create |
| Change storage allocation thresholds device-wide | zcli edge-node update … –config=storage.X:… |
–no-verify / -k turns it off, only use this if you know why you need to.zcli edge-node create alone. If a node created via ZCLI looks half-configured, check whether you also need the zcli network and zcli project steps first.debug.enable.ssh and volume instances solve different problems. SSH knobs get you a shell on the node itself. Volume instances give an app storage. Don't reach for one when you mean the other.