Installing ICM
ICM is installed with a single self-contained script, deploy_icm_unified.sh, which creates a service user, installs Docker and a pinned Ansible, downloads the ICM release package from Cloudsmith, and brings up the full ICM stack with Docker Compose on one Linux host. It runs interactively or fully non-interactively from environment variables.
The script and its detailed reference README are published in the public lightbits-community repository under intelligent-cluster-management/. This is the starting point. This article summarizes the flow.
Prerequisites
System Requirements
Operating System (a Python ≥ 3.12 Ansible controller is required):
Ubuntu 24.04+, Debian 13+
AlmaLinux / Rocky / RHEL 9 (via the AppStream
python3.12module) or 10Not supported: Ubuntu 22.04 and Debian 12 (their stock Python is older than 3.12)
Disk: at least 20 GB free on
/(bypass withICM_SKIP_DISK_CHECK).Memory: 4 GB RAM minimum, 8 GB recommended.
Network: outbound internet connectivity for package and container-image downloads.
Storage-network reachability (thick clone / data mobility only): to run thick clones, the ICM host must be able to reach every attached cluster's NVMe/TCP data network - the cluster's
nvmeEndpointaddresses, both the discovery service (port8009) and the I/O controllers (port4420). ICM's bundled discovery-client attaches the source and destination volumes to the ICM host over NVMe/TCP to copy the data, so a route or interface onto that storage network is required. Management-only connectivity is sufficient to deploy ICM, attach clusters, and run volume/snapshot CRUD - but not for thick clone.
Required Permissions
Root access on the target host - the script creates a service user, installs packages, and configures the firewall.
Required Credentials
A Cloudsmith API key (obtain from Lightbits) - used to pull the ICM container images and release package from
docker.lightbitslabs.com.An ICM version to deploy (for example
v0.9.6), orlatest.
Install
Copy the script to a root-capable host and make it executable:
Interactive
The script prompts for the Cloudsmith API key, lets you pick a version (newest first), and asks for the project name.
Non-Interactive
Provide the inputs as environment variables and pass --non-interactive:
Variable | Required | Meaning |
|---|---|---|
| Yes | Cloudsmith API key (used as the image-registry password). |
| Yes | ICM version to deploy, or |
| No | The Lightbits project ICM manages. Default: |
| No |
|
Deployment takes roughly 10–20 minutes, dominated by container-image pulls. On success, the script prints the access URLs and the icmcli alias is configured for the shell.
What Gets Deployed
The stack is brought up with Docker Compose and consists of the ICM service, its etcd registry, the Temporal engine with its PostgreSQL database and UI, the discovery client, and (optionally) the observability stack.
Access URLs
Service | URL |
|---|---|
ICM API |
|
ICM Metrics |
|
Temporal UI |
|
Grafana |
|
Prometheus |
|
The etcd registry has no host port; it is reachable only inside the Compose network.
Files Created
Path | Contents |
|---|---|
| Compose stack, |
|
|
| Prometheus and Grafana configuration. |
Security Notes
The default ICM login is username admin, password light (stored in /etc/icm/.htpasswd). Change it before using ICM in production.
The Cloudsmith API key is written in clear text to the generated Ansible inventory (inventory/group_vars/all.yml). Treat that file as a secret and rotate the key if it is exposed. The service user created by the installer has passwordless sudo.
Advanced Configuration
ICM's runtime configuration lives in /etc/icm/icm.yml.
The following are a few operational considerations:
Cluster polling interval — how often ICM refreshes its inventory from the attached clusters. Default 30s; must be within 5–120 seconds.
Refresh cron — the periodic full cluster refresh must be scheduled no more frequently than once per hour.
Request rate limit — ICM applies a request rate limit (default 200 requests/second); requests over the limit receive an HTTP 429 / gRPC
ResourceExhausted.
Changing these values requires editing /etc/icm/icm.yml and restarting the ICM service.
© 2026 Lightbits Labs™