Descripción
Release 2.14.1 del Agente entregada como paquete firmado (app-2.14.1.zip ~200 KB, firma Ed25519) sin recompilar ni tocar el .exe. Primer validación E2E del Lanzador Estable F2.
Flujo: descarga → verifica firma Ed25519 → actualiza puntero current → relanza en 2.14.1.
Validación E2E (07-07, máquina de Edu)
- Máquina de producción: publicó release de prueba 2.14.1 (paquete firmado).
- Resultado: el
.exequedó byte-idéntico antes/después. - Carrera antivirus eliminada por construcción: sin nuevo binario, el AV no tiene momento donde bloquear la extracción de un onefile sin reputación.
Implementación
Lado server
core/views.download_agent: sirve el instalador.core/agent_release.py: gestiona las releases (manifest v2 con campospackage_*)./api/agent/manifest: publicapackage_url,package_hash,package_signature.
Lado Agente (bootstrap)
terminal/agent/bootstrap.py: descarga, verifica SHA-256 + Ed25519, swap de puntero atómico.core/pkg_updater.py(nuevo, viaja en el paquete): updater que se actualiza a sí mismo, regresa a bootstrap con funciones de verificación (cero duplicación).pkg-watchdogcon rollback de puntero: sin AV en la ecuación, fallo = bug real → rollback certero.
Clave privada Ed25519
- Ubicación: fuera del repo y servidor (
~/.crearack/keys/agent_signing.key). - Generación:
scripts/agent/generate_signing_key.py. - Rotación: script disponible.
- Ventaja de seguridad: un SaaS comprometido ya no puede empujar código a máquinas de clientes (antes sí: SHA desde el propio server).
Testing
- 19 tests nuevos en
tests/agent/test_agent_launcher.py:- Verificación SHA-256 y Ed25519.
- Fallback
current → previous → embebido. - Markers de extracción, gates, punteros atómicos.
- Pruning, payload del servidor.
- Suite: agente 83/83 ✅ + servidor 12/12 ✅.
Limitaciones (para F3)
- Bootstrap 2.14.0 aún es onefile → re-extrae
.pyden cada arranque. - AV puede morder un
.pyden esa extracción (raíz del tracebackpydantic_core, hermano de_overlapped). - Fix F3: pasar bootstrap a
--onedir(los.pydviven en_internal, se escanean una vez).
Cambios en .gitignore
static/downloads/*.exe: todos los executables de agente.static/downloads/app-*.zip: paquetes de código (artefactos de build).static/downloads/app-*.meta.json: metadatos de paquetes.
Véase también
- [[feature—agent-lanzador—bootstrap-zip]]
- [[concept—agent-lanzador—bootstrap-y-pkg-updater]]
- [[decision—20260707—netbird-ssh-apex]]
- [[feature—agent-lanzador—onedir-f3]]
- [[incident—20260707—bootstrap-2-14-0-roto]]
Referenciado desde
- Bootstrap 2.14.0 roto — PyInstaller descartó app_main.py
- Bootstrap ZIP — Código embebido que no descarta PyInstaller
- Cadena de fallback del bootstrap — current → previous → embebido
- Lanzador Estable F3 — Auto-update desatendido transparente (onedir + setup stub)
- Rollback silencioso e infalible — Caída al embebido sin `previous.txt`
- SSH a PROD por NetBird, no por apex — Cloudflare cerró el puerto 22