265 lines
9.6 KiB
Markdown
265 lines
9.6 KiB
Markdown
# Snikket
|
||
|
||
Si tratta di un progetto che, tramite l'utilizzo di container Docker, permette di installare un servizio su un server fisico o virtuale per configurarlo in modo da riuscire a gestire autonomamente la messaggistica tramite il protocollo XMPP.
|
||
|
||
## DNS
|
||
|
||
```bash
|
||
# 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.
|
||
```
|
||
|
||
## Docker
|
||
|
||
```bash
|
||
apt update && apt upgrade
|
||
```
|
||
Per Debian, seguire le istruzioni alla pagina [ufficiale](https://docs.docker.com/install/linux/docker-ce/debian/). In particolare:
|
||
|
||
|
||
```bash
|
||
# Add Docker's official GPG key:
|
||
sudo apt-get update
|
||
sudo apt-get install ca-certificates curl gnupg
|
||
sudo install -m 0755 -d /etc/apt/keyrings
|
||
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||
sudo chmod a+r /etc/apt/keyrings/docker.gpg
|
||
|
||
# Add the repository to Apt sources:
|
||
echo \
|
||
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
|
||
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
|
||
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||
|
||
sudo apt-get update
|
||
|
||
# To install the latest version, run:
|
||
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
||
|
||
# Verify that the installation is successful by running the hello-world image:
|
||
sudo docker run hello-world
|
||
```
|
||
|
||
## Installazione di Snikket
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
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
|
||
|
||
```bash
|
||
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:
|
||
|
||
```bash
|
||
> 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
|
||
[12] 1222/tcp (v6) ALLOW IN Anywhere (v6)
|
||
[13] 80/tcp (v6) ALLOW IN Anywhere (v6)
|
||
[14] 443/tcp (v6) ALLOW IN Anywhere (v6)
|
||
[15] 5222/tcp (v6) ALLOW IN Anywhere (v6)
|
||
[16] 5269/tcp (v6) ALLOW IN Anywhere (v6)
|
||
[17] 5000/tcp (v6) ALLOW IN Anywhere (v6)
|
||
[18] 3478 (v6) ALLOW IN Anywhere (v6)
|
||
[19] 3479 (v6) ALLOW IN Anywhere (v6)
|
||
[20] 5349 (v6) ALLOW IN Anywhere (v6)
|
||
[21] 5350 (v6) ALLOW IN Anywhere (v6)
|
||
[22] 49152:65535/udp (v6) ALLOW IN Anywhere (v6)
|
||
```
|
||
|
||
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:
|
||
|
||
```bash
|
||
docker compose up -d
|
||
```
|
||
|
||
### Creazione utente admin
|
||
|
||
```bash
|
||
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
|
||
|
||
[https://snikket.org/service/help/setup/troubleshooting/](https://snikket.org/service/help/setup/troubleshooting/)
|
||
|
||
```bash
|
||
# 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
|
||
|
||
```bash
|
||
> cat /etc/snikket/docker-compose.yml
|
||
|
||
version: "3.3"
|
||
|
||
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:
|
||
```
|
||
|
||
### cli dei volumi
|
||
|
||
```bash
|
||
> docker volume help
|
||
|
||
Usage: docker volume COMMAND
|
||
|
||
Manage volumes
|
||
|
||
Commands:
|
||
create Create a volume
|
||
inspect Display detailed information on one or more volumes
|
||
ls List volumes
|
||
prune Remove all unused local volumes
|
||
rm Remove one or more volumes
|
||
```
|
||
|
||
## Comandi docker compose (in riferimento ai volumi)
|
||
|
||
Docker Compose fornisce diversi comandi che aiutano a gestire in modo efficace l’applicazione e le sue risorse. Nel dettaglio questi comandi e il loro rapporto con i volumi:
|
||
|
||
- `docker compose up`: crea e avvia l’applicazione, compresi i servizi, le reti e i volumi. Se si definisce un volume denominato nel file docker-compose.yml prima che esista, questo comando lo creerà automaticamente.
|
||
- `docker compose down`: arresta e rimuove i servizi e le reti dell’applicazione. Per impostazione predefinita, non rimuove i volumi denominati. Per rimuovere i volumi denominati, usare il flag `--volumes` o `-v`.
|
||
- `docker compose ps`: elenca i container e il loro stato attuale, comprese le informazioni relative ai volumi.
|
||
- `docker compose config`: convalida e visualizza la configurazione effettiva generata dal file docker-compose.yml, comprese le definizioni dei volumi.
|
||
|
||
## Update Snikket
|
||
|
||
```bash
|
||
cd /etc/snikket
|
||
docker compose down
|
||
docker compose pull
|
||
docker compose up -d
|
||
```
|
||
|
||
Per maggiori dettagli: [https://snikket.org/service/help/setup/upgrading/](https://snikket.org/service/help/setup/upgrading/)
|
||
|
||
## Collegamenti
|
||
|
||
- [https://clarintuxmail.eu.org/articles/server3.html](https://clarintuxmail.eu.org/articles/server3.html)
|
||
- [https://snikket.org/service/quickstart/](https://snikket.org/service/quickstart/)
|
||
- [https://docs.lugbz.org/install-snikket.html](https://docs.lugbz.org/install-snikket.html)
|
||
- [https://wiki.xmpp-it.net/index.php/Installazione_di_un_server_Snikket](https://wiki.xmpp-it.net/index.php/Installazione_di_un_server_Snikket)
|
||
- [https://snikket.org/service/help/advanced/firewall/](https://snikket.org/service/help/advanced/firewall/)
|
||
- [https://snikket.org/](https://snikket.org/)
|