# Uncloud


I'm playing with [Uncloud](https://uncloud.run) to see if it is something we can use at $WORK. Pretty
impressed with it already, as I've written something worse [pgo](https://github.com/miekg/pgo), that was
(obviously) not good enough. Uncloud does: implement a subset of the Docker(-compose) API, uses gRPC and
wireguard to create mini network; just brilliant. Haven't seen prometheus metrics yet, although Caddy is used
for the proxy, but more prometheus metrics would make sense. (Which you can then observe through a cluster
hosted prometheus...?)

Anyway the installer logs in into your machine and turns it into a cluster node. I kinda dislike these kind of
things and prefer packages. Hence I, quick-and-dirty, made [two Debian
packages](https://github.com/miekg/unpkg), that allow me to provision a machine and _then_ initialize the
cluster.

```sh
% sudo dpkg -i uncloud-corrosion_0.2.2_amd64.deb
Unpacking uncloud-corrosion (0.2.2) ...
Setting up uncloud-corrosion (0.2.2) ...
info: Selecting UID from range 100 to 999 ...

% sudo dpkg -i uncloudd_0.17.1_amd64.deb
Selecting previously unselected package uncloudd.
(Reading database ... 440995 files and directories currently installed.)
Preparing to unpack uncloudd_0.17.1_amd64.deb ...
Unpacking uncloudd (0.17.1) ...
Setting up uncloudd (0.17.1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/uncloudd.service → /usr/lib/systemd/system/uncloudd.service.
```

And then `systemctl start uncloudd`. And add your self to the `uncloud` group:

```
% sudo adduser miek uncloud
info: Adding user `miek' to group `uncloud' ...
```

Next install the local CLI to interact with the cluster with
`go install github.com/psviderski/uncloud/cmd/uncloud@latest`, note you manually need to copy or alias
uncloud to `uc`

```
% uncloud machine init --no-caddy --no-dns --no-install --context test miek@172.31.76.38
Cluster initialised with machine 'machine-uco9' and saved as context 'test' in your local config (/home/miek/.config/uncloud/config.yaml)
Current cluster context is now 'test'.
Cluster is ready.
```

Next deploy something! First we need to "reserve" a domain, need to figure out what this means and how to make
it local. Note this is following the
[demo-app-deploy](https://uncloud.run/docs/getting-started/deploy-demo-app/).

```
% uncloud dns reserve
Reserved cluster domain: q3baqx.uncld.dev
```

Next:

```
% uncloud run --name excalidraw --publish 80/https excalidraw/excalidraw
[+] Running service excalidraw (replicated mode) 11/11
 ✔ Container excalidraw-p2ss on machine-uco9  Healthy        35.1s
   ✔ Image excalidraw/excalidraw on machine-uco9  Pulled     3.6s

excalidraw endpoints:
 • https://excalidraw.q3baqx.uncld.dev → :80
```

Now this machine is in my internal network, if even _with_ wireguard this is not reacheable.

