Files
Egutierrez 93acc059f1 docs: app.md + deploy artifacts (systemd unit, deploy README)
- app.md: frontmatter (service, port 8480, systemd unibus-admin.service on magnus),
  architecture, capabilities, security, known gaps. uses_functions:
  sign_ed25519_go_cybersecurity. e2e_checks (build/vet/web_build/smoke_mock).
- deploy/unibus-admin.service: systemd unit (Restart=always per the SIGTERM gotcha).
- deploy/README.md: reproducible deploy steps (no secrets), Caddy additive-site recipe.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-07 19:44:38 +02:00
..

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

# 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-<random>.organic-machine.com {
#       basic_auth {
#           admin <HASH>
#       }
#       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).