Matrix Pushbits Addon: Docker

5 minuto(s) de lectura

Docker

Matrix vimos que es una red abierta para una comunicación segura y descentralizada.

Lo que vamos a realizar es la integración de Pushbits mediante un docker sobre Matrix.

Pushbits es un servidor de retransmisión para notificaciones push. Nos va a permitir enviar notificaciones a través de una API web simple y las entrega a través de la red Matrix.

El proyecto aún continúa en desarrollo pero tiene un enorme potencial, desarrollado en lenguaje Go.

Es ideal para incluir notificaciones en nuestros scripts y desarrollar posibles bots.

Hace un tiempo estuve usando un script bash a modo bot para integrar las notificaciones del sistema, pero no me convencía la flexibilidad de integración para servicios de Docker que como por ejemplo tiene Pushbits.

Como idea dejo las integraciones configuradas para la red Matrix en sustitución de Telegram:

  • Notificaciones del sistema
  • Notificaciones Fail2ban
  • Descargas .torrent
  • Eventos Home Assistant
  • ...

Instalación

Requisitos previos

NOTA: Adicionalmente vamos a crear un usuario en nuestra red Matrix que usaremos de mediador informativo, en nuestro caso Morfeo.

Pushbits Addon: Docker

Vamos a tomar la base de configuración del docker de Matrix para configurar el addon. En primer lugar creamos estructura adicional que usaremos para la creación del servicio:

mkdir -p $HOME/docker/matrix/datos

A continuación nos dirigimos a la ruta donde alojamos la configuración adicional:

cd $HOME/docker/matrix/datos

Creamos el fichero de configuración genérico del servicio (Actualizado 25/04/2022):

nano  $HOME/docker/matrix/datos/config.yml

Y le añadimos el siguiente contenido:

debug: false

http:
    # The address to listen on. If empty, listens on all available IP addresses of the system.
    listenaddress: ''

    # The port to listen on.
    port: 8080

database:
    # Currently sqlite3 and mysql are supported.
    dialect: 'sqlite3'

    # For sqlite3, specifies the database file. For mysql, specifies the connection string. Check out
    # https://github.com/go-sql-driver/mysql#dsn-data-source-name for details.
    connection: 'pushbits.db'

admin:
    # The username of the initial admin.
    name: 'admin'

    # The password of the initial admin.
    password: 'admin'

    # The Matrix ID of the initial admin, where notifications for that admin are sent to.
    # [required]
    matrixid: ''

matrix:
    # The Matrix server to use for sending notifications.
    homeserver: 'https://matrix.org'

    # The username of the Matrix account to send notifications from.
    # [required]
    username: ''

    # The password of the Matrix account to send notifications from.
    # [required]
    password: ''

security:
    # Wether or not to check for weak passwords using HIBP.
    checkhibp: false

crypto:
    # Configuration of the KDF for password storage. Do not change unless you know what you are doing!
    argon2:
        memory: 131072
        iterations: 4
        parallelism: 4
        saltlength: 16
        keylength: 32

formatting:
    # Whether to use colored titles based on the message priority (<0: grey, 0-3: default, 4-10: yellow, 10-20: orange, >20: red).
    coloredtitle: false

alertmanager:
    # The name of the entry in the alerts annotations or lables that should be used for the title
    annotationtitle: title
    # The name of the entry in the alerts annotations or labels that should be used for the message
    annotationmessage: message

Y creamos el fichero de base de datos con permisos de nuestro usuario de sistema:

touch $HOME/docker/matrix/datos/pushbits.db

Volvemos al directorio raíz de nuestro docker y hacemos un backup del fichero de configuración:

cd $HOME/docker/matrix && \
cp docker-compose.yml docker-compose.old

Definimos un upgrade del mismo con las nuevas variables:

cat << EOF >> $HOME/docker/matrix/docker-compose.yml

  pushbits:
    image: ghcr.io/pushbits/server:latest
    container_name: Pushbits
    ports:
      - '8080:8080'
    environment:
      PUSHBITS_DATABASE_DIALECT: 'sqlite3'
      PUSHBITS_HTTP_PORT: '8080'
      PUSHBITS_ADMIN_NAME: 'Empalador'
      PUSHBITS_ADMIN_PASSWORD: 'Nocturno'
      PUSHBITS_MATRIX_HOMESERVER: 'https://minipc.lordpedal.duckdns.org'
      PUSHBITS_ADMIN_MATRIXID: '@lordpedal:minipc.lordpedal.duckdns.org'
      PUSHBITS_MATRIX_USERNAME: 'morfeo'
      PUSHBITS_MATRIX_PASSWORD: 'GrOundHOG'
    volumes:
      - '/etc/localtime:/etc/localtime:ro'
      - '/etc/timezone:/etc/timezone:ro'
      - './datos:/data'
    restart: always
EOF

Vamos a repasar los principales parámetros que hemos añadido sobre la anterior base, para poder adaptarlos a nuestro sistema y configuración especifica:

Parámetro Función
8080:8080 Puerto de notificaciones Push :8080
PUSHBITS_DATABASE_DIALECT: sqlite3 Definimos tipo base datos a usar, ./datos/config.yml
PUSHBITS_HTTP_PORT: 8080 Definimos puerto notificaciones a usar, ./datos/config.yml
PUSHBITS_ADMIN_NAME: Empalador Creamos usuario admin Pushbits, ./datos/config.yml Recomiendo cambiar
PUSHBITS_ADMIN_PASSWORD: Nocturno Contraseña usuario admin Pushbits, ./datos/config.yml Recomiendo cambiar
PUSHBITS_MATRIX_HOMESERVER: https://minipc.lordpedal.duckdns.org Dirección de nuestro servidor Matrix a usar, Necesario sustituir
PUSHBITS_ADMIN_MATRIXID: @lordpedal:minipc.lordpedal.duckdns.org Usuario de nuestro servidor que va a recibir notificaciones, Necesario sustituir
PUSHBITS_MATRIX_USERNAME: morfeo Usuario adicional que creamos en los requisitos previos para enviar notificaciones, Necesario sustituir
PUSHBITS_MATRIX_PASSWORD: GrOundHOG Contraseña usuario adicional para enviar notificaciones, Necesario sustituir
/etc/localtime:/etc/localtime:ro Clona hora del sistema anfitrión (solo lectura)
/etc/timezone:/etc/timezone:ro Clona zona horaria del sistema anfitrión (solo lectura)
./datos: data Ruta donde almacena la base datos y consultas
restart: always Habilitamos que tras reiniciar la maquina anfitrion vuelva a cargar el servicio

Una vez configurado, levantamos nuevamente el servicio para ser reconfigurado y ejecutado:

docker-compose up -d

En mi caso, el servicio estaría disponible en la siguiente dirección http://192.168.1.90:8080/health

Nginx Proxy Manager

Configuramos dominios y certificados:

Pushbits Addon: CLI

Para poder usar el servicio de notificaciones necesitamos de dos requisitos en Matrix:

  • Una SALA de comunicación
  • Un TOKEN de dicha sala para poder interactuar con el servicio

Para obtener ambos parámetros usaremos una aplicación de terminal adicional. En el momento de escribir esta entrada la release v0.0.3 es la que usaremos.

Nos volvemos a dirigr a la ruta donde alojamos la configuración del proyecto:

cd $HOME/docker/matrix/datos

Descargamos y descomprimimos el paquete compilado elegido, en nuestro caso usaremos arquitectura PC 64bits:

wget https://github.com/pushbits/cli/releases/download/v0.0.3/cli_0.0.3_linux_amd64.tar.gz && \
tar -xf 'cli_0.0.3_linux_amd64.tar.gz'

Damos permisos de ejecución al fichero de configuración:

chmod +x cli

Procedemos a crear la sala y obtener el token con los datos que hemos ido creando en el proyecto:

./cli application create Matrix --url https://pushbits.lordpedal.duckdns.org --username Empalador

Vamos a repasar el comando para poder adaptarlo a nuestro sistema sin problemas:

Parámetro Función
./cli application create Matrix Creamos la Sala Matrix
--url https://pushbits.lordpedal.duckdns.org Dirección del servicio Pushbits creado en NPM
--username Empalador Usuario admin de Pushbits que definimos en docker-compose.yml

Adjunto ejemplo de la ejecución completa del comando previo:

pi@overclock:~/docker/matrix/datos$ ./cli application create Matrix --url https://pushbits.lordpedal.duckdns.org --username Empalador
Current password of user Empalador: Nocturno
{
	"id": 1,
	"name": "Matrix",
	"token": "Z3JvdW5kaG9kIGRheQ=="
}

NOTA: Anotamos el token para uso posterior en nuestros scripts.

Tras ejecutarlo en nuestra aplicación de mensajeria Matrix veremos como el usuario @lordpedal:minipc.lordpedal.duckdns.org que definimos en docker-compose.yml para ser notificados, recibira una invitación a la sala Matrix recien creada.

Notificación

Vamos a enviar un comando de prueba para comprobar que todo esta debidamente configurado:

curl \
    --header "Content-Type: application/json" \
    --request POST \
    --data '{"message":"La IP del dispositivo es '$(hostname -I | awk '{print $1}')'","title":"Overclock Server"}' \
    "https://pushbits.lordpedal.duckdns.org/message?token=Z3JvdW5kaG9kIGRheQ=="

NOTA: Sustituye el valor https://pushbits.lordpedal.duckdns.org/message?token=Z3JvdW5kaG9kIGRheQ== por tu servidor y el token del mismo.

Y listo!