This release brings container health monitoring with automatic rollback during rolling deployments, Compose spec support for healthcheck, devices, and ulimits, and various reliability improvements.
✨ Highlights
Container health monitoring and rollback
Changes: 7a9eac5, 7b88040, ce3cb8a
Rolling deployments now monitor crashes and health checks after starting new containers. If a container keeps restarting or becomes unhealthy, the deployment automatically rolls it back and fails to prevent downtime.
Screen.Recording.2026-03-02.at.8.48.29.am.mov
Compose healthcheck support
Compose files now support the healthcheck attribute, allowing you to define health checks for your services:
services:
app:
image: myapp
healthcheck:
test: curl -f http://localhost:8000/health
interval: 5s
retries: 3
start_period: 10s
start_interval: 1sUse uc deploy --skip-health flag to bypass health monitoring for faster emergency deployments.
See Rolling deployments for more details on how rolling deployments work and how to configure health checks for your services.
Control container replacement order during rolling deployments
PR: #248. Thanks to @nick-potts for the contribution ❤️
You can now control the order of container replacement during rolling deployments with deploy.update_config.order in your Compose file:
start-first(default): starts a new container before stopping the old onestop-first: stops the old container before starting a new one (brief downtime)
services:
app:
image: myapp
deploy:
update_config:
order: stop-firstThe default order automatically switches to stop-first if a service mounts a volume to prevent data corruption.
See Rolling deployments for more details.
Compose devices support
PR: #250. Thanks to @jabr for the contribution ❤️
You can now map host devices into containers, for example, Intel integrated GPU for video transcoding using the devices attribute in your Compose file:
services:
app:
image: myapp
devices:
- /dev/dri:/dev/dri
- /dev/ttyUSB0:/dev/ttyUSB0:rwCompose ulimits support
PR: #244. Thanks to @ipaddicting for the contribution ❤️
You can now set ulimits for service containers in your Compose file. For example, to increase the maximum number of open files:
services:
app:
image: myapp
ulimits:
nofile:
soft: 65536
hard: 65536Auto-provision volumes for global services
PR: #243. Thanks to @zasdaym for the contribution ❤️
When deploying a global service with a volume, the volume is now automatically created on all machines in the cluster.
Improvements
- SSH connections with
ssh+cli://prefix (usesshCLI instead of Go native SSH implementation) reuse a single SSH connection via control socket - significantly speeds upuccommands - Improved
uc image pushsupport on macOS by always running proxy to virtualised Docker (except OrbStack that doesn't require it) - Global service deployment stops all running conflicting containers, e.g. left from interrupted deploys, not just the first one
- Temporary socat proxy containers created by
uc image pushare labeled withuncloud.managed
Bug fixes
- Fixed IPv6 address formatting for HTTP URLs (#254)
- Fixed
uc image pushwhen using Rancher Desktop locally (#251) - Fixed
uc machine initto reset an already initialised machine when usingssh+cli://connection
Upgrade to 0.17.0
Uncloud CLI locally
To upgrade the Uncloud CLI (uc) locally:
# Homebrew (macOS, Linux)
brew upgrade uncloud
# Install script (macOS, Linux)
curl -fsS https://get.uncloud.run/install.sh | shMachine daemon
To upgrade the Uncloud daemon on your machines, run the following commands on each machine:
# AMD64
curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.17.0/uncloudd_linux_amd64.tar.gz
# ARM64
# curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.17.0/uncloudd_linux_arm64.tar.gz
tar -xf uncloudd.tar.gz
sudo install uncloudd /usr/local/bin/uncloudd
rm uncloudd uncloudd.tar.gz
sudo systemctl restart uncloudChangelog
- b48ebe2 chore: UNCLOUD_HEALTH_MONITOR_PERIOD accepts duration (10s, 500ms, 0)
- f8d1945 chore: add TODO for ReplaceContainerOperation
- fe56d6d chore: always run proxy to virtualised Docker on macOS for 'image push' except OrbStack
- f48dc25 chore: fix landing navbar github/discord buttons wrap on mobile
- 44013da chore: format AGENTS, instruct to not use em dashes
- 6e59657 chore: global reconciliation: stop all running conflicting containers, not only replace the first one
- a5a9ef5 chore: init container healthcheck const
- 87e49df chore: label temporary socat proxy containers created by 'uc image push' with uncloud.managed
- 215f214 chore: lint and fix e2e deploy tests with ReplaceContainerOperation
- c91a964 chore: make ssh+cli connections reuse one SSH connection via control socket. Fix image push
- 185cf19 chore: minor full-spec test change
- 1d4dbd9 chore: minor sshcli refactgor
- 5c54e9d chore: refactor device mapping to be compliant with Compose (CDI requests)
- 93d7f29 chore: remove TODO about encapsulating Client in deploy operations
- 808bda6 chore: remove unused constants
- 2588279 chore: rename AI.md to AGENTS.md
- e670559 chore: rename env var UNCLOUD_DEFAULT_HEALTH_MONITOR_PERIOD_MS -> UNCLOUD_HEALTH_MONITOR_PERIOD_MS
- 7c4f739 chore: specify machines to deploy website to
- 18ebd29 chore: split deploy operations into separate files in operation package
- e0a63a3 chore: typo
- 4443fa9 chore: update full-spec test to include latest implemented Compose attributes
- 0b2e1bb chore: update newsletter form to substack
- 53bf446 deploy.update_config.order support to start-first or stop-first when replacing containers (#248)
- ab6f856 feat: Add support for compose
devicesmappings (#250) - ce3cb8a feat: add --skip-health flag to bypass health monitoring during container deployment
- 17c1bb5 feat: add WaitContainerHealthy client method and health check utilities
- 3056e2a feat: add support for healthcheck in Compose
- 3bd9400 feat: add support for ulimits in compose and container creation (#221) (#244)
- 15d9ceb feat: auto-provision volumes on all machines for global services (#243)
- 7a9eac5 feat: implement container health monitoring and rollback during rolling deployment (closes #24)
- 14056cc fix: format IPv6 addr correclty for HTTP URL (#254)
- 7bfaf31 fix: image tag template formatting in docs
- 2940965 fix: recreate container on ulimit changes, add test
- 476a2d5 fix: reset already initialised machine on 'uc machine init' when using ssh+cli connection
- 7b88040 fix: rolling container replacement: if new container fails, rollback and run old container only if it was running
- ce46a67 fix: ssh args for machine init/add when using ssh+cli
- a4a8e70 fix: sshcli tests
- d3ee739 fix: support image push when using Rancher Desktop locally (#251)