Skip to content

Instantly share code, notes, and snippets.

@jwcastillo
Forked from roadev/deploy-sh__git.md
Created July 7, 2025 16:07
Show Gist options
  • Save jwcastillo/791701b2c4f80dfd50b9f1771016d22c to your computer and use it in GitHub Desktop.
Save jwcastillo/791701b2c4f80dfd50b9f1771016d22c to your computer and use it in GitHub Desktop.

Revisions

  1. @roadev roadev created this gist Jan 7, 2016.
    88 changes: 88 additions & 0 deletions deploy-sh__git.md
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,88 @@
    Aquí explicaré cómo realizar un deploy automático en servidor (VPS de DigitalOcean).
    Realizaremos un push primero a github y necesitaremos una conexión ssh para poder jalar automáticamente desde el servidor de deploy.
    Para comenzar, debemos tener nuestra llave ssh agregada en github, así que seguimos los siguientes pasos (ésto si nunca lo hemos hecho...).

    En nuestro equipo, ejecutamos:

    `ssh-keygen`

    Con ello generamos una clave ssh en nuestro directorio `home`, si ya la tenemos la terminal les preguntará si quieren sobre-escribir la llave. Elegimos según corresponda (nota, si ya está generada, tener en cuenta si se ha usado con otros servidores o para otro tipo de autenticación...).
    Nos pedirá una passphrase, la cuál no es más que una contraseña segura que deseemos colocarle a nuestra llave privada.
    Para efectos prácticos no colocaremos ninguna, ésto es importante para evitar que alguien más tenga accesos ssh con su llave pública, pero por efecto de agilidad y de ejemplo, la dejaremos sin passphrase.

    Ahora para obtenerla, ejecutamos:

    `cat ~/.ssh/id_rsa.pub`

    Nos saldrá un hash y lo copiamos desde donde dice `ssh-rsa` hasta `<user@pc>` NOTA -> "No saldrán los < >, simplemente es nomenclatura"

    Ahora vamos a `Settings` en nuestra cuenta de github, `SSH Keys`, `Add SSH Key` y colocamos un título para identificar que esa llave es de uno de nuestros PCs, las llaves ssh son únicas por PC por usuario/cuenta.

    En el campo `Key` pegamos la ssh-key que copiamos luego de hacer `cat` a `id_rsa.pub` y tecleamos `Add Key`.

    Éste mismo proceso debemos hacerlo en nuestro VPS, así que accedemos a él y ejecutamos los mismos comandos que ejecutamos para obtener la llave en nuestro PC local y la agregamos en `github`.

    ¿Por qué?

    Porque nuestro servidor de deploy también debe conectarse via ssh (más seguro que hacerlo por http) y github identificarlo con la llave única que se generó, y así, permitirle hacer pull de los cambios.

    Ahora editamos nuestro archivo .gitignore (si no existe, lo creamos) y agregamos una línea para ignorar los archivos con extensión `.sh`

    `nano .gitignore`

    Agregamos:

    `*.sh`

    Guardamos y salimos.

    Creamos el archivo `deploy.sh` en la raíz de nuestro proyecto con:

    `touch deploy.sh`

    Ahora generamos el hook `post-commit` como lo explico en el siguiente gist

    https://gist.github.com/roadev/fc3f9c366d7ce875c4fb

    Pero adicional a ese proceso, debemos agregar otras líneas para el script `post-commit`:

    ```
    #!/bin/sh
    git push origin master
    ssh [email protected] 'bash -s' < deploy.sh
    ```

    En el anterior post-commit tenemos una línea nueva comenzando por la instrucción `ssh`, explicaré de qué se trata.

    Ésta línea genera una conexión remota ssh al servidor VPS al cuál haremos el deploy, y justo después de ese login, ejecutaremos una terminal temporal con la instrucción `bash -s`. Ésto lo hacemos para realizar el segundo paso del automatic deployment.
    la instrucción: `'bash -s' < deploy.sh` como ya expliqué, abre la terminal temporal pero además, le "inyecta" por así decirlo, el script `deploy.sh`, el cuál es un archivo local de nuestro proyecto.

    En el archivo `deploy.sh` deben ir las instrucciones de lo que debe hacer nuestro servidor justo después de generar la conexión remota después del push.

    Antes de proceder con el archivo `deploy.sh` asumiremos de que será nuestro primer deploy, o al menos el primero con git a nuestro server. Así que seguimos estos pasos:

    1. Creamos la carpeta de nuestro proyecto.
    2. Inicializamos el repositorio git dentro de la carpeta del proyecto.
    3. Agregamos la url de nuestro repositorio remoto de github.

    1. `mkdir my-app`
    2. `cd my-app && git init`
    3. `git remote add origin [email protected]:mygithubuser/myremoterepo.git`

    **Usamos la url remota de ssh para agregarla a nuestro proyecto tanto en el server como en local...**

    ========

    Ahora con nano o con su editor favorito, creamos el archivo `deploy.sh` (en nuestro repositorio local) y agregamos lo siguiente:

    ```
    #!/bin/sh
    cd ~/<carpeta_del_proyecto>
    git pull origin master
    ```

    En la conexión en la que se inyecta el `deploy.sh` se utiliza shell, posteriormente se accede a la carpeta donde haremos el deploy y por último hacemos un pull de github a nuestroo servidor.

    Todo ésto lo hacemos asumiendo que queremos hacer deploy cada vez que tengamos cambios en nuestra rama master.

    **Si por algún motivo, corremos nuestro server como root, por ejemplo en `PHP` sobre `/var/www/` debemos hacer unos pasos adicionales.....**