Instalar un servidor rápido XMPP con Docker y Proxy Inverso | Programador Web Valencia

Instalar un servidor rápido XMPP con Docker y Proxy Inverso

4 minutos

Chat privado

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.

Otros artículos de interés

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

¿Me invitas a un café? ☕

Puedes hacerlo usando el terminal.

ssh customer@andros.dev -p 5555

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario

Tal vez también te interese...