Matrix: Docker
Matrix una red abierta para una comunicación segura y descentralizada.
Sencillo y contundente eslogan, para presentar un estándar de código abierto en ofrecer sistemas de comunicación descentralizados, cifrados y en tiempo real.
En Matrix, cada mensaje enviado pasa por el servidor local de cada uno de los participantes en la conversación.
Sus creadores afirman que esta es la mejor forma de democratizar el control de los usuarios sobre sus comunicaciones, sin que haya un único punto de control por el que pasen los mensajes.
En esta entrada vamos a centrarnos en crear un servidor propio de comunicación con acceso a la red federada de forma sencilla.
Instalación
Vamos a realizar unos pasos previos para preparar el entorno, para ello en primer lugar creamos las carpetas donde alojar el proyecto:
mkdir -p $HOME/docker/matrix/riot && \
cd $HOME/docker/matrix
Importante aclarar que antes de continuar, que debemos de elegir un nombre dominio para su alojamiento, en mi caso he seleccionado minipc.lordpedal.duckdns.org y el tutorial se basa en él. Importante comentar que el proyecto genera claves de cifrado en base a él.
Configuración Servidor
Comenzamos creando los ficheros de configuración del servicio, para ello usaremos la siguiente plantilla:
NOTA: Si quieres montar el servicio en una arquitectura ARM sustituye la variable matrixdotorg/synapse:latest por black0/synapse:latest
docker run -it --rm \
-v $HOME/docker/matrix/config:/data \
--name=Matrix \
-e SYNAPSE_SERVER_NAME=minipc.lordpedal.duckdns.org \
-e SYNAPSE_REPORT_STATS=no \
-e UID=1000 \
-e GID=1000 \
matrixdotorg/synapse:latest generate
Vamos a repasar los principales parámetros que hemos añadido sobre la anterior base, para poder adaptarlos a nuestro sistema y configuración especifica:
Parámetro | Función |
---|---|
$HOME/docker/matrix/config:/data |
Ruta donde aloja la configuración |
SYNAPSE_SERVER_NAME=minipc.lordpedal.duckdns.org |
Dominio elegido para publicar el proyecto, IMPORTANTE SUSTITUIR ya que las claves de cifrado se basan en él |
SYNAPSE_REPORT_STATS=no |
Desactivamos el reporte anonimo de estadísticas |
UID=1000 |
UID de nuestro usuario. Para saber nuestro ID ejecutar en terminal: id |
GID=1000 |
GID de nuestro usuario. Para saber nuestro ID ejecutar en terminal: id |
Ahora llega el turno de cambiar los permisos de estructura, en mi caso a usuario sistema pi:
sudo chown pi:pi -R $HOME/docker/matrix && \
cd $HOME/docker/matrix/config
Entramos en la carpeta de configuración del servicio y editamos los parámetros para nuestro servidor:
cd $HOME/docker/matrix/config && \
nano homeserver.yaml
Empezamos buscando el apartado del cliente que posteriormente configuraremos en el fichero docker-compose.yml
:
#web_client_location: https://riot.example.com/
Descomentamos la linea y especificamos un dominio de nuestro DuckDNS:
web_client_location: https://element.lordpedal.duckdns.org/
Activamos el acceso a la red federada mediante HTTPS:
#serve_server_wellknown: true
Para ello descomentamos la opción:
serve_server_wellknown: true
Activamos la política del periodo retención de canales:
retention:
#enabled: true
Para ello descomentamos la opción:
retention:
enabled: true
Cambiamos la base datos por defecto SQLite3 a PostgreSQL que posteriormente activaremos en docker-compose.yml
:
database:
name: sqlite3
args:
database: /data/homeserver.db
Comentamos la configuración por defecto y añadimos las siguientes variables:
#database:
# name: sqlite3
# args:
# database: /data/homeserver.db
database:
name: psycopg2
args:
user: synapse
password: Matrix2kLordpedal
database: synapse
host: postgresql
cp_min: 5
cp_max: 10
Activamos la opción de registrar usuarios en nuestro servidor:
#enable_registration: false
Descomentamos la opción y cambiamos la orden:
enable_registration: true
enable_registration_without_verification: true
Activamos la opción de cuentas de invitado para consultar canales públicos:
#allow_guest_access: false
Descomentamos la opción y cambiamos la orden:
allow_guest_access: true
Activamos la opción suprimir mensajes de advertencia en el servidor de autentificación de matrix.org
#suppress_key_server_warning: true
Descomentamos la opción y cambiamos la orden:
suppress_key_server_warning: true
Activamos la opción de optimización de base datos Redis
redis:
#enabled: true
#host: localhost
#port: 6379
Descomentando y configurandolo de la siguiente forma:
redis:
enabled: true
host: redis
port: 6379
Guardamos el fichero con la combinación CTRL + O y salimos del editor CTRL + X
Configuración Cliente
Toca el turno de configurar el cliente web que añadiremos a nuestro servidor, lanzando el siguiente comando:
nano $HOME/docker/matrix/riot/config.json
Y le añadimos el siguiente contenido:
{
"default_server_config": {
"m.homeserver": {
"base_url": "https://minipc.lordpedal.duckdns.org",
"server_name": "minipc.lordpedal.duckdns.org"
},
"m.identity_server": {
"base_url": "https://vector.im"
}
},
"disable_custom_urls": false,
"disable_guests": false,
"disable_login_language_selector": false,
"disable_3pid_login": false,
"brand": "Element",
"integrations_ui_url": "https://scalar.vector.im/",
"integrations_rest_url": "https://scalar.vector.im/api",
"integrations_widgets_urls": [
"https://scalar.vector.im/_matrix/integrations/v1",
"https://scalar.vector.im/api",
"https://scalar-staging.vector.im/_matrix/integrations/v1",
"https://scalar-staging.vector.im/api",
"https://scalar-staging.riot.im/scalar/api"
],
"bug_report_endpoint_url": "https://riot.im/bugreports/submit",
"defaultCountryCode": "ES",
"showLabsSettings": false,
"features": {
"feature_new_spinner": "labs",
"feature_pinning": "labs",
"feature_custom_status": "labs",
"feature_custom_tags": "labs",
"feature_state_counters": "labs"
},
"default_federate": true,
"default_theme": "ligth",
"roomDirectory": {
"servers": [
"matrix.org",
"gitter.im",
"libera.chat"
]
},
"welcomeUserId": "@riot-bot:matrix.org",
"piwik": {
"url": "https://piwik.riot.im/",
"whitelistedHSUrls": [
"https://matrix.org"
],
"whitelistedISUrls": [
"https://vector.im",
"https://matrix.org"
],
"siteId": 1
},
"enable_presence_by_hs_url": {
"https://matrix.org": false,
"https://matrix-client.matrix.org": false
},
"settingDefaults": {
"breadcrumbs": true
},
"jitsi": {
"preferredDomain": "jitsi.riot.im"
}
}
Vamos a repasar los principales parámetros que hemos añadido sobre la anterior base, para poder adaptarlos a nuestro sistema y configuración especifica:
Parámetro | Función |
---|---|
base_url: https://minipc.lordpedal.duckdns.org |
Ruta acceso servidor IMPORTANTE CAMBIAR |
server_name: https://minipc.lordpedal.duckdns.org |
Servidor Matrix IMPORTANTE CAMBIAR |
Configuración docker-compose
Ahora llega el turno de crear el fichero de configuración docker-compose.yml
lanzando el siguiente comando:
NOTA: Si quieres montar el servicio en una arquitectura ARM sustituye la variable matrixdotorg/synapse:latest por black0/synapse:latest
EXTRA: Debido a incompatibilidad con la BD Postgres 16 se debe de cambiar la versión de latest a 15 (Septiembre 2023)
cat << EOF > $HOME/docker/matrix/docker-compose.yml
version: '2'
services:
redis:
image: "redis:latest"
container_name: Redis_Matrix
restart: always
matrix:
image: "docker.io/matrixdotorg/synapse:latest"
container_name: Matrix
ports:
- 8008:8008
- 8448:8448
volumes:
- "./config:/data"
environment:
- TZ=Europe/Madrid
- UID=1000
- GID=1000
- SYNAPSE_SERVER_NAME=minipc.lordpedal.duckdns.org
- SYNAPSE_REPORT_STATS=no
restart: always
postgresql:
#image: "postgres:latest"
image: "postgres:15"
container_name: Matrix_DB
environment:
POSTGRES_DB: "synapse"
POSTGRES_PASSWORD: "Matrix2kLordpedal"
POSTGRES_USER: "synapse"
POSTGRES_INITDB_ARGS: "--encoding='UTF8' --lc-collate='C' --lc-ctype='C'"
volumes:
- "./bdatos:/var/lib/postgresql/data"
restart: always
riot:
image: "vectorim/element-web:latest"
container_name: Matrix_Rio
ports:
- 8009:80
volumes:
- "./riot/config.json:/app/config.json:ro"
restart: always
EOF
Vamos a repasar los principales parámetros que hemos añadido sobre la anterior base, para poder adaptarlos a nuestro sistema y configuración especifica:
Parámetro | Función |
---|---|
8008:8008 |
Puerto de comunicación público SERVIDOR |
8448:8448 |
Puerto de comunicación Red Federada |
./config:/data |
Ruta donde aloja la configuración del SERVIDOR |
TZ=Europe/Madrid |
Zona horaria Europa/Madrid |
UID=1000 |
UID de nuestro usuario. Para saber nuestro ID ejecutar en terminal: id |
GID=1000 |
GID de nuestro usuario. Para saber nuestro ID ejecutar en terminal: id |
SYNAPSE_SERVER_NAME=minipc.lordpedal.duckdns.org |
Dominio elegido para publicar el proyecto, IMPORTANTE SUSTITUIR ya que las claves de cifrado se basan en él |
SYNAPSE_REPORT_STATS=no |
Desactivamos el reporte anonimo de estadísticas |
Parametros POSTGRES |
Usuario, contraseña, ruta y puerto comunicación Base de datos |
./bdatos:/var/lib/postgresql/data |
Ruta donde aloja la Base de datos |
8009:80 |
Puerto de comunicación público CLIENTE |
./riot/config.json:/app/config.json:ro |
Ruta donde almacena la configuración del CLIENTE |
restart: always |
Habilitamos que tras reiniciar la maquina anfitrion vuelva a cargar el servicio |
Una vez configurado, levantamos el servicio para ser configurado y ejecutado:
docker-compose up -d
En mi caso, el servicio estaría disponible en la dirección web http://192.168.1.90:8008/_matrix/static/
Nginx Proxy Manager
Configuramos dominios y certificados:
Red Federada
Debemos de comprobar que el sistema esta debidamente configurado y con acceso a la red global con el siguiente test:
Cuentas usuario
Desactivar registro cuentas
Una vez creadas las cuentas de usuario que necesitemos, recomiendo volver a desactivar la opción de registro de cuentas.
Para ello volvemos a editar el fichero de configuración del servidor:
cd $HOME/docker/matrix/config && \
nano homeserver.yaml
Buscamos las variable que previamente habiamos activado para el registro:
enable_registration: true
enable_registration_without_verification: true
suppress_key_server_warning: true
Y la desactivamos:
enable_registration: false
enable_registration_without_verification: false
suppress_key_server_warning: false
Guardamos el fichero con la combinación CTRL + O, salimos del editor CTRL + X y reiniciamos el servicio con las nuevas variables:
cd $HOME/docker/matrix && \
docker-compose restart
Y listo!