Salta el contingut

Pràctica: Servidor de Missatgeria Matrix amb Docker

Objectius

En aquesta pràctica aprendràs a:

  • ✅ Desplegar un servidor Matrix (Synapse) amb Docker
  • ✅ Configurar un homeserver personalitzat amb el teu nom
  • ✅ Instal·lar i utilitzar el client Element
  • ✅ Crear usuaris i sales de xat
  • ✅ Verificar xifrat d'extrem a extrem (E2EE)
  • ✅ Configurar federació (opcional)
  • ✅ Documentar la instal·lació i configuració

Requisits

Programari necessari

  • Docker Desktop o Docker Engine
  • Docker Compose
  • Navegador web modern
  • Editor de text (VS Code, Notepad++, nano)

Coneixements previs

  • Conceptes de missatgeria instantània
  • Docker i contenidors
  • Protocols de xarxa bàsics

Què és Matrix?

Matrix és un protocol obert de comunicació en temps real, pensat per a xat, veu i vídeo, que destaca per ser descentralitzat i federat.

Matrix no és una aplicació, és un estàndard.
Aplicacions com Element són clients que fan servir aquest protocol.


🧩 Com funciona Matrix?

Matrix funciona de manera similar al correu electrònic:

  • Hi ha servidors (homeservers)
  • Hi ha clients
  • Els servidors es federen entre ells

Exemple d’usuari:

@usuari:exemple.cat

🏗️ Components principals

🔹 Homeserver

És el servidor Matrix que gestiona els usuaris i les sales.

Exemples:

  • Synapse (L'opció que treballarem)
  • Dendrite
  • Conduit

🔹 Client

És l’aplicació que utilitza l’usuari per connectar-se al servidor.

Exemples:

  • Element (web, escriptori, mòbil)
  • FluffyChat
  • Nheko

🔹 Sales (Rooms)

Espais on es duen a terme les converses:

  • Xats individuals
  • Grups
  • Comunitats

Cada sala té un identificador únic:

!abc123:exemple.cat

🌐 Federació

La federació és una de les característiques clau de Matrix:

  • Pots tenir el teu propi servidor
  • Pots comunicar-te amb usuaris d’altres servidors
  • No depens d’un servidor central

Funciona igual que el correu electrònic.

🔐 Seguretat

  • Xifrat d’extrem a extrem (E2EE) per defecte
  • El servidor no pot llegir els missatges
  • Basat en Olm i Megolm

📡 Funcionalitats

  • 💬 Missatgeria instantània
  • 📞 Trucades de veu
  • 🎥 Videotrucades
  • 📎 Enviament de fitxers
  • 🤖 Bots i integracions

🆚 Comparació amb altres plataformes

Característica Matrix WhatsApp
Descentralitzat
Servidor propi
Codi obert
Federació
Xifrat E2EE
Control de dades

Part 1: Preparació de l'Entorn

Pas 1.1: Crear estructura de directoris

Crea un directori de treball personalitzat amb el teu nom i cognom:

# Substitueix NOMCOGNOM pel teu nom i cognom (minúscules, sense espais)
mkdir -p ~/matrix-NOMCOGNOM
cd ~/matrix-NOMCOGNOM

# Crear subdirectoris
mkdir -p data config

Exemple per a l'estudiant Francesc Barragan:

mkdir -p ~/matrix-fbarragan
cd ~/matrix-fbarragan
mkdir -p data config

Pas 1.2: Generar fitxer de configuració inicial

Utilitzarem el contenidor oficial de Synapse per generar una configuració base:

# PERSONALITZA: Substitueix matrix.NOMCOGNOM.local pel teu homeserver
docker run -it --rm \
  -v $(pwd)/data:/data \
  -e SYNAPSE_SERVER_NAME=matrix.NOMCOGNOM.local \
  -e SYNAPSE_REPORT_STATS=no \
  matrixdotorg/synapse:latest generate

Exemple per Francesc Barragan:

docker run -it --rm \
  -v $(pwd)/data:/data \
  -e SYNAPSE_SERVER_NAME=matrix.fbarragan.local \
  -e SYNAPSE_REPORT_STATS=no \
  matrixdotorg/synapse:latest generate

Això crearà data/homeserver.yaml amb la configuració base.


Part 2: Configuració de Synapse

Pas 2.1: Editar homeserver.yaml

Edita el fitxer generat data/homeserver.yaml i personalitza els següents paràmetres:

# NOM DEL SERVIDOR - PERSONALITZA AMB EL TEU NOM
server_name: "matrix.NOMCOGNOM.local"

# Permet registre d'usuaris (inicialment sí, després desactiva)
enable_registration: true
enable_registration_without_verification: true

# Base de dades (SQLite per defecte, suficient per aquesta pràctica)
database:
  name: sqlite3
  args:
    database: /data/homeserver.db

# Listeners - Port 8008 per HTTP
listeners:
  - port: 8008
    tls: false
    type: http
    x_forwarded: true
    bind_addresses: ['::']

    resources:
      - names: [client, federation]
        compress: false

# Informació pública del servidor - PERSONALITZA
public_baseurl: "http://matrix.NOMCOGNOM.local:8008"

# Administrador - PERSONALITZA AMB EL TEU EMAIL
admin_contact: "mailto:NOMCOGNOM@sapalomera.cat"

# Activar xifrat d'extrem a extrem
encryption_enabled_by_default_for_room_type: all

# Límits de càrrega
max_upload_size: 50M

# Registre d'activitat (logs)
log_config: "/data/matrix.NOMCOGNOM.local.log.config"

Pas 2.2: Configurar logs

Edita el fitxer data/matrix.NOMCOGNOM.local.log.config:

version: 1

formatters:
  precise:
    format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(message)s'

handlers:
  console:
    class: logging.StreamHandler
    formatter: precise
    level: INFO

  file:
    class: logging.handlers.RotatingFileHandler
    formatter: precise
    filename: /data/homeserver.log
    maxBytes: 10485760
    backupCount: 3
    level: INFO

root:
  level: INFO
  handlers: [console, file]

Part 3: Docker Compose

Pas 3.1: Crear docker-compose.yml

Crea el fitxer docker-compose.yml personalitzat:

services:
  # PERSONALITZA: Nom del servei amb el teu nom
  synapse-NOMCOGNOM:
    image: matrixdotorg/synapse:latest
    container_name: matrix-synapse-NOMCOGNOM

    ports:
      - "8008:8008"    # Client API i Federation

    volumes:
      - ./data:/data

    environment:
      - SYNAPSE_SERVER_NAME=matrix.NOMCOGNOM.local
      - SYNAPSE_REPORT_STATS=no
      - TZ=Europe/Madrid

    restart: unless-stopped

    networks:
      - matrix-network

  # Cliente Element Web - PERSONALITZAT
  element-NOMCOGNOM:
    image: vectorim/element-web:latest
    container_name: matrix-element-NOMCOGNOM

    ports:
      - "8080:80"

    volumes:
      - ./config/element-config.json:/app/config.json:ro

    restart: unless-stopped

    depends_on:
      - synapse-NOMCOGNOM

    networks:
      - matrix-network

networks:
  matrix-network:
    driver: bridge

Pas 3.2: Configurar Element

Crea config/element-config.json personalitzat:

{
  "default_server_config": {
    "m.homeserver": {
      "base_url": "http://matrix.NOMCOGNOM.local:8008",
      "server_name": "matrix.NOMCOGNOM.local"
    }
  },
  "brand": "Element - Matrix NOMCOGNOM",
  "default_country_code": "ES",
  "show_labs_settings": true,
  "default_theme": "light",
  "room_directory": {
    "servers": ["matrix.NOMCOGNOM.local"]
  },
  "enable_presence_by_hs_url": {
    "http://matrix.NOMCOGNOM.local:8008": true
  },
  "setting_defaults": {
    "breadcrumbs": true
  }
}

Part 4: Desplegament i Verificació

Pas 4.1: Iniciar els serveis

# Aixecar els contenidors
docker-compose up -d

# Verificar que estan actius
docker-compose ps

Hauries de veure:

NAME                        STATUS
matrix.synapse-NOMCOGNOM   Up
matrix-element-NOMCOGNOM   Up
Image title

Pas 4.2: Verificar logs

# Logs de Synapse
docker-compose logs synapse-NOMCOGNOM

# Logs en temps real
docker-compose logs -f synapse-NOMCOGNOM
Image title

Busca missatges com:

Synapse now listening on TCP port 8008
Database engine 'sqlite3'
Started synapse.app.homeserver

Si trobeu algun error l'heu de solucionar abans de continuar

Pas 4.3: Accedir a Element

Obre el navegador i accedeix a:

http://matrix.NOMCOGNOM.local:8080

Hauries de veure la interfície d'Element amb el títol personalitzat "Element - Matrix NOMCOGNOM". Si et dona un avis de navegador no compatible, continuem igualment. És degut al tema de SSL.

Image title

Captura de pantalla 1: Pàgina inicial d'Element amb el teu nom al títol.


Part 5: Creació d'Usuaris

Pas 5.1: Registrar el primer usuari (admin)

Des de la interfície d'Element:

  1. Clica "Create Account"
  2. Assegura't que el homeserver és matrix.NOMCOGNOM.local
  3. Username: Utilitza el teu nom, per exemple francesc (minúscules)
  4. Password: Contrasenya forta
  5. Clica "Register"

Image title

El teu MXID (Matrix ID) serà: @francesc:matrix.fbarragan.local

Quan s'hagi creat el teu usuari se't presentarà una pantalla com la següent:

Image title

Pas 5.2: Crear usuari des de terminal (alternativa)

També pots crear usuaris des del terminal:

# Crear usuari admin - PERSONALITZA EL NOM
docker exec -it matrix-synapse-NOMCOGNOM \
  register_new_matrix_user \
  http://matrix.NOMCOGNOM.local:8008 \
  -c /data/homeserver.yaml \
  -u NOMCOGNOM-admin \
  -p ContraForta123! \
  --admin

Exemple per Francesc Barragan:

docker exec -it matrix-synapse-fbarragan \
  register_new_matrix_user \
  http://matrix.fbarragan.local:8008 \
  -c /data/homeserver.yaml \
  -u fbarragan-admin \
  -p ContraForta123! \
  --admin

Image title

Pas 5.3: Crear usuaris addicionals

Crea almenys 2 usuaris més per provar la missatgeria (amb opció --no-admin):

Usuari 2: - Username: NOMCOGNOM-user1 (exemple: fbarragan-user1) - Password: A triar

Usuari 3: - Username: NOMCOGNOM-user2 (exemple: fbarragan-user2) - Password: A triar

Pots crear-los des d'Element o amb el comando register_new_matrix_user.

Captura de pantalla 2: Llista d'usuaris creats (mínim 3).


Part 6: Proves de Funcionalitat

Pas 6.1: Crear una sala de xat

Amb l'usuari admin loguejat a Element:

  1. Clica el botó "+" o "Create a room"
  2. Room name: Sala de NOMCOGNOM (exemple: Sala de Francesc Barragan)
  3. Topic: "Sala de proves per a la pràctica de Matrix"
  4. Visibility: Private
  5. Enable end-to-end encryption: ✅ Activat
  6. Clica "Create room"

Captura de pantalla 3: Sala creada amb el nom personalitzat.

Pas 6.2: Convidar altres usuaris

  1. Dins de la sala, clica la icona d'informació (ℹ️)
  2. Clica "Invite"
  3. Introdueix el MXID dels altres usuaris:
  4. @NOMCOGNOM-user1:matrix.NOMCOGNOM.local
  5. @NOMCOGNOM-user2:matrix.NOMCOGNOM.local
  6. Envia les invitacions

Pas 6.3: Provar missatgeria E2EE

  1. Obre una finestra d'incògnit al navegador
  2. Accedeix a http://matrix.NOMCOGNOM.local:8080
  3. Fes login amb NOMCOGNOM-user1
  4. Accepta la invitació a la sala

Image title

  1. Verifica les claus de xifrat entre els usuaris(icona d'escut verd)

Image title Image title

  1. Envia missatges entre usuaris

Text del missatge: "Hola, sóc [Nom Complet] provant Matrix amb xifrat E2EE!"

Captura de pantalla 4: Conversa entre usuaris amb indicador de xifrat E2EE visible (escut verd).

Pas 6.4: Verificar dispositius

  1. A la sala, clica la icona d'escut
  2. "Verify" → Comparar "Emoji" o "Numbers"
  3. Si coincideixen, marca com verificat

Image title

Això confirma que no hi ha man-in-the-middle.

Captura de pantalla 5: Verificació de dispositius completada.


Part 7: Funcionalitats Avançades

Pas 7.1: Compartir fitxers

  1. A la sala, clica la icona de clip 📎
  2. Selecciona un fitxer (imatge, PDF, etc.)
  3. Puja'l i envia
  4. Verifica que el fitxer es pot descarregar des de l'altre usuari

Captura de pantalla 5a: Compartir fitxers

Pas 7.2: Formatar missatges

Matrix suporta Markdown:

**Negreta**
*Cursiva*
`Codi inline`
Bloc de codi
  • Llistes
  • De punts

Cites

Envia missatges amb diferents formats.

Captura de pantalla 5b: Missatges en diferents formats

Pas 7.3: Reaccions i respostes

  1. Passa el ratolí sobre un missatge
  2. Clica l'emoji per afegir una reacció 👍 ❤️ 😄
  3. Clica la fletxa per respondre a un missatge específic

Part 8: Administració del Servidor

Pas 8.1: Desactivar registre obert

Un cop creats els usuaris necessaris, desactiva el registre públic per seguretat:

Edita data/homeserver.yaml:

enable_registration: false

Reinicia Synapse:

docker-compose restart synapse-NOMCOGNOM

Pas 8.2: Consultar base de dades

Pots explorar la base de dades SQLite:

# Accedir al contenidor
docker exec -it matrix-synapse-NOMCOGNOM bash

# Dins del contenidor
sqlite3 /data/homeserver.db

# Consultes SQL
.tables
SELECT name FROM users;
SELECT room_id, name FROM room_aliases;
.quit

Captura de pantalla 6: Sortida de la consulta SQL mostrant els usuaris creats.

Pas 8.3: Monitoritzar recursos

# Ús de recursos dels contenidors
docker stats

# Logs d'activitat
tail -f data/homeserver.log

Part 9: Client de Terminal (Opcional)

Pas 9.1: Instal·lar gomuks

gomuks és un client Matrix de terminal escrit en Go.

# Linux
wget https://github.com/tulir/gomuks/releases/download/v0.3.0/gomuks-linux-amd64
chmod +x gomuks-linux-amd64
./gomuks-linux-amd64

Pas 9.2: Configurar connexió

Dins de gomuks:

/login matrix.NOMCOGNOM.local
Username: NOMCOGNOM-admin
Password: ********

Captura de pantalla 7 (opcional): gomuks connectat al servidor.


Qüestions i Exercicis

Qüestió 1: Protocols i arquitectura

a) Explica amb les teves paraules com funciona la federació a Matrix. Per què és important?

b) Quina diferència hi ha entre Matrix i WhatsApp pel que fa a l'arquitectura?

c) Què és un homeserver i quin paper juga a Matrix?

Qüestió 2: Xifrat E2EE

a) Què significa E2EE (End-to-End Encryption)?

b) Per què és important verificar els dispositius amb emojis o números?

c) Pot el servidor Synapse llegir els missatges xifrats? Justifica la resposta.

Qüestió 3: Recursos

Consulta l'ús de recursos amb docker stats:

a) Quanta memòria RAM consumeix el contenidor Synapse?

b) Quant de CPU utilitza durant converses actives vs inactives?

c) És viable executar aquest servidor en un Raspberry Pi? Justifica.

Exercici 1: Sala pública

Crea una sala pública anomenada Anuncis-NOMCOGNOM: - Sense xifrat E2EE - Accessible per a qualsevol usuari del homeserver - Publica un anunci: "Servidor Matrix de [Nom Complet] operatiu!"

Exercici 2: Bot simple (avançat)

Investiga com crear un bot Matrix simple amb Python utilitzant matrix-nio.

Crea un bot que: - Respongui "Hola! Sóc el bot de [Nom]" quan algú escrigui !hola - S'uneixi automàticament a sales quan és convidat

Exercici 3: Backup de dades

Crea un script que:

  1. Aturi el servidor Synapse
  2. Faci una còpia de seguretat de data/homeserver.db
  3. Comprimexi el backup amb la data actual: backup-matrix-NOMCOGNOM-YYYYMMDD.tar.gz
  4. Torni a iniciar Synapse

Lliurament

Format de lliurament

Document PDF amb les següents seccions:

1. Portada

  • Nom complet
  • Curs i grup
  • Data de realització

2. Configuració

  • Contingut complet de homeserver.yaml (secció rellevant)
  • Contingut complet de docker-compose.yml
  • Contingut de element-config.json
  • Destacar les personalitzacions amb el teu nom

3. Captures de pantalla (mínimes)

  1. Element amb títol personalitzat
  2. Llista d'usuaris creats (mínim 3, amb el teu nom)
  3. Sala creada amb nom personalitzat
  4. Conversa amb missatges xifrats E2EE (escut verd visible)
  5. Verificació de dispositius completada
  6. Consulta SQL mostrant usuaris
  7. (Opcional) Client de terminal gomuks connectat

4. Taula d'usuaris

MXID Nom d'usuari Admin? Descripció
@fbarragan:matrix-fbarragan.local francesc Usuari principal admin
... ... ... ...

5. Proves realitzades

  • Descripció de les proves de missatgeria
  • Verificació E2EE realitzada
  • Compartició de fitxers testejada
  • Resultat de cada prova

6. Respostes a qüestions

  • Qüestió 1: a, b, c amb respostes detallades
  • Qüestió 2: a, b, c amb justificacions
  • Qüestió 3: a, b, c amb dades reals del sistema

7. Exercicis opcionals

  • Documentació dels exercicis 1, 2 o 3 realitzats

8. Reflexió personal (250-300 paraules)

  • Dificultats trobades
  • Comparativa Matrix vs altres plataformes que coneixes
  • Avantatges d'auto-allotjar missatgeria
  • Casos d'ús reals on aplicaries Matrix

Criteris d'Avaluació

Criteri Punts Pes
Personalització (nom en configuracions, usuaris, sales) 1,5 15%
Configuració Synapse funcional 2,0 20%
Docker Compose correcte 1,5 15%
Usuaris creats i funcionalment (3+) 1,0 10%
Proves de missatgeria E2EE 1,5 15%
Captures de pantalla completes 1,5 15%
Respostes a qüestions 1,0 10%
TOTAL 10,0 100%

Penalitzacions

Infracció Penalització
Còpia detectada (configuracions idèntiques) -10 (qualificació 0)
Sense personalització (NOMCOGNOM sense substituir) -2,0 punts
Contenidors no s'inicien -2,5 punts
Menys de 3 usuaris creats -1,0 punts
E2EE no verificat o no funcional -1,5 punts
Captura obligatòria absent -0,25 punts per captura
Format diferent de PDF -0,5 punts

Requisits mínims per aprovar

  • Synapse i Element desplegats i funcionals
  • Almenys 2 usuaris creats amb noms personalitzats
  • Sala de xat amb E2EE funcional
  • Missatges enviats entre usuaris
  • Captures de pantalla mínimes (4 de 7)
  • Personalització bàsica amb nom de l'estudiant

Recursos Addicionals

Documentació oficial

Clients alternatius

Eines útils


Solució de Problemes

Error: "Failed to join homeserver"

Causa: Synapse no està accessible o el nom del homeserver és incorrecte.

Solució:

# Verificar que Synapse està actiu
docker-compose ps

# Comprovar logs
docker-compose logs synapse-NOMCOGNOM

# Verificar nom a element-config.json coincideix amb homeserver.yaml

Error: "Unable to register user"

Causa: Registre desactivat o error de permisos.

Solució:

# A homeserver.yaml
enable_registration: true
enable_registration_without_verification: true

Reinicia: docker-compose restart

Els missatges no es xifren

Causa: E2EE no activat per defecte o sala creada sense xifrat.

Solució: Crea una nova sala marcant explícitament "Enable end-to-end encryption".

Port 8008 ja en ús

Solució:

# Trobar què utilitza el port
sudo lsof -i :8008

# O canvia el port a docker-compose.yml
ports:
  - "8009:8008"


Conclusió

Ara tens un servidor Matrix completament funcional amb:

  • ✅ Homeserver Synapse personalitzat
  • ✅ Client web Element configurat
  • ✅ Usuaris creats amb el teu nom
  • ✅ Xifrat E2EE verificat
  • ✅ Infraestructura desplegada amb Docker

Aquesta configuració et permet:

  • Comunicació privada i segura
  • Control total de les dades
  • Independència de plataformes comercials
  • Base per a projectes més grans (bridges, bots, federació)

Excel·lent feina dominant Matrix i la missatgeria federada! 💬🔐