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
    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:

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

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.

Matrix login