Blog del Podcast
podcast      GitHub      Twitter   Telegram

Docker. Monta tu propio servidor de mensajería ejabberd - xmpp

Tiempo estimado de lectura: 7 minutos. 846 palabras. ejabberd

De todas las aplicaciones de mensajería, ya sabéis que mi favorita es XMPP.

Voy a explicaros como instalar el docker del servidor ejabberd que creé y habilitar los certificados para podernos conectar fuera de nuestra red local.

En este artículo explico como crearlo para Raspberry, pero este método también sirve para arquitectura AMD64 y utilizando del docker official.

Crea docker para Raspberri Pi

docker run -ti -h xmpp --name xmpp -p 5222:5222 -p 5280:5280 -d ugeek/ejabberd:pi

El puerto 5222, es el encargado de mantener la comunicación de los clientes con el servidor. Es necesario tener abierto mínimo ese puerto en tu router.

Docker Compose

A mi me gusta más utilizar docker-compose

version: '3'
services:
  xmpp:
    container_name: xmpp
    image: 'ugeek/ejabberd:pi'
    ports:
      - '5222:5222'
      - '5280:5280'
    hostname: xmpp
    tty: true

Edita el nombre del servidor

Para entrar dentro del contenedor y editar el nombre del servidor, utilizaremos vi, que ya viene instalado por defecto en el propio docker.

docker exec -it xmpp vi /etc/ejabberd/ejabberd.yml

En el archivo ejabberd.yml, en las primeras líneas, encontraremos el apartado hosts para editar el nombre del servidor.

Podemos utilizar varios nombres de servidor.

## hosts: Domains served by ejabberd.
## You can define one or several, for example:
## hosts:
##   - "example.net"
##   - "example.com"
##   - "example.org"
hosts:
- "midominio.duckdns.org"

En este ejemplo de configuración, he utilizado el nombre de dominio midominio.duckdns.org. Esto quiere decir que los usuarios que estarán registrados en el servidor, utilizan de nombre de usuario, por ejemplo:

Reinicia el servidor

docker exec -it xmpp service ejabberd restart

Comandos

Ejabberd utiliza en su versión de terminal para admistrar el servidor el comando:

ejabberdctl

Crea un usuario y su contraseña

docker exec -it xmpp ejabberdctl register angel midominio.duckdns.org "contraseña"

Cambia la contraseña de un usuario

docker exec -it xmpp ejabberdctl change_password angel midominio.duckdns.org "contraseña"

Lista todos los usuarios de un host

Hay que especificar al final el nombre del servidor. Existe la posibilidad que el servidor tenga dos nombres

docker exec -it xmpp ejabberdctl registered_users midominio.duckdns.org

Borrar Usuarios

docker exec -it xmpp ejabberdctl unregister angel midominio.duckdns.org

Administrador

Editamos el archivo ejabberd.yml y escribimos el nombre de administrador o administradores. En este caso angel.

## Full path to a script that generates the image.
## captcha_cmd: "/usr/share/ejabberd/captcha.sh"

acl:
admin:
user:
- "angel"

Acceder a la web de administración

Para acceder a la página web de administración nos conectaremos del siguiente modo a la url:

Iniciar servidor

docker exec -it xmpp service ejabberd start

Usuarios conectados al servidor

docker exec -it xmpp ejabberdctl connected_users

logs

Para ver los logs, ejecutariamos el siguiente comando

docker exec -it xmpp tail -f /var/log/ejabberd/ejabberd.log

Certificados

Para poder abrir tu servidor ejabberd a la red de un modo seguro, necesitamos que generar el certificado TLS para que nuestro usuario, contraseña y mensajes viajen cifrados.

Para generarlo voy a utilizar caddy o traefik. Voy a montar un servidor nginx con el dominio midominio.duckdns.org y como ambos servicios crean el certificado automáticamente, ya tendremos el primer paso hecho, conseguir el certificado SSL para el servidor web.

Ahora vamos combertirlo en ejabberd.pem para utilizarlo con ejabberd con TLS.

Certificado con caddy

Con Caddy, en el directorio de configuración (caddy/data/caddy/data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/midominio.duckdns.org), encontraremos dos archivos. El .key y .crt.

El archivo crt es el certificado que contiene la llave pública de la url y key contiene la llave privada.

Para fusionarlos y crear el archivo .pem, utilizaremos el comando cat.

Primero irá el archivo .key y despues el .crt

cat midominio.duckdns.org.key  midominio.duckdns.org.crt > ejabberd.pem

Para que ejabberd reconozca el certificado, edita el archivo ejabberd.pem y elmina el último bloque desde -----BEGIN CERTIFICATE----- a -----END CERTIFICATE-----.

Copiamos el certificado en el servidor con docker

docker cp ejabberd.pem  xmpp:/etc/ejabberd

Reiniciamos el servidor

docker exec -it xmpp service ejabberd restart

Certificado con traefik

Si utilizas traefik, lo haremos del siguiente modo:

version: '3'
services:
   web:
    image: nginx:alpine
    volumes:
      - ./templates:/etc/nginx/templates
    ports:
      - "8081:80"
    environment:
      - NGINX_HOST=foobar.com
      - NGINX_PORT=80
    networks:
      - web
    labels:
      - traefik.backend=web                                                                                               
      - traefik.frontend.rule=Host:midominio.duckdns.org
      - traefik.docker.network=web
      - traefik.port=8081
      - traefik.enable=true

El docker-compose es un servidor nginx basado en un Alpine Linux. Cuando levantemos el contenedor, traefik se encargará de crear los certificados Let's Encrypt para la url: midominio.duckdns.org

Necesitamos las claves públicas y privadas, pero Traefik solo crea un archivo acme.json. Necesitariamos exporta las llaves y para ello utilizaremos un docker:

docker run --name extractor -d -v ~/docker/traefik/:/app/data ~/docker/traefik/extractor/certs:/app/certs ugeek/traefik-certificate-extractor:arm

Para exportar todo los certificados del archivo acme.json de traefik a archivos .pem y ejecuta en la ruta del certificado el comando anterior.

El docker para exportar los certificados, está en: https://github.com/docker-projects/docker-traefik-certificate-extractor

Una vez que tenga el certificado, puede fusionar las claves públicas y privadas en el archivo que espera ejabberd:

cat privkey.pem fullchain.pem > ejabberd.pem

Copiamos el certificado en el servidor con docker

docker cp ejabberd.pem  xmpp:/etc/ejabberd

Reiniciamos el servidor

docker exec -it xmpp service ejabberd restart

Reiniciar con cron

Es interesante hacer un reinicio del servidor de tanto en tanto, por si se produce algún cuelgue en algún archivo sin entregar

00 4 * * * docker exec -it xmpp service ejabberd restart

Publicado por Angel el Sunday 07 November del 2021



También te puede interesar:




Powered by org-bash-blog

Written in OrgMode with Emacs and converted to HTML with Pandoc

Licencia de Creative Commons
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.