Uncloud

作者 affaan-mef648e01899b無授權條款275K 個星標收錄於 2026年10月8日更新於 2026年10月8日儲存庫3 天前更新

Use when managing an Uncloud cluster — deploying services, configuring Caddy ingress, adding static proxy routes for non-cluster devices, publishing ports, scaling, inspecting logs, or managing machines and volumes with the `uc` CLI.

僅含說明DevOps & Cloud
AI 產生的概覽

使用 uc CLI 管理 Uncloud 叢集的參考指南:部署服務、Caddy 入口、連接埠、擴縮與日誌。

功能
此技能是 uc CLI 的參考文件,uc 是 Uncloud 自架平台的命令列工具,建構於 Docker 容器、WireGuard 網狀網路與 Caddy 之上。內容記錄機器初始化與加入指令、從 Compose 檔案部署服務、HTTP/HTTPS 與 TCP/UDP 連接埠發佈、Caddy 入口設定、放置限制、擴縮、磁碟區、DNS 與日誌檢視。也涵蓋 Uncloud 的 Compose 擴充(例如 x-ports、x-caddy 與 x-machines)、映像標籤範本,以及將外部非叢集裝置接入路由的方法。產出的是指引與指令範例,而非檔案或指令碼。
適用情境
在操作 Uncloud 叢集時使用,例如初始化或加入機器、從 Compose 檔案部署服務、發佈連接埠、設定 Caddy 入口,或檢視日誌、磁碟區與叢集狀態。也適用於透過叢集代理路由外部區域網路裝置,或排查常見的 Uncloud 使用錯誤。
執行需求
不隨附指令碼,僅為說明文件。依其中指引操作需要 uc CLI 與 Uncloud 叢集,以及 Docker、WireGuard 網狀網路連線與 Caddy。

Uncloud Cluster Management

Reference for the uc CLI — a decentralised self-hosting platform using Docker containers, WireGuard mesh networking, and Caddy reverse proxy.

When to Activate

Use this skill when working with Uncloud clusters, especially when:

  • Bootstrapping or joining machines with uc machine
  • Deploying services from Compose files with uc deploy
  • Publishing HTTP, HTTPS, TCP, or UDP ports through Uncloud
  • Configuring Caddy ingress with x-caddy, x-ports, or --caddyfile
  • Routing external LAN devices through the cluster proxy
  • Inspecting logs, service state, volumes, DNS, or machine placement

How It Works

Uncloud runs Docker services across peer machines connected by a WireGuard mesh. Each machine is an equal cluster member; services communicate on the overlay network and Caddy runs globally to terminate public HTTP/HTTPS traffic. Compose files can use Uncloud extensions for ingress, placement, and generated Caddy configuration, while the uc CLI handles image distribution, scheduling, scaling, logs, and cluster state.

Examples

bash
uc machine init user@host --name machine-1uc service run --name web -p app.example.com:8080/https nginx:latestuc deploy

Core Concepts

  • No central control plane — all machines are equal peers connected by WireGuard
  • Caddy runs as a global service on every machine; auto-obtains TLS from Let's Encrypt
  • Overlay network — services communicate via 10.210.0.0/16 by default; DNS provided inside the mesh
  • Caddyfile is autogenerated — never edit it directly; use x-caddy / --caddyfile instead

CLI Quick Reference

Machines

CommandPurpose
uc machine init user@hostBootstrap first machine / new cluster
uc machine add user@hostJoin machine to existing cluster
uc machine lsList machines
uc machine update NAME --public-ip IPUpdate public IP for ingress
uc machine rm NAMERemove machine

Key init flags: --name, --network 10.210.0.0/16, --no-caddy, --no-dns, --public-ip auto\|IP\|none

Services

CommandPurpose
uc service ls / uc lsList services
uc service run IMAGERun a single container service
uc deployDeploy from compose.yaml
uc deploy --no-buildDeploy already-pushed images without rebuilding
uc deploy --recreateForce service recreation
uc scale SERVICE NSet replica count
uc service logs SERVICEView logs
uc service exec SERVICEShell into container
uc service inspect SERVICEDetailed info
uc service rm SERVICERemove service (keeps named volumes)
uc psAll containers across cluster

Images

bash
uc image push myapp:latest                    # Push local image to all machinesuc image push myapp:latest -m machine1,machine2  # Push to specific machinesuc images                                     # List images in cluster

Volumes

bash
uc volume ls                  # All volumesuc volume ls -m machine1      # On specific machineuc volume create NAME -m MACHINEuc volume rm NAME

Caddy

bash
uc caddy config    # Show current generated Caddyfile (read-only)uc caddy deploy    # Deploy/upgrade Caddy across cluster

DNS & Context

bash
uc dns show        # Show reserved *.uncld.dev domainuc dns reserve     # Reserve a new domainuc ctx ls          # List cluster contextsuc ctx use prod    # Switch context

Port Publishing

HTTP/HTTPS (via Caddy reverse proxy)

-p [hostname:]container_port[/protocol]
ExampleMeaning
-p 8080/httpsHTTPS with auto service-name.cluster-domain hostname
-p app.example.com:8080/httpsHTTPS with custom hostname
-p 8080/httpHTTP only, no TLS

TCP/UDP (host-bound, bypasses Caddy)

-p [host_ip:]host_port:container_port[/protocol]@host
ExampleMeaning
-p 5432:5432@hostTCP 5432 on all interfaces
-p 127.0.0.1:5432:5432@hostTCP 5432 loopback only
-p 53:5353/udp@hostUDP

Compose File Extensions

Uncloud adds these extensions on top of Docker Compose:

x-ports — publish ports with domains

yaml
services:  app:    image: app:latest    x-ports:      - example.com:8000/https      - www.example.com:8000/https      - api.example.com:9000/https

x-caddy — custom Caddy config for service

yaml
services:  app:    image: app:latest    x-caddy: |      example.com {        redir https://www.example.com{uri} permanent      }      www.example.com {        reverse_proxy {{upstreams 8000}} {          import common_proxy        }        basic_auth /admin/* {          admin $2a$14$...        }      }

Template functions available inside x-caddy:

  • {{upstreams [service] [port]}} — healthy container IPs
  • {{.Name}} — service name
  • {{.Upstreams}} — map of all services → IPs

x-machines — placement constraints

yaml
services:  db:    image: postgres:18    x-machines: db-machine          # Single machine name  app:    image: app:latest    x-machines:      - machine-1      - machine-2

Full multi-service example

yaml
services:  api:    build: ./api    x-ports:      - api.example.com:3000/https    environment:      DATABASE_URL: postgres://db:5432/mydb
  web:    build: ./web    x-ports:      - example.com:8000/https      - www.example.com:8000/https    environment:      API_URL: http://api:3000
  db:    image: postgres:18    environment:      POSTGRES_PASSWORD: ${DB_PASSWORD}    volumes:      - db-data:/var/lib/postgresql/data    x-machines: db-machine
volumes:  db-data:

Routing to External (Non-Cluster) Devices

To expose an external device (e.g. BMC, NAS, router UI) via Caddy without running a real container:

1. Create a Caddyfile snippet (e.g. ~/device.caddyfile):

caddyfile
https://device.example.com {    reverse_proxy https://192.168.1.x {        transport http {            tls_insecure_skip_verify   # needed for self-signed BMC certs        }    }    log}

For plaintext upstream: reverse_proxy http://192.168.1.x:port

2. Register as a named service with no-op container:

bash
uc service run \  --name device-bmc \  --caddyfile ~/device.caddyfile \  registry.k8s.io/pause:3.9

pause is a minimal no-op container — it does nothing, but gives Uncloud a service entry to attach the Caddyfile to.

3. Verify:

bash
uc caddy config   # device.example.com block should appear

--caddyfile cannot be combined with non-@host published ports.

DNS tip: A wildcard record (*.yourdomain.com → cluster-public-ip) means any new subdomain works immediately — no DNS change needed per service.


Service DNS (Internal)

Services inside the cluster resolve each other by name:

DNS nameResolves to
service-nameAny healthy container
service-name.internalSame
rr.service-name.internalRound-robin
nearest.service-name.internalMachine-local first

Scaling & Global Services

bash
uc scale web 5    # 5 replicas (spread across machines)uc scale web 1    # Scale down
yaml
services:  caddy:    deploy:      mode: global   # One container on every machine

Image Tag Templates (in compose.yaml)

yaml
image: myapp:{{gitdate "20060102"}}.{{gitsha 7}}image: myapp:{{gitsha 7}}.${GITHUB_RUN_ID:-local}
FunctionOutput
{{gitsha N}}First N chars of commit SHA
{{gitdate "format"}}Git commit date in Go format
{{date "format"}}Current date

Common Workflows

Deploy from source:

bash
uc deploy                          # Build + push + deployuc build --push && uc deploy --no-build   # Separate steps

Inspect a service:

bash
uc inspect webuc logs -f webuc logs --since 1h webuc exec web                        # Opens shelluc exec web /bin/sh -c "env"       # Run specific command

Zero-downtime deploys happen automatically; Uncloud waits for health checks before terminating old containers.

Force recreate:

bash
uc deploy --recreate

Common Mistakes

MistakeFix
Editing the Caddyfile directlyUse x-caddy in compose or --caddyfile on uc service run
Proxying an HTTPS upstream with self-signed certAdd transport http { tls_insecure_skip_verify }
uc caddy config shows no user-defined blocksCaddy admin socket unreachable — check uc inspect caddy and uc logs caddy
Service can't reach external LAN IP from containerVerify Caddy container's host can route to target network
Volumes lost after uc service rmNamed volumes persist; only anonymous volumes are auto-removed

來源與署名

來源:affaan-m/ecc位於skills/uncloud提交ef648e0

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架