Skip to main content
Glama
README.md
# dsh-plugin-deploy-guardian — revisión y despliegue de VPS para DeepSeek Harness

Plugin MCP local para **revisar y desplegar un VPS por SSH** sin comandos
inventados: el modelo elige entre acciones **declaradas en tu configuración**
(restart, deploy, rollback), con confirmación explícita, auditoría y modo
read-only.

[English](README.en.md) · [Cómo funciona](docs/COMO-FUNCIONA.md) · MIT

## Herramientas (3)

| Tool | Qué hace |
|---|---|
| `mcp__deploy__status` | Conectividad SSH + checks declarados (servicios, disco) por host. |
| `mcp__deploy__logs` | Últimos logs de un servicio permitido (journalctl o comando configurado). |
| `mcp__deploy__action` | `restart`/`deploy`/`rollback` con `confirm:true` y comando de la config. |

## Configuración

Archivo: `<DSH_HOME>\deploy-guardian\config.json` (el `postinstall` crea uno base;
hay un ejemplo completo en `config.example.json`).

```json
{
  "sshCommand": "ssh",
  "sshArgs": ["-o", "BatchMode=yes", "-o", "ConnectTimeout=10"],
  "hosts": [{
    "name": "wendigo-vps",
    "host": "root@203.0.113.10",
    "port": 22,
    "identityFile": "C:\\Users\\tu-usuario\\.ssh\\id_ed25519",
    "checks": [
      { "name": "nginx", "command": "systemctl is-active nginx" },
      { "name": "bot", "command": "systemctl is-active wendigo-bot" },
      { "name": "disco", "command": "df -h / | tail -1" }
    ],
    "services": ["nginx", "wendigo-bot"],
    "logsCommand": "journalctl -u {service} -n {lines} --no-pager",
    "restartCommand": "sudo systemctl restart {service}",
    "deployCommand": "cd /opt/wendigo && ./deploy.sh",
    "rollbackCommand": "cd /opt/wendigo && ./rollback.sh"
  }]
}
```

- El plugin **solo ejecuta los comandos de esta config**; el modelo no puede
  inyectar comandos ni servicios fuera de la lista.
- `sshCommand`/`sshArgs` permiten usar `ssh.exe` de Windows (OpenSSH) u otro
  cliente; las claves viven en tu máquina, nunca en el repo.

## Instalación

Desde **DSH → Settings → Plugins** instala
`github:thegabopacheco-sudo/dsh-plugin-deploy-guardian` y permite el script de
instalación. El `postinstall` copia el runtime a
`<DSH_HOME>\plugins\deploy-guardian` y crea la config base.

CLI (perfiles no administrados por la app):

```
dsh plugin --profile <perfil> add github:thegabopacheco-sudo/dsh-plugin-deploy-guardian
```

Requisitos: Windows 10/11 con cliente **OpenSSH** (`ssh.exe`), Node ≥ 20 (lo
aporta el harness) y acceso SSH por clave al VPS.

## Seguridad

- **Read-only por defecto** en espíritu: `status`/`logs` solo leen.
- **Acciones con confirmación** (`confirm:true` + pedido explícito del usuario).
- **Comandos declarados**: nada de comandos arbitrarios del modelo.
- **Lista de servicios** por host para logs/restart.
- **Rate limit** de 6 acciones por minuto.
- **Auditoría** en `<DSH_HOME>\cache\deploy-guardian\audit.jsonl`.
- **Modo read-only**: `DSH_DEPLOY_MODE=read-only` desactiva las acciones.
- Sin contraseñas SSH ni claves en el repo: solo `identityFile` (ruta local).

## Variables de entorno

| Variable | Uso |
|---|---|
| `DSH_DEPLOY_MODE` | `read-only` desactiva acciones. |
| `DSH_DEPLOY_SKIP_POSTINSTALL` | `1` omite el despliegue. |

## Solución de problemas

- **“falta la configuración”**: copia `config.example.json` a
  `<DSH_HOME>\deploy-guardian\config.json` y completa tus hosts.
- **SSH falla**: prueba `ssh -i <clave> usuario@host 'echo ok'` a mano; revisa
  `BatchMode=yes` y `known_hosts`.
- **Servicio no permitido**: agrégalo a `services` del host.
- **Permiso de scripts en la instalación**: aprueba el `postinstall`; si el
  cartel se repite, `allowBuilds: true` en `pnpm-workspace.yaml` del perfil.

## Desarrollo

```powershell
npm install
npm run build:bundle
cd test; npm install; node connect-test.mjs   # SSH mock local
```

## Licencia

MIT © thegabopacheco-sudo