Proyecto domótica PARTE 7 - Persistir información con MongoDB

Google provee de un software de bases de datos en la nube llamado Firebase, la cual está presente en la mayoría de los ejemplos publicados para proyectos de Smart Home, este software de bases de datos es una buena alternativa para usar, ya que se orienta a documentos en formato JSON similar a MongoDB y es muy fácil de implementar ya que provee de librerías para la mayoría de los lenguajes mayormente usados.

Sin embargo, he desistido de su uso ya que la cantidad de datos que almacenaré son tan pocos (mi listado de dispositivos inteligentes en mi hogar no superan los 15) y el hecho de tener la API y la base de datos en la misma máquina (Raspberry Pi) me disminuyen los tiempos de respuesta, haciendo que las ordenes se ejecuten mucho más rápido, y por último, la opción gratuita de Firebase y Google Cloud no permite la ejecución de llamadas fuera de los servicios de Google Cloud, por lo que significa que tendría que pasarme a un plan de facturación y el costo sería mucho mayor que lo que consume de electricidad mi Raspberry Pi.

Para la construcción de este proyecto he tomado el código fuente de ejemplo de Smart Home de Google y he remplazado la librería y las llamadas de Firebase por Mongoose y MongoDB.

7 Instalación de MongoDB, creación de usuarios y base de datos.


Dado que la arquitectura de la Raspberry Pi 2 es de ARM Hard Float de 32 bits, es necesario usar una versión antigua de MongoDB, la última en ser compatible con esta arquitectura es la 3.0.14.

La instalación se realizará siguiendo las instrucciones del blog de Andy Felong

7.1 Descargar los binarios, en mi caso los dejare en el directorio /opt/mongodb

7.1.1 Crear directiorio mongodb.

cd /opt
sudo mkdir mongodb


7.1.2 Entrar al directorio mongodb y crear directorios bin y tools,  luego descargar librerías y extraerlas en forma respectiva.

cd mongodb
sudo mkdir bin
cd bin
sudo wget https://andyfelong.com/downloads/core_mongodb_3_0_14.tar.gz


El comando wget descargará las fuentes para la instalación


sudo tar -zxvf core_mongodb_3_0_14.tar.gz
sudo rm core_mongodb_3_0_14.tar.gz

Una vez extraídos los archivos con el comando tar y eliminado el comprimido con el comando rm, mediante un comando ls se deberían ver los binarios de mongodb dentro del directorio bin



Se debe repetir el mismo procedimiento para las herramientas de mongodb



cd ..
sudo mkdir tools
cd tools
sudo wget https://andyfelong.com/downloads/tools_mongodb_3_0_14.tar.gz
sudo tar -zxvf tools_mongodb_3_0_14.tar.gz
sudo rm tools_mongodb_3_0_14.tar.gz


El comando wget descargará los archivos

hacer un ls para verificar los archivos en el interior

7.1.3 Crear usuario y verificar que exista.

sudo adduser --ingroup nogroup --shell /etc/false --disabled-password --gecos "" --no-create-home mongodb
grep mongodb /etc/passwd


7.1.4 Asegurar los permisos del propietario y los permisos de los archivos ejecutables.

cd ../bin
sudo chown root:root mongo*
sudo chmod 755 mongo*
sudo strip mongo*
sudo cp -p mongo* /usr/bin


Repetir este mismo procedimiento dentro del directorio tools.

cd ../tools
sudo strip mongo*
sudo chown root:root mongo*
sudo chmod 755 mongo*
sudo mv mongo* /usr/bin


7.1.5 Crear un directorio de archivos de logs con propietario y permisos adecuados.

sudo mkdir /var/log/mongodb
sudo chown mongodb:nogroup /var/log/mongodb


7.1.6 Crear el directorio para la base de datos con permisos de acceso convenientes.

sudo mkdir /var/lib/mongodb
sudo chown mongodb:root /var/lib/mongodb
sudo chmod 775 /var/lib/mongodb


7.1.7 Crear el archivo mongodb.conf en /etc. (este archivo puede escribirse de distintas formas dependiendo de la versión de MongoDB que esté usando, considere apoyarse en la documentación del motor de base de datos para generarlo correctamente)

cd /etc
sudo nano mongodb.conf

Insertar lo siguiente, presionar ctrl+o y ctrl+x, para guardar y cerrar.
# /etc/mongodb.conf
# minimal config file (old style)
# Run mongod --help to see a list of options

bind_ip = 127.0.0.1
quiet = true
dbpath = /var/lib/mongodb
logpath = /var/log/mongodb/mongod.log
logappend = true
storageEngine = mmapv1

7.1.8 Crear la entrada en de servicio systemd.


cd /lib/systemd/system
sudo nano mongodb.service

insertar lo siguiente, presionar ctrl+o y ctrl+x, para guardar y cerrar.

[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target

[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongodb.conf

[Install]
WantedBy=multi-user.target

7.1.9 Arrancar el servicio y ver el estado.

sudo service mongodb start
sudo service mongodb status

Presionar q para salir del log


7.2 Solucionar posible falla en dependencias libssl1.0.0  y multiarch-support.


Dado que la versión de mongodb está deprecado, utiliza una librería anticuada que ya no es soportada por Debian, lo que significa que debe ser descargada e instalada manualmente.

7.2.1 Descarga de paquetes de instalación desde repositorios oficiales, luego instalación de librerías mediante la herramienta dpkg del sistema operativo.

wget http://ftp.us.debian.org/debian/pool/main/g/glibc/multiarch-support_2.28-10_armhf.deb
wget http://security.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u12_armhf.deb
sudo dpkg -i multiarch-support_2.28-10_armhf.deb
sudo dpkg -i libssl1.0.0_1.0.1t-1+deb8u12_armhf.deb


7.3 Crear usuarios para el contenido de la base de datos

Una vez que el servicio está corriendo puede ingresar a la consola de administración de MongoDB con el siguiente comando:

mongo


7.3.1 Una vez dentro de la consola de MongoDB creamos el usuario root, reemplazar el user y pwd por los que estime convenientes:

use admin
db.createUser({user: "root", pwd: "123456", roles:["root"]})

7.3.2 Habilitar la autenticación en MongoDB

Para ello es necesario volver a modificar el archivo "mongo.conf" que hemos creado anteriormente en el directorio "etc".  (este archivo puede escribirse de distintas formas dependiendo de la versión de MongoDB que esté usando, considere apoyarse en la documentación del motor de base de datos para generarlo correctamente)

cd /etc
sudo nano mongodb.conf


Insertar lo siguiente al final del archivo, presionar ctrl+o y ctrl+x, para guardar y cerrar.
auth = true

7.3.3 Reiniciar el servicio y conectarse a la consola de MongoDB.

sudo service mongodb restart


Una vez reiniciado el servicio conéctese usando el usuario root que hemos creado recientemente:

mongo localhost:27017 -u "root" -p "123456" --authenticationDatabase "admin"


7.3.4 Dentro de la consola de MongoDB creamos la base de datos para el proyecto y el usuario a cargo:

use smarthome
db.createUser({user: "itheowner", pwd: "mypassword", roles:["dbOwner"]})


Probamos la correcta conexión a nuestra base de datos smarthome usando la cuenta recién creada.

mongo localhost:27017/smarthome -u "itheowner" -p "mypassword"



Indice

Parte 15) Resultados

Comentarios