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