# Despliegue de unibus_admin El panel se despliega como un service systemd en el mismo host que un nodo del cluster unibus (hoy: **magnus**), bindeado a loopback y fronteado por Caddy con basic auth sobre un subdominio ofuscado. No hay secretos en este directorio. ## Requisitos en el host - Un nodo `membershipd` corriendo (control plane en `:8470`, NATS en `:4250`). - La CA del bus en `/opt/unibus/tls/ca.crt` (la que firma el cert del control plane). - La identidad ADMIN del operador como fichero JSON 0600 en `/opt/unibus_admin/identity.json` (mismo formato que `pass unibus/operator-identity`: `{sign_pub, sign_priv, kex_pub, kex_priv}` en base64). El operador debe estar en la allowlist del bus con rol admin. - Caddy activo con DNS wildcard `*.organic-machine.com` apuntando al host. ## Pasos ```bash # 1. Build del binario (linux/amd64, estático) cd web && pnpm install && pnpm build && cd .. CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o unibus_admin . # 2. Copiar binario + identidad al host ssh magnus 'mkdir -p /opt/unibus_admin' scp unibus_admin magnus:/opt/unibus_admin/unibus_admin pass unibus/operator-identity | ssh magnus 'umask 077; cat > /opt/unibus_admin/identity.json' # 3. Instalar el service systemd scp deploy/unibus-admin.service magnus:/etc/systemd/system/ ssh magnus 'systemctl daemon-reload && systemctl enable --now unibus-admin.service' # 4. Verificar local en el host ssh magnus 'curl -fsS http://127.0.0.1:8480/healthz && curl -fsS http://127.0.0.1:8480/api/cluster' # 5. Caddy: añadir un site ADITIVO (NO tocar bloques existentes) PW=$(pass unibus/admin-panel-password | head -1) HASH=$(ssh magnus "caddy hash-password --plaintext '$PW'") ssh magnus 'cp /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak.$(date +%Y%m%d-%H%M%S)' # Append el bloque (subdominio aleatorio): # # admin-.organic-machine.com { # basic_auth { # admin # } # reverse_proxy 127.0.0.1:8480 # } # ssh magnus 'caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile && systemctl reload caddy' ``` ## Gotchas - **`Restart=always`** (no `on-failure`): un `SIGTERM` limpio sale con éxito y `on-failure` no reiniciaría — el panel quedaría muerto en silencio. - El binario embebe la SPA (`web/dist`), así que **hay que `pnpm build` ANTES de `go build`**; si no, embebe el placeholder. - La identidad del operador es un secreto: 0600, nunca a git ni a argv. - El subdominio y la password viven en `pass` (`unibus/admin-panel-url`, `unibus/admin-panel-password`).