Matrix
Metti in piedi un server Matrix in 5 minuti seguendo questa guida. Nessuna particolare competenza richiesta: segui la procedura, imposta le variabili con i tuoi valori e copincolla i comandi nel terminale!
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: synapse
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
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:
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
matrix-db docker.io/postgres:15-alpine "docker-entrypoint.s…" db About a minute ago Up About a minute 5432/tcp
synapse docker.io/matrixdotorg/synapse:latest "/start.py" synapse 14 seconds ago Up 12 seconds (health: starting) 8009/tcp, 127.0.0.1:8888->8008/tcp, 127.0.0.1:8444->8448/tcp
traefik traefik:v3.3 "/entrypoint.sh --ap…" traefik About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp, 0.0.0.0:8008->8008/tcp, :::8008->8008/tcp, 0.0.0.0:8448->8448/tcp, :::8448->8448/tcp
All'indirizzo definito in $DOMINIO dovresti vedere la pagina di benvenuto di Matrix:
$ curl https://matrix.morrolinux.it
<html>
<head>
<meta http-equiv="refresh" content="0;URL=/_matrix/static">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<a href="/_matrix/static">click here</a>
</body>
</html>
Se è così, siamo pronti per creare il primo utente admin!
Creazione di un utente admin
Per creare il primo utente admin, esegui:
USERNAME=morro
PASSWORD=$(openssl rand -base64 10)
sudo docker exec -it synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -a -u $USERNAME -p $PASSWORD
Per visualizzare la password dell'utente appena creato:
echo $PASSWORD
Salva la password in un luogo sicuro! Non sarai più in grado di vederla
Ora puoi provare il login con un client Matrix.Creazione di utenti non privilegiati
Come sopra, ma senza l'opzione -a :
USERNAME=pippo
PASSWORD=$(openssl rand -base64 10)
sudo docker exec -it synapse register_new_matrix_user http://localhost:8008 -c /data/homeserver.yaml -u $USERNAME -p $PASSWORD
echo $PASSWORD
Matrix login
In questo esempio usiamo il client Element.
Visita app.element.io e premi Modifica per fare l'accesso con un Homeserver differente:
Alla schermata successiva, inserisci il dominio impostato in precedenza e premi Continua
Infine, inserisci username e password generati al punto precedente e premi Accedi:
Benvenuto nel tuo nuovo homeserver!



