93acc059f1
- 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>
61 lines
2.5 KiB
Markdown
61 lines
2.5 KiB
Markdown
# 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-<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`).
|