Matrix
Requisiti
- Un dominio registrato (circa 2€ l'anno con OVH) - Non è uno sponsor! Amo solo il servizio 😉
- Un VPS pubblico o PC / RaspberryPi da utilizzare come server (idealmente sempre accesso).
- Aprire le porte 80, 443, 8008 e 8448 (Firewall / NAT / Port Forwarding) per esporre il server Matrix.
Configurazione del dominio
Questa parte è la più arbitraria perché dipende fortemente dal {domain, internet} provider scelto, quindi mi limiterò a sintetizzare per sommi capi:
- Registra un dominio di secondo livello (ES: pippo.ovh)
- Crea un dominio di terzo livello (ES: matrix.pippo.ovh)
- Punta il dominio all'IP del server Matrix. Se non usi un VPS e hai un IP dinamico, spero tu abbia scelto un buon provider (tipo OVH) che supporta il DynDNS via API 😉
Configurazione del server Matrix
Sulla macchina server:
- Installa docker engine seguendo le istruzioni per la tua distribuzione
- Installa il pacchetto
opensslse non è già presente
Esegui quanto segue, avendo cura di impostare il tuo dominio ed email di contatto:
export DOMINIO=matrix.pippo.ovh
export TUA_MAIL=tua@email.tld
export DB_USER=synapse
export DB_NAME=synapse
export DB_PASSWORD=$(openssl rand -base64 48)
Genera il docker-compose.yaml con:
mkdir ~/matrix
cd ~/matrix
cat > docker-compose.yaml <<EOF
services:
synapse:
image: docker.io/matrixdotorg/synapse:latest
container_name: matrix
restart: unless-stopped
environment:
- SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
- SYNAPSE_SERVER_NAME=$DOMINIO
- SYNAPSE_REPORT_STATS=yes
volumes:
- ./matrix-config:/data:Z
depends_on:
- db
ports:
# accesso locale per gli endpoint admin
- 127.0.0.1:8888:8008
- 127.0.0.1:8444:8448
labels:
- traefik.enable=true
# --- HTTP to HTTPS ---
- traefik.http.routers.http-synapse.entryPoints=web
- traefik.http.routers.http-synapse.rule=Host("${DOMINIO}")
- traefik.http.middlewares.https_redirect.redirectscheme.scheme=https
- traefik.http.middlewares.https_redirect.redirectscheme.permanent=true
- traefik.http.routers.http-synapse.middlewares=https_redirect
# --- HTTPS router ---
- traefik.http.routers.https-synapse.entryPoints=websecure
- traefik.http.routers.https-synapse.rule=Host("${DOMINIO}")
- traefik.http.routers.https-synapse.service=synapse
- traefik.http.routers.https-synapse.tls=true
- traefik.http.routers.https-synapse.tls.certResolver=myresolver
- traefik.http.services.synapse.loadbalancer.server.port=8008
# --- BLOCCA gli admin endpoint: non vogliamo esporli pubblicamente! ---
- traefik.http.routers.synapse-admin-block.rule=Host("${DOMINIO}") && PathPrefix("/_synapse/admin")
- traefik.http.routers.synapse-admin-block.entrypoints=websecure
- traefik.http.routers.synapse-admin-block.priority=100
- traefik.http.routers.synapse-admin-block.middlewares=deny-all
- traefik.http.routers.synapse-admin-block.tls=true
- traefik.http.middlewares.deny-all.errors.status=403-599
- traefik.http.middlewares.deny-all.errors.service=noop
- traefik.http.services.noop.loadbalancer.server.port=65535
traefik:
image: "traefik:v3.3"
container_name: "traefik"
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entryPoints.web.address=:80"
- "--entryPoints.websecure.address=:443"
- "--certificatesresolvers.myresolver.acme.httpchallenge=true"
- "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
#- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
- "--certificatesresolvers.myresolver.acme.email=$TUA_MAIL"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
- "8448:8448"
- "8008:8008"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./letsencrypt:/letsencrypt:Z"
db:
image: docker.io/postgres:15-alpine
container_name: matrix-db
env_file: ./matrix.env
volumes:
- ./schemas:/var/lib/postgresql/data:Z
EOF
cat > matrix.env <<EOF
POSTGRES_USER=$DB_USER
POSTGRES_PASSWORD=$DB_PASSWORD
POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
EOF
Genera la configurazione di matrix con:
sudo docker run -it --rm -v ~/matrix/matrix-config/:/data:Z -e SYNAPSE_SERVER_NAME=$DOMINIO -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest generate
Per usare il database postgres anziché sqlite (lento)
# remove sqlite references
sed -e "/database:/,+3d" ~/matrix/matrix-config/homeserver.yaml
printf "\n\ndatabase:\n name: psycopg2\n args:\n user: $DB_USER\n password: $DB_PASSWORD\n dbname: $DB_NAME\n host: matrix-db\n cp_min: 5\n cp_max: 10\n" | sudo tee -a ~/matrix/matrix-config/homeserver.yaml
Infine, avvia lo stack:
sudo docker compose up -d
Controllare che tutto funzioni
dopo alcuni minuti, sudo docker ps dovrebbe riportare qualcosa di simile:
Creazione di un utente admin
Una volta che matrix è in esecuzione, ottieni il nome del container con:
docker ps
Per creare il primo utente admin, esegui:
USERNAME=tuo_username
PASSWORD=$(openssl rand -base64 10)
sudo docker exec -it <NOME-CONTAINER-QUI> register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -a -u $USERNAME -p $PASSWORD
echo $PASSWORD
Fatto!
Ora puoi provare il login con un client Matrix.