---
id: "0054"
title: "deploy_server: refactor registry-first (SSH/systemd/rsync/health/docker-compose)"
status: pendiente
type: refactor
domain:
  - registry-quality
  - deploy
scope: multi-app
priority: alta
depends: []
blocks: []
related: []
created: 2026-05-17
updated: 2026-05-17
tags: [ausente-ready]
---
# 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 <script_path>`. NO portar a Go solo para "estar en el mismo lenguaje" — la version bash funciona y es la que el registry mantiene.
