Releases: psviderski/uncloud
v0.16.0
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@hostKernel 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: 1Improved 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 initanduc machine addcommands 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
--yesflag touc machine init/addto auto-confirm machine reset - Added
ctx connalias foruc ctx connectioncommand - 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 | 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.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 uncloudChangelog
- 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 showcommand to inspect a machine's uncloud wireguard network (#161) - 6c2f85d feat: add support for
cap_addandcap_dropcompose keys (#238) - 06c3fba feat: add support for
sysctlscompose 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
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 uncloudChangelog
- 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
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.
New service commands
PRs: #165, #195. Thank you @jabr for the contribution! ❤️
-
The
uc pscommand 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--sortflag.
-
New
uc startanduc stopcommands allows starting and stopping all containers of the specified services across cluster machines. The stop command supports--signaland--timeoutoptions 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.
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
--contextflag 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.yamlfor automatic cleanup when removing machines (#182) - Services sorted by name in
uc lsoutput IP ADDRESScolumn added touc psanduc inspectoutputCREATEDcolumn added touc pswith fallback sorting by creation time- Machine install.sh script supports
INSTALL_ONLYmode to skip daemon setup (#194) uc --helpoutput 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
--recreateflag (#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 | 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.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 uncloudChangelog
- 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/stopcommands (#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 pscommand 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
--contextcli 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
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 mydbGPU support
Services can now request GPU resources and device reservations through standard Compose attributes:
gpusfor GPU allocationdeploy.resources.reservations.devicesfor 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: A comprehensive how-to guide for deploying applications from source code or pre-built images
- Deploy to specific machines: Deploy services to specific machines in your cluster
- Deploy a global service: Deploy exactly one replica of a service on each machine in your cluster
- Compose file reference: Image tag template: Template syntax for tagging built images
Bug fixes
- Fixed
uc deployto push images to all machines whenx-machinesis 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_TOKENenvironment 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 | 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.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 uncloudChangelog
- 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
This is a bug fix release for the uc CLI, no daemon update on the machines is required. See update your CLI.
Changelog
v0.13.1
v0.13.0
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 allSee 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.
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.yamlSee 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 pushfeature 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 lsnow displays theIMAGEcolumn showing which container image(s) each service is running- Service containers now receive
UNCLOUD_MACHINE_IDenvironment 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
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.67Screen.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 deploySkip 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-installEnv 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
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
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.
- Use templates like
{{upstreams 8000}}to automatically insert healthy container IPs forreverse_proxy. - Deploy global Caddy config with
uc caddy deploy --caddyfileorx-caddyin a Compose file forcaddyservice. - Invalid Caddy configs are skipped instead of breaking everything.
- View the complete generated Caddyfile served by Caddy with
uc caddy config:
New documentation
- Concepts > Ingress & HTTPS: How Caddy works as a reverse proxy, publishing services, custom Caddy config, and managing
caddyservice. - CLI reference: Automatically generated CLI reference docs.
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
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 | 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.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 uncloudChangelog
- 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