# 0054 — deploy_server: refactor registry-first (SSH/systemd/rsync/health/docker-compose) ## APP Metadata | Campo | Valor | |-------|-------| | **ID** | 0054 | | **Estado** | pendiente | | **Prioridad** | alta | | **Tipo** | refactor — `apps/deploy_server/` | ## Dependencias - 13 funciones del registry ya existentes y testeadas: - `ssh_check_go_infra`, `ssh_exec_go_infra`, `ssh_upload_go_infra`, `ssh_config_read_go_infra`, `ssh_config_find_go_infra` - `systemd_install_go_infra`, `systemd_restart_go_infra`, `systemd_status_go_infra`, `systemd_generate_unit_go_infra` (pure) - `rsync_deploy_bash_infra`, `docker_compose_remote_deploy_bash_infra` - `health_check_http_go_infra` - `vps_setup_app_go_infra` - Pipelines `deploy_app_remote_go_infra` y `setup_vps_app_go_infra` orquestan varias. ## Contexto `fn doctor uses-functions` (2026-05-07) detecto que `apps/deploy_server/` no importa NADA del registry. Toda la logica SSH/systemd/rsync/health/docker-compose esta reimplementada inline en `deployer.go` (`d.sshCheck`, `d.sshExec`, `d.rsyncDeploy`, `d.healthCheck`, `d.generateUnit`, `d.installUnit`, `deployDockerCompose`). Esta es la violacion mas grande de la regla `registry-first.md` actualmente activa. La app fue construida antes de que existieran las funciones del registry equivalentes; las funciones se crearon despues pero deploy_server quedo sin migrar. Tras sincronizar `app.md` (2026-05-07) las 13 funciones se quitaron del frontmatter — ahora refleja la realidad pero la deuda real (registry-first compliance) sigue. ## Objetivo Reemplazar implementaciones inline de `deployer.go` por llamadas a las funciones del registry. Resultado: 1. `apps/deploy_server/*.go` importa `fn-registry/functions/infra` y `fn-registry/functions/cybersecurity` segun corresponda. 2. `app.md` declara las 13 funciones en `uses_functions`. 3. Los tests existentes siguen pasando. 4. `fn doctor uses-functions` reporta `deploy_server_go_infra` sin drift. ## Arquitectura ### Archivos afectados - `apps/deploy_server/deployer.go` — ELIMINAR metodos `sshCheck`, `sshExec`, `sshUpload`, `rsyncDeploy`, `healthCheck`, `generateUnit`, `installUnit` y reemplazar por llamadas a funciones del registry. - `apps/deploy_server/docker_compose.go` — sustituir `deployDockerCompose` por `docker_compose_remote_deploy_bash_infra`. - `apps/deploy_server/handlers.go` (probable) — actualizar callsites. - `apps/deploy_server/app.md` — anadir las 13 deps en `uses_functions`. - `apps/deploy_server/go.mod` — anadir `replace fn-registry => ../..` si no esta. ## Tareas ### Fase 1 — preparacion 1.1 Listar callsites actuales en deployer.go (`grep -n 'd\.\(sshCheck\|sshExec\|sshUpload\|rsyncDeploy\|healthCheck\|generateUnit\|installUnit\)\|deployDockerCompose'`). 1.2 Verificar firmas de las funciones del registry vs los metodos inline. Documentar diferencias (parametros distintos, error wrapping). 1.3 Anadir `replace` directive en `go.mod` si falta. ### Fase 2 — migracion SSH 2.1 Reemplazar `d.sshCheck` por `infra.SshCheck`. 2.2 Reemplazar `d.sshExec` por `infra.SshExec`. 2.3 Reemplazar `d.sshUpload` por `infra.SshUpload`. 2.4 Test build: `go build` en deploy_server. ### Fase 3 — migracion systemd 3.1 Reemplazar `d.generateUnit` por `infra.SystemdGenerateUnit`. 3.2 Reemplazar `d.installUnit` por `infra.SystemdInstall`. 3.3 Reemplazar restart/status por `infra.SystemdRestart`, `infra.SystemdStatus`. ### Fase 4 — migracion rsync + http + docker-compose 4.1 Reemplazar `d.rsyncDeploy` por shell-out a `bash/functions/infra/rsync_deploy.sh` (es bash, no Go). 4.2 Reemplazar `d.healthCheck` por `infra.HealthCheckHTTP`. 4.3 Reemplazar `deployDockerCompose` por shell-out a `bash/functions/infra/docker_compose_remote_deploy.sh`. ### Fase 5 — tests + docs 5.1 Correr tests existentes. Si hay mocks de los metodos privados, actualizar. 5.2 Actualizar `app.md` `uses_functions` con las 13 IDs (orden alfabetico). 5.3 `fn index` y `fn doctor uses-functions` debe reportar deploy_server limpio. 5.4 Update CHANGELOG.md con la migracion. ## Riesgos - Las firmas inline pueden tener parametros adicionales que las del registry no exponen. Mitigacion: si la diferencia es real, abrir proposal para extender la funcion del registry, NO duplicar inline. - Tests con mocks de metodos privados rompen. Mitigacion: convertir a integration tests contra docker container o servidor SSH local. - Build cross-platform: si `infra` paquete tiene CGo y deploy_server cross-compila, validar build linux/windows. ## Decisiones de diseno - **No crear adapter layer**. Llamada directa a las funciones del registry. Si la firma cambia entre version, se actualiza el callsite — el costo es bajo y mantiene la regla registry-first sin ceremonia. - Las funciones bash (`rsync_deploy`, `docker_compose_remote_deploy`) se invocan via `os/exec` con `bash `. NO portar a Go solo para "estar en el mismo lenguaje" — la version bash funciona y es la que el registry mantiene.