Configurando Ruby on Rails 5 con MySQL en Ubuntu 14.04 (con accesos remotos a bases de datos)

Bernardo Gómez
6 min readNov 2, 2016

--

Autor: Bernardo Gómez Romero, 01 / Oct / 2016

Introducción

Ruby on Rails usa sqlite3 como su gestor de base de datos por default. Sqlite3 puede no ser lo suficientemente escalable para su aplicación, o puede carecer de ciertos beneficios (estabilidad, velocidad, etc.) que aportan otros gestores más robustos como MySQL.

En este tutorial se muestra como instalar MySQL en un servidor Ubuntu 14.04 y cómo configurar un proyecto de Ruby on Rails para usarlo (cubriendo al final la parte de accesos remotos a bases de datos)

Prerrequisitos

- Ambiente de producción de Ruby on Rails configurado y funcionando

- Acceso a superusuario (sudo) para poder instalar MySQL

Instalar MySQL

Primero, actualice apt-get:

$ sudo apt-get update

Después instale MySQL y sus librerías:

$ sudo apt-get install mysql-server mysql-client libmysqlclient-dev

En este paso se le pedirá introducir y confirmar una contraseña para el usuario root de MySQL.

Después de terminar la instalación, deberá configurar los directorios donde se crearán las bases de datos, eso con el siguiente comando:

$ sudo mysql_install_db

Como medida de seguridad, para evitar configuraciones por default correremos:

$ sudo mysql_secure_installation

Se le pedirá la contraseña para el usuario root de MySQL que acaba de crear y a continuación le preguntará si desea cambiar la contraseña. Introduzca “n” si no la desea cambiarla.

Para todas las preguntas que continúan dará ENTER. Esto configurará algunos valores preestablecidos, negará inicios de sesión remotos, eliminará usuarios de bases de datos, etc.

Si desea confirmar que la instalación ha sido correcta y la versión de MySQL que se ha instalado, simplemente corra:

$ mysql –versión

Y deberá aparecer algo como esto:

mysql  Ver 14.14 Distrib 5.7.11, for Linux (x86_64) using           EditLine wrapper

Además, para verificar que MySQL está corriendo, ejecute el comando:

$ service mysql status

Y deberá ver lo siguiente (con un id de proceso diferente):

mysql start/running, process 2689

Si MySQL no está corriendo, ejecute:

$ sudo service mysql start

Ahora MySQL está instalado. Lo que sigue es configurar la gema y la aplicación de Rails para que funcione con MySQL.

Instalar / agregar gema de MySQL.

En este punto, las instrucciones pueden variar según sea su caso. Un caso puede ser que ya había creado el proyecto de rails antes de comenzar a seguir este tutorial. El otro es que lo está siguiendo de cero sin ninguna aplicación creada. De cualquier forma, a continuación se explican los pasos necesarios para ambos casos.

En el caso de que no tengas el proyecto creado, instala la gema desde consola:

$ gem install mysql2

Si ya tenía el proyecto de rails creado, tendrá que agregar la gema a tu gemfile:

gem ‘mysql’

Y después instalarla:

$ bundle update

Crear una nueva aplicación de Rails

Si aún no había creado la aplicación, ahora puede crearla con rails new agregando -d mysql al comando de creación. Esto establecerá la base de datos de la aplicación a que sea de MySQL. El comando para crearla quedará de la siguiente forma:

$ rails new nombreapp -d mysql

Y después muévase al directorio de la aplicación:

$ cd nombreapp

Ahora se debe crear las bases de datos y configurar la conexión a la base de datos.

Creación de base de datos.

Para este punto, si su caso fue el que ya tenía el proyecto de Rails creado antes de comenzar el tutorial, es probable que también ya haya creado las bases de datos de la aplicación. De ser así, salte este paso y vaya al siguiente (Configuración de conexión de base de datos).

Primero que nada, en el archivo config/database.yml hay una línea dentro de default que dice

password:

Ahí deberá introducir la contraseña que asignó al registrar el usuario root de MySQL anteriormente.

password: mysql_root_password

Guarde y salga.

Después de hacer esto, para crear las bases de datos de development y de test ejecute el siguiente comando de Rails:

$ rake db:create

Esto creará las dos bases de datos mencionadas en el servidor con el nombre de su aplicación junto con el nombre del ambiente de desarrollo según sea el caso, de la siguiente forma: “nombreapp_development” y “ nombreapp_test”.

Configuración de conexión a base de datos

Si usted ya había creado las bases de datos sin especificar que fueran de MySQL al crear la aplicación, la configuración de la base de datos se encontrará definida para sqlite3.

Si ese es su caso, deberá modificar el archivo config/database.yml para que quede de la siguiente forma:

En la parte de “database” de cada ambiente, si había nombrado las bases de datos de forma diferente, ahí ingresa el nombre que les asignaste.

De igual forma, en la parte de default, username: tuUsuarioMySQL se puede tratar del usuario root y su contraseña.

Nota: Si al continuar el tutorial y al llegar al punto de correr la aplicación tienes problemas con el socket, pruebe cambiando el valor por

socket: /tmp/mysql.sock

Probar configuración

Para comprobar que la configuración ha sido correcta, corra el servidor de Rails con el comando:

$ rails server

El cual lo correrá en el localhost en el puerto 3000.

Si la aplicación de Rails está en un servidor remoto, para poder acceder vía un navegador web a la aplicación, una forma fácil de hacerlo es unir la aplicación a la dirección ip pública del servidor con el siguiente comando:

$ rails server — binding=IP_publica_servidor

Ahora deberá ser capaz de acceder a la aplicación de Rails con un navegador web vía la dirección ip pública del servidor en el puerto 3000:

http:// IP_publica_servidor:3000

Si ve la página de Ruby on Rails con el mensaje de “Welcome aboard”, su aplicación ha sido configurada correctamente y funciona con base de datos de MySQL.

Configuración extra

Si usted desea correr la aplicación de Rails de manera local o desde algún editor de código en línea, como cloud9, y quiere correr las mismas bases de datos que tiene en el servidor, deberá configurar MySQL en el servidor para que permita los accesos remotos. En el archivo config/database.yml se deberá tener la configuración que habíamos mencionado anteriormente para determinar la ip del servidor donde correrán las bases de datos:

Habiendo configurado este archivo, lo que resta es permitir los accesos remotos en MySQL:

  1. Modificar el archivo de configuración de MySQL:

$ sudo nano /etc/mysql/my.cnf

Deberá buscar las siguientes líneas (descomentarlas en caso de estar comentadas):

  • skip-external-locking
  • bind-address = 127.0.0.1

La IP que le vamos a dar a bind-address será 0.0.0.0. (a menos de que cuente con una ip específica a la cual dar acceso)

2. Reiniciar el servicio de MySQL para aplicar los cambios:

$ sudo service mysql restart

3. Dar permisos de acceso al usuario de la base de datos.

Primero, entre a la consola de MySQL:

$ mysql –u root -p

Tras esto, se le dan los privilegios al usuario un usuario determinado (el que ingresó en archivo config/database.yml del proyecto de Rails). En este caso root, con los siguientes comandos:

GRANT ALL PRIVILEGES ON *.* TO root@’%’ IDENTIFIED BY ‘password’;

FLUSH PRIVILEGES;

Al finalizar esto, ya deberá ser capaz de acceder a las bases de datos de MySQL de manera remota y, en este caso, desde tu aplicación de Rails que corre de manera local (o en cloud9).

Para más detalle sobre esta configuración, referir al siguiente enlace:

http://stackoverflow.com/questions/15663001/remote-connections-mysql-ubuntu

Fuentes:

La información aquí presentada fue recaudada de diferentes tutoriales y de experiencias propias de situaciones que experimenté al realizar esta configuración para un proyecto propio. Si desea consultar las fuentes que utilicé, fueron las siguientes:

--

--