on
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:
- Una dns de tipo a desde chat.midominio.com hacia la ip del servidor vps
- Una dns de tipo cname desde groups.chat.midominio.com hacia chat.midominio.com
- Una dns de tipo cname desde share.chat.midominio.com hacia chat.midominio.com
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).