Desplegar un servidor Prosody con certificado en la Pi

A petición popular, en esta entrada desplegaremos un servidor Prosody casero para tenerlo funcionando en una Pi, y poder comunicarnos de forma segura desde nuestro móvil o cualquier cliente XMPP con otros usuarios o salas. Utilizaremos Docker para crosscompilar la imagen oficial de los desarrolladores de Prosody en la arquitectura necesaria para la Pi (arm64).

Clonamos el repositorio oficial de los Prosody Developers:

$ git clone https://github.com/prosody/prosody-docker

Entramos en el directorio y compilamos la imagen para la arquitectura arm64 con el nombre prosody:

$ cd prosody-docker && docker buildx build --platform arm64 -t prosody -f ng/Dockerfile ng/

En este punto tenemos que especificar en variables de entorno la configuración que queremos añadir en el servicio, para esto podemos crear un archivo .env donde tengamos el docker-compose.yml, o en la sección environment: de la definición del contenedor en el compose. Las variables que necesitamos crear son:

ENV_PROSODY_ADMINS=admin@dominio.com,user@dominio.com
ENV_PROSODY_SQL_DRIVER=SQLite3
ENV_PROSODY_SQL_DB=prosody.sqlite
ENV_PROSODY_CERTIFICATES=certs/dominio.com
ENV_PROSODY_VIRTUAL_HOSTS=dominio.com
ENV_PROSODY_NETWORK_HOSTNAME=dominio.com
ENV_PROSODY_ENABLE_MODULES=bosh,http_upload
ENV_PROSODY_COMPONENTS=conference.dominio.com:muc,xmpp.dominio.com:http_upload
ENV_PROSODY_MUC_MODULES=bosh
ENV_PROSODY_EXTERNAL_COMPONENTS=
ENV_PROSODY_COMPONENT_SECRET=

Aclarar que se necesita añadir la ruta de la carpeta que contenga los certificados SSL en la variable ENV_PROSODY_CERTIFICATES con el mismo nombre que el dominio que vamos a compartir dominio.com.crt y dominio.com.key, o sino con los nombres fullchain.pem y privkey.pem dentro de una carpeta con el mismo nombre que el dominio que tengamos si son certificados Let’s Encrypt.

Una vez creadas las variables podemos usar un archivo docker-compose.yml como el siguiente para instanciar el contenedor:

version: '2'

services:
  prosody:
    image: prosody
    hostname: prosody
    container_name: prosody
    restart: always
    env_file:
      - .env
    ports:
      - 80:80
      - 443:443
      - 5222:5222
      - 5269:5269
      - 5347:5347
      - 5280:5280
      - 5281:5281
    volumes:
      - ./prosody.sqlite:/etc/prosody/prosody.sqlite
      - ./mod_http_upload.lua:/usr/lib/prosody/modules/mod_http_upload.lua:ro # módulo para subir archivos con el protocolo XMPP
      - ./certs:/etc/prosody/certs/dominio.com/:ro # ruta de los certificados SSL
    networks:
      prosodynet:

networks:
  prosodynet:

Y esto es todo, nos leemos por XMPP 👀