Seleccionar página

Capistrano

Capistrano es una herramienta de código abierto para ejecutar scripts en los servidores remotos. Por lo general, se usa para implementar aplicaciones a través de una conexión SSH. Capistrano está escrito en Ruby como un componente del marco de Ruby on Rails, por lo tanto, se usa ampliamente para la implementación de aplicaciones Ruby. Sin embargo, puede funcionar fácilmente con otros lenguajes de programación, por ejemplo, PHP.

Así, en esta instrucción descubriremos cómo implementar una aplicación PHP de forma remota, a través de la herramienta Capistrano. Inicialmente necesitará:

  • un ambiente PHP ya creado con servidor de aplicaciones Apache;
  • Clave pública SSH generada y agregada a su tablero de Elasticserver ;
  • Repositorio GIT con la aplicación PHP que le gustaría implementar (por ahora, la herramienta Capistrano 3 solo admite el tipo GIT VCS);
  • copia local de este proyecto en su computadora.

¡Empecemos!

Nota: los siguientes comandos deben ejecutarse en el usuario de su máquina local,de manera similar a como se realizó durante la generación del par de claves SSH, para evitar errores de permiso / conexión.

Instalar Capistrano

1. Para usar Capistrano, necesita tener Ruby instalado en su computadora local. Por lo tanto, ejecute el comando apropiado:

apt-get install ruby rubygems

2. Luego, instale la herramienta Capistrano ingresando el siguiente comando:

gem install capistrano

3. Asegúrese de tener la carpeta de configuración en el directorio local con su proyecto (ya que es una carpeta predeterminada con configuraciones para Ruby on Rails). Cree esta carpeta si no la tiene.

mkdir {path_to_your_project}/config

Capifique su aplicación

Después de la instalación, debe capificar su aplicación, es decir, configurar Capistrano para la implementación de la aplicación. Para hacer esto, navegue a la carpeta raíz de su proyecto PHP local y ejecute el siguiente comando:

cap install

Esto creará nuevos archivos y directorios en su proyecto:

  • Capfile es el archivo principal de Capistrano que se encarga de las configuraciones y globs necesarios para las tareas personalizadas.
  • config / deploy / carpeta con dos archivos ( staging.rb y production.rb ) para la configuración de implementación específica de un entorno.
  • config / deploy.rb Script Ruby que contiene configuraciones de la aplicación e instrucciones de Capistrano.
  • lib / capistrano / tasks / carpeta para sus tareas personalizadas.

Sugerencia: Como opción, puede probar la gema capistrano-Elasticserver dedicada, mantenida por gerado-navarro , para automatizar la implementación de sus aplicaciones Rails en Elasticserver PaaS e IaaS.

Establecer configuraciones personalizadas

1. Navegue hasta el archivo config / deploy.rb y configúrelo según su configuración. Inicialmente parece lo siguiente:

# config valid only for Capistrano 3.1
    lock '3.2.1'
    
    set :application, 'my_app_name'
    set :repo_url, 'git@example.com:me/my_repo.git'
    
    # Default branch is :master
    # ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }.call
    
    # Default deploy_to directory is /var/www/my_app
    # set :deploy_to, '/var/www/my_app'
    
    # Default value for :scm is :git
    # set :scm, :git
    
    # Default value for :format is :pretty
    # set :format, :pretty
    
    # Default value for :log_level is :debug
    # set :log_level, :debug
    
    # Default value for :pty is false
    # set :pty, true
    
    # Default value for :linked_files is []
    # set :linked_files, %w{config/database.yml}
    
    # Default value for linked_dirs is []
    # set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}
    
    # Default value for default_env is {}
    # set :default_env, { path: "/opt/ruby/bin:$PATH" }
    
    # Default value for keep_releases is 5
    # set :keep_releases, 5
    
    namespace :deploy do
    
      desc 'Restart application'
      task :restart do
        on roles(:app), in: :sequence, wait: 5 do
          # Your restart mechanism here, for example:
          # execute :touch, release_path.join('tmp/restart.txt')
        end
      end
    
      after :publishing, :restart
    
      after :restart, :clear_cache do
        on roles(:web), in: :groups, limit: 3, wait: 10 do
          # Here we can do anything such as:
          # within release_path do
          #   execute :rake, 'cache:clear'
          # end
        end
      end
    
    end

Modifique las siguientes cadenas:

  • ingrese un nombre para su aplicación:

    set :application, "my_app_name"
    
  • especifique la URL del repositorio VSC con el código de su aplicación PHP:

    set :repo_url, "git@example.net:me/my_repo.git"

Nota: Necesita tener una clave pública SSH adjunta a su cuenta GIT (la misma que ha agregado al panel de Elasticserver). De lo contrario, obtendrá un «Permiso denegado»; Error al intentar implementar su aplicación.

También puede utilizar el enlace https: del siguiente tipo:

set :repo_url, "https://example.net/GIT_user_name/repo_name.git"

En este caso, no se requiere autenticación y puede indicar una URL a cualquier repositorio de código abierto PHP que le gustaría implementar. 

  • Quite el comentario de la siguiente línea e indique el directorio en el que se implementará su aplicación (este valor es predeterminado para los servidores de aplicaciones PHP de Elasticserver):
    # set :deploy_to, '/var/www/webroot'
    
  • descomente las siguientes líneas:
    set :scm, :git
    set :format, :pretty
    set :pty, true
    
  • elimine las cadenas con el código de tareas al final del archivo (comenzando desde el espacio de nombres: comando deploy do ) y pegue las siguientes líneas en su lugar:
    namespace :deploy do
        desc 'Restart Apache'
        task :apache do
            on roles(:app) do
                execute :sudo, "service httpd restart"
            end
        end
    
        desc 'Creating symlink'
        task :symlink do
            on roles(:app) do
                execute :rm, "-rf /var/www/webroot/ROOT"
                execute :ln, "-s /var/www/webroot/current /var/www/webroot/ROOT"
            end
        end
    
        desc 'Restart Apache and create symlink'
        task :restart
        before :restart, :symlink
        before :restart, :apache
    
    end
    
    after 'deploy:publishing', 'deploy:restart'

También puede configurar opciones adicionales en este archivo (por ejemplo, especificar una rama del repositorio o vincular archivos / carpetas adicionales) si es necesario.

Guarde los cambios que ha realizado.

2. Luego navegue hasta el archivo config / deploy / staging.rb . El contenido predeterminado es:

# Simple Role Syntax
    # ==================
    # Supports bulk-adding hosts to roles, the primary server in each group
    # is considered to be the first unless any hosts have the primary
    # property set.  Don't declare `role :all`, it's a meta role.
    
    role :app, %w{deploy@example.com}
    role :web, %w{deploy@example.com}
    role :db,  %w{deploy@example.com}
    
    # Extended Server Syntax
    # ======================
    # This can be used to drop a more detailed server definition into the
    # server list. The second argument is a, or duck-types, Hash and is
    # used to set extended properties on the server.
    
    server 'example.com', user: 'deploy', roles: %w{web app}, my_property: :my_value
    
    # Custom SSH Options
    # ==================
    # You may pass any option but keep in mind that net/ssh understands a
    # limited set of options, consult[net/ssh documentation](http://net-ssh.github.io/net-ssh/classes/Net/SSH.html#method-c-start).
    #
    # Global options
    # --------------
    #  set :ssh_options, {
    #    keys: %w(/home/rlisowski/.ssh/id_rsa),
    #    forward_agent: false,
    #    auth_methods: %w(password)
    #  }
    #
    # And/or per server (overrides global)
    # ------------------------------------
    # server 'example.com',
    #   user: 'user_name',
    #   roles: %w{web app},
    #   ssh_options: {
    #     user: 'user_name', # overrides user setting above
    #     keys: %w(/home/user_name/.ssh/id_rsa),
    #     forward_agent: false,
    #     auth_methods: %w(publickey password)
    #     # password: 'please use keys'
    #   }

En primer lugar, edite tres roles: cadenas en la sección Sintaxis de rol simple pegando {nodeid-uid@your.SSH.host} en lugar de {deploy@example.com} . Utilice los siguientes valores:

  • nodeid : valor de ID de nodo del contenedor del servidor de aplicaciones Apache en su ambiente;
  • uid – número antes del símbolo @ en su cadena de conexión SSH. Después de eso, modifique la línea de configuración del servidor (sección Sintaxis extendida del servidor ):
  • especifique su host SSH, por ejemplo, servidor ‘gate.elastic.com’
  • ingrese el valor de {nodeid} _ {uid} para el parámetro de usuario , por ejemplo, usuario: ‘190403-136’ Por lo tanto, la línea de configuración de su servidor se verá así:
server 'gate.jelastic.com', user: '190403-136', roles: %w{web app}, my_property: :my_value

Finalmente, especifique el puerto del servidor que se utilizará para la conexión SSH:

set :ssh_options, {
    port: 3022
}

No olvide guardar estas configuraciones personalizadas.

  1. Abra el Capfile (ubicado en la carpeta raíz de su proyecto local) y agregue la siguiente línea:
Rake::Task[:staging].invoke

Configurar el agente SSH

1. Asegúrese de tener su ssh-agent en funcionamiento en su sistema.

2. Agregue su clave SSH privada al agente. Debe corresponder a la clave pública que ha agregado al panel.

ssh-add {full_path_to_the_necessary_private_SSH_key}

3. También puede verificar si se agregó la clave correcta ingresando el comando ssh-add -l .

Verificar configuraciones

Ahora, asegurémonos de que todo esté configurado correctamente.

Navegue a la carpeta raíz de su proyecto local y ejecute el siguiente comando:

cap staging deploy:check

Capistrano se conectará al contenedor remoto, creará las carpetas requeridas en el directorio de implementación (indicado dentro del parámetro set: deploy_to ) y verificará tanto los servidores remotos como los locales para la presencia de todos los archivos necesarios, derechos requeridos, herramientas, etc.

Si se pierde algo, recibirá el mensaje de error correspondiente.

Implementar aplicación

Finalmente, continúe con la implementación de la aplicación. Para hacer esto, ejecute el siguiente comando en la carpeta raíz del proyecto:

cap staging deploy

Cuando esta operación se complete con éxito, navegue hasta la URL de su ambiente y asegúrese de que su aplicación se haya implementado.