Compilación de una aplicación Ruby y Postgres en Azure App Service en Linux

Azure App Service proporciona un servicio de hospedaje web muy escalable y con aplicación de revisiones de un modo automático. En este tutorial se muestra cómo crear una aplicación Ruby y conectarla a una base de datos PostgreSQL. Cuando haya terminado, tendrá una aplicación Ruby on Rails que se ejecuta en App Service en Linux.

Captura de pantalla de un ejemplo de aplicación de Ruby on Rails llamada Tasks.

En este tutorial, aprenderá a:

  • Creación de una base de datos PostgreSQL en Azure
  • Conectar una aplicación Ruby on Rails a PostgreSQL
  • Implementar la aplicación en Azure
  • Actualizar el modelo de datos y volver a implementar la aplicación
  • Transmitir registros de diagnóstico desde Azure
  • Administrar la aplicación en Azure Portal

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Requisitos previos

Para completar este tutorial:

  • Use el entorno de Bash en Azure Cloud Shell.

    Iniciar Cloud Shell en una nueva ventana

  • Si lo prefiere, instale la CLI de Azure para ejecutar sus comandos de referencia.

    • Si usa una instalación local, inicie sesión en la CLI de Azure mediante el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión con la CLI de Azure.

    • Cuando se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para más información sobre las extensiones, consulte Uso de extensiones con la CLI de Azure.

    • Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade.

Preparación de Postgres local

En este paso, creará una base de datos en el servidor Postgres local para usarlo en este tutorial.

Conexión con el servidor Postgres local

  1. Abra la ventana del terminal y ejecute psql para conectarse al servidor de Postgres local.

    sudo -u postgres psql
    

    Si la conexión se realiza correctamente, significa que la base de datos Postgres está en ejecución. De lo contrario, asegúrese de que se ha iniciado la base de datos Postgres local, para lo que debe seguir los pasos que se indican en Downloads - PostgreSQL Core Distribution (Descargas: Distribución del núcleo de PostgreSQL).

  2. Escriba \q para salir del cliente de Postgres.

  3. Cree un usuario Postgres que pueda crear bases de datos ejecutando el siguiente comando, usando el nombre de usuario con el que haya iniciado la sesión de Linux.

    sudo -u postgres createuser -d <signed-in-user>
    

Creación de una aplicación Ruby on Rails local

En este paso, obtendrá una aplicación Ruby on Rails de ejemplo, configurará la conexión a base de datos correspondiente y la ejecutará de forma local.

Clonación del ejemplo

  1. En la ventana del terminal, use cd para cambiar a un directorio de trabajo.

  2. Clone el repositorio de ejemplo y cambie a la raíz del repositorio.

    git clone https://github.com/Azure-Samples/rubyrails-tasks.git
    cd rubyrails-tasks
    
  3. Asegúrese de que la rama predeterminada sea main.

    git branch -m main
    

    Sugerencia

    En App Service, no es obligatorio cambiar el nombre de la rama. Sin embargo, como muchos repositorios están cambiando la rama predeterminada a main, en este tutorial veremos también cómo implementar un repositorio desde main. Para más información, consulte Cambiar la rama de implementación.

  4. Instale los paquetes requeridos.

    bundle install --path vendor/bundle
    

Ejecución local del código

  1. Ejecute las migraciones de Rails para crear las tablas que necesita la aplicación. Para ver qué tablas se crean en las migraciones, mire en el directorio db/migrate del repositorio de Git.

    rake db:create
    rake db:migrate
    
  2. Ejecute la aplicación.

    rails server
    
  3. Vaya a http://localhost:3000 en un explorador. Agregue algunas tareas a la página.

    Conexión correcta de Ruby on Rails a Postgres

  4. Para detener el servidor Rails, escriba Ctrl + C en el terminal.

Creación de Postgres en Azure

En este paso, creará una base de datos Postgres en Azure Database for PostgreSQL. Posteriormente, configurará la aplicación Ruby on Rails para que se conecte a esta base de datos.

Crear un grupo de recursos

Un grupo de recursos es un contenedor lógico en el que los recursos de Azure, como aplicaciones web, bases de datos y cuentas de almacenamiento, se implementen y administren. Por ejemplo, más adelante puede elegir eliminar todo el grupo de recursos en un solo paso.

En Cloud Shell, cree un grupo de recursos con el comando az group create. En el ejemplo siguiente, se crea un grupo de recursos denominado myResourceGroup en la ubicación Oeste de Europa. Para ver todas las ubicaciones de App Service que se admiten en Linux en el nivel Básico, ejecute el comando az appservice list-locations --sku B1 --linux-workers-enabled.

az group create --name myResourceGroup --location "West Europe"

Generalmente se crean el grupo de recursos y los recursos en una región cercana.

Cuando finaliza el comando, una salida de JSON muestra las propiedades del grupo de recursos.

Creación de una base de datos de Postgres en Azure

  1. Instale la extensión db-up con el siguiente comando:

    az extension add --name db-up
    
  2. Cree la base de datos Postgres en Azure con el comando az postgres up, como se muestra en el ejemplo siguiente. Reemplace <postgresql-name> con un nombre único (el punto de conexión del servidor es https://<postgresql-name>.postgres.database.azure.com). Para <admin-username> y <admin-password> , especifique las credenciales para crear un usuario administrador de este servidor Postgres.

    az postgres up --resource-group myResourceGroup --location westeurope --server-name <postgresql-name> --database-name sampledb --admin-user <admin-username> --admin-password <admin-password> --ssl-enforcement Enabled
    

    Este comando puede tardar un poco porque está llevando a cabo las siguientes operaciones:

    • Crea un grupo de recursos denominado myResourceGroup, si no existe. Cada recurso de Azure debe estar incluido en uno de ellos. --resource-group es opcional.
    • Crea un servidor de Postgres con el usuario administrativo.
    • Crea una base de datos sampledb.
    • Permite el acceso desde la dirección IP local.
    • Permite el acceso desde servicios de Azure.
    • Crea un usuario de base de datos con acceso a la base de datos sampledb.

    Puede realizar todos los pasos por separado con otros comandos de az postgres y psql, pero az postgres up realiza todos ellos de una vez.

    Cuando finalice el comando, busque las líneas de salida que empiecen por Ran Database Query:. Muestran el usuario de base de datos que se crea automáticamente, con el nombre de usuario root y la contraseña Sampledb1. Los usará más adelante para conectar la aplicación a la base de datos.

    Sugerencia

    --location <location-name>, se puede establecer en cualquiera de las regiones de Azure. Puede obtener las regiones disponibles para su suscripción con el comando az account list-locations. En el caso de las aplicaciones de producción, coloque la base de datos y la aplicación en la misma ubicación.

Conexión de una aplicación a Azure Postgres

En este paso, conectará la aplicación Ruby on Rails a la base de datos Postgres que creó en Azure Database for PostgreSQL.

Configuración de la conexión de base de datos

En el repositorio, abra config/database.yml. En la parte inferior del archivo, reemplace las variables de producción por el código siguiente.

production:
  <<: *default
  host: <%= ENV['DB_HOST'] %>
  database: <%= ENV['DB_DATABASE'] %>
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>

Guarde los cambios.

Prueba de la aplicación de forma local

  1. En el terminal local, establezca las variables de entorno siguientes:

    export DB_HOST=<postgres-server-name>.postgres.database.azure.com
    export DB_DATABASE=sampledb 
    export DB_USERNAME=root@<postgres-server-name>
    export DB_PASSWORD=Sampledb1
    
  2. Ejecute migraciones de bases de datos Rails con los valores de producción que acaba de configurar para crear las tablas de la base de datos Postgres en Azure Database for PostgreSQL.

    rake db:migrate RAILS_ENV=production
    
  3. Cuando se ejecuta en el entorno de producción, la aplicación Rails necesita recursos precompilados. Genere los recursos necesarios con el comando siguiente:

    rake assets:precompile
    
  4. El entorno de producción Rails también usa secretos para administrar la seguridad. Genere una clave secreta.

    rails secret
    
  5. Guarde la clave secreta en las variables respectivas que usa el entorno de producción Rails. Para mayor comodidad, se usa la misma clave para ambas variables.

    export RAILS_MASTER_KEY=<output-of-rails-secret>
    export SECRET_KEY_BASE=<output-of-rails-secret>
    
  6. Habilite el entorno de producción Rails para atender archivos JavaScript y CSS.

    export RAILS_SERVE_STATIC_FILES=true
    
  7. Ejecute la aplicación de ejemplo en el entorno de producción.

    rails server -e production
    
  8. Vaya a http://localhost:3000. Si la página se carga sin errores, significa que la aplicación Ruby on Rails se está conectado a la base de datos Postgres en Azure.

  9. Agregue algunas tareas a la página.

    Conexión correcta de Ruby on Rails a Azure Database for PostgreSQL

  10. Para detener el servidor Rails, escriba Ctrl + C en el terminal.

Confirmación de los cambios

  1. Ejecute los siguientes comandos de Git para confirmar los cambios:

    git add .
    git commit -m "database.yml updates"
    

La aplicación está lista para implementarse.

Implementar en Azure

En este paso se implementará la aplicación Rails conectada a Postgres en Azure App Service.

Configuración de un usuario de implementación

Se puede implementar FTP y Git local en una aplicación web de Azure mediante un usuario de implementación. Una vez configurado este usuario de implementación, podrá usarlo en todas las implementaciones de Azure. El nombre de usuario y la contraseña en el nivel de cuenta son diferentes de las credenciales de suscripción de Azure.

Para configurar el usuario de implementación, ejecute el comando az webapp deployment user set en Azure Cloud Shell. Reemplace <username> y <password> por un nombre de usuario y una contraseña de usuario de implementación.

  • El nombre de usuario debe ser único dentro de Azure y no debe contener el símbolo "@" para las inserciones de Git local.
  • La contraseña debe tener al menos ocho caracteres y dos de los tres elementos siguientes: letras, números y símbolos.
az webapp deployment user set --user-name <username> --password <password>

La salida JSON muestra la contraseña como null. Si se produce un error 'Conflict'. Details: 409, cambie el nombre de usuario. Si se produce un error 'Bad Request'. Details: 400, use una contraseña más segura.

Anote el nombre de usuario y la contraseña que se usarán para implementar las aplicaciones web.

Creación de un plan de App Service

En Cloud Shell, cree un plan de App Service con el comando az appservice plan create.

En el siguiente ejemplo se crea un plan de App Service denominado myAppServicePlan con el plan de tarifa Gratis:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE --is-linux

Cuando se crea el plan de App Service, la CLI de Azure muestra información similar al ejemplo siguiente:

{ 
  "freeOfferExpirationTime": null,
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "linux",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

Creación de una aplicación web

Cree una aplicación web en el plan de App Service de myAppServicePlan.

En Cloud Shell, puede usar el comando az webapp create. En el siguiente ejemplo, reemplace <app-name> por un nombre único global de aplicación (los caracteres válidos son a-z, 0-9 y -). El tiempo de ejecución se establece en RUBY|2.6.2. Para ver todos los entornos en tiempo de ejecución admitidos, ejecute az webapp list-runtimes --linux.

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime 'RUBY|2.6.2' --deployment-local-git

Cuando se haya creado la aplicación web, la CLI de Azure mostrará información similar a la del ejemplo siguiente:

Local git is configured with url of 'https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

Ha creado una nueva aplicación web vacía, con la implementación de Git habilitada.

Nota

La dirección URL del repositorio de Git remoto se muestra en la propiedad deploymentLocalGitUrl, con el formato https://<username>@<app-name>.scm.azurewebsites.net/<app-name>.git. Guarde esta dirección URL, ya que la necesitará más adelante.

Configuración de la base de datos

En App Service, las variables de entorno se establecen como valores de aplicación mediante el comando az webapp config appsettings set en Cloud Shell.

El siguiente comando Cloud Shell permite configurar los valores de aplicación DB_HOST, DB_DATABASE, DB_USERNAME y DB_PASSWORD. Reemplace los marcadores de posición <appname> y <postgres-server-name> .

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DB_HOST="<postgres-server-name>.postgres.database.azure.com" DB_DATABASE="sampledb" DB_USERNAME="root@<postgres-server-name>" DB_PASSWORD="Sampledb1"

Configuración de las variables de entorno de Rails

  1. En el terminal local, genere un secreto nuevo para el entorno de producción de Rails en Azure.

    rails secret
    
  2. En el comando Cloud Shell siguiente, reemplace los dos marcadores de posición <output-of-rails-secret> por la clave secreta nueva que generó en el terminal local.

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings RAILS_MASTER_KEY="<output-of-rails-secret>" SECRET_KEY_BASE="<output-of-rails-secret>" RAILS_SERVE_STATIC_FILES="true" ASSETS_PRECOMPILE="true"
    

    ASSETS_PRECOMPILE="true" indica al contenedor Ruby predeterminado que precompile los recursos en cada implementación de Git. Para obtener más información, consulte Precompile assets (Precompilación de los recursos) y Serve static assets (Servir recursos estáticos).

Inserción en Azure desde Git

  1. Puesto que va a implementar la rama main, debe establecer la rama de implementación predeterminada de la aplicación de App Service en main (consulte Cambiar la rama de implementación). En Cloud Shell, establezca el valor de la aplicación DEPLOYMENT_BRANCH con el comando az webapp config appsettings set.

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
    
  2. En el terminal local, agregue una instancia remota de Azure al repositorio de Git local.

    git remote add azure <paste-copied-url-here>
    
  3. Insértela en la instancia remota de Azure para implementar la aplicación Ruby on Rails. Se le pedirá la contraseña que especificó anteriormente como parte de la creación del usuario de implementación.

    git push azure main
    

    Durante la implementación, Azure App Service comunicará su progreso con Git.

     Counting objects: 3, done.
     Delta compression using up to 8 threads.
     Compressing objects: 100% (3/3), done.
     Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
     Total 3 (delta 2), reused 0 (delta 0)
     remote: Updating branch 'main'.
     remote: Updating submodules.
     remote: Preparing deployment for commit id 'a5e076db9c'.
     remote: Running custom deployment command...
     remote: Running deployment command...
     ...
     < Output has been truncated for readability >
     

Navegación hasta la aplicación de Azure

Vaya a http://<app-name>.azurewebsites.net y agregue algunas tareas a la lista.

Captura de pantalla de un ejemplo de aplicación de Azure llamada Tasks que muestran las tareas agregadas a la lista.

Ya está ejecutando una aplicación Ruby on Rails orientada a datos en Azure App Service.

Actualización local del modelo y nueva implementación

En este paso, se realiza un cambio sencillo en el modelo de datos task y en la aplicación web y, después, se publica la actualización en Azure.

Para el escenario de las tareas, modifique la aplicación de forma que pueda marcar una tarea como completada.

Adición de una columna

  1. En el terminal, navegue a la raíz del repositorio de Git.

  2. Genere una migración nueva que agregue una columna booleana llamada Done en la tabla Tasks:

    rails generate migration AddDoneToTasks Done:boolean
    

    Este comando genera un archivo de migración nuevo en el directorio db/migrate.

  3. En el terminal, ejecute migraciones de base de datos de Rails para realizar el cambio en la base de datos local.

    rake db:migrate
    

Actualización de la lógica de aplicación

  1. Abra el archivo app/controllers/tasks_controller.rb. Busque esta línea al final del archivo:

    params.require(:task).permit(:Description)
    
  2. Modifique esta línea para incluir el parámetro Done nuevo.

    params.require(:task).permit(:Description, :Done)
    

Actualización de las vistas

  1. Abra el archivo app/views/tasks/_form.html.erb, que es el formulario Edición.

  2. Busque la línea <%=f.error_span(:Description) %> e inserte el código siguiente directamente debajo de ella:

    <%= f.label :Done, :class => 'control-label col-lg-2' %>
    <div class="col-lg-10">
      <%= f.check_box :Done, :class => 'form-control' %>
    </div>
    
  3. Abra el archivo app/views/tasks/show.html.erb, que es la página Vista de un solo registro.

    Busque la línea <dd><%= @task.Description %></dd> e inserte el código siguiente directamente debajo de ella:

      <dt><strong><%= model_class.human_attribute_name(:Done) %>:</strong></dt>
      <dd><%= check_box "task", "Done", {:checked => @task.Done, :disabled => true}%></dd>
    

    Abra el archivo app/views/tasks/index.html.erb, que es la página de índice para todos los registros.

    Busque la línea <th><%= model_class.human_attribute_name(:Description) %></th> e inserte el código siguiente directamente debajo de ella:

    <th><%= model_class.human_attribute_name(:Done) %></th>
    
  4. En el mismo archivo, busque la línea <td><%= task.Description %></td> e inserte el código siguiente directamente debajo de ella:

    <td><%= check_box "task", "Done", {:checked => task.Done, :disabled => true} %></td>
    

Prueba local de los cambios

  1. En el terminal local, ejecute el servidor Rails.

    rails server
    
  2. Para ver el cambio del estado de la tarea, navegue a http://localhost:3000 y agregue o edite los elementos.

    Casilla agregada a tarea

  3. Para detener el servidor Rails, escriba Ctrl + C en el terminal.

Publicación de los cambios en Azure

  1. En el terminal, ejecute las migraciones de bases de datos Rails para el entorno de producción para hacer el cambio en la base de datos de Azure.

    rake db:migrate RAILS_ENV=production
    
  2. Confirme todos los cambios en Git y, después, inserte los cambios en el código en Azure.

    git add .
    git commit -m "added complete checkbox"
    git push azure main
    
  3. Una vez que git push esté completo, vaya a la aplicación de Azure y pruebe la nueva funcionalidad.

    Modelo y cambios en la base de datos publicados en Azure

    Si ha agregado tareas, estas se conservarán en la base de datos. Las actualizaciones que efectúe en el esquema de datos dejan los datos existentes intactos.

Transmisión de registros de diagnóstico

Para acceder a los registros de la consola generados desde el código de la aplicación en App Service, active el registro de diagnósticos, para lo que debe ejecutar el siguiente comando en Cloud Shell:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

Los valores posibles de --level son: Error, Warning, Info y Verbose. Todos los niveles incluyen el nivel anterior. Por ejemplo: Error incluye solo los mensajes de error, mientras que Verbose incluye todos los mensajes.

Una vez que se activa el registro de contenedor, ejecute el siguiente comando para ver la transmisión del registro:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

Si no ve los registros de la consola de inmediato, vuelve a comprobarlo en 30 segundos.

Nota

También puede inspeccionar los archivos de registro desde el explorador en https://<app-name>.scm.azurewebsites.net/api/logs/docker.

Para detener el streaming del registro en cualquier momento, escriba Ctrl+C.

Administración de la aplicación de Azure

  1. Vaya a Azure Portal para administrar la aplicación que ha creado.

  2. En el menú izquierdo, haga clic en App Services y, luego, en el nombre de la aplicación de Azure.

    Navegación en el portal a la aplicación de Azure

    Verá la página de información general de la aplicación. Aquí se pueden realizar tareas de administración básicas como detener, iniciar, reiniciar, examinar y eliminar.

    El menú izquierdo proporciona varias páginas para configurar la aplicación.

    Página de App Service en Azure Portal

Limpieza de recursos

En los pasos anteriores, creó recursos de Azure en un grupo de recursos. Si prevé que no necesitará estos recursos en el futuro, elimine el grupo de recursos ejecutando el siguiente comando en Cloud Shell:

az group delete --name myResourceGroup

Este comando puede tardar varios segundos en ejecutarse.

Pasos siguientes

En este tutorial, ha aprendido a:

  • Crear una base de datos de Postgres en Azure
  • Conectar una aplicación Ruby on Rails a Postgres
  • Implementar la aplicación en Azure
  • Actualizar el modelo de datos y volver a implementar la aplicación
  • Transmitir registros de diagnóstico desde Azure
  • Administrar la aplicación en Azure Portal

Vaya al siguiente tutorial para aprender a asignar un nombre DNS personalizado a una aplicación web.

O bien, eche un vistazo a otros recursos:

Configure Ruby app (Configuración de una aplicación de Ruby)