Rancher Desktop is a free alternative to Docker Desktop (which prohibits
commercial use) and has gained significant popularity. When running
Rancher Desktop on non-native Docker platforms such as macOS and
Windows, the secondary tunnel from the host OS to the Docker's Linux
machine is necessary. At the moment, the check for this seems to be
based on the vhost name of the docker engine's VM.
For Rancher Desktop it seemms to be `lima-rancher-desktop`:
$ docker info --format 'json' | jq .Name
This might not be the best approach but is simple and should save a lot
of headaches for a lot of people until a potentially better solution is
devised.
See also: https://github.com/psviderski/unregistry/issues/62
* feat: auto-provision volumes on all machines for global services
* fix: schedule global service volumes only on machines that need them
* fix: use union of eligible machines for volumes shared by global services
* test: restore global with missing volume fails test
* refactor: simplify volume scheduler by removing redundant check
Move isVolumeSharedBetweenGlobalAndReplicated check earlier to fail
fast, then use isVolumeForGlobalService instead of the now-redundant
isVolumeOnlyForGlobalServices function.
* feat: Add `uc service start/stop` commands
* Add nolint:dupl for service start/stop commands
Co-authored-by: Pasha Sviderski <me@psviderski.name>
* Add --signal and --timeout options to uc service stop
* Check whether service stop --timeout flag was used to set options properly
---------
Co-authored-by: Pasha Sviderski <me@psviderski.name>
* feat(caddy): expose 443/udp port for HTTP3
* expose udp port 443 for caddy to support new HTTP3
* chore: Add comment for HTTP/3 (QUIC) port configuration
Added a comment to clarify the purpose of the UDP port configuration.
---------
Co-authored-by: Anton Ovchinnikov <anton@tonyo.info>
* chore: fix landing logo shadow
* feat: implement service logs command with colored output and strict ordering
* revert Makefile
* fix after rebase
* move logs command under services with root shortcut
* simplify server options for streaming logs and CLI flags
* refactor ContainerLogs grpc server
* update --tail flag
* minor docker.proto
* refactor client ServiceLogs and ContainerLogs
* move ProxyMachinesContext from api to client pkg
* minor refactor proto Stream
* add api/logs
* implement LogMerger
* fix LogMerger to correctly use semaphore
* increate inflish entries to 100 per stream
* send heartbeats
* refactor ContainerLogs to synchronise Send of entries and heartbeats to the steram
* minor logmerege
* remove ContainerName form ServiceLogEntryMetadata
* refactor ContainerLogs into docker.Service
* detect stalled container logs streams
* update logmerger tests
* fix comment in test
* refactor LogMerger with options
* uc logs: format one or multiple services
* make LogMerger emit heartbeats, emit entries <= watermark, rewrite tests
* update uc logs with new LogMerger
* go mod tidy
* fix after merge
---------
Co-authored-by: Evgenii Orlov <evgenii.orlov@semrush.com>
* Connect to remote SSH nodes using SSH CLI
Replace Go-native SSH implementation with SSH CLI execution
to support diverse SSH configurations and agents. Implements
'uncloudd dial-stdio' subcommand that proxies gRPC connections
over stdin/stdout, similar to Docker's approach.
This change addresses compatibility issues with:
- SSH agents exposing many keys (1Password, causing "too many
authentication failures")
- Tailscale SSH (which doesn't support advanced SSH channel
types like direct-streamlocal)
- Custom SSH configurations in ~/.ssh/config
The dial-stdio approach reduces SSH feature requirements by
streaming the unix socket connection over stdin/stdout instead
of using SSH channel forwarding.
Changes:
- Add 'uncloudd dial-stdio' hidden subcommand for socket proxy
- Add SSHCLIConnector using ssh command + dial-stdio
- Update connection logic to use SSH CLI connector
- Maintain backward compatibility with SSHKeyFile config
Resolves#131
* Fix sshcli tests missing ConnectionTimeout
Introduced short connection timeout on the first change but forgot to
update tests to match.
* Add SSHCLI field and update MachineConnection String() format
- Add SSHCLI field to support ssh_cli YAML configuration
- Update String() to use URI-like format (ssh://, ssh+cli://, tcp://)
* Add Validate() method and tests for MachineConnection
- Add Validate() to ensure connection methods are mutually exclusive
- Add tests for validation and String() method
* Unify SSH connector configs to use SSHConnectorConfig
* Update connectCluster to support both SSH connector types
* Restore Go SSH connector as default for machine init/add
Revert provisionOrConnectRemoteMachine to use Go SSH connector:
- Root users: reuse SSH connection from provisioning
- Non-root users: establish new connection for group membership
- Remove SSH CLI as default connector
SSH CLI connector remains available via ssh_cli config field.
* Add sshCLIDialer with DialContext method
Implement proxy.ContextDialer for SSHCLIConnector using SSH -W flag.
Each dial spawns a new SSH process for TCP forwarding, enabling
independent connections separate from the gRPC dial-stdio connection.
* Implement SSHCLIConnector.Dialer() method
Return sshCLIDialer instead of error, enabling uc image push
functionality with SSHCLIConnector. Validates connector is
configured before returning dialer.
* Fix half-closing implementation matchin Docker's approach
* Use testify assertions for connection tests
* Allow ssh+cli:// to be used with --connect
This way I can skip the configuration file while testing things out,
and confirm it works correctly:
$ unset SSH_AUTH_SOCK
$ ./uncloud --connect ssh://provision@blatta11 machine ls
Error: connect to cluster: connect to machine: SSH login to
provision@blatta11:22: connect using SSH agent: connect to SSH
agent: dial unix: missing address
$ ./uncloud --connect ssh+cli://provision@blatta11 machine ls
NAME STATE ADDRESS PUBLIC IP WIREGUARD ENDPOINTS MACHINE ID
blatta11 Up 10.210.0.1/24 - 100.64.0.22:51820, ...
* Validates configuration before connecting to cluster
* Do not tie client constructor with real validation
No longer attempt to validate the connection when instantiating a new
client.
Later on we could validate it in different places.
* Cleanup test and remove AI-slop
There were some serious slop in those tests, so took the time to clean
them up and kept only the relevant ones.
There is some repetition between buildSSHArgs and buildDialArgs but can
be tackled at a later stage.
* Fix connection representation tests
Prefix connection with ssh ssh+cli respectively.
* Wait for stdout before returning
Missed copy & pasta from Docker dial-stdio implementation (this happens
when you stare at the code for too long that it burns your eyes).