Flujos¶
Cómo funciona versaDeploy por dentro, en diagramas. Para cada paso hay más detalle en la referencia.
Qué hace versa deploy¶
Todo lo pesado ocurre en tu computador (o en el CI); el servidor solo recibe el resultado y lo activa.
flowchart TD
A[versa deploy production] --> B{¿Cambió algo desde<br>el último deploy?<br><small>SHA256 de cada archivo</small>}
B -- No --> Z0[Nada que hacer]
B -- Sí --> C[Compila en tu computador<br><small>composer · npm · go build</small>]
C --> D[Comprime y sube por SFTP<br><small>solo lo que cambió, en paralelo</small>]
D --> E[Crea releases/NUEVA en el servidor<br><small>reutiliza vendor, node_modules, .venv</small>]
E --> F[Enlaza shared/<br><small>.env, storage, uploads…</small>]
F --> G[Hooks pre_deploy_server]
G --> H[Cambia current → releases/NUEVA<br><small>un symlink: cero downtime</small>]
H --> I[services_reload<br><small>PHP-FPM, nginx</small>]
I --> J[Hooks post_deploy<br><small>migraciones, caches</small>]
J --> K[Reinicia los services<br><small>Go, Python, Node</small>]
K --> L{Health check}
L -- OK --> M[✅ Registra el deploy<br>limpia releases viejas<br>avisa a Slack/Discord/Telegram]
J -- falla --> R
K -- falla --> R
L -- falla --> R[↩️ Rollback automático<br><small>current vuelve a la versión anterior</small>]
R --> N[❌ Deploy fallido: queda en el historial<br>con su log, y se avisa]
Primer deploy en un servidor nuevo¶
flowchart LR
A[VPS nuevo<br><small>acceso root por SSH</small>] --> B[deploy.yml<br><small>de examples/</small>]
B --> C[versa → Services → I<br><small>instala el stack, crea el usuario<br>deploy y la base de datos</small>]
C --> D[versa deploy production<br>--initial-deploy]
D --> E[versa → Shared → .env<br><small>datos de producción</small>]
E --> F[versa deploy production<br>--force<br><small>migraciones y caches</small>]
F --> G[🚀 App en línea]
Paso a paso en Primeros pasos, y en video en Videos.
El día a día¶
sequenceDiagram
actor Dev as Tú
participant Git
participant V as versa
participant S as Servidor
Dev->>Git: git commit
Dev->>V: versa deploy production
V->>V: detecta cambios y compila
V->>S: sube solo lo que cambió
V->>S: activa la nueva versión
S-->>V: health check OK
V-->>Dev: ✅ listo (y queda en versa history)
Note over Dev,S: ¿Algo salió mal en producción?
Dev->>V: versa rollback production
V->>S: current → la versión anterior (1 segundo)
Dónde vive cada cosa en el servidor¶
flowchart LR
current["current<br><small>symlink</small>"] --> R3
subgraph releases["releases/"]
R1["20261101-090000/app"]
R2["20261105-153000/app"]
R3["20261109-120000/app<br><small>la versión en línea</small>"]
end
subgraph shared["shared/ (sobrevive a todos los deploys)"]
ENV[".env"]
ST["storage/"]
end
R1 -. ".env, storage" .-> shared
R2 -. ".env, storage" .-> shared
R3 -. ".env, storage" .-> shared
- Tu
.envde producción vive solo enshared/: nunca pasa por git ni por tu computador. Se crea en el primer deploy a partir de.env.exampley se edita desde la vista Shared de la TUI. - Cada versión enlaza el mismo
.env; volver atrás no lo cambia. - Se guardan las últimas
releases_to_keepversiones (5 por defecto): son las que puedes recuperar con un rollback.
Rollback¶
flowchart LR
subgraph Antes
C1[current] --> V3a[v3 ❌]
end
subgraph Después
C2[current] --> V2b[v2 ✅]
end
Antes -- "versa rollback production" --> Después
No se vuelve a compilar ni a subir nada: el código de la versión anterior sigue en el servidor, y versa solo mueve el enlace, recarga PHP-FPM/nginx y reinicia los services. Lo mismo ocurre solo cuando un deploy falla después de activarse.
Staging, producción y CI¶
flowchart LR
P[git push a main] --> S[GitHub Actions<br>versa deploy staging]
T[git tag v1.2.0<br>git push --tags] --> PR[GitHub Actions<br>versa deploy production]
PR --> TG{¿El commit tiene<br>un tag v*?}
TG -- Sí --> OK[✅ Deploy]
TG -- No --> NO[⛔ Rechazado<br><small>deploy_tags: v*</small>]
Cada entorno tiene su propio servidor (o su propio remote_path) y su propio .env. Con deploy_tags: "v*", producción solo acepta versiones con tag, aunque alguien lo intente desde su computador. El workflow de ejemplo está en examples/github-actions.yml.
La vista Services (provisioning)¶
flowchart TD
A[versa → Services] --> B[Detecta el servidor<br><small>distro, lo instalado, versiones</small>]
B --> C[Marca lo que pide tu app<br><small>según deploy.yml y el repo</small>]
C --> D{¿Choca con algo<br>ya instalado?}
D -- Sí --> X[⛔ No lo instala<br><small>nunca nginx sobre Apache,<br>ni un segundo PHP</small>]
D -- No --> E[I: instala por SSH como root<br><small>sin agentes</small>]
E --> F[Lo ya instalado no se toca<br><small>ni su configuración, ni se reinicia</small>]
Detalles en Servicios del servidor.