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.
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.
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
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:
docker exec -it xmpp service ejabberd restart
Ejabberd utiliza en su versión de terminal para admistrar el servidor el comando:
ejabberdctl
docker exec -it xmpp ejabberdctl register angel midominio.duckdns.org "contraseña"
docker exec -it xmpp ejabberdctl change_password angel midominio.duckdns.org "contraseña"
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
docker exec -it xmpp ejabberdctl unregister angel midominio.duckdns.org
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"
Para acceder a la página web de administración nos conectaremos del siguiente modo a la url:
docker exec -it xmpp service ejabberd start
docker exec -it xmpp ejabberdctl connected_users
Para ver los logs, ejecutariamos el siguiente comando
docker exec -it xmpp tail -f /var/log/ejabberd/ejabberd.log
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.
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
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
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

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