---
name: spark-ssh
description: >-
  Conecta y ejecuta comandos en el servidor remoto "spark" vía SSH usando la variable de entorno
  SPARK_PASSWORD para la autenticación (spark no acepta key, solo password). Traduce rutas entre el
  volumen NFS /mnt/docker-nas/projects de spark y la carpeta ~/projects de este entorno de desarrollo
  (son el mismo storage compartido). Triggers: "conéctate a spark", "ejecuta esto en spark", "corre este
  comando en spark", "revisa spark", "spark ssh".
effort: low
argument-hint: "[comando o tarea a ejecutar en spark]"
---

# spark-ssh — Ejecutar comandos remotos en spark vía SSH

## Contexto fijo

- El host `spark` ya está configurado en `~/.ssh/config` (`HostName <<SPARK_IP_1>>`, `User aleleba`) —
  nunca hace falta especificar user/host, basta `ssh spark`.
- spark **no acepta autenticación por key**, solo por password. La password vive en la variable de
  entorno `$SPARK_PASSWORD` de este entorno de desarrollo.
- `ssh` no tiene ninguna forma nativa de pasar una password por flag (`-p` es el puerto, no la
  password) — por eso se usa `sshpass` para automatizar el login.
- spark tiene montado por NFS el volumen `/mnt/docker-nas`. Dentro de él,
  `/mnt/docker-nas/projects/<nombre>` **es exactamente el mismo storage** que `~/projects/<nombre>` en
  este entorno de desarrollo (compartido vía NAS). Un cambio hecho en un lado es instantáneamente visible
  en el otro.
- En spark, los modelos (LLMs, checkpoints, etc.) se guardan en `/home/aleleba/models` — esta ruta es
  local a spark, no está compartida con este entorno de desarrollo.

## 1. Preflight — sshpass (una sola vez, idempotente)

```bash
which sshpass >/dev/null 2>&1 || sudo apt-get install -y sshpass
```

Si ya está instalado (lo estará después de la primera vez que se use esta skill), este paso no hace
nada — no volver a instalar ni preguntar por ello.

## 2. Ejecutar un comando remoto

```bash
SSHPASS="$SPARK_PASSWORD" sshpass -e ssh spark '<comando remoto>'
```

- Usar siempre `sshpass -e` (lee la password de la variable de entorno `SSHPASS`), **nunca** `sshpass -p
  "$SPARK_PASSWORD"` — ese flag deja la password visible en la lista de procesos (`ps`).
- Para comandos multilínea o con comillas complejas, usar un heredoc remoto en vez de escapar comillas:
  ```bash
  SSHPASS="$SPARK_PASSWORD" sshpass -e ssh spark bash -s <<'EOF'
  comando1
  comando2
  EOF
  ```

## 3. Rutas — proyectos compartidos

Si el comando remoto opera sobre un proyecto que también existe localmente en `~/projects/<nombre>`, la
ruta equivalente en spark es `/mnt/docker-nas/projects/<nombre>`.

- Para **editar código** de esos proyectos, preferir las tools locales (Read/Edit) ya que es el mismo
  filesystem — no hace falta editar por SSH.
- Usar SSH solo para **ejecutar** cosas que realmente necesitan correr en spark (builds, procesos,
  comandos específicos del entorno/hardware de spark, por ejemplo GPU/Spark jobs).

## Seguridad

- Nunca imprimir, loggear ni commitear el valor de `$SPARK_PASSWORD`.
- Aplican las reglas generales de acciones riesgosas: confirmar con el usuario antes de ejecutar en spark
  comandos destructivos o de alto impacto (`rm -rf`, `docker rm`/`docker system prune`, `kill -9`,
  reinicios de servicios, etc.).
