docs: la tarea programada tiene que apuntar a lo que se instalo

BUILD.md gana la seccion del fallo silencioso y como reproducirlo con
scripts/emular-actualizacion-windows.ps1.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-31 10:28:20 -06:00
parent 0ac899f531
commit 399b0483d5
2 changed files with 45 additions and 0 deletions

View File

@@ -222,6 +222,30 @@ Reemplazar el binario de un servidor en producción no puede dejarlo sin restaur
3. **Se confirma que el agente volvió a arrancar** y, si no, se **revierte** al binario anterior. 3. **Se confirma que el agente volvió a arrancar** y, si no, se **revierte** al binario anterior.
El respaldo solo se descarta tras esa confirmación. El respaldo solo se descarta tras esa confirmación.
### La tarea programada tiene que apuntar a lo que se instaló
Reemplazar el binario es una operación por **ruta**; `Start-ScheduledTask` es por **nombre** y
ejecuta la ruta que la tarea lleva registrada en su acción. Cuando las dos no coinciden —una
instalación fuera de la carpeta por omisión, o movida de sitio— se copiaba el binario nuevo en un
lado y se arrancaba el viejo del otro: **el run terminaba en verde y el servidor seguía igual**.
`install.ps1` compara la acción de la tarea con el `-Prefix` y la **reapunta** si difieren,
conservando disparador, principal, ajustes y argumentos. Si no puede corregirla, falla: arrancar a
sabiendas el binario anterior es peor que abortar. Y la confirmación de arranque mira la **ruta**
del proceso, no solo su nombre — un agente viejo que nunca se detuvo satisface igual de bien un
`Get-Process -Name CloudRestoreAS`.
Para reproducirlo y comprobarlo sin un servidor, desde WSL o Windows:
```powershell
scripts\emular-actualizacion-windows.ps1 -Installer .\install.ps1 # caso roto
scripts\emular-actualizacion-windows.ps1 -Installer .\install.ps1 -Escenario alineada # caso normal
```
Monta un agente falso (un `.exe` real que se queda vivo), una instalación en una carpeta y una
tarea apuntando a otra, corre el instalador y dice si la actualización surtió efecto. No necesita
elevación ni toca la instalación real de la máquina.
`-UpdateInPlace` además no vuelve a registrar la tarea (así no pisa ajustes hechos sobre ella) y `-UpdateInPlace` además no vuelve a registrar la tarea (así no pisa ajustes hechos sobre ella) y
se salta el bootstrap: una segunda instancia purgaría el `Temp\` de la que está viva. Es el modo se salta el bootstrap: una segunda instancia purgaría el `Temp\` de la que está viva. Es el modo
que usa el PANEL para actualizar. que usa el PANEL para actualizar.

View File

@@ -2,6 +2,27 @@
## [Sin publicar] ## [Sin publicar]
### La actualización de Windows decía que funcionó y no cambiaba nada
Actualizar sobre un servidor con el agente en una carpeta **no estándar** terminaba en verde y
dejaba el servidor con la versión anterior. La causa: todo el camino de Windows identificaba al
agente por **nombre**, mientras que lo único que se actualiza se identifica por **ruta**.
- **`install.ps1` alinea la tarea programada con el binario instalado.** `Start-ScheduledTask`
ejecuta la ruta registrada en la acción de la tarea, no el `-Prefix`: si difieren, se copiaba el
binario nuevo en un sitio y se arrancaba el viejo del otro. Ahora se reapunta la tarea
conservando disparador, principal, ajustes y argumentos; si no se puede corregir, **falla**.
- **La confirmación de arranque mira la ruta del proceso**, no solo su nombre. Un agente viejo que
nunca se detuvo satisfacía igual de bien un `Get-Process -Name CloudRestoreAS`. Si la ruta no es
legible —un proceso de SYSTEM no la expone a una cuenta sin elevación— se acepta por nombre y se
avisa, en vez de revertir una actualización correcta por falta de información.
- **Nuevo `scripts/emular-actualizacion-windows.ps1`**: reproduce el escenario completo con un
agente falso, sin elevación y sin tocar la instalación real de la máquina. Es lo que destapó este
defecto y el siguiente.
- **Corregido `Merge-EnvFile` con un `config\.env` de una sola línea.** Al asignar la salida de un
`if`, PowerShell desenrolla un array de un elemento a escalar, así que `$lines.Count` reventaba
bajo `Set-StrictMode` y la siembra de credenciales abortaba la instalación.
### Instalación y actualización desatendidas en Windows ### Instalación y actualización desatendidas en Windows
El instalador de Windows nunca recibió la maquinaria de actualización segura que sí tiene El instalador de Windows nunca recibió la maquinaria de actualización segura que sí tiene