lunes, 20 de septiembre de 2021

Comunicación entre contenedores e introducción a Docker Compose.

    

imagen de entrada del capitulo


Comunicación entre contenedores e introducción a Docker Compose.

Anteriormente vimos como se trabaja con un contenedor de Docker. En este capítulo vamos a ir un poco más allá y ver como podemos trabajar con varios contenedores que además estén conectados entre si. Para ello vamos a utilizar con un ejemplo práctico que es como enlazar un contenedor que tenga phpMyAdmin con uno que este ejecutando Mysql o Mariadb.

1.1 Requisitos.

Para poder ejecutar contenedores de Docker lo primero es tener Docker Community Edition (CE) instalado. Puedes ver como hacerlo en el capitulo que previamente vimos sobre Docker. En este ejemplo yo estoy trabajando en una maquina con Linux.

1.2 Enlazar un contenedor PhpMyAdmin con otro que contenga MariaDB o MySQL.


Lo primero que tenemos que hacer es descargar las imágenes de Docker Hub de PhpMyAdmin y de por ejemplo MariaDB

$ docker pull phpmyadmin
y

$ docker pull mariadb

Para conectar dos contenedores podemos hacerlo de dos formas.

1.2.1 Usando el parámetro --link.


Los enlaces permiten que los contenedores se reconozcan entre si y transfieran información de forma segura de un contenedor a otro. Para crear un enlace utilizaremos el parámetro --link.

docker run -d \
--rm \
--name mibase \
-p 3306:3306 \
-e MARIADB_ROOT_PASSWORD=contraseña \
mariadb:latest
Una vez que el contenedor de Mariadb esta en ejecución procedemos a crear el contenedor de PhpMyAdmin

docker run -d \
--rm \
--name phpmyadminc \
--link mibase \
-e PMA_HOST=mibase \
-p 8080:80 \
phpmyadmin
La variable de entorno PMA_HOST, como nos dice las instrucciones que podemos encontrar en docker hub sobre PhpMyAdmin nos sirve para indicar el nombre del contenedor al que nos queremos conectar desde PhpMyAdmin.

Con el parámetro --link hemos creado un enlace entre ambos contenedores 

Para comprobar que todo funciona bien, abrimos un navegador web y accedemos a la dirección:


pantalla de login de phpmyadmin

En este caso, tal como especificamos, usando el usuario root y el password "contraseña" nos debería funcionar bien.

pantalla inicial de phpmyadmin



1.2.1 Usando un "user-defined bridge network".


Para empezar creamos el "user-defined bridge network"

docker network create mi_red

La idea es que los contenedores usen esa red que hemos creado como puente de comunicación entre ellos.

Por tanto ejecutamos el contenedor para Mariadb de una forma muy parecida a como lo hicimos anteriormente, solo que especificando que usen "mi_red" como medio de comunicación.

docker run -d \
--rm \
--name mibase \
--network mi_red \
-p 3306:3306 \
-e MARIADB_ROOT_PASSWORD=contraseña \
mariadb:latest

y hacemos lo mismo con el contenedor de PhpMyAdmin especificando también que use como puente de comunicación "mi_red" y también no olvidemos la variable de entorno "PMA_HOST"

docker run -d \
--rm \
--name phpmyadminc \
--network mi_red \
-e PMA_HOST=mibase \
-p 8080:80 \
phpmyadmin
Para comprobar que todo funciona bien volvemos a abrir un navegador web y entramos en la siguiente dirección http:/localhost:8080. Si todo va bien nos saldrá la pantalla de phpmyadmin en donde podremos loguearnos.

Al igual que podemos eliminar los contenedores, también podemos eliminar la conexión de red que hemos creado. Para ello basta con teclear el siguiente comando:

docker network rm mi_red

En los ejemplos anteriores al cerrar los contenedores se nos perdía la información. Vamos a ver ahora un ejemplo en el que usaremos ambos contenedores pero usando persistencia de datos, es decir que cuando cerremos los contenedores la base que creemos quede guardada en nuestro ordenador.

1.3 Ejemplo de uso con persistencia de datos de PhpMyAdmin y MariaDb.


En los ejemplos anteriores al cerrar los contenedores perdíamos toda la información, desaparecían las bases de datos que hubiésemos creado. En este ejemplo vamos a hacer los mismo, pero de forma que la información sobre la base de datos que creemos, se guarde de unas sesiones a otras.

Con el argumento -v vinculamos un directorio que esta en nuestro ordenador con el directorio de destino en el contendor. Como los datos de las bases de datos en el contenedor se guardan en el directorio /var/lib/mysql para vincularlos ejecutaré la siguiente sentencia pero entrando primeramente en el directorio de mi ordenador donde quiero que se guarden los datos (o vincular mejor dicho). En vez de usar "$(pwd)"  también se puede poner directamente el directorio absoluto a donde queremos vincular los datos.

docker run -d \
--rm \
--name mibase \
-p 3306:3306 \
-e MARIADB_ROOT_PASSWORD=contraseña \
-v $(pwd):/var/lib/mysql \
mariadb:latest

Creamos un contenedor con PhpMyAdmin que esté enlazado con el contenedor anterior.

docker run -d \
--rm \
--name phpmyadminc \
--link mibase \
-e PMA_HOST=mibase \
-p 8080:80 \
phpmyadmin

Para ver si funciona entramos en phpmyadmin y creamos una nueva base de datos. Yo la llamaré "mibasededatos"

creación de una base de datos con phpmyadmin


Ahora cerramos todo y volvemos a hacer lo mismo, para ver si se han vinculado correctamente los datos y la base de datos que hemos creado no ha desaparecido al cerrar los contenedores. No obstante si entras en el directorio del ordenador que has elegido para vincular los datos verás como antes estaba vacío y ahora contiene los datos que se han ido vinculando.

Efectivamente, ahí sigue la base de datos que hemos creado. Ya que el directorio local esta vinculado con el del contenedor automáticamente.

base de datos creada con phpmyadmin



1.4 Docker Compose.

Tal como nos dice la documentación de Microsoft para VS Code, Docker-Compose es una herramienta desarrollada para ayudar a definir y compartir aplicaciones entre varios contenedores. Tan solo es necesario crear un archivo YAML para definir los servicios y, con un solo comando, ponerlo todo en marcha o eliminarlo.

1.4.1 Instalación de Docker Compose.


En la documentación de Docker se especifica como instalarlo en cualquier sistema operativo. Yo voy a seguir las instrucciones para instalarlo en Linux

Lo primero es ejecutar la siguiente instrucción para descargar la versión estable de Docker-Compose:

 $ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Luego le damos permisos de ejecución al binario que nos hemos descargado.

$ sudo chmod +x /usr/local/bin/docker-compose
Para finalizar comprobamos que la instalación haya finalizado correctamente:

$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c

1.4.2. Creación del archivo docker-compose.yml con Mariadb y PhpMyAdmin.


1.- En la raíz del proyecto de la aplicación, crearemos un archivo llamado docker-compose.yml con el que ejecutaremos dos servicios Mariadb y PhpMyAdim.

2.- En el archivo de Compose, lo primero que tenemos que definir es la versión del esquema del archivo YAML que vamos a utilizar. En la mayor parte de los casos lo mejor es utilizar la última versión. Podemos consultar las versiones de esquema y sus compatibilidades en la referencia de archivos de Compose.

Archivo docker-compose.yml

version: "3.8"
3.- A continuación, definimos la lista de servicios o contenedores que queremos ejecutar como parte de la aplicación. Podemos poner el nombre de los servicios como nosotros queramos. En este caso lo típico sería usar como nombre de servicio Mariadb y PhpMyAdmin pero para ver que podemos cambiar de nombre usaremos miBase y miPhpmyadminc. El nombre que utilicemos para los servicios, que hemos elegido libremente, se convertirá automáticamente en un alias de red, lo que nos será muy útil al definir el servicio para Mariadb.

Archivo docker-compose.yml

version: "3.8"

services: 
    miBase:

    miPhpmyadminc:
4.- Lo siguiente a hacer es ir pasando o traducir todas las instrucciones que hemos usado anteriormente para ejecutar los contenedores a este archivo. Por ejemplo para crear ejecutar MariaDb y PhpmyAdmin con persistencia de datos usamos las siguientes instrucciónes.

docker run -d \
--rm \
--name mibase \
-p 3306:3306 \
-e MARIADB_ROOT_PASSWORD=contraseña \
-v $(pwd):/var/lib/mysql \
mariadb:latest
docker run -d \
--rm \
--name phpmyadminc \
--link mibase \
-e PMA_HOST=mibase \
-p 8080:80 \
phpmyadmin

Ahora en el archivo yaml en el que hemos puesto el nombre de los servicios, tenemos que poner que imágenes se van a utilizar.  

Archivo docker-compose.yml

version: "3.8"

services: 
    miBase:
        image: mariadb:latest

    miPhpmyadminc:
        image: phpmyadmin:latest
Para traducir los puertos, cambiamos el argumento -p por la clave "ports" de la siguiente forma:

Archivo docker-compose.yml

version: "3.8"

services: 
    miBase:
        image: mariadb:latest
        ports:
            - 3306:3306
    miPhpmyadminc:
        image: phpmyadmin:latest
        ports:
            - 8080:80

Continuamos traduciendo las variables de entorno que utilizan cada uno de los contenedores. En vez del argumento -e utilizamos la clave "environment"

Archivo docker-compose.yml

version: "3.8"

services: 
    miBase:
        image: mariadb:latest
        ports:
            - 3306:3306
        environment:
            - MARIADB_ROOT_PASSWORD=contraseña

    miphpmyadminc:
        image: phpmyadmin:latest
        ports:
            - 8080:80
        environment:
            - PMA_HOST=miBase
   
Como hemos usado persistencia de datos para guardar las bases de datos que creemos en el directorio que estemos trabajando del ordenador, sustituimos el argumento -v por la clave "volumes". Si hubiésemos especificado un directorio de trabajo en Docker utilizaríamos la clave "working_dir" aunque en este ejemplo no es el caso. 

Una cosa importante es que cuando usamos docker run para ejecutar los contenedores, se crea automáticamente el volumen con su nombre. Pero esto no sucede cuando se ejecuta Compose. Aquí tenemos que definir el volumen en la sección volumes: de nivel superior, y después, especificar el punto de montaje en la configuración del servicio. Para que se usen las opciones predeterminadas solo se tiene que proporcionar el nombre del volumen. Pero hay muchas más opciones disponibles.

IMPORTANTE: cuando ejecutamos en los ejemplos anteriores docker run con la opcion -v para tener persistencia de datos, utilice $(pwd) para que se creara la sincronización dentro del directorio con el que estamos trabajando. Sin embargo esto no funciona en docker Compose que se basa en python. Podemos hacer la persistencia de otra forma que también nos valdría para el caso de que usemos docker run que es creando un volumen de docker. 

Para crear un volumen de Docker usamos la instrucción:

$ docker volume create Nombre_del_volumen

Por ejemplo, yo para usar en el archivo yaml crearé uno llamado "almacen"

$ docker volume create almacen
Esto creará un espacio donde se sincronizarán los datos en nuestro disco local, fuera del contenedor o contenedores. Para obtener información y poder localizar donde están los archivos podemos usar:

$ docker volume inspect almacen
[
    {
        "CreatedAt": "2021-09-19T18:59:27+02:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/almacen/_data",
        "Name": "almacen",
        "Options": {},
        "Scope": "local"
    }
]

Tenemos opciones para crear, inspeccionar, listar o eliminar los volúmenes que hayamos creado, lo mismo que para los contenedores.

Así nuestro archivo yaml para persistencia quedaría de la siguiente forma.


Archivo docker-compose.yml

version: "3.8"

services: 
    miBase:
        image: mariadb:latest
        ports:
            - 3306:3306
        environment:
            - MARIADB_ROOT_PASSWORD=contraseña
        volumes:
            - almacen:/var/lib/mysql

    miPhpmyadminc:
        image: phpmyadmin:latest
        ports:
            - 8080:80
        environment:
            - PMA_HOST=miBase
volumes:
    almacen:

Para finalizar usamos la clave depends_on para indicar al servicio miPhpmyadminc que no se ejecute hasta que el servicio miBase se haya iniciado.

Archivo docker-compose.yml

version: "3.8"

services: 
    miBase:
        image: mariadb:latest
        ports:
            - 3306:3306
        environment:
            - MARIADB_ROOT_PASSWORD=contraseña
        volumes:
            - almacen:/var/lib/mysql

    miPhpmyadminc:
        image: phpmyadmin:latest
        ports:
            - 8080:80
        environment:
            - PMA_HOST=miBase
        depends_on:
            - miBase
volumes:
    almacen:
        

5.- Para ejecutar nuestro archivo docker-compose.yml ejecutamos, desde donde este se encuentre:

$ docker-compose up -d

En donde la opcion -d es para que se ejecute en segundo plano.

Para comprobar que funciona volvemos a abrir el navegador web, ir al localhost:8080 y ver si podemos logearnos en Phpmyadmin y crear nuestra base de datos que conservará los datos una vez hayamos cerrado los contenedores.

Otros comandos útiles que podemos utilizar con Docker-compose son:

- docker-compose up crea y ejecuta una colección de contenedores.

- docker-compose stop detiene los contenedores.

- docker-compose start inicia los contenedores.

- docker-compose down detiene y retira los contenedores.




miércoles, 1 de septiembre de 2021

Sistema de Seguridad con una VPN y MotionEye



Sistema de Seguridad con un VPN y MotionEye

Cuando nos vamos de casa es interesante contar con un sistema de videovigilancia de nuestro hogar, que nos avise si entra algún intruso y nos permita ver lo que ocurre dentro. Si además estamos de vacaciones y necesitamos conectarnos a la red wifi de un hotel o de cualquier sitio público es muy útil conectarnos a través de nuestra propia vpn que nos garantice nuestra privacidad al navegar por internet a través de una conexión privada en el que los datos viajan codificados y utilizando el servidor de nuestra casa.


Instalación y Configuración de una VPN.


Requisitos previos:


IMPORTANTE: Lo primero de todo es conseguir un nombre de Dominio que apunte hasta nuestro servidor que es la rapsberry pi. Ya que normalmente nuestra dirección ip pública no suele ser fija sino que suele cambiar con el tiempo (DNS Dinámica) necesitamos que la VPN sepa donde encontrarnos en la red. Para conseguir y configurar una, sigue este enlace.

También necesitaremos una dirección de red interna fija de la rapsberry ya que sino el router le ira asignando una cada vez, lo cual no nos interesa. En este enlace te pongo como poner una ip fija a la Raspberry Pi.

Una vez hecho lo anterior comencemos por instalar la red privada virtual. En nuestra Raspberry pi usaremos el programa pivpn. Podemos ver todas las opciones de instalación en la siguiente dirección web.

Tal como pone en las instrucciones de instalación abrimos una terminal del sistema y tecleamos la siguiente instrucción:


$ curl -L https://install.pivpn.io | bash


Esperamos a que se instalen los paquetes necesarios. Cuando el proceso termine, nos saldrá la pantalla de bienvenida en la que se nos informa de que podremos instalar OpenVPN o Wireguard para acceder a nuestra red privada virtual. El proceso de instalación es muy similar en ambos casos. Yo voy a utilizar Wireguard. En la pantalla que nos sale pulsamos Ok.


Pantalla de Bienvenida de Pivpn



En la siguiente pantalla el programa nos informa que tenemos que utilizar una IP estática. En los requisitos previos ya puse el enlace de como configurar una IP interna fija para la Raspberry Pi en nuestra red, lo que es una cosa sencilla. Yo ya tengo especificado una dirección IP estática (192.168.1.200) de la rapsberry en mi red con lo que me salto este paso.

pivpn necesita una dirección ip estática


Pantalla mostrando direcciones IP estáticas


Y utilizo la dirección estática facilitada por el programa  que en mi caso es correcta, dándole a "yes".


direcciones estáticas de la raspberry pi en pivpn


Necesitarás también seleccionar un usuario local. Si has creado un usuario diferente del que viene por defecto en la rapsberry, el usuario pi, aquí podrás seleccionarlo.

Seleccionar usuarios locales en pivpn


En la siguiente pantalla nos pregunta por el tipo de VPN que queremos instalar. Yo he utilizado Wireguard aunque como ya comente antes puedes optar por OpenVPN ya que los pasos de instalación son muy similares. Procedemos a la instalación.

pantalla de selección de Wireguard o OpenVPN


Se instala Wireguard y el programa nos pregunta que puerto queremos utilizar. Probablemente es una buena idea dejar el puerto predeterminado por la aplicación (el 51820) pero si quieres cambiarlo puedes especificarlo en esta pantalla. NOTA: el puerto 51820 es un puerto UDP.  

Para que el VPN funcione es muy IMPORTANTE que abras el puerto que hayas elegido en el router y lo redirijas hacia la dirección IP fija que hayas seleccionado para la PI. En cada router se hace de una forma pero normalmente hay que ir al menu del router y buscar en el menu de "puertos", abrir el puerto seleccionado con el protocolo UDP y redirigirlo a la dirección fija interna de la Raspberry. 

A continuación te pedirá que le confirmes el puerto que vas a utilizar por lo que si es correcto le damos al "yes".


Puerto a utilizar por wireguard


Siguiente pregunta. ¿Que proveedor de DNS utilizar? Como lo vamos a utilizar para conectarnos a la Pi desde fuera de casa escoge uno cualquiera, que no sea CUSTOM. Por ejemplo CLOUDFLARE no funciona mal.

selección de proveedor de DNS en pivpn


Ahora nos pide que especifiquemos la dirección de pública de nuestra Raspberry para poder conectarse con ella desde cualquier punto de la WEB. Lo normal es que nuestro proveedor de internet no nos proporcione una IP estática pública, lo normal es que está cambie con el tiempo (IP Dínámica). Al principio del manual ya expliqué como conseguir un nombre de dominio que apunte a nuestro servidor con lo que aquí hay que colocar el que hayas conseguido. Lo primero seleccionamos que queremos utilizar una DNS pública.

Public IP o DNS


En la siguiente pantalla introducimos la dirección de nuestra dns dinámica que hayamos consguido y la confirmamos.


teclear el nombre de nuestra DNS pública

En el siguiente paso se generarán las claves para nuestro servidor VPN. Para finalizar el programa nos dirá si queremos que se seleccionen las actualizaciones desatendidas, lo cual es una gran idea. 


Instalaciones desatendidas.


La instalación ya está completa. Reiniciamos el sistema.


pantalla de instalación completa.


Ahora que ya tenemos instalado correctamente Wireguard vamos a crearnos un perfil para poder utilizarlo. Para crear nuestro perfil vamos a usar de nuevo el script de PiVPN.

Ejecutaremos el siguiente comando

$ sudo pivpn add

Todo lo que vamos a necesitar es teclear un nombre para el perfil que estamos creando.  Por ejemplo yo llamaré al mio "MevoyaReir"

pi@raspberrypi:~ $ sudo pivpn add
Enter a Name for the Client: MevoyaReir
::: Client Keys generated
::: Client config generated
::: Updated server config
::: WireGuard reloaded
======================================================================
::: Done! MevoyaReir.conf successfully created!
::: MevoyaReir.conf was copied to /home/pi/configs for easy transfer.
::: Please use this profile only on one device and create additional
::: profiles for other devices. You can also use pivpn -qr
::: to generate a QR Code you can scan with the mobile app.
======================================================================

Una vez que hemos creado el perfil, este está guardado dentro del directorio que se nos especifica. Si has seguido los pasos anteriores y has usado el usuario pi, encontrarás los archivos en el siguiente directorio:  /home/pi/configs.

Podemos usar esos archivos para configurar el cliente de Wireguard. Sin embargo existe un método más cómodo para hacerlo, que es a través de un código QR.  

Para generar un código QR para nuestro perfil , necesitaremos ejecutar el siguiente comando.  Es importante que uses el nombre de perfil que hayas establecido. En mi caso el comando quedaría de la siguiente forma:

$ pivpn -qr MevoyaReir

Esta instrucción generará un código qr en la pantalla. 


logo de wireguard y código QR


Este código QR lo utilizaremos para configurar fácilmente el cliente de Wireguard ya se en un móvil Android o IOS. 

Puedes encontrar la aplicación cliente de Wireguard para IOS en la Apple App Store y para Android en la Google Play Store.

Configurar esta aplicación cliente es muy fácil ya que solo hay que seleccionar configurar el programa cliente a través del código QR, escanear el código que hemos generado antes y ya está.

Para ver si todo funciona, en el móvil desconectamos la wifi, para que no se conecte a nuestra red interna, abrimos Wireguard y seleccionamos nuestro perfil. Si todo ha ido bien podremos navegar por internet pero utilizando como servidor nuestra raspberry pi o también podemos intentar conectarnos por ssh a la dirección de la Pi. Si lo hemos conseguido ya tenemos el tunel VPN en funcionamiento.


Instalación de MotionEye.


¿Que es MotionEye? Pues es una interfaz web para un programa llamado Motion y que sirve para crear un sistema de videovigilancia de forma sencilla. No solo nos va a permitir controlar lo que pasa en nuestra casa, sino que en caso de que detecte movimiento nos puede avisar enviándonos un correo electrónico, haciendo videos o fotografías de lo que detecte la cámara que podemos almacenar en local o en una cuenta en la nube o ejecutar incluso algún script.

Para que la cosa funcione lógicamente tenemos que tener una raspberry pi y una cámara. Yo tengo esta cámara interna conectada a la una raspberry pi 4 que funciona muy bien y es bastante económica. (Siempre conectarla y desconectarla con la Pi apagada, lo digo por experiencia)

Imagen de camara para raspberry pi 4




Antes de comenzar.

  • Todos los comandos que pondremos a continuación requieren ser root, así que usa sudo antes de cada comando o bien conviértete momentáneamente en root usando sudo -i
  • Si como en mi caso usas un módulo de cámara para la Raspberry, es decir usas una cámara interna que no sea USB, asegúrate de que está activada en la aplicación de configuración. Ejecuta en un terminal sudo raspi-config y en la opción 3 (Interface Option) activa la opción 1 que corresponde al módulo de la cámara.
activar cámara en raspi-config


  • A la fecha en la que estoy escribiendo esto, MotionEye está escrito en python 2 (ojo con esto) con lo que necesitarás al menos la versión 2.7.

Comenzamos.

    1.- Instala ffmpeg y otras dependencias de Motion.

$ sudo apt-get install ffmpeg libmariadb3 libpq5 libmicrohttpd12

    2.- Instala Motion.

$ sudo wget https://github.com/Motion-Project/motion/releases/download/release-4.2.2/pi_buster_motion_4.2.2-1_armhf.deb
$ sudo dpkg -i pi_buster_motion_4.2.2-1_armhf.deb

    3.- Instala las dependencias desde los repositorios.

$ sudo apt-get install python-pip python-dev libssl-dev libcurl4-openssl-dev libjpeg-dev libz-dev

    4.- Instala MotionEye.

$ sudo pip install motioneye

IMPORTANTE. Usamos pip y no pip3 porque MotionEye funciona con la versión 2.7 de python. 

5.- Preparamos el directorio de configuración:

$ sudo mkdir -p /etc/motioneye
$ sudo cp /usr/local/share/motioneye/extra/motioneye.conf.sample /etc/motioneye/motioneye.conf


6.- Preparamos el directorio para los videos y capturas.

$ sudo mkdir -p /var/lib/motioneye


7.- Creamos un script para que el programa se inicie cuando arranque la Pi y se nos inicie el servidor de MotionEye.

$ sudo cp /usr/local/share/motioneye/extra/motioneye.systemd-unit-local /etc/systemd/system/motioneye.service
$ sudo systemctl daemon-reload
$ sudo systemctl enable motioneye
$ sudo systemctl start motioneye

Reiniciamos la Raspberry.


8.- Para actualizar a una versión más reciente de MotionEye, solo hay que teclear:

$ sudo pip install motioneye --upgrade
$ sudo systemctl restart motioneye


Accediendo a la pantalla de inicio.


Una vez que ya tenemos todo instalado para poder acceder a MotionEye, el servidor del programa debería estar ejecutándose en la Pi y escuchando las peticiones que se hagan en el puerto 8765. Para acceder ve a tu navegador y teclea la siguiente dirección:

http://[tu_ip]:8765/

Remplazando [tu_ip] con la dirección fija que configuramos al principio para la Raspberry Pi en nuestra red. Al comenzar no hay configurada ninguna contraseña, ni usuario con lo que usamos como nombre de usuario "admin" y dejamos la contraseña vacía.


Pantalla de login de Motion


Al entrar al programa, este nos dirá que no hemos configurado ninguna cámara que añadamos una. 

Página principal de Motion


Aquí el modelo a elegir dependerá si tu cámara es usb, o como en mi caso un módulo interno. (mmal service 16.1)

Añadir una camara a Motion


y ya está, tenemos la cámara agregada y funcionando. Nos queda configurar las opciones y ver como conectarnos desde afuera.


Opciones de configuración de Motion


Opciones de Configuración.

Conectarnos desde fuera de donde tenemos instalada la o las cámaras (porque se pueden tener varias configuradas) es muy sencillo. Yo lo voy a ver desde el internet del móvil que suele ser lo que tenemos más a mano. Para ello abro la aplicación de Wireguard (o OpenVpn depende de cual hayas instalado) y le damos a conectar. Es importante que antes hayamos abierto el puerto UDP en nuestro router y este redirigido a la dirección estática de la Raspberry.

Si todo esta correcto el programa nos dirá que la conexión se ha realizado correctamente. Y es como si estuviéramos conectados dentro de nuestra red. Solo tenemos que acceder desde un navegador a la dirección de la pi y poner el puerto que hayamos elegido, tal como hicimos antes.

La primera opción que tenemos es "General Settings" o Configuración General. 

Opciones generales de configuración


Como siempre que tenemos algo asomado a internet es buena idea es cambiar tanto el nombre del administrador ("admin username") como su contraseña (Admin Password) y también el nombre y la contraseña del usuario normal ("Surveillance Username") que puede usar la aplicación y su contraseña ("Surveillance Password").


En segundo lugar tenemos las opciones de la cámara "Video Device"

Opciones de video


No hay mucho que comentar sobres estas opciones. Puedes modificar el nombre de la cámara, la resolución el número de frames que se capturan por segundo o como en mi caso girar la imagen 180 grados ya que si no lo veía al revés por la forma que tengo conectada la cámara.

La tercera opción se refiere a las opciones para guardar los archivos de imagen o video, básicamente el directorio y el porcentaje de disco usado.

File Storage Options.


La cuarta hace referencia al texto que se muestra junto a la imagen captada. 

Text Overlay Options

Según lo tengo a la izquierda abajo aparece el nombre de la cámara, abajo a la derecha la hora y el tamaño con el que queremos que se vea.

La quinta opción hace referencia a las propiedades del streaming del video de nuestra cámara.

video streaming option


Entre otras opciones encontramos: la tasa de frames del video en streaming (a más frames mejor calidad de imagen pero más consumo de recursos), la calidad de los videos etc.

La opción sexta se refiere a las características de las capturas de imágenes que hagamos con nuestra cámara. El programa se puede configurar para que se hagan automáticamente al detectar movimiento o nosotros mismos desde la interfaz podemos realizarlas.

Still Image Options.


La primera fila sirve para configurar el nombre del archivo con el que se guardarán las capturas.

En la segunda podemos elegir la calidad de la imagen. Seguidamente podemos configurar el modo en el que se realizarán las capturas. En mi caso está configurado para que estas se realicen cuando se detecte movimiento. 

Podemos establecer con "Preserve Picture" el tiempo de almacenamiento en el disco duro. En mi caso no se borran si quiero borrarlas lo tengo que hacer manualmente.

Finalmente también tengo puesto que pueda hacer capturas manuales a través de la interfaz de la aplicación.


La Séptima es muy parecida a la anterior solo que es para establecer las características de los videos que grabemos. 

Opciones de video de Motion

Solamente comento que en mi configuración el tamaño máximo del video lo tengo en cero segundos porque me interesa que cuando se detecte movimiento no se grabe video me basta con que haga unas capturas de imágenes y me mande un email como veremos luego.


La octava opción es la más interesante. Hace referencia a los parámetros que utiliza el programa para determinar cuando existe movimiento. Para que te hagas una idea, Motion va haciendo continuas capturas de pantalla, una detrás de la otra que va analizando. Si de un frame a otro hay una variación significativa en los pixeles que componen la imagen es de suponer que hay movimiento. Imagina una pared blanca. Si la tenemos enfocada de frente todos los pixeles de la imagen son blancos. Si en ese momento pasa alguien corriendo en ese fotograma ya no todos los pixeles serán blancos, algunos corresponderán a la persona que pasa, con lo que el programa es como detecta el movimiento.

Motion Detection Option


Así es como yo lo tengo configurado, más o menos en automático. Lo suyo es que lo pruebes y vayas ajustando los parámetros poco a poco para que la detección no sea demasiado sensible y te detecte falsos positivos pero tampoco tan lasa que no detecte ninguno.


La novena opción es también muy interesante. Hace referencia a que queremos que el programa haga si detecta movimiento. A mi lo que me interesa es que me envíe un correo electrónico con unas pocas imágenes de lo que esta pasando, pero también puedes establecer que se ejecuten comandos para por ejemplo encender las luces de la casa si detecta movimiento o hacer sonar una alarma o lo que se te ocurra.

Motion Notifications Options


En email addresses ponemos el correo al que queremos que nos manden el mensaje, y en smtp account el correo desde que lo enviamos. Yo aquí utilizo un correo de gmail que tengo para estos menesteres. Para que funcione con gmail hay que desactivar dentro de las opciones del correo de gmail esta opción y dejarla como se ve en la imagen:

Acceso de terceros a la cuenta de gmail desactivada

 ya que si la activas gmail no te dejará enviar el correo desde la aplicación por cuestiones de seguridad.

Y la ultima opción es cuando queremos que funcione el programa para lo cual tenemos una pequeña agenda por si queremos que funciones solo determinados dias. 

Y con esto ya lo tendriamos todo. Tenemos una conexión vpn protegida que nos sirve para acceder a nuestra cámara desde cualquier lugar  y ver lo que ocurre donde la hayamos puesto. Además no tenemos que estar pendientes de estar conectándonos continuamente ya que en caso de que detecte un intruso nos avisará.