Despliegue de una aplicación Ruby en un hosting con cPanel

Despliegue de una aplicación Ruby en un hosting con cPanel

A continuación, se detalla cómo desplegar una aplicación Ruby básica en un hosting Ruby con cPanel. Se configurará un servidor sencillo usando el framework HTTP Ruby on Rails, que gestionará peticiones y respuestas HTTP básicas, además de servir archivos estáticos. Después explicaremos cómo desplegar la aplicación que hemos desarrollado en cPanel.

Creación de un proyecto básico Ruby + Ruby on Rails

Lo primero, vamos a crear un proyecto de Ruby desde cero. Los requisitos mínimos para poder crear nuestro setup de desarrollo, la aplicación Ruby on Rails, son contar con el runtime de Ruby, el framework de Ruby on Rails y cualquier IDE o editor de código. En este caso utilizaremos Visual Studio Code.

Aquí está la guía oficial para instalar Ruby y Rails: https://guides.rubyonrails.org/install_ruby_on_rails.html

Una vez instalado todo lo necesario, vamos a crear un proyecto de Ruby on Rails desde cero. Para ello, abrimos una terminal en nuestra máquina local y crearemos una carpeta con el nombre del proyecto.

Creamos el directorio del proyecto Rails con rails new [nombre_del_proyecto].

$ rails new rails_basic_app

Si abrimos el proyecto en Visual Studio Code seleccionando el directorio que acabamos de crear, deberíamos ver que contiene una serie de directorios con la estructura de ficheros de un proyecto de Rails.

Creación de un proyecto básico Ruby + Ruby on Rails

Vamos a instalar las gemas (dependencias de paquetes de Ruby) que vamos a necesitar en nuestro proyecto. Para ello, tenemos que ubicar el fichero Gemfile. En este se definen las dependencias de nuestra aplicación con sus versiones especificadas o simplemente se pueden declarar para obtener la última versión compatible con el resto de dependencias del proyecto. Así, vamos a declarar la gema de la dependencia LSAPI, que es el conector entre un servidor LiteSpeed y nuestra aplicación Ruby on Rails. Tenemos la necesidad de instalar esta gema debido a que cPanel utiliza este mismo protocolo para servir nuestra aplicación Rails. Cuando vayamos a desplegar nuestra aplicación, deberemos tener instalada la dependencia para que funcione con normalidad.

Añadiremos esta línea en cualquier parte del Gemgile, excepto dentro de los grupos de dependencias. Podemos añadirla de forma simple al principio o al final del fichero.

gem "ruby-lsapi"

Añadir línea en cualquier parte del Gemgile

Una vez tengamos todas las dependencias que necesitamos declaradas en nuestro Gemfile, podemos instalarlas localmente. Para ello utilizaremos el comando bundler installo bundle install realmente es el mismo comando, uno es un alias del otro, así que se pueden utilizar indistintamente.

$ bundler install

instalar dependencias en nuestro Gemfile, con el comando `bundler install`o `bundle install`

Para terminar la instalación en local de nuestro proyecto y poder empezar a desarrollar, únicamente nos falta migrar la base de datos. Por defecto, Rails trae una configuración de base de datos para desarrollo de SQLite. Esta nos permite manejar fácilmente una base de datos autogestionada por nuestra aplicación sin necesidad de instalar otro software a mayores de base de datos.

Para ejecutar la migración y crear nuestra base de datos debemos ejecutar el siguiente comando:

$ rails db:migrate

Una vez ejecutadas las migraciones, debe haber aparecido un fichero .sqlite3 en el directorio storage. Ese fichero es nuestra base de datos.

 fichero .sqlite3 en el directorio storage, la base de datos

Ahora que tenemos la instalación completada, vamos a crear una vista de ejemplo para servir en nuestra aplicación un fichero estático (una imagen), recursos Javascript y CSS.

Vamos a empezar creando una clase de controlador en el path app/controllers/home_controller.rb, donde escribiremos el código para declarar una función llamada “index” y un parámetro llamado “pageTitle” que le pasaremos a la vista para renderizar su contenido de texto. Luego llamaremos a la función render para indicar la vista que queremos renderizar apuntando a la vista home/index.

class HomeController < ApplicationController   def index      @pageTitle = "Aplicación Ruby + Ruby on Rails"      render "home/index"   end
end 

Para declarar una ruta y que conecte con la función index declarada en nuestro controlador, tenemos que dirigirnos al fichero config/routes.rb. Donde declararemos de esta manera la ruta /rails-basic-app.

Rails.application.routes.draw do   get "rails-basic-app" => "home#index", as: :rails_basic_app
end

Para crear la vista home/index de nuestra aplicación, debemos crear el directorio home dentro del directorio viewsdel proyecto, y dentro del directorio home crearemos el fichero index.html.erb. Es decir, debemos crear el fichero views/home/index.html.erb. En él escribiremos el siguiente código:

<% content_for :title, "Aplicación Ruby + Ruby on Rails" %><div>   <h1><%= @pageTitle %></h1>   <%= image_tag 'image.webp' %>   <p id="description"></p></div>

Aquí estamos declarando, en la primera sentencia, un título para nuestra página que se renderizará por medio del layout de nuestra aplicación definido en views/layouts/application.html.erb. Luego definimos como contenido de la página un elemento <div> con un título <h1> con el contenido de nuestra variable @pageTitle declarada en nuestro controlador, una imagen y un elemento <p> con el id “description” que será manipulado y rellenado de texto por medio del Javascript de la aplicación.

Para declarar el CSS de nuestra página, vamos a dirigirnos a app/assets/stylesheets/application.cssAquí declararemos un estilo para el título <h1> de nuestra página.

/*
* This is a manifest file that'll be compiled into application.css.
*
* With Propshaft, assets are served efficiently without preprocessing steps. You can still include
* application-wide styles in this file, but keep in mind that CSS precedence will follow the standard
* cascading order, meaning styles declared later in the document or manifest will override earlier ones,
* depending on specificity.
*
* Consider organizing styles into separate files for maintainability.
*/h1 {
    color: #dc1b1b;
    text-shadow: 2px 2px 4px #00000080;
}

Ahora para escribir el código JavaScript de nuestra aplicación debemos dirigirnos a app/javascript/application.js, donde escribiremos el siguiente código, que espera al evento “onload” de la página y recoge el elemento del párrafo con el id “description” que hemos declarado en el HTML y le añade contenido de texto.

// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-railsimport "@hotwired/turbo-rails";
import "controllers";


window.onload = () => {
 const description = document.getElementById("description");
 description.innerText =
   "Este texto fue insertado desde el Javascript de nuestra aplicación";
};

Ahora debemos añadir la imagen image.webp en el directorio de assets de imágenes del proyecto. Para ellos metemos una imagen con el nombre y el formato image.webp en el directorio app/assets/images.

añadir imagen `image.webp` en el directorio de assets de imágenes del proyecto

Una vez creados los ficheros y el código necesarios, podemos probar a ejecutar nuestra aplicación en nuestra máquina local, ejecutando un pequeño servidor HTTP que viene incluído en Rails. Con el siguiente comando ejecutaremos nuestra aplicación en el servidor HTTP de Rails:

$ bin/rails server

En la terminal deben aparecer los mensajes del servidor de confirmación, tal que así:

mensajes del servidor de confirmación

Ahora, desde el navegador de nuestra preferencia, podemos acceder a la URL: http://127.0.0.1:3000/rails-basic-app y deberíamos visualizar nuestra página:

acceder a la URL para visualizar nuestra página

Si todo funciona correctamente, podremos observar que el título tiene el contenido de texto que le hemos pasado desde el controlador y se estiliza según hemos definido en el CSS. La imagen se sirve correctamente y el párrafo se rellena desde el código Javascript.

Si no sucede correctamente alguna de estas cuestiones, revisa ese punto en concreto en esta guía o busca tu error concreto en un buscador como Google o ¡Pregunta a una inteligencia artificial sobre tu problema!

¿Cómo desplegar la aplicación en cPanel?

Ahora en Raiola Networks ofrecemos en nuestros hosting cPanel una herramienta especialmente diseñada para desplegar aplicaciones Ruby de forma fácil e intuitiva.

Lo primero que debemos entender para poder desplegar nuestra aplicación Rails en cPanel, es adaptarla ligeramente al entorno en el cual se va a servir. Las aplicaciones en un cPanel se sirven a partir de un path concreto de cPanel, por lo que toda nuestra aplicación Rails, se va a servir desde un path. Para esto ya hemos declarado dicho path en la ruta raíz de nuestra aplicación, este path es /rails-basic-app.

Para que el framework entienda que debe servir todos los ficheros estáticos a partir de ese path, debemos declarar en los ficheros de configuración de entornos, la siguiente clave de configuración:

config.assets.prefix = '/rails-basic-app/assets'

Esto deberíamos declararlo en los ficheros de configuración de entornos de producción y desarrollo para que podamos probar la aplicación en ambos modos en cPanel. Estos ficheros están ubicados en config/environments/development.rb y config/environments/production.rb. Puedes colocar la línea de asignación de la clave de configuración config.assets.prefix en cualquier parte del fichero indistintamente.

También es imprescindible indicar a Rails, en su configuración, que permita funcionar la aplicación montada sobre un nombre de host o dominio concreto. En este caso, será el dominio de mi servidor cPanel que es enriquesv.webcloud.es.

config.hosts << "enriquesv.webcloud.es"

Esta línea la debes colocar también en ambos ficheros de configuración de entornos, de la misma manera que has añadido la clave de config.assets.prefix. Si te resulta más cómodo, añade ambas líneas seguidas en el mismo lugar.

Para subir el proyecto comprimido, nos tenemos que dirigir a la herramienta de “Administrador de archivos” en el menú de herramientas de cPanel. O subir el archivo por SSH o FTP si tenemos estos protocolos habilitados en nuestro hosting cPanel.

Para el ejemplo, utilizaremos la opción del “Administrador de archivos” de la sección “Archivos”. Una vez dentro del administrador, pulsaremos la opción de “Cargar”

dentro del administrador, pulsaremos la opción de “Cargar

Ahí cargaremos nuestro fichero comprimido .zip y esperaremos a que se complete la subida.

cargar fichero comprimido .zip

Una vez subido, podremos verlo en nuestra carpeta de usuario de cPanel. Podría tardar unos segundos en aparecer, sé paciente.

archivo subido en la carpeta de usuario de cPanel

Ahora tendremos que descomprimir el proyecto en la carpeta de nuestro usuario, haciendo clic derecho sobre la carpeta y eligiendo la opción de “Extract” o seleccionando el fichero y eligiendo la misma opción en el menú de operaciones de la parte superior.

descomprimir el proyecto en la carpeta de nuestro usuario

Aparecerá un menú modal para indicar en qué ruta de nuestro hosting queremos extraer el proyecto. Simplemente, podemos dejar la opción vacía para indicar que lo queremos en la carpeta de nuestro usuario (es en la misma que nos encontramos posicionados), o podemos indicar la ruta de nuestra preferencia. Haz clic en “Extract Files” y espera a que se descomprima el proyecto.

indicar la ruta de preferencia y click en “Extract Files”

Una vez descomprimido, deberíamos ver la nueva carpeta entre los archivos de nuestra carpeta de usuario.

ver la nueva carpeta entre los archivos de la carpeta de usuario

Si hemos descomprimido correctamente la aplicación, deberíamos ver la carpeta de nuestro proyecto, en mi caso se llama rails-basic-app.

Ahora que ya tenemos nuestro proyecto descomprimido en nuestra carpeta de usuario, vamos a desplegar la aplicación. Para ello, tenemos que llegar a la herramienta de despliegue de aplicaciones Ruby. En el menú de herramientas de nuestro cPanel, vamos a dirigirnos a la sección de “Software” y ahí buscaremos la opción “Setup Ruby App”.

despliegue de aplicación Ruby, en el menú de herramientas de cPanel

Una vez dentro, veremos la sección “Setup new application” en la cual, podemos desplegar una nueva aplicación.

 “Setup new application” para desplegar una nueva aplicación

Tenemos el campo “Ruby version”, donde debemos seleccionar la versión de Ruby de nuestra conveniencia, normalmente la misma versión en la que hemos desarrollado nuestra aplicación en local. En mi caso, seleccionaré la 3.4. Tú selecciona la que te convenga, osea, la versión con la que hayas desarrollado la aplicación en local.

En el campo “App Directory” deberemos indicar la ruta del directorio donde hemos posicionado nuestra aplicación, siempre partiendo desde el path de nuestro usuario de cPanel (tal y como se indica en el campo). En mi caso, el path completo con mi directorio de usuario es enriquesv/rails_basic_app, pero en este campo indico solamente el directorio a partir de la carpeta de mi usuario, osea, solamente rails_basic_app.

En el campo “App Domain/URI” debemos indicar cuál es la ruta en la que queremos que se sirva nuestra aplicación en nuestro hosting cPanel. Es muy importante que esta ruta coincida con las rutas que hemos declarado en nuestra aplicación Rails. Siempre debemos de configurar nuestras rutas de Rails a partir de una misma ruta raíz para desplegar sobre el mismo path que en cPanel. En mi caso esta ruta es /rails-basic-app.

Una vez tengamos rellenados los campos, pulsamos el botón “Setup” y esperamos a que se despliegue la aplicación.

 “Setup” y esperar a que se despliegue la aplicación

Una vez se haya creado nuestra aplicación, debemos de instalar las dependencias manualmente por medio de la terminal de cPanel. Para ello, vamos a copiar el comando source que aparece en el campo Command for entering to virtual environment. En mi caso, el comando es:

source /home/enriquesv/rubyvenv/rails__basic__app/3.4/bin/activate

Esto nos va a servir para acceder desde la terminal al entorno virtual de Ruby en el que se encapsula nuestra aplicación.

Ahora debemos dirigirnos a la herramienta “Terminal” de nuestro cPanel. Esta herramienta se encuentra en la sección “Avanzado”.

herramienta “Terminal” de cPanel

Una vez dentro, escribimos el comando source que hemos copiado en el paso anterior y presionamos la tecla “Enter” para ejecutar el comando.

escribir el comando `source` en terminal

Esto nos meterá en el entorno virtual de Ruby de nuestra aplicación, donde tenemos a nuestra disposición las herramientas y comandos del entorno de Ruby para modificar las dependencias. En este caso, queremos ejecutar el instalador de dependencias para que se instalen las dependencias que están definidas en el fichero Gemfile de nuestro proyecto.

Para posicionarnos en la terminal en el directorio de nuestro proyecto, debemos ejecutar el comando:

$ cd rails_basic_app

Una vez dentro del directorio, podemos instalar las dependencias de nuestro proyecto Ruby con el comando:

$ bundler install

Una vez dentro del directorio, proceder a instalar las dependencias del proyecto Ruby

La instalación de dependencias puede tardar unos minutos, no te preocupes si se queda estancada por un tiempo en algún punto de la instalación.

Una vez que termine la instalación, debemos dirigirnos de nuevo a la herramienta de “Setup Ruby app” y debemos pulsar el botón “Restart” de nuestra aplicación para que se reinicie con las dependencias correctamente instaladas.

pulsar el botón “Restart” de la aplicación para que se reinicie con las dependencias correctamente instaladas

Una vez reiniciada, podemos acceder URL de nuestra aplicación (en mi caso https://enriquesv.webcloud.es/rails-basic-app) desde un navegador y deberíamos ver el mismo resultado que al ejecutar la aplicación en nuestra máquina local.

acceder  URL de nuestra aplicación con el mismo resultado que en local

Espero que esta guía te haya podido servir como punto de partida para aprender a desplegar aplicaciones Ruby con el framework Ruby on Rails en cPanel y entender los conceptos y posibles problemas que pueden surgir en el proceso.

Si tienes dudas, puedes consultar las siguientes guías y documentaciones:

Ruby docs: https://www.ruby-lang.org/es/documentation/

Ruby on rails guides: https://guides.rubyonrails.org/

Cpanel guide: https://docs.cpanel.net/cpanel/

Enrique Sánchez

Enrique Sánchez

Amante del código eficiente, los patrones de diseño y experto en Laravel. Formo parte del departamento de desarrollo de Raiola Networks.

Autor

Álvaro Fontela

Álvaro Fontela

Consultor WordPress, además de CEO y cofundador de Raiola Networks. Autor del libro "Curso Práctico de WordPress" y speaker en congresos de marketing digital.

Revisor