Configurazione di un server XMPP

2024-05-04

Snikket

Si tratta di un progetto che, tramite l’utilizzo di container Docker, permette di installare un server XMPP per la messaggistica istantanea.

DNS

Aggiungere i seguenti record DNS:

# Domain           TTL  Class  Type  Target
chat.example.com.  300  IN     A     203.0.113.123
groups.chat.example.com  300  IN     CNAME  chat.example.com.
share.chat.example.com   300  IN     CNAME  chat.example.com.

Installare docker

Per Debian, seguire le istruzioni alla pagina ufficiale.

Installazione di Snikket

mkdir /etc/snikket
cd /etc/snikket

# And then download our docker-compose.yml file:
curl -o docker-compose.yml https://snikket.org/service/resources/docker-compose

Quindi creare il file di configurazione di Snikket:

vim /etc/snikket

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

Firewall

ufw default allow outgoing && ufw default deny incoming
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 5222/tcp
ufw allow 5269/tcp
ufw allow 5000/tcp
ufw allow 3478
ufw allow 3479
ufw allow 5349
ufw allow 5350
ufw allow 49152:65535/udp

Questo il risultato:

 > ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                   ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] 5222/tcp                   ALLOW IN    Anywhere
[ 5] 5269/tcp                   ALLOW IN    Anywhere
[ 6] 5000/tcp                   ALLOW IN    Anywhere
[ 7] 3478                       ALLOW IN    Anywhere
[ 8] 3479                       ALLOW IN    Anywhere
[ 9] 5349                       ALLOW IN    Anywhere
[10] 5350                       ALLOW IN    Anywhere
[11] 49152:65535/udp            ALLOW IN    Anywhere

In particolare:

TCP only

80/443 Web Interface And Group File Sharing Service (HTTP(S))
5222 Client App Connections (Client to Server) (XMPP-c2s)
5269 Federation With Other Snikket Servers (Server to Server) (XMPP-s2s)
5000 File Transfer Proxy (proxy65)

TCP and UDP

3478/3479 Audio/Video Data Proxy Negotiation and IP discovery (STUN/TURN)
5349/5350 Audio/Video Data Proxy Negotiations and IP Discovery over TLS (STUN/TURN over TLS)

UDP only

49152-65535 Audio/Video Data Proxy (Turn Data, see below)

Avviare il servizio col comando:

docker compose up -d

Creazione utente admin

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

Viene generato un link utilizzabile una sola volta. Tutti gli altri utenti possono essere creati dal pannello di controllo una volta eseguito l’accesso.

Troubleshooting

# Checking for errors
cd /etc/snikket
docker-compose exec snikket_certs cat /var/log/letsencrypt/errors.log

# Force the renewal of certificates
cd /etc/snikket
docker-compose exec snikket_certs su letsencrypt -- -c "certbot renew --config-dir /snikket/letsencrypt --cert-path /etc/ssl/certbot --force-renew"

Analisi docker-compose.yml

 > cat /etc/snikket/docker-compose.yml

services:
  # nome del servizio
  snikket_proxy:
    container_name: snikket-proxy
    image: snikket/snikket-web-proxy:beta
    # file con le variabili
    env_file: snikket.conf
    # Se si usa la modalità di rete host per un container, lo stack di rete del container non è isolato dall'host e al container non viene assegnato un proprio indirizzo IP. Per esempio, se si esegue un container che si lega alla porta 80 e si usa la rete host, l'applicazione del container è disponibile sulla porta 80 dell'indirizzo IP dell'host.
    network_mode: host
    # I volumi memorizzano e gestiscono i dati persistenti generati dai container effimeri. Consentono la persistenza dei dati anche dopo la rimozione o l’aggiornamento di un container.
    volumes:
    # Il volume snikket_data viene montato nella directory /snikket del container snikket_proxy
      - snikket_data:/snikket
      - acme_challenges:/var/www/html/.well-known/acme-challenge
    # La clausola restart: "unless-stopped" indica il comportamento di riavvio del servizio in caso di interruzione o arresto.
    # Nel caso di restart: "unless-stopped", Docker riavvierà automaticamente il container a meno che non venga esplicitamente arrestato dall'utente. Questa opzione è utile per garantire che il servizio torni in esecuzione automaticamente dopo eventuali problemi o riavvii del sistema. Tuttavia, se l'utente decide di arrestare manualmente il container, questa istruzione impedisce il riavvio automatico.
    restart: "unless-stopped"

  snikket_certs:
    container_name: snikket-certs
    image: snikket/snikket-cert-manager:beta
    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:beta
    network_mode: host
    env_file: snikket.conf
    restart: "unless-stopped"

  snikket_server:
    container_name: snikket
    image: snikket/snikket-server:beta
    network_mode: host
    volumes:
      - snikket_data:/snikket
    env_file: snikket.conf
    restart: "unless-stopped"

volumes:
  acme_challenges:
  snikket_data:

Update Snikket

cd /etc/snikket
docker compose down
docker compose pull
docker compose up -d

Per maggiori dettagli: upgrading

Applicazioni

Per Android, un’ottima applicazione é monocles chat. Per GNU/Linux invece consigliamo Dino

dino

Riferimenti