Advertisement
  1. Code
  2. PHP

Implementación de una aplicación Laravel usando Capistrano

Scroll to top
Read Time: 8 min

() translation by (you can also view the original English article)

Así que acabas de crear una aplicación web elegante y estás planeando ponerla en línea. Esto puede hacerse de muchas maneras. En este artículo me gustaría cubrir un enfoque para implementar su sistema back-end en su servidor de producción. Vamos a seguir los siguientes pasos con el ejemplo de una aplicación Laravel, pero esto se puede aplicar a cualquier otro idioma o tecnología.

Actualizar

Este artículo fue actualizado a Capistrano 3. Se puede encontrar más información sobre la nueva versión en el sitio web de capistrano.

El pasado

Tal vez ya haya puesto en línea algunos sitios web en el pasado. Probablemente haya usado un cliente FTP y cargado los bits y bytes a mano. O tal vez siempre inició sesión en su servidor a través de ssh y sacó los cambios manualmente.

La idea

Nuestro objetivo es simplificar este proceso tanto como sea posible. La idea es usar el repositorio de código como fuente para cada despliegue. La herramienta de implementación, en nuestro caso capistrano, se registrará automáticamente en su servidor y construirá su sistema directamente desde su repositorio.

La implementación del software es todas las actividades que hacen que un sistema de software esté disponible para su uso. - Wikipedia

Lo que necesitarás...

... en su servidor remoto

Su servidor remoto necesita proporcionar acceso ssh. También debe haber instalado todas las dependencias necesarias para su proyecto, como GIT, PHP, MySQL, Composer, ... Además de eso, no necesita ningún software adicional en su servidor de producción.

... en tu máquina local

Para instalar y usar capistrano, necesitas al menos Ruby 1.9 (si no tienes instalado Ruby, te recomiendo instalarlo usando rbenv). Para instalar Capistrano, simplemente tiene que ejecutar:

1
2
$ gem install capistrano

Entonces, ¿por qué capistrano ?, puedes preguntar. Como siempre, hay muchas maneras de realizar una tarea, pero en mi caso, capistrano siempre parecía ser el enfoque más fácil y flexible. Puede configurarlo para todas sus necesidades y hay muchos complementos que simplifican su trabajo de nuevo.

Capistrano es una utilidad y un marco para ejecutar comandos en paralelo en múltiples máquinas remotas, a través de SSH. Utiliza un DSL simple (tomado en parte de Rake) que le permite definir tareas, que pueden aplicarse a máquinas en ciertos roles. También admite conexiones de túnel a través de una máquina de puerta de enlace para permitir que las operaciones se realicen detrás de VPN y firewalls.

Preparar

Ahora tenemos todo lo que necesitamos, así que configuremos nuestra configuración de implementación. Pero primero tenemos que crear una carpeta en el servidor remoto donde se deben desplegar todos los archivos. Inicie sesión en su servidor con SSH y cree una carpeta. Un lugar común es /var/www/. Así que hagamos esto:

1
2
$ sudo mkdir /var/www/my-app
3
$ sudo chown -R username:group /var/www/my-app

Eso es. No hay nada más que hacer en el servidor remoto, por lo que puede cerrar la conexión ssh y continuar. Vaya a su proyecto (o cualquier otra carpeta, eso no importa ahora) y ejecute:

1
2
$ cd my-project
3
$ cap install

Este comando creará los archivos básicos que necesitamos. Después de eso, tu carpeta debería verse así.

1
2
.
3
├── Capfile
4
├── config
5
│   ├── deploy
6
│   │   ├── production.rb
7
│   │   └── staging.rb
8
│   └── deploy.rb
9
└── lib
10
    └── capistrano
11
        └── tasks

El Capfile es como el punto de montaje para capistrano, pero por ahora solo necesitaremos editar config/deploy.rb y config/deploy/production.rb. El primer archivo es responsable de todos los pasos de construcción, el segundo archivo representa un "escenario". Puedes tener varias etapas como producción, puesta en escena, prueba ... En cada archivo de configuración de etapa, puede especificar su (s) servidor (es). Vamos a abrir esos dos archivos en su editor de texto favorito y reemplazar el contenido con los siguientes fragmentos. Luego revisaremos el código.

Comenzaremos con config/deploy/production.rb:

1
2
role :app, %w{username@123.456.789.123} # EDIT your ssh username and server ip address 

3
4
set :ssh_options, {
5
    auth_methods: %w(password),
6
    password: "" # EDIT your ssh password

7
}

A continuación, modificaremos config/deploy.rb:

1
2
set :application, "Your app name"  # EDIT your app name

3
set :repo_url,  "https://github.com/laravel/laravel.git" # EDIT your git repository

4
set :deploy_to, "/var/www/my-app" # EDIT folder where files should be deployed to

5
6
namespace :deploy do
7
    
8
    desc "Build"
9
    after :updated, :build do
10
        on roles(:app) do
11
            within release_path  do
12
                execute :composer, "install --no-dev --quiet" # install dependencies

13
                execute :chmod, "u+x artisan" # make artisan executable

14
            end
15
        end
16
    end
17
18
    desc "Restart"
19
    task :restart do
20
        on roles(:app) do
21
            within release_path  do
22
                execute :chmod, "-R 777 app/storage/cache"
23
                execute :chmod, "-R 777 app/storage/logs"
24
                execute :chmod, "-R 777 app/storage/meta"
25
                execute :chmod, "-R 777 app/storage/sessions"
26
                execute :chmod, "-R 777 app/storage/views"
27
            end
28
        end
29
    end
30
31
end

Ahora debe colocar sus datos en cada línea con un comentario #EDIT (dirección IP, git repo, usuario de ssh, contraseña, etc.). La variable :deploy_to debe ser la carpeta que acabamos de crear. Su servidor web (Apache, Nginx, ...) debe apuntar a /var/www/my-app/current/public.

En el namespace :deploy de implementación del archivo deploy.rb, usted especifica lo que realmente debería suceder para cada implementación. Entonces hay dos tareas. En la tarea de compilación, instalamos todas sus dependencias de PHP, tal como está acostumbrado durante el desarrollo. Después de eso, hacemos el archivo artesanal ejecutable para usarlo en migraciones. En la tarea de reinicio, corregimos los permisos para las carpetas de almacenamiento.

Todas esas tareas se invocan en el siguiente orden. Puede enganchar en cada tarea si lo necesita, pero por ahora nos quedamos con nuestra configuración simple.

1
2
deploy:starting    - start a deployment, make sure everything is ready
3
deploy:started     - started hook (for custom tasks)
4
deploy:updating    - update server(s) with a new release
5
deploy:updated     - updated hook
6
deploy:publishing  - publish the new release
7
deploy:published   - published hook
8
deploy:finishing   - finish the deployment, clean up everything
9
deploy:finished    - finished hook

Cada implementación se almacena en /var/www/my-app/releases/. Implementación de la tarea integrada: publicación crea un enlace simbólico de la implementación reciente a la carpeta actual. De esta forma, puede mantener versiones anteriores y cambiar versiones sin desconectarse por un segundo. Cuando se ejecutó esta tarea, su última versión está en línea.

Puede agregar fácilmente sus propias tareas si su proceso de compilación requiere algunos pasos adicionales. Para obtener información más detallada, te recomiendo que leas la documentación oficial.

Después de estos pasos de configuraciones básicas, estamos preparados para nuestro primer despliegue.

¡Fuego!

Entonces ese es el momento que estabas esperando. La parte más difícil está hecha. Por ahora, cada vez que quiera entregar las actualizaciones de su aplicación, solo tiene que ejecutar el siguiente comando mágico. Capistrano leerá sus archivos config/deploy.rb config/deploy/production.rb y ejecutará cada tarea. Si una tarea falla, la implementación se detendrá y la versión anterior aún estará en línea.

1
2
$ cap production deploy

Verá un montón de salida de texto y después de poco tiempo (dependiendo de su servidor) todo debería estar completo. Eso fue fácil, ¿no? 

Nota: por ahora, simplemente configuramos nuestra etapa de producción, pero puede reemplazar la producción por otra etapa, por ejemplo, su servidor de prueba y ejecutar $ cap staging deploy.

Pensamientos Adicionales

Seguridad

Tal vez podría estar un poco preocupado si tiene que poner su contraseña de texto plano en el archivo de configuración. Escogí esa forma de hacer la demostración lo más directa posible, pero en el mundo real quizás quieras usar una clave SSH. Puede importar uno como este:

1
2
set :ssh_options, {
3
    keys: %w("/path/to/your/key.pem"), # EDIT your ssh key

4
    auth_methods: %w(publickey)
5
}

Base de datos

Por ahora, nos hemos centrado en la implementación de los archivos reales en su nuevo hogar, pero en muchos casos también podría hacer algo con su base de datos. Laravel tiene una herramienta perfecta para eso: migraciones. Puede agregar un nuevo paso donde ejecuta estas migraciones. Después de eso, nuestra tarea de compilación podría verse así:

1
2
desc "Build"
3
after :updated, :build do
4
    on roles(:app) do
5
        within release_path  do
6
            execute :composer, "install --no-dev --quiet" # install dependencies

7
            execute :chmod, "u+x artisan" # make artisan executable

8
            execute :php, "artisan migrate" # run migrations

9
        end
10
    end
11
end

También debe agregar esta tarea en el bloque de transacción de la tarea de actualización. Ahora, cada vez que implemente, la base de datos se actualizará a sus últimas migraciones.

Retroceder

Algunas veces implementa una versión no funcional de su aplicación y necesita deshacer estos cambios. Capistrano tiene una función incorporada para el llamado "retroceso". Solo corre:

1
2
$ cap production deploy:rollback

Conclusión

Acaba de aprender una forma muy simple de implementar su aplicación en su (s) servidor (es) de producción con Capistrano. Una vez que se realiza el trabajo de configuración, solo se necesita un comando para implementar su última versión en segundos. Pero como se mencionó anteriormente, esta no es la única forma de hacer esto.

También deberías echarle un vistazo al gruñido de tareas que se adapta perfectamente para construir e implementar aplicaciones de JavaScript. Un acercamiento completamente diferente requiere una ventana acoplable que actúa como una máquina virtual liviana. La idea aquí es implementar todo tu entorno como una máquina virtual. Échales un vistazo!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.