Inicio Snikket xmpp
Entrada
Cancelar

Snikket xmpp

Hoy he hecho un cambio en el servidor: he desinstalado prosody y he levantado un docker con Snikket. ¿Que por qué he hecho esto? Pues porque configurar prosody es un puto dolor de huevos. Lo llevo usando un par de años y todavía no le he pillado el punto, así que al carajo, levanto algo más sencillo de configurar con docker y me quedo a gusto.

Snikket es un servidor de mensajería instantánea xmpp con el que se pueden tanto enviar mensajes, contactos, documentos… como además hacer llamadas y videollamadas (exactamente igual que con el dichoso güasap). Yo lo he alojado en mi vps con el docker oficial del proyecto (Sí, prefiero liarla parda instalándolo a las bravas, pero últimamente no tengo mucho tiempo y no me la quiero jugar, así que docker), y siguiendo la web también oficial.

Vamos al lío.

Ni que decir tiene que debemos tener instalados docker, docker-compose, un servidor web (en mi caso caddy) y un dominio antes de empezar con la instalación para que esto funcione.

Paso 1: Configurar el servidor.

Lo primero que hay que hacer es configurar los registros DNS de nuestro servidor añadiendo un dominio y dos subdomninios, que son los que necesita Snikket para hacer su magia. Quedarían más o menos así:

1
2
3
4
    Domain                  TTL     Class   Type    Target
    chat.example.com.       300     IN      A       203.0.113.123
    groups.chat.example.com 300     IN      CNAME   chat.example.com.
    share.chat.example.com  300     IN      CNAME   chat.example.com.

Ya con nuestros dominios apuntando a donde deben, hay que abrir los puertos del cortafuegos que necesitamos. Reconozco que esta es la parte que más trabajo me ha costado de tragar, porque son un montón de puertos, pero si no lo hacemos, no funciona, así que no nos queda otra que abrir lo que haga falta. Desde el panel de control del servidor, hay que asegurarse de que el cortafuegos que proporciona la empresa en la que tengas el vps tenga esos puertos abiertos, y luego, abrirlos también en el cortafuegos del propio servidor (Suelo usar ufw por la sencillez a la hora de manejar la apertura de puertos). Los puertos son:

  • 80/TCP y 443/TCP Puertos HTTP y HTTPS, para la interfaz web y el servicio para compartir archivos en grupos.
  • 5222/TCP Conexiones de clientes con el servidor.
  • 5269/TCP Federación con otros servidores.
  • 5000/TCP Proxy para transferencia de archivos.
  • 3478 y 3479 TCP y UDP Para la negociación de audio y vídeo (STUN/TURN).
  • 5349 y 5350 TCP y UDP Para la negociación de audio y vídeo sobre TLS.
  • 49152:65535/UDP Para el proxy de datos de audio y vídeo.

Con ufw se abren los puertos de la siguiente manera:

1
2
3
4
5
6
7
8
9
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 5222/tcp
sudo ufw allow 5269/tcp
sudo ufw allow 5000/tcp
sudo ufw allow 3478:3479
sudo ufw allow 5349:5350
sudo ufw allow 49152:65535/udp
sudo ufw reload

En el caso de que ufw no acepte los rangos de puertos, detenemos el firewall, añadimos las reglas y volvemos a activar.

1
2
3
4
5
6
sudo ufw disable
sudo ufw allow 443/tcp
sudo ufw allow 5222/tcp
...
sudo ufw allow 49152:65535/udp
sudo ufw enable

Una vez hecho esto, vamos con la instalación.

Paso 2: La instalación.

Para los dockers, yo suelo trabajar de la siguiente manera: Primero creo en mi HOME una carpeta llamada docker y dentro de esta voy creando carpetas para cada servicio donde voy creando los diferentes docker-compose.yml y alojando los volúmenes para tenerlos siempre a mano por eso de las copias de seguridad, así me ahorro hacer copias de seguridad de todo lo que conlleva levantar un docker y que realmente no es necesario, ya que con el docker-compose.yml, el archivo de configuración y los volúmenes a salvo, se puede recrear cualquier servicio.

1
2
3
mkdir ~/docker
mkdir ~/docker/snikket
nvim ~/docker/snikket/docker-compose.yml

El docker-compose.yml lo puedes descargar desde la web de snikket en el siguiente enlace, pero hay que cambiarlo para que los volúmenes se queden en la misma carpeta y no en la que usa docker por defecto. Quedaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
version: "3.3"

services:
  snikket_proxy:
    container_name: snikket-proxy
    image: snikket/snikket-web-proxy:stable
    env_file: snikket.conf
    network_mode: host
    volumes:
      - ./snikket_data:/snikket
      - ./acme_challenges:/var/www/html/.well-known/acme-challenge
    restart: "unless-stopped"
  snikket_certs:
    container_name: snikket-certs
    image: snikket/snikket-cert-manager:stable
    network_mode: host
    env_file: snikket.conf
    volumes:
      - ./snikket_data:/snikket
      - ./acme_challenges:/var/www/.well-known/acme-challenge
    restart: "unless-stopped"
  snikket_portal:
    container_name: snikket-portal
    image: snikket/snikket-web-portal:stable
    network_mode: host
    env_file: snikket.conf
    restart: "unless-stopped"

  snikket_server:
    container_name: snikket
    image: snikket/snikket-server:stable
    network_mode: host
    volumes:
      - ./snikket_data:/snikket
    env_file: snikket.conf
    restart: "unless-stopped"

volumes:
  acme_challenges:
  snikket_data:

Ahora creamos el archivo snikket.conf en el mismo directorio.

1
nvim ~/docker/snikket/snikket.conf

Y queda así:

1
2
3
4
5
6
7
8
# The primary domain of your Snikket instance
SNIKKET_DOMAIN=chat.example.com

# An email address where the admin can be contacted
# (also used to register your Let's Encrypt account to obtain certificates)
SNIKKET_ADMIN_EMAIL=correo@tucorreo.org
SNIKKET_TWEAK_HTTP_PORT=5080
SNIKKET_TWEAK_HTTPS_PORT=5443

Nos falta configurar caddy añadiendo las siguientes líneas al archivo /etc/caddy/Caddyfile

1
2
3
4
5
6
7
8
9
chat.ejemplo.com,
groups.chat.ejemplo.com,
share.chat.ejemplo.com {
        reverse_proxy https://localhost:5443 {
                transport http {
                        tls_insecure_skip_verify
                }
        }
}

Lanzamos el compose y recargamos caddy.

1
2
3
cd ~/docker/snikket
sudo docker-compose up -d
sudo systemctl reload caddy

Paso 3: Creando el usuario administrador.

Si todo ha ido bien, ya podemos acceder a nuestra web, y aunque todavía no tengamos usuario, nos aparecerá la página de inicio donde nos pedirá hacer login.

Snikket funciona con un sistema de invitaciones, con lo que no puedes abrirte una cuenta en mi servidor si yo, que soy el administrador, no te envío una invitación, así que vamos a crear el enlace para poder tener el usuario administrador:

1
docker exec snikket create-invite --admin --group default

Con este enlace nos dirige a la página de administración donde pondremos nuestro nick y una contraseña.

¿Y sólo puedo comunicarme con usuarios de mi instancia de snikket?

Nop, ya que estamos usando el protocolo xmpp, con lo que podemos comunicarnos con cualquier otro servidor, ya sea snikket, prosody, ejabberd…

¿En el móvil tengo que tener la app de snikket?

Tampoco. Volvemos a lo de antes: como usamos el protocolo xmpp podemos usar la app que más nos guste, como Conversations, AstraChat, Blabber… o clientes de escritorio para güindous, linux e ios.

Pues esto es todo, ya sólo falta empezar a enviar mensajes.

Más info: Web oficial de Snikket

Esta entrada está licenciada bajo CC BY 4.0 por el autor.