Skip to content

Releases: psviderski/uncloud

v0.16.0

13 Jan 00:26

Choose a tag to compare

This is a smaller release focused on reliability improvements, with a new WireGuard network inspection command and expanded Compose spec support for container capabilities and sysctls.

✨ Highlights

WireGuard network inspection

PR: #161. Thanks to @jabr for the contribution ❤️

The new uc wg show command displays the WireGuard network configuration for a machine, including the interface details and all configured peers. This is useful for debugging network connectivity issues and understanding the mesh topology.

Use the -m/--machine flag to inspect the configuration of a specific machine in the cluster or the global --connect user@host flag to inspect the machine that has issues connecting to the cluster.

uc wg show
uc wg show -m machine-1
uc wg show --connect user@host

Kernel capabilities and sysctls support

PRs: #238, #239. Thanks to @4ndv for the contribution ❤️

You can now use cap_add, cap_drop, and sysctls attribute in your Compose files to add or remove Linux capabilities and configure kernel parameters for service containers. This allows fine-grained control over container privileges and behaviour.

services:
  app:
    image: myapp
    cap_drop:
      - ALL
    cap_add:
      - NET_ADMIN
    sysctls:
      net.core.somaxconn: 65535
      net.ipv4.tcp_syncookies: 1

Improved cluster initialisation reliability

Machine initialisation and joining with uc machine init/add have been made more reliable that fixed WireGuard peer misconfiguration for machines joining the cluster:

  • The daemon now waits for the initial Corrosion state sync and cluster components before serving gRPC requests
  • uc machine init and uc machine add commands wait for cluster readiness
  • gRPC auto-retries with exponential backoff for transient connection failures (up to ~8 seconds)

Note

You have to upgrade both the local uc CLI and the Uncloud daemon on all your current machines to v0.16.0 to benefit from this improvement.

Other improvements

  • Added --yes flag to uc machine init/add to auto-confirm machine reset
  • Added ctx conn alias for uc ctx connection command
  • Reduced gRPC connection timeout to proxied machines from 20s to 10s
  • Machine state file is now saved atomically to prevent corruption
  • Config mounts are now creating non-existent parent directories (#233)

Upgrade to 0.16.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 | sh

Machine 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.16.0/uncloudd_linux_amd64.tar.gz
# ARM64
# curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.16.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

  • 878f96a Revert "build: Generate CLI docs in GHA"
  • 9efaab2 build: Generate CLI docs in GHA
  • 5e0d4d0 build: Generate CLI docs in GHA (#236)
  • 33a3683 chore: Regenerate CLI docs
  • 85a2615 chore: add 'ctx conn' alias for 'ctx connection' command
  • 5acf557 chore: add --yes flag to 'uc machine init/add' to auto-confirm machine reset
  • 777615b chore: add TODO to remove extra checks after upgrading clusters to perform store sync
  • 4d97c30 chore: enable gRPC auto retries for transient Unavailable failures up to ~8s
  • 76affeb chore: minor formatting for 'wg show' command, enrich Unimplemented error with >=0.16 requirement
  • fc84709 chore: new InspectMachine gRPC method that to return store DB version (lamport time)
  • 4366714 chore: pass current store DB version when adding new machine to cluster
  • f86e63c chore: reduce the default gRPC connection timeout to proxied machines 20->10s
  • bac34eb chore: save machine state file atomically
  • 5308c87 chore: update 'uc machine init/add' to wait for cluster readiness, confirm caddy deployment on added machine
  • 9bd5ffc chore: update ucind cluster to wait for initial store sync and cluster readiness
  • f6cf731 chore: wait for FailedPrecondition in addition to Unavailable for backward compatibility
  • 8d8acd5 chore: wait for the initial store sync and cluster components before serving cluster gRPC requests
  • a945291 feat: Add uc wg show command to inspect a machine's uncloud wireguard network (#161)
  • 6c2f85d feat: add support for cap_add and cap_drop compose keys (#238)
  • 06c3fba feat: add support for sysctls compose key (#239)
  • 2c34ba7 fix(configs): Create non-existent parent directories automatically (#233)
  • 9a1d2e0 fix: Equals and Clone for configs (#235)
  • b2322e1 fix: WireGuard peers misconfiguration on joined machine by waiting for the initial store sync
  • aa71ab0 fix: e2e caddy test after changing the config header
  • 4be1ea3 fix: machine name for failed machines in 'uc ps'
  • d2a7af7 fix: uncloud daemon crash when listing partially replicated container records
  • 65e9cdd refactor: use WaitGroup.Go to replace wg.Add(1)/go/wg.Done() boilerplate (#222)

v0.15.1

16 Dec 10:12

Choose a tag to compare

This is a bug fix release that upgrades Unregistry to v0.4.1. It fixes occasional failures with pushing images that consist of big layers (hundreds of MBs).

Upgrade to 0.15.1

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

  • db09dec chore: add more tests for MatchesDockerVolume and update error message when volume spec doesn't match
  • 0b32cd2 chore: upgrade unregistry 0.3.1 -> 0.4.1 with a fix for pushing big images
  • 20cdcdf fix: Set volume driver name to "local" if not specified (#219)
  • 425b974 fix: panic when initialising new cluster with --connect

v0.15.0

12 Dec 12:50

Choose a tag to compare

This release features 4 weeks of work from 6 contributors. It brings service logs streaming, new service management commands, SSH CLI connection mode, interactive cluster connection selection, HTTP/3 support, and various improvements and bug fixes.

✨ Highlights

Service logs streaming

PR: #196
The new uc logs command streams logs from service containers across all machines in the cluster. Logs are merged from all replicas with colored output, strict timestamp ordering, and service/container identification.

You can filter logs by machine using -m/--machine, follow mode with -f, and time ranges with --since/--until.

Running uc logs without arguments streams logs from all services defined in the local Compose file.

Screenshot 2025-12-01 at 9 45 23 pm

New service commands

PRs: #165, #195. Thank you @jabr for the contribution! ❤️

  • The uc ps command displays all running containers in the cluster with service name, machine, state, health status, IP address, and creation time. You can sort containers by service, machine, or health status using the --sort flag.

    Screenshot 2025-12-12 at 10 40 07 pm
  • New uc start and uc stop commands allows starting and stopping all containers of the specified services across cluster machines. The stop command supports --signal and --timeout options for graceful shutdown control.

SSH CLI connection mode

PRs: #152, #173. Thank you @luislavena for the contribution! ❤️

A new ssh+cli:// connection scheme allows using the system's ssh (OpenSSH) CLI client instead of the native Go implementation of the SSH protocol for connecting to cluster machines. This makes it possible to init machines in private networks via ProxyJump, use hardened SSH agents like 1Password or Yubikey, and use existing custom host configuration from your ~/.ssh/config.

If ssh <target> works from your terminal, then uc machine init/add ssh+cli://<target> should also work.

We will make this connection mode the default after addressing the edge case of removing machines when using the ssh+cli scheme.

Interactive connection selection

PR: #170. Thank you @jabr for the contribution! ❤️

The new uc ctx connection command provides an interactive selector for choosing the preferred cluster connection among multiple configured ones.

Screenshot 2025-12-12 at 10 42 26 pm

HTTP/3 support

PR: #204. Thank you @z0rrn for the contribution! ❤️

Caddy (reverse proxy) now exposes UDP port 443 for HTTP/3 (QUIC) protocol support, enabling faster HTTPS connections for supported clients.

New managed DNS domain

Free managed DNS subdomains now use the new shorter xxxxxx.uncld.dev domain instead of xxxxxx.cluster.uncloud.run to separate the main project domain (uncloud.run) from the user cluster's domains. See tweet for more details. Existing subdomains will continue to work.

You can run uc dns release && uc dns reserve to release your old subdomain and reserve a new one under uncld.dev.

Improvements

  • --context flag is now a global option available on all commands (#174)
  • Unix domain socket connector for local daemon connections (#186)
  • Machine ID stored on connection entries in ~/.config/uncloud/config.yaml for automatic cleanup when removing machines (#182)
  • Services sorted by name in uc ls output
  • IP ADDRESS column added to uc ps and uc inspect output
  • CREATED column added to uc ps with fallback sorting by creation time
  • Machine install.sh script supports INSTALL_ONLY mode to skip daemon setup (#194)
  • uc --help output shows links to documentation and Discord
  • Minor documentation updates and improvements

Bug fixes

  • Fixed volume driver options not being used when driver is not explicitly specified (#211)
  • Fixed new Compose deployment with volumes and --recreate flag (#176)

Upgrade to 0.15.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 | sh

Machine 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.15.0/uncloudd_linux_amd64.tar.gz
# ARM64
# curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.15.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

  • 3c33973 chore(exec): Update TODO regarding signal forwarding
  • 596bc56 chore: 'uc stop' - make --timeout default explicit, update flag and long descriptions
  • bc65c73 chore: add CREATED column to 'uc ps', fallback sorting by CREATED
  • 05c8117 chore: add redirect from uncloud.run/discord to discord invite
  • e30ea89 chore: enable CGO to be able to build fsevent required by updated compose on macOS
  • 2e655d8 chore: extract version from latest redirect in install_cli.sh (#180)
  • e87207e chore: fix landing logo shadow
  • f215fae chore: group deploy and service management commands in uc --help
  • 4433095 chore: show links to docs and Discord for the root 'uc --help' command
  • 95afc7f chore: sort 'uc inspect' containers by CREATED
  • 3fbba6d chore: sort services in 'uc ls' output by name
  • 3019377 chore: update logo for docs
  • 53def3a chore: update white color in logo-title-dark.svg
  • bf65fba feat --utc flag for 'uc logs' command to print timestamps in UTC
  • 234985b feat(install): Add install-only mode to the install script (#194)
  • eea8172 feat(ssh+cli): Support SSH CLI on machine init and add commands (#173)
  • 4b4b721 feat(uc/caddy): expose 443/udp port for HTTP3 (#204)
  • 27cfe1c feat: 'uc logs' without argements streams logs for services in the local Compose file
  • a9a720f feat: Add uc service start/stop commands (#195)
  • 1d41373 feat: Interactive 'uc ctx connection` command to select preferred cluster connection (#170)
  • 91a09d5 feat: add CLI connector for unix domain socket (#186)
  • cb0df21 feat: add IP ADDRESS column to 'uc ps' and 'uc inspect'
  • d89bfb8 feat: add uc ps command to list all containers in the cluster (#165)
  • 79dc05c feat: service logs command to stream service logs (#196)
  • 76b4369 feat: store machine id on connection entries in Uncloud config so it can be removed with machine (#182)
  • 1e6aaf4 feat: support filtering service logs by machine (-m/--machine)
  • 796363f fix: TestCollectContainers unit tests
  • 57205e1 fix: new Compose deployment with volumes and --recreate flag (fixes #176)
  • 6373d40 fix: volume driver options are not used if driver if not specified [bug #210] (#211)
  • f6d75d5 lint
  • ebd4622 lint
  • 939645e refactor: Make --context cli flag a global option (#174)
  • 75085b3 refactor: Simplify dns e2e test using new ExecContainer functionality (#178)
  • 6a1cd7b refactor: replace loadProjectFromContent with compose.LoadProjectFromContent

v0.14.0

12 Nov 14:47

Choose a tag to compare

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 section in your Compose file and run:

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
  • Deploys your services as usual

See the new Deploy an app guide for full details.

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

uc-deploy-demo.mp4

Execute commands in running containers

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

# 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:

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

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:

# 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:

# 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

  • 48d2239 Connect to remote SSH nodes using SSH CLI (#152)
  • 1c3f210 bug: Use GITHUB_TOKEN if present in scripts/install_cli.sh (#169)
  • 2f5f515 build: Bump go tests timeout to 15 min
  • 90d244f chore: 'uc image push' fix long description
  • 6da8e98 chore: add TODO to refactor docker client method
  • 7e366ff chore: add gitutils package to inspect local git repo
  • 89db50e chore: consistent casing
  • 4cdbaa20b909ef6ae47a386b9d7b5be84996fd8c chore: enable CGO to be able to build fsevent required by updated compose on macOS
  • 497b948 chore: fix the examples for 'uc image push' command after changing default
  • 722615c chore: go mod tidy
  • 328ace1 chore: implement image template processing using git repo state (not enabled)
  • dde23b5 chore: increase timeout 5->30s for waiting for machines to be ready in ucind cluster
  • bd8a843 chore: inspecrt git state without an error if git utility not available
  • 4de068c chore: pin corrosion version to the latest working version v0.2.2
  • 9a0b1a4 chore: print (custom Caddy config) for service ENDPOINTS if x-caddy is used
  • 2d292ed chore: remove x-machines from website compose
  • 6e4439b chore: show container image for the remove container plan operation
  • 2b93a1c chore: update --container flag help that accepts ID prefix
  • 3ac5992 chore: use short container ID for stop operation in deploy plan
  • 06d9885 doc: Generate docs
  • c3ecd37 feat(build): --push and --push-registry flags to push build images to cluster or registries
  • 65c3e0a feat(build): print if no services to build, build dependencies --dep, check build configuration --check
  • 882f2f5 feat(build,deploy): build service images using compose (bake/buildkit), push to cluster, and deploy
  • abea3e2 feat: "exec" command to start processes inside remote containers (#139)
  • 15d4ef5 feat: Allow container matching by ID prefix (#175)
  • 6af7a98 feat: Allow to match containers against truncated ID (#160)
  • ba6290d feat: add "nearest..internal" mode to internal DNS (#159)
  • 5c4f49b feat: new cbuild (compose build) command using Compose implementation
  • 26c3699 feat: process image templates in compose services, set default git-based tags if not specified
  • 3b4bcb7 feat: support service.gpus and reservations.devices (#156)
  • 30bb33f fix(exec): Handle context cancellation server-side
  • 9770151 fix: 'uc deploy' push image to all machines if x-machines is not specified
  • 0153e9f fix: progress percent overflow in image push (#153)
  • b6dfc21 fix: reconfigure WireGuard peers when listed >=1 machines in cluster store (fixes #155)
  • 4d591f9 lint
  • 809d1ec lint
  • d0c23fa lint: fix ineffassign
  • 7bff706 ref: Rewrite config tests with Exec
  • 4bc47af refactor: strip project name from volume names without mangling project name

v0.13.2

20 Oct 11:23

Choose a tag to compare

This is a bug fix release for the uc CLI, no daemon update on the machines is required. See update your CLI.

Changelog

  • e251dd9 fix: Improve wording for containerd warning
  • 40862df fix: compose variables are now interpolated from .env file (fixes #144)

v0.13.1

13 Oct 10:43

Choose a tag to compare

Bug fixes

  • Now uc image push doesn't fail when uploading a large image that takes more than 10s. You need to update only the uc CLI. #141

Changelog

  • 6ba98e4 fix: uc image push closed network connection error if takes >10s (fixes #141)

v0.13.0

10 Oct 09:03

Choose a tag to compare

This release features 3 weeks of work from 3 contributors. It's focused on unregistry integration and expanding Compose support.

Highlights

Unregistry integration (push images to cluster)

We've integrated unregistry to make image distribution way easier. You can build your Docker images locally or on CI and push them directly to your Uncloud cluster without needing an external registry. Only the missing layers are transferred, making it efficient and fast.

# Push local Docker image to a specific or multiple machines.
uc image push IMAGE [-m/--machine NAME[,NAME]]

# Push local Docker image to all machines.
uc image push IMAGE -m all

See uc image push documentation for more details and examples.

Screen.Recording.2025-09-30.at.8.01.39.pm.mov

Under the hood, uncloudd daemon on each machine runs an embedded unregistry server that handles the image receiving and storage in containerd. uc image push requires containerd image store to be enabled for Docker on the target machines.

This brings us one step closer to an end-to-end uc deploy experience which will handle building, pushing, and deploying images in one go.

Inspect images

You can now inspect what images you have on your machines in the cluster.

# List all images on all machines.
uc images

# List images on specific machines.
uc images -m machine1,machine2

# List images filtered by name pattern.
uc images "myapp:1.*"

See uc images documentation for more details and examples.

Screenshot 2025-10-10 at 6 53 47 pm
Untitled.mp4

Compose configs

PR: #116 Thank you @tonyo for the contribution! ❤️

Uncloud now supports Compose configs for managing configuration files in your services. Configs allow you to store non-sensitive configuration data separately from your container images and mount them into containers at runtime.

Example compose.yaml using configs:

services:
  app:
    image: myapp:latest
    configs:
      - source: app_config
        target: /app/config.yaml

configs:
  app_config:
    # Local path is relative to compose.yaml location
    file: ./config.yaml

See Configs documentation for more details.

Internal DNS improvements

PR: #123 Thank you @jabr for the contribution! ❤️

New machine-scoped DNS entries <machine-id>.m.<service-name>.internal allow targeting services on specific machines.
This is useful for debugging, health checks, or machine-specific routing needs.

See Internal DNS documentation for more details.

Containerd image store integration

Uncloud now automatically configures Docker to use the containerd image store by default on new machines, enabling:

  • uc image push feature to push images directly to the cluster machines via unregistry
  • ability to push and store multi-platform images

The system gracefully handles machines without containerd support and provides clear error messages when required features aren't available.

Improvements

  • uc ls now displays the IMAGE column showing which container image(s) each service is running
  • Service containers now receive UNCLOUD_MACHINE_ID environment variable with the machine ID they are running on
  • Updated Docker and Compose Go dependencies to latest versions for better compatibility

Bug fixes

  • Fixed panic in Docker when pushing images without authentication
  • Fixed error handling when removing non-existent services

Changelog

  • 2d361d3 Adding machine.service.internal dns entries (#123)
  • a2c6cbe chore(images): filter images by name with wildcard pattern using Docker filter
  • 509c9eb chore(images): format platforms as pills, sort images by name
  • 59074a2 chore(images): initialise Docker service with containerd client
  • cce81ec chore(images): simplifies ListImages service, server, and client to only list Docker images and not directly access containerd
  • e8b4dd0 chore(push): fail 'image push' when containerd image store not used on target machine
  • 521ccf2 chore(push): run unregistry only if containerd image store enabled for docker
  • 337c15d chore: Add node to Mise
  • c6d18f5 chore: NAME -> IMAGE column name
  • 782f4cb chore: Update AI.md with instructions around tests and docs
  • 977fdf3 chore: add Proxy for proxing local connections to a remote TCP address using the dialer
  • fa004d6 chore: add firewall rule to allow cluster machines to push to other machines unregistry
  • e0d11a8 chore: configure Docker to use containerd image store by default (closes #129)
  • 458d282 chore: correct comment and add TODO to move machine resolution to grpc-proxy router
  • bc6f2fd chore: fix docker client CreateContainerWithImagePull, add WaitPortPublished
  • 3bac1e6 chore: go mod tidy
  • fc3297c chore: go mod tidy
  • bcc504b chore: internal Docker client PushImage
  • 27bbbe7 chore: internal docker package with handy PullImage and CreateContainerWithImagePull methods
  • ae458d2 chore: refactor duplication
  • e0045c7 chore: refactor gRPC docker client
  • 82fd974 chore: remove unused imports
  • 2969b40 chore: return a proxy dialer for SSH connections
  • a217643 chore: shorten socat proxy container progress message
  • a30ed60 chore: update docker and compose Go dependencies to the latest versions
  • 6d2e100 feat(images): 'uc image ls' and 'uc images' (alias) commands to list images on machines
  • 0fc5032 feat(images): add IN USE column to highlight which images are used by any container
  • 92975ee feat(images): add gRPC proto ListImages
  • cdff036 feat(images): gRPC client and server for ListImages
  • fba03b3 feat(images): list image platforms and do not group images by machine
  • 1f9c2c8 feat(images): list images filtered by name
  • 684f0d3 feat(push): '--platform all' to push image to all machines in cluster
  • ffed906 feat(push): 'image push' to single or multiple machines via unregistry proxy
  • 332e7bc feat(push): --platform flag to push a specific platform of a multi-platform image
  • 9f6880b feat(push): stub for 'image push' command and Dialer interface for cluster connectors
  • 63c4de5 feat: Initial support for Compose configs (#116)
  • b6b8286 feat: run embedded unregistry on machine IP in uncloudd daemon
  • 3e804d9 feat: set UNCLOUD_MACHINE_ID in service container ENV (#135)
  • 60926f6 feat: show IMAGE column when listing services (uc ls) #13
  • 5aa85ab fix(push): always provide encoded empty auth config to work around panic in Docker
  • 08f233c fix: auto-detect containerd.sock path and conditionally start unregistry
  • cd25b97 fix: docker client PullImage
  • 1a1afec fix: e2e test rebind the registry port to unoccupied 5001
  • 893ab1f fix: negotiate docker client API version in e2e test
  • 20cf98d fix: return an error if 'uc rm' tries to remove a service that doesn't exist
  • 784d86d fix: test build for docker server
  • 265042e lint

v0.12.2

22 Sep 01:42

Choose a tag to compare

What's new

Multiple connection support

When connecting to a cluster, the CLI will now try each connection in the Uncloud config (~/.config/uncloud/config.yaml) until one succeeds. A progress spinner indicates what connection it is trying.

current_context: default
contexts:
  default:
    connections:
      - ssh: ubuntu@152.67.101.198
      - ssh: root@1.2.3.4
      - ssh: ubuntu@137.123.45.67
Screen.Recording.2025-09-13.at.9.15.40.pm.mov

Auto-confirmation for deployment

You can auto-confirm the deployment plan either locally or on CI with -y|--yes flag or UNCLOUD_AUTO_CONFIRM=true environment variable:

uc deploy --yes
# or
UNCLOUD_AUTO_CONFIRM=true uc deploy

Skip machine provisioning

New --no-install flag for machine init and machine add commands allows you to skip the automatic installation of Docker, Uncloud daemon, and dependencies on the machine. Useful when you want to use your own method for installing Uncloud daemon on the machine. See #122.

uc machine init user@server --no-install

Env vars

Instead of the --uncloud-config and --connect flags, you can now use the following environment variables:

  • UNCLOUD_CONFIG - Override the default config file path (~/.config/uncloud/config.yaml)
  • UNCLOUD_CONNECT - Connect to a remote machine without using a config file

Changelog

  • 6d0b1dc chore bump mise version on CI to 2025.9.6
  • e1734a1 chore: bump Go to 1.25.1
  • 51840e0 chore: bump golangci-lint to 2.4.0
  • 375bb38 chore: bump golangci-lint to 2.4.0 on CI
  • 84376bb chore: mise.lock include checksums for linux-x64
  • 8a273db chore: rename cluster -> context option in commands for consistency
  • 1f62e30 chore: update mise checksums for linux-x64
  • 88f05ff chore: update mise checksums for macos-arm64
  • f8fe3c7 feat: --no-install flag for 'machine init/add' to skip installing Uncloud daemon and dependencies #122
  • bc07847 feat: add -y|--yes flag for 'us deploy' to auto-confirm deployment plan
  • 3db07ca feat: allow setting config and connection with UNCLOUD_CONFIG and UNCLOUD_CONNECT env vars
  • 831c581 feat: try each cluster connection in order until one succeeds, add progress spinner
  • 8f906cf fix: do not auto-confirm deploy plan on CI (no TTY), require explicit --yes or UNCLOUD_AUTO_CONFIRM=true
  • b6e9766 lint: gRPC status.Error for static error messages

v0.12.1

10 Sep 07:05

Choose a tag to compare

Caddy config loading

After upgrading both CLI and machine daemons to v0.12.1, you can redeploy Caddy without using the --watch flag.

The Caddy config is now loaded automatically by the machine daemon via the Caddy Admin API. This allows to log errors and not overwrite the Caddyfile on disk if the config is invalid. uc caddy config should now return the latest config that was successfully loaded into Caddy.

Unique context name for new clusters

When creating a new cluster, if the default context name default is already taken, a unique name like default-1, default-2, etc. will be generated automatically.

Changelog

  • 8358343 chore: Add GH bug report template
  • 9963f9d chore: Update bug template
  • 5baa808 chore: load Caddy config via admin API instead of watching Caddyfile change on fs
  • d25864e feat: automatically generate a unique 'default-N' context name for new cluster (fixes #113)
  • ec2787c fix: Handle implicit relative path for config
  • 51ba3c7 fix: landing navbar on mobile
  • 97bdb8e fix: skip validation for user-defined Caddy configs if caddy not running locally
  • 7b88b8b fix: write generated Caddyfile to disk only if succesfully loaded into local Caddy (means valid)

v0.12.0

28 Aug 10:20

Choose a tag to compare

What's new

✨ Custom Caddy configuration (per-service and global)

For advanced routing and behavior, use x-caddy instead of x-ports in Compose files. It allows you to provide custom Caddy configuration for a service in Caddyfile format. See Ingress & HTTPS docs for details.

compose.yaml example
  • Use templates like {{upstreams 8000}} to automatically insert healthy container IPs for reverse_proxy.
  • Deploy global Caddy config with uc caddy deploy --caddyfile or x-caddy in a Compose file for caddy service.
  • Invalid Caddy configs are skipped instead of breaking everything.
  • View the complete generated Caddyfile served by Caddy with uc caddy config:
SCR-20250828-saca

New documentation

Improvements

  • Caddy now uses Caddyfile format instead of JSON which is more human-friendly.
  • Caddy keeps its data between restarts (certificates are preserved) using a persistent volume.

Upgrade to 0.12.0

⚠️ After upgrading both machines and CLI, you need to redeploy the caddy service to be able to use the new custom Caddy configs. This update will also lose all the previously issued TLS certificates because a persistent data wasn't used before.
Please follow Deploying or updating Caddy.

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 | sh

Machine 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.12.0/uncloudd_linux_amd64.tar.gz
# ARM64
# curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.12.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

  • e99e769 chore: add Caddy gRPC service to retrieve Caddyfile config from machines
  • c01365b chore: add header to generated Caddyfile that it's autogenerated
  • 3cda5cc chore: caddy client to get caddy config
  • 813c397 chore: change reverse_proxy upstreams from 'to' to the directive arguments
  • 48dc1dd chore: delete unused image digest resolver
  • 81f4e3a chore: fix mockery for linux in .mise.lock
  • 455174c chore: generate sites in Caddyfile from x-ports alongside caddy.json
  • 11949ee chore: include validation errors for user-defined Caddy configs as a comment in Caddyfile
  • 8bf9fc0 chore: introduce mockery for generating mocks, generate for CaddyfileValidator
  • db60a81 chore: lint
  • 066d411 chore: parse Created time on container with CreatedTime
  • 93fef88 chore: refactor Caddyfile generator to accept a validator
  • 75fdbaf chore: relax ports+Caddy spec validation to allow host mode ports
  • b437659 chore: update comments in generated Caddyfile
  • 290e6db docs(ingress): Publishing service and Managing Caddy
  • 9f5ca9a feat: add 'uc caddy config' command to show the current Caddyfile
  • 3a6eef4 feat: add --caddyfile flag to 'uc caddy deploy' and 'uc run' commands
  • 0397086 feat: concatenate custom Caddy configs for services into final Caddyfile (no upstream interpolation)
  • b046b78 feat: migrate Caddy to generated Caddyfile, mount persistent data volume
  • 5cc005a feat: validate and append custom per-service Caddy configs to generated Caddyfile
  • 0107363 fix: allow host mode x-ports with x-caddy in compose
  • 5a1e61c fix: broken links to completions docs in CLI reference
  • 6476908 fix: format for --publish flag
  • ff213e7 fix: unmarshaling of ServiceSpec in ServiceContainer struct