Snikket + Nginx

Resulta que snikket (un servidor estupendo de chat xmpp) se instala con docker y ocupa los puertos habitales de nginx de la máquina. Esto hace que tu servidor “solo se pueda usar” para snikket. En este tutorial voy a servir snikket desde nginx instalado en el sistema, y de esta forma podré servir otras aplicaciones además de snikket.

Instrucciones

Voy a usar ubuntu server 24.04 en un servidor virtual (vps) remoto, de los que puedes conseguir por 4€/mes en digital ocean, ovh o hetzner.

Todo el rato estoy usando el usuario root.

Paso 1: Apunta las dns de tu dominio

Supongamos que has comprado el dominio midominio.com y quieres usar para el chat de snikket chat.midominio.com

Debes ir al sitio donde compraste el dominio y apuntar 3 dns:

Paso 2: Abre los puertos

Tal como dice la documentación oficial de snikket, hay que abrir algunos puertos. He añadido además el puerto 22 para no perder la conexión ssh, aunque es recomendable usar un puerto que no esa este.

ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 5222/tcp
ufw allow 5269/tcp
ufw allow 5000/tcp
ufw allow 3478:3479
ufw allow 3478:3479/tcp
ufw allow 3478:3479/udp
ufw allow 5349:5350/udp
ufw allow 5349:5350/tcp
ufw allow 49152:65535/udp
ufw allow 22/tcp
sudo ufw enable

Paso 3: Instala docker, docker-compose y nginx

apt install docker docker-compose nginx

Paso 4: Prepara Snikket

Descarga el docker-compose.yml que tiene preparado el equipo de snikket

mkdir /etc/snikket
cd /etc/snikket
curl -o docker-compose.yml https://snikket.org/service/resources/docker-compose.beta.yml

Creo snikket.conf

nano /etc/snikket/snikket.conf

Indica tu dominio, tu email y guarda

# The primary domain of your Snikket instance
SNIKKET_DOMAIN=chat.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=admin@chat.midominio.com

Paso 5: Certificado ssl

Instalo certbot

apt install nginx python3-certbot-nginx

Obtengo el certificado ssl

certbot certonly --standalone -d share.chat.midominio.com -d groups.chat.midominio.com  -d chat.midominio.com

El resultado debería ser algo así:

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/chat.midominio.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/chat.midominio.com/privkey.pem

Si a ti te falla este paso, revisa las dns. En caso de que hayas comprado el dominio hace pocos minutos, quizás debas esperar unas horas antes de solicitar el certificado.

Como ves, aparecen las rutas de los certificados. Más adelante las utilizarás.

Paso 6: Puertos de docker

El puerto 80 y el 443 van a ser para el nginx del sistema, así que vamos a hacer que el docker que va a tener snikket escuche en el 5080 y 5443.

Para ello hay que aditar /etc/snikket/snikket.conf

nano /etc/snikket/snikket.conf

Escribe esto y guarda:

SNIKKET_TWEAK_HTTP_PORT=5080
SNIKKET_TWEAK_HTTPS_PORT=5443

Paso 7: Crea un bloque para nginx

Edita /etc/nginx/sites-enabled/chat.midominio.com (cambia chat.midominio.com por tu dominio)

nano /etc/nginx/sites-enabled/chat.midominio.com

Ahora pega este bloque de nginx, pero cambiando los dominios por los tuyos.

Además, donde pone ssl_certificate /etc/letsencrypt/live/chat.midominio.com/fullchain.pem y donde pone ssl_certificate_key /etc/letsencrypt/live/chat.midominio.com/privkey.pem debes poner las rutas que obtuviste cuando obtuviste el certificado ssl.

Por ultimo guarda.

server {
  # Accept HTTP connections
  listen 80;
  listen [::]:80;

  server_name chat.midominio.com;
  server_name groups.chat.midominio.com;
  server_name share.chat.midominio.com;

  location / {
      proxy_pass http://localhost:5080/;
      proxy_set_header      Host              $host;
      proxy_set_header      X-Forwarded-For   $proxy_add_x_forwarded_for;

      # This is the maximum size of uploaded files in Snikket
      client_max_body_size 104857616; # 100MB + 16 bytes
  }
}

server {
  # Accept HTTPS connections
  listen [::]:443 ssl ipv6only=on;
  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/chat.midominio.com/fullchain.pem
  ssl_certificate_key /etc/letsencrypt/live/chat.midominio.com/privkey.pem;

  server_name chat.midominio.com;
  server_name groups.chat.midominio.com;
  server_name share.chat.midominio.com;

  location / {
      proxy_pass https://localhost:5443/;
      proxy_set_header      Host              $host;
      proxy_set_header      X-Forwarded-For   $proxy_add_x_forwarded_for;
      # REMOVE THIS IF YOU CHANGE `localhost` TO ANYTHING ELSE ABOVE
      proxy_ssl_verify      off;
      proxy_set_header      X-Forwarded-Proto https;
      proxy_ssl_server_name on;

      # This is the maximum size of uploaded files in Snikket
      client_max_body_size 104857616; # 100MB + 16 bytes

      # For BOSH and WebSockets
      proxy_set_header Connection $http_connection;
      proxy_set_header Upgrade $http_upgrade;
      proxy_read_timeout 900s;

  }
}

Paso 8: Reinicia nginx

systemctl restart nginx

Paso 9: Lanza Snikket

Lanza el docker de snikket

cd /etc/snikket
docker-compose up -d

Paso 10: Comprueba que ha funcionado

Dirígete a chat.midominio.com y verás la pantalla de inicio de snikket.

Paso 11: Crea un usuario nuevo en snikket

Corre el siguiente comando y estarás creando un usuario nuevo con privilesgios de administrador

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

Fin

Ya estaría. Ahora tan solo tienes que isntalar en tu movil o en tu ordenador tu cliente favorito de xmpp (en mi caso instalo desde la playstore snikket en android (igual en ios), y dino en mi pc con linux).