v0.14.0

psviderski/uncloudv0.14.0Nov 12, 2025by psviderski

AI Summary

Focused release on deploying apps from source code, executing commands in running containers, and expanding Compose support including GPU support.

Key Highlights

  • Deploy apps from source code with 'uc deploy' command
  • Execute commands in running containers with 'uc exec'
  • GPU support via gpus and reservations.devices
  • Nearest replica DNS resolution

New Features

  • 'uc deploy' builds images locally from source code
  • 'uc exec' runs interactive shells or one-off commands in containers
  • GPU allocation via gpus attribute
  • Device access via reservations.devices
  • nearest.<service>.internal DNS prioritizes machine-local replicas
  • Image push to all machines when x-machines not specified
  • WireGuard peer reconfiguration fix for joining machines

Full Release Notes

This release features **3 weeks of work** from **4 contributors**. It's focused on deploying apps from source code, executing commands in running containers, and expanding Compose support.

## ✨Highlights

### Deploy an app from source code

Build and deploy your apps in one command. No registry required.

Just configure a [`build`](https://github.com/compose-spec/compose-spec/blob/main/spec.md#build) section in your Compose file and run:

```shell
uc deploy
```

- Builds your images locally
- Tags images with a Git version making every deployment traceable to its source commit
- Pushes images straight to your cluster machines using [unregistry](https://github.com/psviderski/unregistry)
- Deploys your services as usual

See the new [Deploy an app](https://uncloud.run/docs/guides/deployments/deploy-app) guide for full details.

Watch `uc deploy` building and deploying a demo app (18 seconds):

https://github.com/user-attachments/assets/0a308b55-dffc-40c1-8a8b-d8a0d6c60020

### Execute commands in running containers

You can now run interactive shells or execute one-off commands in running service containers using `uc exec` command.

```bash
# Start an interactive shell ("bash" or "sh" will be tried by default)
uc exec web-service

# Restore a database from an SQL dump
cat backup.sql | uc exec -T db psql -U postgres mydb
```

### GPU support

Services can now request GPU resources and device reservations through standard Compose attributes:
- [`gpus`](https://github.com/compose-spec/compose-spec/blob/main/spec.md#gpus) for GPU allocation
- [`deploy.resources.reservations.devices`](https://github.com/compose-spec/compose-spec/blob/main/deploy.md#devices) for device access

This enables deployment of workloads requiring GPU like machine learning applications and video processing services.

### Nearest replica DNS

Internal DNS now supports `nearest.<service>.internal` resolution, which prioritises machine-local replicas by returning their IPs first in the response.

## New documentation

- [**Deploy an app**](https://uncloud.run/docs/guides/deployments/deploy-app): A comprehensive how-to guide for deploying applications from source code or pre-built images
- [**Deploy to specific machines**](https://uncloud.run/docs/guides/deployments/deploy-specific-machines): Deploy services to specific machines in your cluster
- [**Deploy a global service**](https://uncloud.run/docs/guides/deployments/deploy-global-services): Deploy exactly one replica of a service on each machine in your cluster
- [**Compose file reference: Image tag template**](https://uncloud.run/docs/compose-file-reference/image-tag-template): Template syntax for tagging built images

## Bug fixes

- Fixed `uc deploy` to push images to all machines when `x-machines` is not specified
- Fixed WireGuard peer reconfiguration when machines join cluster (#155)
- Fixed image push progress percent overflow (#153)

## Additional updates

- Container images displayed in removal plan operations
- Shorter container IDs shown in deploy plan operations
- Corrosion version pinned to v0.2.2
- Docker and Compose dependencies updated to latest versions
- Installation script now respects `GITHUB_TOKEN` environment variable

## Upgrade to 0.14.0

### Uncloud CLI locally

To upgrade the Uncloud CLI (`uc`) locally:

```bash
# Homebrew (macOS, Linux)
brew upgrade uncloud

# Install script (macOS, Linux)
curl -fsS https://get.uncloud.run/install.sh | sh
```

### Machine daemon

To upgrade the Uncloud daemon on your machines, run the following commands on each machine:

```bash
# AMD64
curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.14.0/uncloudd_linux_amd64.tar.gz
# ARM64
# curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.14.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 uncloud
```

## Changelog
* 48d2239f5d49ef5a8b655a43052b4d259167bb62 Connect to remote SSH nodes using SSH CLI (#152)
* 1c3f210848878709c167943349cea3126504881e bug: Use GITHUB_TOKEN if present in scripts/install_cli.sh (#169)
* 2f5f515696c7e864fe99809dcc104fe46771e65b build: Bump go tests timeout to 15 min
* 90d244fea831a51b31cd30c6b1fe4871ac975143 chore: 'uc image push' fix long description
* 6da8e98c625fbc7841651b32da721ee9c02dce02 chore: add TODO to refactor docker client method
* 7e366ff980799944092890f580adfc4bdf9ecb0c chore: add gitutils package to inspect local git repo
* 89db50e8df1b573bf6e0e3a9f330a795a675dab0 chore: consistent casing
* 4cdbaa20b909ef6ae47a386b9d7b5be84996fd8c chore: enable CGO to be able to build fsevent required by updated compose on macOS
* 497b9483f65b16f42e1774a2472ce4fb4ca071a2 chore: fix the examples for 'uc image push' command after changing default
* 722615cd9bae52152d8c083c11bf9dac2333713d chore: go mod tidy
* 328ace1fd1a61341744a8599a6d187b85747e130 chore: implement image template processing using git repo state (not enabled)
* dde23b55497be2f07071ff428afe88e31b1ff73a chore: increase timeout 5->30s for waiting for machines to be ready in ucind cluster
* bd8a84397221636184bb5c61d3e7a5c32bd6880e chore: inspecrt git state without an error if git utility not available
* 4de068c46e67110dbc498f76d42f425f9af2e14b chore: pin corrosion version to the latest working version v0.2.2
* 9a0b1a4ce36cbca13861529034d1280b414cd545 chore: print (custom Caddy config) for service ENDPOINTS if x-caddy is used
* 2d292ed05332b96ee37d4a903dd2dbca76c64b8b chore: remove x-machines from website compose
* 6e4439bf490857609393c8e86afc5d149a98ef83 chore: show container image for the remove container plan operation
* 2b93a1c089ae98f6c415cd08bee4baf26989e5b8 chore: update --container flag help that accepts ID prefix
* 3ac5992e1d8b3a1a86fa8e3506cc2e865c1cb4ba chore: use short container ID for stop operation in deploy plan
* 06d988583dbe2398f642bd45e34b4b02455cbc07 doc: Generate docs
* c3ecd378f820d13e6da753f8905ff74334f6b10a feat(build): --push and --push-registry flags to push build images to cluster or registries
* 65c3e0a68d06e84bc7c5ad01185ace6beee4894c feat(build): print if no services to build, build dependencies --dep, check build configuration --check
* 882f2f5d03ed5e90887ed9b5950f9e1ef061149f feat(build,deploy): build service images using compose (bake/buildkit), push to cluster, and deploy
* abea3e229e0989b33d3adac6e54b0ae37cddb4d8 feat: "exec" command to start processes inside remote containers (#139)
* 15d4ef5518faca900958f76b59a8dc6ede4245b3 feat: Allow container matching by ID prefix (#175)
* 6af7a9861d2a1a1abf68090555e2ec1a04ec50e7 feat: Allow to match containers against truncated ID (#160)
* ba6290d616b625a9d88d70b218d540f44d1c9c2e feat: add "nearest.<service>.internal" mode to internal DNS (#159)
* 5c4f49b685622b200d709f47bd32dfa16cba9be6 feat: new cbuild (compose build) command using Compose implementation
* 26c3699a9ed7c5e8e9979c2f26ff14e1009b98be feat: process image templates in compose services, set default git-based tags if not specified
* 3b4bcb7932f65bb651160e76fa065a95666c0337 feat: support service.gpus and reservations.devices (#156)
* 30bb33f1a06720207706fc8ecbc64dc3d6a5cf1c fix(exec): Handle context cancellation server-side
* 97701515831409d680fa7975ff600630e5775d73 fix: 'uc deploy' push image to all machines if x-machines is not specified
* 0153e9f9e2b28e175fc6779c0fcc6dc8f46edfa9 fix: progress percent overflow in image push (#153)
* b6dfc2175fcfa02d6fcc5a00928dd9118248cb35 fix: reconfigure WireGuard peers when listed >=1 machines in cluster store (fixes #155)
* 4d591f9efcd736710c9d0f260b449316a582b06b lint
* 809d1eca7745413855f0e823d6a7d2414bf6d177 lint
* d0c23fa840ad477f20e245afb908cbd2e59287ca lint: fix ineffassign
* 7bff706aa0c85ae23a5fce3ed8e6c4ef55e75447 ref: Rewrite config tests with Exec
* 4bc47af05b13b669cd7d5efb4a3a2262ed1cc6d9 refactor: strip project name from volume names without mangling project name