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:
🏗️ 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:
🌐 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 | |
|---|---|---|
| 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:
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
Hauries de veure:
Pas 4.2: Verificar logs
# Logs de Synapse
docker-compose logs synapse-NOMCOGNOM
# Logs en temps real
docker-compose logs -f synapse-NOMCOGNOM
Busca missatges com:
Si trobeu algun error l'heu de solucionar abans de continuar
Pas 4.3: Accedir a Element
Obre el navegador i accedeix a:
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.

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:
- Clica "Create Account"
- Assegura't que el homeserver és
matrix.NOMCOGNOM.local - Username: Utilitza el teu nom, per exemple
francesc(minúscules) - Password: Contrasenya forta
- Clica "Register"

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:

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

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:
- Clica el botó "+" o "Create a room"
- Room name:
Sala de NOMCOGNOM(exemple:Sala de Francesc Barragan) - Topic: "Sala de proves per a la pràctica de Matrix"
- Visibility: Private
- Enable end-to-end encryption: ✅ Activat
- Clica "Create room"
Captura de pantalla 3: Sala creada amb el nom personalitzat.
Pas 6.2: Convidar altres usuaris
- Dins de la sala, clica la icona d'informació (ℹ️)
- Clica "Invite"
- Introdueix el MXID dels altres usuaris:
@NOMCOGNOM-user1:matrix.NOMCOGNOM.local@NOMCOGNOM-user2:matrix.NOMCOGNOM.local- Envia les invitacions
Pas 6.3: Provar missatgeria E2EE
- Obre una finestra d'incògnit al navegador
- Accedeix a
http://matrix.NOMCOGNOM.local:8080 - Fes login amb
NOMCOGNOM-user1 - Accepta la invitació a la sala

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

- 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
- A la sala, clica la icona d'escut
- "Verify" → Comparar "Emoji" o "Numbers"
- Si coincideixen, marca com verificat

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
- A la sala, clica la icona de clip 📎
- Selecciona un fitxer (imatge, PDF, etc.)
- Puja'l i envia
- 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:
- Llistes
- De punts
Cites
Envia missatges amb diferents formats.
Captura de pantalla 5b: Missatges en diferents formats
Pas 7.3: Reaccions i respostes
- Passa el ratolí sobre un missatge
- Clica l'emoji per afegir una reacció 👍 ❤️ 😄
- 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:
Reinicia Synapse:
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
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:
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:
- Aturi el servidor Synapse
- Faci una còpia de seguretat de
data/homeserver.db - Comprimexi el backup amb la data actual:
backup-matrix-NOMCOGNOM-YYYYMMDD.tar.gz - 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)
- Element amb títol personalitzat
- Llista d'usuaris creats (mínim 3, amb el teu nom)
- Sala creada amb nom personalitzat
- Conversa amb missatges xifrats E2EE (escut verd visible)
- Verificació de dispositius completada
- Consulta SQL mostrant usuaris
- (Opcional) Client de terminal gomuks connectat
4. Taula d'usuaris
| MXID | Nom d'usuari | Admin? | Descripció |
|---|---|---|---|
| @fbarragan:matrix-fbarragan.local | francesc | Sí | 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
- FluffyChat - Client mòbil modern
- Nheko - Client d'escriptori lleuger
- gomuks - Client de terminal
Eines útils
- matrix-nio - SDK Python per bots
- Dimension - Gestor d'integracions
- matrix-appservice-irc - Bridge a IRC
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ó:
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! 💬🔐