mirror of
https://github.com/psviderski/uncloud.git
synced 2026-11-10 12:44:16 +00:00
docs(releases): copy release notes from github to docs for v0.16.0-v0.21.0
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
label: Release notes
|
||||
collapsed: true # keep the category closed by default
|
||||
link:
|
||||
type: generated-index
|
||||
description: What's new in each Uncloud release and how to upgrade.
|
||||
# Each release page sets sidebar_position to the negative minor.patch version (for example, -22.0 for v0.22.0)
|
||||
# to list the newest release first.
|
||||
@@ -0,0 +1,96 @@
|
||||
---
|
||||
sidebar_position: -16.0
|
||||
sidebar_label: v0.16.0
|
||||
---
|
||||
|
||||
# v0.16.0
|
||||
|
||||
This page mirrors the [GitHub release](https://github.com/psviderski/uncloud/releases/tag/v0.16.0), which also includes
|
||||
the full list of commits.
|
||||
|
||||
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 {#highlights}
|
||||
|
||||
### WireGuard network inspection
|
||||
|
||||
PR: [#161](https://github.com/psviderski/uncloud/issues/161). Thanks to [@jabr](https://github.com/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.
|
||||
|
||||
```bash
|
||||
uc wg show
|
||||
uc wg show -m machine-1
|
||||
uc wg show --connect user@host
|
||||
```
|
||||
|
||||
### Kernel capabilities and `sysctls` support
|
||||
|
||||
PRs: [#238](https://github.com/psviderski/uncloud/issues/238), [#239](https://github.com/psviderski/uncloud/issues/239). Thanks to [@4ndv](https://github.com/4ndv) for the contribution ❤️
|
||||
|
||||
You can now use [`cap_add`](https://github.com/compose-spec/compose-spec/blob/main/spec.md#cap_add), [`cap_drop`](https://github.com/compose-spec/compose-spec/blob/main/spec.md#cap_drop), and [`sysctls`](https://github.com/compose-spec/compose-spec/blob/main/spec.md#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.
|
||||
|
||||
```yaml
|
||||
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:
|
||||
|
||||
```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.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
|
||||
```
|
||||
@@ -0,0 +1,141 @@
|
||||
---
|
||||
sidebar_position: -17.0
|
||||
sidebar_label: v0.17.0
|
||||
---
|
||||
|
||||
# v0.17.0
|
||||
|
||||
This page mirrors the [GitHub release](https://github.com/psviderski/uncloud/releases/tag/v0.17.0), which also includes
|
||||
the full list of commits.
|
||||
|
||||
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 {#highlights}
|
||||
|
||||
### Container health monitoring and rollback
|
||||
|
||||
Changes: [7a9eac5](https://github.com/psviderski/uncloud/commit/7a9eac593f9be0f02b42b1bef5b82f311e6af243), [7b88040](https://github.com/psviderski/uncloud/commit/7b88040c73a43e1dea8db79513fec1c3cd5eac79), [ce3cb8a](https://github.com/psviderski/uncloud/commit/ce3cb8a34f3ae027a4c17b3425eb58c466ce3dbc)
|
||||
|
||||
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.
|
||||
|
||||
https://github.com/user-attachments/assets/4ee73048-9ca2-4c8a-b075-f8c6a0840ee7
|
||||
|
||||
#### Compose `healthcheck` support
|
||||
|
||||
Compose files now support the [`healthcheck`](https://github.com/compose-spec/compose-spec/blob/main/spec.md#healthcheck) attribute, allowing you to define health checks for your services:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
app:
|
||||
image: myapp
|
||||
healthcheck:
|
||||
test: curl -f http://localhost:8000/health
|
||||
interval: 5s
|
||||
retries: 3
|
||||
start_period: 10s
|
||||
start_interval: 1s
|
||||
```
|
||||
|
||||
Use `uc deploy --skip-health` flag to bypass health monitoring for faster emergency deployments.
|
||||
|
||||
See [Rolling deployments](/docs/guides/deployments/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](https://github.com/psviderski/uncloud/pull/248). Thanks to [@nick-potts](https://github.com/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 one
|
||||
- `stop-first`: stops the old container before starting a new one (brief downtime)
|
||||
|
||||
```yaml
|
||||
services:
|
||||
app:
|
||||
image: myapp
|
||||
deploy:
|
||||
update_config:
|
||||
order: stop-first
|
||||
```
|
||||
|
||||
The default order automatically switches to `stop-first` if a service mounts a volume to prevent data corruption.
|
||||
|
||||
See [Rolling deployments](/docs/guides/deployments/rolling-deployments) for more details.
|
||||
|
||||
### Compose `devices` support
|
||||
|
||||
PR: [#250](https://github.com/psviderski/uncloud/pull/250). Thanks to [@jabr](https://github.com/jabr) for the contribution ❤️
|
||||
|
||||
You can now map host devices into containers, for example, Intel integrated GPU for video transcoding using the [`devices`](https://github.com/compose-spec/compose-spec/blob/main/spec.md#devices) attribute in your Compose file:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
app:
|
||||
image: myapp
|
||||
devices:
|
||||
- /dev/dri:/dev/dri
|
||||
- /dev/ttyUSB0:/dev/ttyUSB0:rw
|
||||
```
|
||||
|
||||
### Compose `ulimits` support
|
||||
|
||||
PR: [#244](https://github.com/psviderski/uncloud/pull/244). Thanks to [@ipaddicting](https://github.com/ipaddicting) for the contribution ❤️
|
||||
|
||||
You can now set [`ulimits`](https://github.com/compose-spec/compose-spec/blob/main/spec.md#ulimits) for service containers in your Compose file. For example, to increase the maximum number of open files:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
app:
|
||||
image: myapp
|
||||
ulimits:
|
||||
nofile:
|
||||
soft: 65536
|
||||
hard: 65536
|
||||
```
|
||||
|
||||
### Auto-provision volumes for global services
|
||||
|
||||
PR: [#243](https://github.com/psviderski/uncloud/pull/243). Thanks to [@zasdaym](https://github.com/zasdaym) for the contribution ❤️
|
||||
|
||||
When deploying a [global service](/docs/guides/deployments/deploy-global-services) with a volume, the volume is now automatically created on all machines in the cluster.
|
||||
|
||||
## Improvements
|
||||
|
||||
- SSH connections with `ssh+cli://` prefix (use `ssh` CLI instead of Go native SSH implementation) reuse a single SSH connection via control socket - significantly speeds up `uc` commands
|
||||
- Improved `uc image push` support 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 push` are labeled with `uncloud.managed`
|
||||
|
||||
## Bug fixes
|
||||
|
||||
- Fixed IPv6 address formatting for HTTP URLs ([#254](https://github.com/psviderski/uncloud/pull/254))
|
||||
- Fixed `uc image push` when using Rancher Desktop locally ([#251](https://github.com/psviderski/uncloud/pull/251))
|
||||
- Fixed `uc machine init` to reset an already initialised machine when using `ssh+cli://` connection
|
||||
|
||||
## Upgrade to 0.17.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.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 uncloud
|
||||
```
|
||||
@@ -0,0 +1,78 @@
|
||||
---
|
||||
sidebar_position: -17.1
|
||||
sidebar_label: v0.17.1
|
||||
---
|
||||
|
||||
# v0.17.1
|
||||
|
||||
This page mirrors the [GitHub release](https://github.com/psviderski/uncloud/releases/tag/v0.17.1), which also includes
|
||||
the full list of commits.
|
||||
|
||||
This is small patch release that adds WireGuard endpoint management for machines, Compose `stop_grace_period` support, and several networking fixes.
|
||||
|
||||
## WireGuard endpoint management
|
||||
|
||||
You can now manually specify what WireGuard endpoint to use when adding or initialising a machine instead of relying on auto-detection. This is useful when a machine is behind a NAT or has multiple network interfaces.
|
||||
|
||||
```shell
|
||||
uc machine init user@host --wg-endpoint 203.0.113.1
|
||||
uc machine add user@host --wg-endpoint 203.0.113.2 --wg-endpoint 192.168.1.5
|
||||
```
|
||||
|
||||
You can also update the WireGuard endpoint for an existing machine:
|
||||
|
||||
```shell
|
||||
uc machine update my-machine --wg-endpoint 203.0.113.1
|
||||
```
|
||||
|
||||
## Compose `stop_grace_period` support
|
||||
|
||||
Control how long to wait before sending SIGKILL to a container during replacements and stops.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
app:
|
||||
image: myapp
|
||||
stop_grace_period: 30s
|
||||
```
|
||||
|
||||
## Improvements
|
||||
|
||||
- Tailscale addresses are excluded from auto-detected WireGuard endpoints: see [Discord thread](https://discord.com/channels/1371726032104587335/1477823130670993408)
|
||||
- `uc logs` now prints a warning and continues instead of failing when some Compose services are not found in the cluster
|
||||
- Improved reliability of the initial cluster store sync by waiting for known missing changes
|
||||
- Removed the obsolete `uc machine token` command
|
||||
|
||||
## Bug fixes
|
||||
|
||||
- Fixed Uncloud DNS resolution for IPv6 machines by creating AAAA records: https://github.com/psviderski/uncloud/pull/257
|
||||
- Fixed connection formatting when changing connection with `uc ctx conn`
|
||||
|
||||
## Upgrade to 0.17.1
|
||||
|
||||
### 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.17.1/uncloudd_linux_amd64.tar.gz
|
||||
# ARM64
|
||||
# curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.17.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
|
||||
```
|
||||
@@ -0,0 +1,190 @@
|
||||
---
|
||||
sidebar_position: -18.0
|
||||
sidebar_label: v0.18.0
|
||||
---
|
||||
|
||||
# v0.18.0
|
||||
|
||||
This page mirrors the [GitHub release](https://github.com/psviderski/uncloud/releases/tag/v0.18.0), which also includes
|
||||
the full list of commits.
|
||||
|
||||
The main highlights of this release are **pre-deploy hooks** for running database migrations and a **redesigned deployment plan** output that makes `uc deploy` much nicer to read and understand.
|
||||
|
||||
On top of that, 0.18.0 also:
|
||||
- makes the system `ssh` CLI the default connection method (with fallback to the Go implementation)
|
||||
- adds Compose support for `pid`, `shm_size`, and the new `x-context` extension to pin a Compose file to a cluster
|
||||
- brings new docs, a bunch of quality-of-life improvements and bug fixes, read on for the full details!
|
||||
|
||||
## Pre-deploy hooks
|
||||
|
||||
⚠️ This requires both `uc` and the daemon to be [upgraded to v0.18.0](#upgrade-to-0180)
|
||||
|
||||
Changes: [f4581ea](https://github.com/psviderski/uncloud/commit/f4581eac1167979e9297d749cb8ac8aa56a1cecc), [1c8b770](https://github.com/psviderski/uncloud/commit/1c8b770), [772b31b](https://github.com/psviderski/uncloud/commit/772b31b), [0e820f9](https://github.com/psviderski/uncloud/commit/0e820f9)
|
||||
|
||||
You can now run a one-off command before deploying a service using the new `x-pre_deploy` Compose extension. This is ideal for database schema migrations, uploading static assets to a CDN, cache invalidation, and any other setup task that needs to run **once** before new code goes live.
|
||||
|
||||
```yaml title="compose.yaml"
|
||||
services:
|
||||
web:
|
||||
build: ..
|
||||
environment:
|
||||
DATABASE_URL: postgres://postgres:${DB_PASSWORD}@db:5432/postgres
|
||||
x-pre_deploy:
|
||||
# Apply Django migrations from the built image before deploying new app containers.
|
||||
command: python manage.py migrate
|
||||
depends_on:
|
||||
- db
|
||||
```
|
||||
|
||||
Here is how it's displayed in the deploy plan when you run `uc deploy`:
|
||||
|
||||
<img width="692" height="115" alt="Screenshot 2026-04-10 at 5 16 56 pm" src="https://github.com/user-attachments/assets/fc921bdd-aeea-43e9-923e-abefa2426358" />
|
||||
|
||||
The hook command runs in a new container that inherits the service's image, environment variables, volumes, placement, and compute resources.
|
||||
|
||||
If the command exits successfully, the deployment continues with a normal rolling update. If it fails or times out, the deployment stops immediately and `uc deploy` displays the latest hook logs to help you diagnose the issue.
|
||||
|
||||

|
||||
|
||||
Container tables in `uc ps` and `uc inspect` now also list pre-deploy hook containers.
|
||||
|
||||
See the docs:
|
||||
- [Pre-deploy hooks](/docs/guides/deployments/pre-deploy-hooks) guide for more details and examples
|
||||
- [`x-pre_deploy`](/docs/compose-file-reference/extensions#x-pre_deploy) reference for all available attributes
|
||||
|
||||
## Restyled deployment plans
|
||||
|
||||
Changes: [0f4c211](https://github.com/psviderski/uncloud/commit/0f4c211), [f5a77b8](https://github.com/psviderski/uncloud/commit/f5a77b8), [b4b1232](https://github.com/psviderski/uncloud/commit/b4b1232)
|
||||
|
||||
The deployment plan output that you see when running `uc deploy`, `uc scale`, and `uc caddy deploy` has been redesigned with consistent styling, clearer operation verbs, and a header and the prompt showing the target context.
|
||||
|
||||
We hope this makes it easier for you to understand what changes will be made and to which cluster before you confirm the deployment.
|
||||
|
||||
<img alt="Screenshot 2026-03-18 at 9 39 38 pm" src="https://github.com/user-attachments/assets/f9d67b36-4a19-4ec6-b115-23c09b90f795" />
|
||||
|
||||
## System `ssh` is now the default connection method
|
||||
|
||||
Change: [06c2bc5](https://github.com/psviderski/uncloud/commit/06c2bc55f2fbf20920613aac45c07952107160a0)
|
||||
|
||||
The `ssh+cli://` connection method that uses your system's `ssh` CLI is now the default for new connections, so the prefix can be omitted:
|
||||
|
||||
```shell
|
||||
# Old
|
||||
uc machine init ssh+cli://user@host
|
||||
# New
|
||||
uc machine init user@host
|
||||
```
|
||||
|
||||
`ssh_cli:` can also be replaced with just `ssh:` in the config file (`~/.config/uncloud/config.yaml`):
|
||||
|
||||
```yaml title="config.yaml"
|
||||
contexts:
|
||||
prod:
|
||||
connections:
|
||||
- ssh: user@host
|
||||
```
|
||||
|
||||
This will by default use your existing SSH config, agent, keys, `ProxyJump`, and `ProxyCommand` setup automatically. You can fall back to the Go native SSH implementation using `ssh+go://` prefix.
|
||||
|
||||
Combined with the SSH control socket reuse introduced in [v0.17.0](https://github.com/psviderski/uncloud/releases/tag/v0.17.0), this makes most `uc` commands noticeably faster and removes a whole class of authentication friction.
|
||||
|
||||
The new [Connecting to a cluster](/docs/concepts/clusters/connecting) doc walks through all the supported connection schemes (`ssh://`, `ssh+go://`, `tcp://`, `unix://`), how `uc` picks a machine to talk to from your config, and how to connect without a config file for CI pipelines and scripts.
|
||||
|
||||
## Cluster context selection in Compose
|
||||
|
||||
Change: [1525d18](https://github.com/psviderski/uncloud/commit/1525d182b516b876510d6e4413ca2fe9ff029b53)
|
||||
|
||||
You can now pin a Compose file to a specific context using the new `x-context` extension. This prevents accidentally deploying to the wrong cluster when you switch contexts.
|
||||
|
||||
```yaml title="compose.yaml"
|
||||
x-context: prod
|
||||
|
||||
services:
|
||||
web:
|
||||
image: myapp
|
||||
```
|
||||
|
||||
When `x-context` is set, `uc deploy` will use that context regardless of your currently selected one in the Uncloud config. The deployment plan output also displays the target context so you always know where your changes are going.
|
||||
|
||||
See [`x-context`](/docs/compose-file-reference/extensions#x-context) reference for more details.
|
||||
|
||||
## Compose `pid` namespace support
|
||||
|
||||
PR: [#276](https://github.com/psviderski/uncloud/pull/276). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
|
||||
You can now configure the [PID namespace mode](https://github.com/compose-spec/compose-spec/blob/main/spec.md#pid) for service containers. The most common use case is `pid: host`, which lets a container see and interact with processes on the host. This is useful for monitoring agents, debuggers, and similar tooling.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
monitoring:
|
||||
image: agent
|
||||
pid: host
|
||||
```
|
||||
|
||||
## Compose `shm_size` support
|
||||
|
||||
Change: [8ae38cf](https://github.com/psviderski/uncloud/commit/8ae38cfd57d02f42631e0c2bb54c4331b9c072c9)
|
||||
|
||||
You can now set [`shm_size`](https://github.com/compose-spec/compose-spec/blob/main/spec.md#shm_size), the size of the `/dev/shm` shared memory tmpfs. This is useful for databases like Postgres, headless Chromium, and other workloads that need a larger shared memory segment.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:18
|
||||
shm_size: 256mb
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
- [Connecting to a cluster](/docs/concepts/clusters/connecting): a complete guide to cluster contexts, connection resolution and all supported types, and how to connect without a config file
|
||||
- [CLI configuration file](/docs/cli-config-reference): a full reference for the `~/.config/uncloud/config.yaml` file, covering contexts, connections, and all supported fields
|
||||
- [Pre-deploy hooks](/docs/guides/deployments/pre-deploy-hooks): a guide for the new feature, with examples for database migrations and other one-off setup tasks
|
||||
- [Compose extensions](/docs/compose-file-reference/extensions): a dedicated reference page for all Uncloud-specific Compose extensions
|
||||
|
||||
## Improvements
|
||||
|
||||
- The `uc` CLI and the daemon now exchange versions on every gRPC call and error if they are incompatible. This is a groundwork to make better user experience when releasing breaking changes in the future ([#260](https://github.com/psviderski/uncloud/pull/260)). Thanks to [@jabr](https://github.com/jabr) for the contribution ❤️
|
||||
- New `uc exec` accepts an optional `--` separator before the command, matching Docker and other CLIs ([#301](https://github.com/psviderski/uncloud/pull/301)). Thanks to [@nick-potts](https://github.com/nick-potts) for the contribution ❤️
|
||||
- New `uc docs --manual` flag generates manual pages for `uc`, making it easier for distribution maintainers to package manpages alongside the binary ([#302](https://github.com/psviderski/uncloud/pull/302)). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
- The daemon now exposes a gRPC method to fetch journald logs from a machine, laying the groundwork for an upcoming `uc machine logs` command ([#282](https://github.com/psviderski/uncloud/pull/282)). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
- Warnings are now printed for detected unsupported Compose features ([#288](https://github.com/psviderski/uncloud/pull/288)). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
- New `--auto-confirm` flag for `uc scale` which now always asks for confirmation before changing replica counts
|
||||
- New `--ulimit` flag for `uc run` to set resource limits
|
||||
- bumped Go to 1.26.1 and modernized the codebase using Go 1.26 ([#278](https://github.com/psviderski/uncloud/pull/278))
|
||||
- Migrated TUI components to `lipgloss/v2`, `bubbletea/v2`, and `huh/v2`
|
||||
|
||||
## Bug fixes
|
||||
|
||||
- Fixed `uc deploy` crash in an initialised but empty git repository ([#275](https://github.com/psviderski/uncloud/pull/275)). Thanks to [@tonyo](https://github.com/tonyo) for the contribution ❤️
|
||||
- Fixed `ucind` downloading the wrong Corrosion architecture on arm64 ([#285](https://github.com/psviderski/uncloud/pull/285)). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
- Fixed output contamination in the SSH CLI executor by separating stdout and stderr ([#270](https://github.com/psviderski/uncloud/issues/270))
|
||||
- Fixed trying other machine connections when the first one fails for the new default `ssh` type. Fixed the TUI progress spinner.
|
||||
|
||||
## Upgrade to 0.18.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.18.0/uncloudd_linux_amd64.tar.gz
|
||||
# ARM64
|
||||
# curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.18.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
|
||||
```
|
||||
@@ -0,0 +1,170 @@
|
||||
---
|
||||
sidebar_position: -19.0
|
||||
sidebar_label: v0.19.0
|
||||
---
|
||||
|
||||
# v0.19.0
|
||||
|
||||
This page mirrors the [GitHub release](https://github.com/psviderski/uncloud/releases/tag/v0.19.0), which also includes
|
||||
the full list of commits.
|
||||
|
||||
This release brings **easier debugging** of failed deploys, new **troubleshooting commands** (`uc machine logs` and `uc machine rtt`), and a **nightly release** channel.
|
||||
|
||||
Read on for the full list of changes and upgrade instructions.
|
||||
|
||||
## Show logs from a failed deploy
|
||||
|
||||
Changes: [8afe523](https://github.com/psviderski/uncloud/commit/8afe523), [303c8e4](https://github.com/psviderski/uncloud/commit/303c8e4), [56a54ab](https://github.com/psviderski/uncloud/commit/56a54ab)
|
||||
|
||||
When `uc deploy` fails because a pre-deploy hook failed or a new container couldn't become healthy, it now prints the last 10 (configurable) log lines from the failed container.
|
||||
|
||||
This is a quality-of-life improvement that saves you from running a follow-up `uc logs` to figure out what went wrong.
|
||||
|
||||
<img width="1253" height="871" alt="Screenshot 2026-04-24 at 2 01 22 pm" src="https://github.com/user-attachments/assets/69adcf19-ebe8-465e-8834-414c99c15260" />
|
||||
|
||||
See [Failed container logs](/docs/guides/deployments/rolling-deployments/#failed-container-logs) for more details.
|
||||
|
||||
## Filter service logs by container
|
||||
|
||||
Change: [2045819](https://github.com/psviderski/uncloud/commit/2045819)
|
||||
|
||||
`uc logs` now accepts a `SERVICE/CONTAINER` form where `CONTAINER` is a container name, full ID, or unique ID prefix. This is handy when one replica of a service is misbehaving and you want to look at it without the noise from the others:
|
||||
|
||||
```shell
|
||||
uc logs web/2f60
|
||||
# Mix and match
|
||||
uc logs api/61d57fd3428f web/2f60 db
|
||||
```
|
||||
|
||||
## Stream machine logs
|
||||
|
||||
⚠️ This requires both `uc` and the daemon to be [upgraded to v0.19.0](#upgrade-to-0190)
|
||||
|
||||
PRs: [#282](https://github.com/psviderski/uncloud/pull/282), [#283](https://github.com/psviderski/uncloud/pull/283). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
|
||||
You can now stream logs from the systemd services that run Uncloud itself on remote machines using the new `uc machine logs` command. It covers three main services:
|
||||
|
||||
- `uncloud` - the Uncloud daemon
|
||||
- `uncloud-corrosion` - the Corrosion service providing the distributed cluster store
|
||||
- `docker` - the Docker daemon
|
||||
|
||||
For example, stream the Uncloud daemon logs from all machines with:
|
||||
```shell
|
||||
uc machine logs -f uncloud
|
||||
```
|
||||
|
||||
This is useful for troubleshooting Uncloud operations without having to SSH into every machine and run `journalctl` yourself.
|
||||
|
||||
See [`uc machine logs`](/docs/cli-reference/uc_machine_logs) for more details and examples.
|
||||
|
||||
## Round-trip time between machines
|
||||
|
||||
⚠️ This requires both `uc` and the daemon to be [upgraded to v0.19.0](#upgrade-to-0190)
|
||||
|
||||
PR: [#226](https://github.com/psviderski/uncloud/pull/226). Thanks to [@jabr](https://github.com/jabr) for the contribution ❤️
|
||||
|
||||
The new `uc machine rtt` command shows the round-trip time between every pair of machines in the cluster. This gives you a real-time view of how the mesh network is performing without needing to run manual `ping` tests.
|
||||
|
||||
The data is collected from Corrosion's gossip protocol, which samples latency between peers as part of its normal operation.
|
||||
|
||||
```shell
|
||||
$ uc machine rtt
|
||||
MACHINE PEER MEDIAN STDDEV
|
||||
machine-1 machine-2 140ms ±19.4ms
|
||||
machine-1 machine-3 39ms ±1.1ms
|
||||
machine-2 machine-1 168ms ±18.5ms
|
||||
machine-2 machine-3 203ms ±42.3ms
|
||||
machine-3 machine-1 40ms ±2.0ms
|
||||
machine-3 machine-2 158ms ±15.2ms
|
||||
```
|
||||
|
||||
A new `RTT` column has also been added to `uc wg show` to show the median round-trip time to each WireGuard peer.
|
||||
|
||||
## Local machine upstreams first in Caddyfile
|
||||
|
||||
Change: [45cf87a](https://github.com/psviderski/uncloud/commit/45cf87a)
|
||||
|
||||
The generated Caddyfile now lists upstreams from the local machine first for each service.
|
||||
|
||||
On its own this doesn't change routing behaviour (Caddy's default `random` load balancing policy ignores order). But if you pair it with the `first` policy in a custom Caddy config, you can always prefer the same-host replica and only fall back to remote machines when the local one is unhealthy.
|
||||
|
||||
```yaml
|
||||
services:
|
||||
app:
|
||||
...
|
||||
x-caddy: |
|
||||
example.com {
|
||||
reverse_proxy {{upstreams 8000}} {
|
||||
import common_proxy
|
||||
lb_policy first
|
||||
}
|
||||
log
|
||||
}
|
||||
```
|
||||
|
||||
This saves a cross-machine WireGuard hop for every request that hits Caddy on the machine which already has a replica of the target service. This is especially useful if you have a multi-region setup.
|
||||
|
||||
## Nightly builds
|
||||
|
||||
PR: [#308](https://github.com/psviderski/uncloud/pull/308). Thanks to [@tonyo](https://github.com/tonyo) for the contribution ❤️
|
||||
|
||||
Every push to `main` now produces a set of nightly binaries tagged as the [`nightly` release](https://github.com/psviderski/uncloud/releases/tag/nightly) on GitHub.
|
||||
|
||||
They're great for testing upcoming unreleased changes and reporting regressions early. They might be unstable, so please don't run them in production.
|
||||
|
||||
Install the nightly `uc` CLI locally:
|
||||
|
||||
```shell
|
||||
curl -fsS https://get.uncloud.run/install.sh | VERSION=nightly sh
|
||||
```
|
||||
|
||||
Initialise a cluster or add a machine with a nightly daemon:
|
||||
|
||||
```shell
|
||||
uc machine init --version nightly user@host
|
||||
uc machine add --version nightly user@host
|
||||
```
|
||||
|
||||
## Improvements
|
||||
|
||||
- `uc machine init/add` now embed the install script into the `uc` binary and send it to the remote machine over the existing SSH connection instead of `curl | bash` ([fe829ef](https://github.com/psviderski/uncloud/commit/fe829ef)).
|
||||
- New `uc ctx show` command prints the name of the currently active cluster context, great for shell prompts and scripts ([#317](https://github.com/psviderski/uncloud/pull/317)).
|
||||
- SSH connections now use `-o StrictHostKeyChecking=accept-new`, which silently accepts host keys on first connection but still protects against key changes later ([#303](https://github.com/psviderski/uncloud/pull/303)).
|
||||
- The `STORE` column in `uc images` is hidden when all machines use the containerd image store, which is the default for new clusters ([c38d916](https://github.com/psviderski/uncloud/commit/c38d916))
|
||||
- Image push errors now include the underlying error from the unregistry proxy, which makes it much easier to tell apart a broken image push from a broken SSH tunnel ([d340659](https://github.com/psviderski/uncloud/commit/d340659))
|
||||
- `ucind` now accepts a `UNCLOUD_CONFIG` environment variable to override the config file path for development clusters ([#315](https://github.com/psviderski/uncloud/pull/315)).
|
||||
- New `ucind cluster ls` command lists the local development clusters managed by `ucind` with their machines ([#316](https://github.com/psviderski/uncloud/pull/316)).
|
||||
|
||||
## Bug fixes
|
||||
|
||||
- Fixed containerd socket auto-detection for unregistry after a machine reboot ([47199c3](https://github.com/psviderski/uncloud/commit/47199c3)).
|
||||
- Fixed Caddy config being regenerated on every service change because container records were serialised non-deterministically ([#111](https://github.com/psviderski/uncloud/issues/111)).
|
||||
- Fixed SSH control socket path on WSL2 when the runtime directory doesn't exist ([#319](https://github.com/psviderski/uncloud/issues/319)).
|
||||
- Fixed a stale SSH `ControlMaster` connection sometimes causing `uc machine init`/`add` to hang ([fdbffbf](https://github.com/psviderski/uncloud/commit/fdbffbf)).
|
||||
|
||||
## Upgrade to 0.19.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
|
||||
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
|
||||
curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.19.0/uncloudd_linux_${ARCH}.tar.gz
|
||||
tar -xf uncloudd.tar.gz
|
||||
sudo install uncloudd /usr/local/bin/uncloudd
|
||||
rm uncloudd uncloudd.tar.gz
|
||||
sudo systemctl restart uncloud
|
||||
```
|
||||
@@ -0,0 +1,146 @@
|
||||
---
|
||||
sidebar_position: -20.0
|
||||
sidebar_label: v0.20.0
|
||||
---
|
||||
|
||||
# v0.20.0
|
||||
|
||||
This page mirrors the [GitHub release](https://github.com/psviderski/uncloud/releases/tag/v0.20.0), which also includes
|
||||
the full list of commits.
|
||||
|
||||
This release adds **secrets** for passing sensitive data to services, a new **`uc proxy`** command for port-forwarding, a **Prometheus metrics** endpoint, **`uc machine ls`** that surfaces each machine's OS, Docker, and daemon versions. Plus daemon self-upgrade on `uc machine init/add`, WireGuard MTU auto-detection, shell completion, and more.
|
||||
|
||||
⚠️ **This is a breaking release.** Both the `uc` CLI and the `uncloudd` daemon on **every** machine must be upgraded to 0.20. See [Breaking changes](#breaking-changes) below before you upgrade.
|
||||
|
||||
## ⚠️ Breaking changes {#breaking-changes}
|
||||
|
||||
0.20 changes the internal gRPC API proxy format and migrates the cluster store to a new Corrosion version, so a mixed 0.19/0.20 cluster will not work. The built-in version check rejects requests between incompatible CLI and daemon versions, so upgrade everything together. See [Upgrade to 0.20.0](#upgrade-to-0200) for instructions.
|
||||
|
||||
- **Server-side gRPC proxy resolution** ([#247](https://github.com/psviderski/uncloud/pull/247)). API proxy targets (machines) are now resolved on the daemon instead of the CLI. This changes the request format on the wire, so old and new components can't talk to each other. Thanks to [@jabr](https://github.com/jabr) for the contribution ❤️
|
||||
- **Corrosion now runs as a managed container** ([71da325](https://github.com/psviderski/uncloud/commit/71da325)). The Corrosion cluster store moved from a systemd unit to a Docker container and was upgraded to Corrosion v1 ([`2026.6.15`](https://github.com/unlabs-dev/corrosion/releases/tag/v2026.6.15)). Existing data is migrated to the new format **automatically** on first daemon start. Auth is now enabled for local Corrosion API requests too ([#110](https://github.com/psviderski/uncloud/issues/110)).
|
||||
- **CLI artifact renamed `uncloud_*` → `uc_*`** ([a5d73fe](https://github.com/psviderski/uncloud/commit/a5d73fe)). Homebrew and the install script handle this for you. Only update your own scripts if you download the CLI archive directly. The daemon archive name (`uncloudd_*`) is unchanged.
|
||||
- **Unregistry image proxy moved from port `5000` to `51500`** ([d36ff67](https://github.com/psviderski/uncloud/commit/d36ff67)). `uc` handles this automatically when pushing images. Only update your setup if you reach this proxy port directly in your own tooling.
|
||||
|
||||
## Secrets support
|
||||
|
||||
PR: [#403](https://github.com/psviderski/uncloud/pull/403), docs: [e01c8d3](https://github.com/psviderski/uncloud/commit/e01c8d3)
|
||||
|
||||
You can now keep sensitive data like passwords, API tokens, and private keys out of your Compose file. Define a secret with the new `x-command` extension and reference it from a service's `environment` with `secret://<name>`. The command runs locally at deploy time and pulls the value from your password manager, cloud secrets store, or any CLI you already use.
|
||||
|
||||
```yaml title="compose.yaml"
|
||||
services:
|
||||
api:
|
||||
image: myapp:latest
|
||||
environment:
|
||||
DB_PASSWORD: secret://db_password
|
||||
|
||||
secrets:
|
||||
db_password:
|
||||
x-command: op read "op://prod/myapp/db_password"
|
||||
```
|
||||
|
||||
The value never lands in your Compose file or git. See the new [Secrets](/docs/concepts/secrets) doc for supported sources, caveats, and examples.
|
||||
|
||||
## Proxy a service port locally
|
||||
|
||||
PR: [#384](https://github.com/psviderski/uncloud/pull/384). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
|
||||
The new `uc proxy` command forwards a service port to a local port over the cluster network, similar to `kubectl port-forward`. This is handy for reaching an internal database or admin UI from your laptop without exposing them publicly.
|
||||
|
||||
## Richer `uc machine ls`
|
||||
|
||||
Changes: [8aa0a96](https://github.com/psviderski/uncloud/commit/8aa0a96), [ad43569](https://github.com/psviderski/uncloud/commit/ad43569), [1d5c717](https://github.com/psviderski/uncloud/commit/1d5c717), [23d6b44](https://github.com/psviderski/uncloud/commit/23d6b44)
|
||||
|
||||
`uc machine ls` now shows the `OS`, `KERNEL`, `ARCH`, `DOCKER`, and `VERSION` (daemon) of each machine. You can spot version drift and outdated daemons at a glance.
|
||||
|
||||
```shell
|
||||
$ uc machine ls
|
||||
NAME STATE ADDRESS PUBLIC IP WIREGUARD ENDPOINTS OS KERNEL ARCH DOCKER VERSION
|
||||
machine-1 Up 10.210.0.1/24 203.0.113.10 203.0.113.10:51820 Debian 12.12 6.1.0-41-amd64 amd64 29.4.0 0.20.0
|
||||
machine-2 Up 10.210.1.1/24 198.51.100.7 198.51.100.7:51820 Debian 12.5 6.1.0-18-amd64 amd64 26.0.0 0.20.0
|
||||
machine-3 Up 10.210.2.1/24 - 192.0.2.44:51820 Ubuntu 22.04.5 LTS 6.8.0-1050-oracle arm64 29.5.3 0.20.0
|
||||
```
|
||||
|
||||
Pass `-o json` for machine-readable output to use in scripts.
|
||||
|
||||
## Prometheus metrics
|
||||
|
||||
PR: [#304](https://github.com/psviderski/uncloud/pull/304). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
|
||||
Each daemon now serves the initial set of Prometheus metrics on `http://<machine-ip>:51090/metrics`, listening on the machine's internal IP. Point your scraper at it to monitor the cluster.
|
||||
|
||||
## Daemon self-upgrade on machine init/add
|
||||
|
||||
Change: [a26af3b](https://github.com/psviderski/uncloud/commit/a26af3b)
|
||||
|
||||
`uc machine init` and `uc machine add` now upgrade the installed daemon binary to the latest (or a specified `--version`) if the daemon was already installed on the machine.
|
||||
|
||||
## Improvements
|
||||
|
||||
- WireGuard now auto-detects the optimal interface MTU, with a new `--wg-mtu` flag to override it ([0c3b8b1](https://github.com/psviderski/uncloud/commit/0c3b8b1)).
|
||||
- New `--wg-port` flag for `uc machine init/add` to customise the WireGuard listen port ([#366](https://github.com/psviderski/uncloud/pull/366)). Thanks to [@dasunsrule32](https://github.com/dasunsrule32) for the contribution ❤️
|
||||
- `x-ports` can bind to multiple host IP addresses given as a CIDR prefix ([#358](https://github.com/psviderski/uncloud/pull/358)). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
- New `uc version` and `uncloudd version` commands that print full build information, replacing the `--version` flag ([2f15915](https://github.com/psviderski/uncloud/commit/2f15915)).
|
||||
- `uc machine init/add` installs `curl` on the remote machine if it's missing ([#402](https://github.com/psviderski/uncloud/issues/402)).
|
||||
- New `uc caddy logs` alias for `uc logs caddy` ([#381](https://github.com/psviderski/uncloud/pull/381)).
|
||||
- Shell/argument completion for the `uc` and `ucind` CLIs (machines, services, volumes) ([#309](https://github.com/psviderski/uncloud/pull/309), [#344](https://github.com/psviderski/uncloud/pull/344), [#352](https://github.com/psviderski/uncloud/pull/352)). Thanks to [@miekg](https://github.com/miekg) for the contributions ❤️
|
||||
- Support rootless Docker locally when pushing images to the cluster ([#347](https://github.com/psviderski/uncloud/pull/347)). Thanks to [@tonyo](https://github.com/tonyo) for the contribution ❤️
|
||||
- The CLI strips ANSI colors from table output and skips interactive TUI elements when stdout is not a TTY ([e3823c2](https://github.com/psviderski/uncloud/commit/e3823c2), [#386](https://github.com/psviderski/uncloud/issues/386)).
|
||||
|
||||
## Bug fixes
|
||||
|
||||
- Reject relative volume source paths in Compose with a clear error ([#353](https://github.com/psviderski/uncloud/pull/353)). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
- Return a non-zero exit code when a `uc` command is cancelled by declining a confirmation prompt ([#354](https://github.com/psviderski/uncloud/issues/354)).
|
||||
- Don't include outdated containers from a removed machine in the DNS and Caddy configs ([07acb31](https://github.com/psviderski/uncloud/commit/07acb31)).
|
||||
- Improve context cancellation and Corrosion resubscription handling during watch and sync operations ([328d175](https://github.com/psviderski/uncloud/commit/328d175), [83256b5](https://github.com/psviderski/uncloud/commit/83256b5), [99e1ae0](https://github.com/psviderski/uncloud/commit/99e1ae0), [5f07bc5](https://github.com/psviderski/uncloud/commit/5f07bc5)).
|
||||
- Use a forked Bubble Tea that drains pending TTY input on shutdown ([#286](https://github.com/psviderski/uncloud/pull/286)).
|
||||
|
||||
## Upgrade to 0.20.0
|
||||
|
||||
Upgrade **all** machines and your local CLI to 0.20. Corrosion data migrates automatically on the first daemon restart.
|
||||
|
||||
:::important
|
||||
|
||||
On the first restart, each daemon pulls the Corrosion container image `ghcr.io/unlabs-dev/corrosion:2026.6.15`. Make sure your machines can reach `ghcr.io`, or pre-pull the image, otherwise the cluster store won't start.
|
||||
|
||||
:::
|
||||
|
||||
### Uncloud CLI locally
|
||||
|
||||
```bash
|
||||
# Homebrew (macOS, Linux)
|
||||
brew upgrade uncloud
|
||||
|
||||
# Install script (macOS, Linux)
|
||||
curl -fsS https://get.uncloud.run/install.sh | sh
|
||||
```
|
||||
|
||||
### Machine daemon
|
||||
|
||||
Run the following commands on each machine:
|
||||
|
||||
```bash
|
||||
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
|
||||
curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.20.0/uncloudd_linux_${ARCH}.tar.gz
|
||||
tar -xf uncloudd.tar.gz
|
||||
sudo install uncloudd /usr/local/bin/uncloudd
|
||||
rm uncloudd uncloudd.tar.gz
|
||||
sudo systemctl restart uncloud
|
||||
```
|
||||
|
||||
### After upgrading
|
||||
|
||||
On the first restart, the daemon migrates the Corrosion store and stops the legacy systemd service. A couple of leftovers need manual cleanup on each machine:
|
||||
|
||||
- The old store is preserved at `/var/lib/uncloud/corrosion.backup-<timestamp>`. Once you've verified the cluster is healthy (`uc machine ls`), you can remove it:
|
||||
|
||||
```bash
|
||||
sudo rm -rf /var/lib/uncloud/corrosion.backup-*
|
||||
```
|
||||
|
||||
- The legacy Corrosion systemd unit and binary are left in place because the daemon's sandbox doesn't have permission to delete them. Remove them manually:
|
||||
|
||||
```bash
|
||||
sudo rm /etc/systemd/system/uncloud-corrosion.service /usr/local/bin/uncloud-corrosion
|
||||
sudo systemctl daemon-reload
|
||||
```
|
||||
@@ -0,0 +1,184 @@
|
||||
---
|
||||
sidebar_position: -21.0
|
||||
sidebar_label: v0.21.0
|
||||
---
|
||||
|
||||
# v0.21.0
|
||||
|
||||
This page mirrors the [GitHub release](https://github.com/psviderski/uncloud/releases/tag/v0.21.0), which also includes
|
||||
the full list of commits.
|
||||
|
||||
This release brings **shared TLS certificate storage for Caddy**, **systemd socket activation**, **runtime templates**, and a way to use **your own cluster domain**. It also adds a certificate inventory command, faster service listing, and fixes for proxying, container logs, and terminal output.
|
||||
|
||||
## ⚠️ Breaking changes {#breaking-changes}
|
||||
|
||||
- The API socket moved from `/run/uncloud/uncloud.sock` to `/run/uncloud/api/uncloud.sock` ([f68c985](https://github.com/psviderski/uncloud/commit/f68c985)). Update your custom tools and container mounts if you used the API socket directly. Both old and new `uc` versions handle the socket move automatically.
|
||||
|
||||
## Shared certificate storage for Caddy
|
||||
|
||||
Caddy module: [caddy-uncloud](https://github.com/unlabs-dev/caddy-uncloud), issue: [#31](https://github.com/psviderski/uncloud/issues/31)
|
||||
|
||||
If you run Caddy on multiple machines behind a load balancer or a DNS record with multiple IPs, certificate issuance may not work correctly.
|
||||
|
||||
The new Uncloud storage module lets Caddy instances share certificates, private keys, and challenge tokens through the cluster store. Any instance can read the token to answer a challenge, and once one obtains a certificate, the others can use it too. Distributed locks coordinate issuance across machines.
|
||||
|
||||
Shared storage is **opt-in** for now. See [Cluster storage for Caddy](/docs/concepts/ingress/cluster-storage-for-caddy) for more details.
|
||||
|
||||
## Inspect Caddy certificates
|
||||
|
||||
Changes: [930e7ea](https://github.com/psviderski/uncloud/commit/930e7ea), [9c21ae6](https://github.com/psviderski/uncloud/commit/9c21ae6)
|
||||
|
||||
The new [`uc caddy cert ls`](/docs/cli-reference/uc_caddy_cert_ls) command lists certificates in Caddy's shared cluster storage. This is handy for checking which certificates have been issued and when they expire.
|
||||
|
||||
```shell
|
||||
uc caddy cert ls
|
||||
|
||||
ID NAME ISSUER EXPIRES
|
||||
c111e23615f7 dns.uncloud.run Let's Encrypt 2026-12-31 (2 months)
|
||||
b5dcd2a03e1b nginx.2t5ex2.uncld.dev Let's Encrypt 2026-12-31 (2 months)
|
||||
70707fd2fea2 test-staging.2t5ex2.uncld.dev Let's Encrypt (staging) 2026-12-31 (2 months)
|
||||
c5f9301e1c06 uncloud.run Let's Encrypt 2026-12-31 (2 months)
|
||||
```
|
||||
|
||||
```shell
|
||||
uc caddy cert ls --machine machine-1
|
||||
uc caddy cert ls -o json
|
||||
```
|
||||
|
||||
This requires Caddy to first be deployed with [cluster storage](/docs/concepts/ingress/cluster-storage-for-caddy).
|
||||
|
||||
## Systemd socket activation
|
||||
|
||||
Change: [f68c985](https://github.com/psviderski/uncloud/commit/f68c985)
|
||||
|
||||
Systemd now creates the Uncloud API socket and passes it to the daemon when it starts. The socket is available before Docker starts and stays in place across daemon restarts. This gives Caddy's cluster storage module and other extensions a stable API socket, including after a reboot.
|
||||
|
||||
## Runtime templates for bind mounts
|
||||
|
||||
Change: [5c33e4b](https://github.com/psviderski/uncloud/commit/5c33e4b)
|
||||
|
||||
You can now use per-container metadata in bind mount paths. Uncloud renders these Go templates on the destination machine just before creating each container, so every replica can get its own host directory:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
app:
|
||||
image: app:latest
|
||||
scale: 2
|
||||
volumes:
|
||||
- "/var/lib/app/{{.Container.Name}}:/data"
|
||||
```
|
||||
|
||||
For now, runtime templates expose `.Container.Name` and work only in the host and container paths of bind mounts. They could easily be extended to other metadata fields and Compose attributes. Please share your use case on [#431](https://github.com/psviderski/uncloud/issues/431).
|
||||
|
||||
See [Runtime templates](/docs/concepts/services/runtime-templates) for more details and examples.
|
||||
|
||||
## Use your own cluster domain
|
||||
|
||||
PR: [#365](https://github.com/psviderski/uncloud/pull/365). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
|
||||
The new [`uc dns set`](/docs/cli-reference/uc_dns_set) command lets you use a domain you manage yourself as the default cluster domain for generated service hostnames:
|
||||
|
||||
```shell
|
||||
uc dns set apps.example.com
|
||||
```
|
||||
|
||||
Configure wildcard DNS records for `*.apps.example.com` with your DNS provider, pointing to machines running Caddy. New services published without an explicit hostname can then use addresses like `web.apps.example.com`. Uncloud doesn't create or manage those external records.
|
||||
|
||||
If your cluster already has a reserved `*.uncld.dev` domain, release that reservation with `uc dns release` first.
|
||||
|
||||
## Improvements
|
||||
|
||||
- `uc ls` now collects services and containers with a single broadcast request instead of inspecting every service separately. This significantly speeds it up, especially when you have many services ([0e53f50](https://github.com/psviderski/uncloud/commit/0e53f50)).
|
||||
- Compose now supports `stdin_open` and `tty` ([#419](https://github.com/psviderski/uncloud/pull/419)). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
- Compose warns about more unsupported options, including external configs, `container_name`, and `deploy.placement` ([#429](https://github.com/psviderski/uncloud/pull/429)). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
- `uc machine init/add` now accept `UNCLOUD_DAEMON_VERSION` as an alternative to `--version`, useful for scripts and nightly setups ([#409](https://github.com/psviderski/uncloud/pull/409)). Thanks to [@tonyo](https://github.com/tonyo) for the contribution ❤️
|
||||
- Caddy deployments now have a healthcheck that queries the admin API, so the deployment waits for Caddy to load its config before treating a new container as healthy ([70de7b1](https://github.com/psviderski/uncloud/commit/70de7b1)).
|
||||
- The [installation docs](/docs/getting-started/install-cli) now include mise ([#421](https://github.com/psviderski/uncloud/pull/421)).
|
||||
|
||||
## Bug fixes
|
||||
|
||||
- Preserve custom global Caddy configuration during regeneration on Caddy restart. `uc caddy config` now warns when the last attempt to load the config failed ([ace8cbf](https://github.com/psviderski/uncloud/commit/ace8cbf)).
|
||||
- Keep `uc proxy` running when an individual client disconnects or a forwarded connection fails. Connection errors now include more useful troubleshooting information ([fa77edf](https://github.com/psviderski/uncloud/commit/fa77edf)).
|
||||
- Stream logs correctly from containers with an allocated TTY ([#419](https://github.com/psviderski/uncloud/pull/419)).
|
||||
- Stop terminal capability replies from leaking into the shell after CLI spinners finish ([#435](https://github.com/psviderski/uncloud/pull/435)). Thanks to [@tonyo](https://github.com/tonyo) for the contribution ❤️
|
||||
- Fix shell completion when using `--connect`, `--context`, or `--uncloud-config` ([351698c](https://github.com/psviderski/uncloud/commit/351698c)).
|
||||
- Return a non-zero exit code consistently when a command is cancelled by declining a confirmation prompt ([#406](https://github.com/psviderski/uncloud/pull/406)). Thanks to [@miekg](https://github.com/miekg) for the contribution ❤️
|
||||
- Extend the systemd startup timeout while pulling the Corrosion image, allowing up to 5 minutes for a slow pull ([dc721e5](https://github.com/psviderski/uncloud/commit/dc721e5)).
|
||||
- Fix daemon version comparisons when upgrading from a nightly build to the latest stable release ([50f8fbc](https://github.com/psviderski/uncloud/commit/50f8fbc)).
|
||||
- Avoid waiting on replication gaps from unavailable cluster members after the requested store versions have been reached ([e4bd1ad](https://github.com/psviderski/uncloud/commit/e4bd1ad)).
|
||||
|
||||
## Upgrade to v0.21.0
|
||||
|
||||
Upgrade your local CLI and the daemon on every machine. If you're upgrading from before v0.20.0, follow the [v0.20.0 upgrade instructions](https://github.com/psviderski/uncloud/releases/tag/v0.20.0#upgrade-to-0200) first for the Corrosion migration.
|
||||
|
||||
### Uncloud CLI locally
|
||||
|
||||
```bash
|
||||
# Homebrew (macOS, Linux)
|
||||
brew upgrade uncloud
|
||||
|
||||
# Install script (macOS, Linux)
|
||||
curl -fsS https://get.uncloud.run/install.sh | VERSION=0.21.0 sh
|
||||
```
|
||||
|
||||
### Machine daemon
|
||||
|
||||
Run the following commands over SSH on each machine to upgrade the daemon binary:
|
||||
|
||||
```bash
|
||||
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
|
||||
curl -fsSL -o uncloudd.tar.gz https://github.com/psviderski/uncloud/releases/download/v0.21.0/uncloudd_linux_${ARCH}.tar.gz
|
||||
tar -xf uncloudd.tar.gz
|
||||
sudo install uncloudd /usr/local/bin/uncloudd
|
||||
rm uncloudd uncloudd.tar.gz
|
||||
```
|
||||
|
||||
**The following systemd unit updates are only needed on existing machines.** New machines set up with `uc machine init` or `uc machine add` using v0.21.0 or later install these units automatically. Replacing the daemon binary alone on an existing machine doesn't install the new `uncloud.socket` unit or update `uncloud.service`.
|
||||
|
||||
Create `/etc/systemd/system/uncloud.socket`:
|
||||
|
||||
```bash
|
||||
sudo tee /etc/systemd/system/uncloud.socket >/dev/null <<'EOF'
|
||||
[Unit]
|
||||
Description=Uncloud API socket
|
||||
Before=docker.service
|
||||
|
||||
[Socket]
|
||||
ListenStream=/run/uncloud/api/uncloud.sock
|
||||
SocketUser=root
|
||||
SocketGroup=uncloud
|
||||
SocketMode=0660
|
||||
DirectoryMode=0750
|
||||
|
||||
[Install]
|
||||
WantedBy=sockets.target
|
||||
EOF
|
||||
```
|
||||
|
||||
Run this command to add the socket dependency directly to `/etc/systemd/system/uncloud.service`:
|
||||
|
||||
```bash
|
||||
sudo sed -i \
|
||||
's/^After=.*$/Requires=uncloud.socket\
|
||||
After=network-online.target uncloud.socket docker.service/' \
|
||||
/etc/systemd/system/uncloud.service
|
||||
```
|
||||
|
||||
Stop the daemon before starting the socket unit, then reload systemd, enable the socket, and start the upgraded daemon:
|
||||
|
||||
```bash
|
||||
sudo systemctl stop uncloud.service && \
|
||||
sudo systemctl daemon-reload && \
|
||||
sudo systemctl enable uncloud.socket && \
|
||||
sudo systemctl start uncloud.socket && \
|
||||
sudo systemctl start uncloud.service
|
||||
```
|
||||
|
||||
### After upgrading
|
||||
|
||||
Check your CLI and daemon versions:
|
||||
|
||||
```shell
|
||||
uc version
|
||||
uc machine ls
|
||||
```
|
||||
Reference in New Issue
Block a user