![Chat privado](/img/blog/2024/07/xmpp.avif)
Gracias a Snikket podemos tener un servidor XMPP en minutos. Por debajo es un servidor Prosody con un frontend web y un proxy inverso. Además viene preconfigurado para obtener certificados de Let’s Encrypt, servidor STUN/TURN y soporte para WebRTC. En otras palabras, es un servidor XMPP completo y listo para usar.
Requisitos
Para poder realizar los pasos necesitarás.
- Un servidor con Docker y Docker Compose instalado.
- Un dominio o subdominio apuntando a la IP del servidor.
- Poder modificar el firewall del servidor, si existiera.
Si es así, ¡vamos a ello!
Tutorial
Primero debes configurar el firewall para que permita el tráfico necesario.
- 5222 TCP
- 5269 TCP
- 5000 TCP/UDP
- 3478 TCP/UDP
- 3479 TCP/UDP
- 5349 TCP/UDP
- 5350 TCP/UDP
A continuación apuntar el dominio, o subdominio, que quieres utilizar a la IP del servidor donde se instalará Snikket.
Después de eso, crea un archivo snikket.conf
con la siguiente información.
# The primary domain of your Snikket instance
SNIKKET_DOMAIN=im.midominio.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=mi@correo.com
Sustituye im.midominio.com
por el dominio que apuntaste a la IP del servidor y mi@correo.com
por tu correo electrónico.
Ahora crea un archivo compose.yaml
con el siguiente contenido.
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:
Si no necesitas un proxy inverso, ya puedes levantarlo.
docker compose up -d
Para crear tu primer usuario ejecuta el siguiente comando.
docker exec snikket create-invite --admin --group default
Se imprimirá un enlace que puedes abrir en tu navegador para crear tu cuenta.
¡A disfrutar de tu libertad en la mensajería instantánea!
Un momento, ¿necesitas un proxy inverso? ¿tu servidor es solo un intermediario? Sin problema, continúa leyendo.
Proxy inverso
Si necesitas un proxy inverso, por ejemplo, para redirigir el tráfico a un servidor XMPP que no está en la misma red, u otro motivo, deberás editar el archivo snikket.conf
añadiendo las siguientes líneas.
SNIKKET_TWEAK_HTTP_PORT=5080
SNIKKET_TWEAK_HTTPS_PORT=5443
Ahora supongamos que el servidor XMPP está en la IP 1.2.3.4
. ¿Cómo redirigir el tráfico? Existen multitud de opciones. Una de ellas es usar socat
, un comando unix que permite redirigir tráfico entre dos puertos o IPs.
Por ejemplo, si yo quiero redirigir el trafico del puerto 22 (SSH) de mi servidor A al puerto 22 de mi servidor B, ejecutaría el siguiente comando en el servidor A.
socat TCP-LISTEN:22,fork TCP:1.2.3.4:22
Y lo mismo con cualquier otro puerto, incluyendo el HTTP o todos los puertos necesarios para el servidor XMP
El caso es el siguiente: El servidor A es donde esta apuntando el dominio y el servidor B es donde esta el servidor XMPP. Bien, en el servidor A crea un fichero compose.yaml
con el contenido.
services:
socat_xmpp_c2s_tcp:
image: alpine/socat
container_name: socat_xmpp_c2s_tcp
command: "TCP-LISTEN:5222,fork TCP:1.2.3.4:5222"
ports:
- 5222:5222
socat_xmpp_s2s_tcp:
image: alpine/socat
container_name: socat_xmpp_s2s_tcp
command: "TCP-LISTEN:5269,fork TCP:1.2.3.4:5269"
ports:
- 5269:5269
socat_proxy65_tcp:
image: alpine/socat
container_name: socat_proxy65_tcp
command: "TCP-LISTEN:5000,fork TCP:1.2.3.4:5000"
ports:
- 5000:5000
socat_proxy65_udp:
image: alpine/socat
container_name: socat_proxy65_udp
command: "UDP-LISTEN:5000,fork UDP:1.2.3.4:5000"
ports:
- 5000:5000/udp
socat_stun_turn_tcp:
image: alpine/socat
container_name: socat_stun_turn_tcp
command: "TCP-LISTEN:3478,fork TCP:1.2.3.4:3478"
ports:
- 3478:3478
socat_stun_turn_udp:
image: alpine/socat
container_name: socat_stun_turn_udp
command: "UDP-LISTEN:3478,fork UDP:1.2.3.4:3478"
ports:
- 3478:3478/udp
socat_stun_turn_3479_tcp:
image: alpine/socat
container_name: socat_stun_turn_3479_tcp
command: "TCP-LISTEN:3479,fork TCP:1.2.3.4:3479"
ports:
- 3479:3479
socat_stun_turn_3479_udp:
image: alpine/socat
container_name: socat_stun_turn_3479_udp
command: "UDP-LISTEN:3479,fork UDP:1.2.3.4:3479"
ports:
- 3479:3479/udp
socat_stun_turn_tls_5349_tcp:
image: alpine/socat
container_name: socat_stun_turn_tls_5349_tcp
command: "TCP-LISTEN:5349,fork TCP:1.2.3.4:5349"
ports:
- 5349:5349
socat_stun_turn_tls_5349_udp:
image: alpine/socat
container_name: socat_stun_turn_tls_5349_udp
command: "UDP-LISTEN:5349,fork UDP:1.2.3.4:5349"
ports:
- 5349:5349/udp
socat_stun_turn_tls_5350_tcp:
image: alpine/socat
container_name: socat_stun_turn_tls_5350_tcp
command: "TCP-LISTEN:5350,fork TCP:1.2.3.4:5350"
ports:
- 5350:5350
socat_stun_turn_tls_5350_udp:
image: alpine/socat
container_name: socat_stun_turn_tls_5350_udp
command: "UDP-LISTEN:5350,fork UDP:1.2.3.4:5350"
ports:
- 5350:5350/udp
Ahora ejecuta el siguiente comando.
docker compose up -d
¡Listo! Ahora el tráfico se redirige al servidor XMPP.
{{ comments.length }} comentarios