Skip to main content

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:

  1. Registra un dominio di secondo livello (ES: pippo.ovh)
  2. Crea un dominio di terzo livello (ES: matrix.pippo.ovh)
  3. 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:

  1. Installa docker engine seguendo le istruzioni per la tua distribuzione
  2. Installa il pacchetto openssl se 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!