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
O también puedes usar un servidor Nginx. Edita el archivo /etc/nginx/nginx.conf
y añade las siguientes líneas.
...
stream {
upstream snikket1 {
server 1.2.3.4:5222;
}
server {
listen 5222;
proxy_pass snikket1;
# proxy reverse TLS
ssl_preread on;
}
upstream snikket2 {
server 1.2.3.4:5269;
}
server {
listen 5269;
proxy_pass snikket2;
# proxy reverse TLS
ssl_preread on;
}
upstream snikket3 {
server 1.2.3.4:5000;
}
server {
listen 5000;
proxy_pass snikket3;
# proxy reverse TLS
ssl_preread on;
}
upstream snikket4 {
server 1.2.3.4:3478;
}
server {
listen 3478;
proxy_pass snikket4;
# proxy reverse TLS
ssl_preread on;
}
upstream snikket5 {
server 1.2.3.4:3479;
}
server {
listen 3479;
proxy_pass snikket5;
# proxy reverse TLS
ssl_preread on;
}
upstream snikket6 {
server 1.2.3.4:5349;
}
server {
listen 5349;
proxy_pass snikket6;
# proxy reverse TLS
ssl_preread on;
}
upstream snikket7 {
server 1.2.3.4:5350;
}
server {
listen 5350;
proxy_pass snikket7;
# proxy reverse TLS
ssl_preread on;
}
}
¡Listo! Ahora el tráfico se redirige al servidor XMPP.
{{ comments.length }} comentarios