Compare commits

...

5 Commits

Author SHA1 Message Date
agent f7f53035ee feat(livekit): expose TURN ports UDP 3478 + TCP 5349 (issue 0166)
Integrated LiveKit TURN enabled. Wildcard cert *.organic-machine.com
extracted from Traefik acme.json into configs/livekit/certs/ (gitignored).
livekit.yaml updated with turn.enabled=true, domain=turn-matrix-rtc-320bd4,
udp_port=3478 (NOT 443 — taken by Traefik HTTP/3), tls_port=5349.
external_tls=false (LiveKit terminates TLS directly with mounted cert).
UFW opened 3478/udp + 5349/tcp.
2026-05-24 22:45:40 +00:00
Egutierrez 8eef89b63c feat(livekit): rotate secret + hardcode external_ip + expand UDP range + hygiene
- Rotate API key/secret (previously exposed in agent session, issue 0169)
- Hardcode node_ip + disable use_external_ip (kill Google STUN leak, issue 0167)
- Expand UDP range 50000-50200 -> 50000-50500 (capacity, issue 0168)
- Refresh livekit.example.yaml template + add *.bak.* to gitignore (issue 0170)

Note: live secrets in configs/livekit/livekit.yaml + .env (gitignored)
docker-compose.livekit.yml has pre-existing operator TURN changes (issue 0166) left untouched.
2026-05-24 22:43:49 +00:00
egutierrez 4909b8447e feat: MAS as auth provider + remove synapse-admin
- Migrate Synapse SQLite -> Postgres (synapse_port_db)
- Enable MSC3861 (matrix_authentication_service block)
- Disable password_config legacy
- Add bcrypt passwords scheme to MAS
- Register 4 MAS clients (element, matrix_pc, matrix_android, admin_panel)
- syn2mas migrated 21 users + 41 access_tokens
- Patch well-known with org.matrix.msc2965.authentication
- Remove synapse-admin container (replaced by custom admin panel — issue 0163)

Issue: 0162
Refs: dev/flows/0010-matrix-client-pc.md, dev/flows/0011-matrix-client-android.md
2026-05-24 20:51:41 +00:00
egutierrez df08e1fbbf docs: añadir nota de CI/CD al README
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 21:02:10 +02:00
egutierrez 6e7b35a87f primer intento authenticacion qr mas 2025-11-18 23:50:42 +00:00
10 changed files with 264 additions and 10 deletions
+7
View File
@@ -35,6 +35,11 @@ certs/
# Configuraciones sensibles generadas en tiempo de despliegue # Configuraciones sensibles generadas en tiempo de despliegue
configs/livekit/livekit.yaml configs/livekit/livekit.yaml
configs/well-known/matrix-client.json configs/well-known/matrix-client.json
mas/config.yaml
mas/secrets/*
!mas/secrets/.gitkeep
mas/keys/*
!mas/keys/.gitkeep
# Archivos de media de Matrix (pueden ser muy grandes) # Archivos de media de Matrix (pueden ser muy grandes)
*/media_store/ */media_store/
@@ -44,3 +49,5 @@ configs/well-known/matrix-client.json
.dockerignore .dockerignore
element-call element-call
*.bak.*
+2
View File
@@ -2,6 +2,8 @@
Configuración completa de servidor Matrix con Element Web y panel de administración usando Docker Compose. Configuración completa de servidor Matrix con Element Web y panel de administración usando Docker Compose.
> **CI/CD**: push a Gitea → webhook → deploy_server → `docker compose pull` + `up -d`.
## 🚀 Servicios incluidos ## 🚀 Servicios incluidos
- **Matrix Synapse**: Servidor Matrix (puerto 8008) - **Matrix Synapse**: Servidor Matrix (puerto 8008)
+6 -3
View File
@@ -5,13 +5,16 @@ port: 7880
bind_addresses: bind_addresses:
- "0.0.0.0" - "0.0.0.0"
log_level: info log_level: info
region: "us-east-1" region: "REGION_PLACEHOLDER"
rtc: rtc:
tcp_port: 7881 tcp_port: 7881
port_range_start: 50000 port_range_start: 50000
port_range_end: 50200 port_range_end: 50500
use_external_ip: true # Set use_external_ip to false and hardcode node_ip to your public IPv4 to
# prevent LiveKit from probing Google STUN at startup.
use_external_ip: false
node_ip: "PUBLIC_IPV4_PLACEHOLDER"
force_tcp: false force_tcp: false
# Optional TURN forwarding. Enable only if you already operate a TURN server. # Optional TURN forwarding. Enable only if you already operate a TURN server.
+4
View File
@@ -5,11 +5,15 @@ services:
command: --config /etc/livekit/livekit.yaml command: --config /etc/livekit/livekit.yaml
volumes: volumes:
- ./configs/livekit/livekit.yaml:/etc/livekit/livekit.yaml:ro - ./configs/livekit/livekit.yaml:/etc/livekit/livekit.yaml:ro
- ./configs/livekit/certs:/etc/livekit/certs:ro
ports: ports:
- "${LIVEKIT_HTTP_PORT:-7880}:7880/tcp" - "${LIVEKIT_HTTP_PORT:-7880}:7880/tcp"
- "${LIVEKIT_TCP_PORT:-7881}:7881/tcp" - "${LIVEKIT_TCP_PORT:-7881}:7881/tcp"
- "${LIVEKIT_HEALTH_PORT:-7882}:7882/tcp" - "${LIVEKIT_HEALTH_PORT:-7882}:7882/tcp"
- "${LIVEKIT_UDP_PORT_RANGE_START:-50000}-${LIVEKIT_UDP_PORT_RANGE_END:-50200}:${LIVEKIT_UDP_PORT_RANGE_START:-50000}-${LIVEKIT_UDP_PORT_RANGE_END:-50200}/udp" - "${LIVEKIT_UDP_PORT_RANGE_START:-50000}-${LIVEKIT_UDP_PORT_RANGE_END:-50200}:${LIVEKIT_UDP_PORT_RANGE_START:-50000}-${LIVEKIT_UDP_PORT_RANGE_END:-50200}/udp"
# TURN ports (issue 0166)
- "${LIVEKIT_TURN_UDP_PORT:-3478}:3478/udp"
- "${LIVEKIT_TURN_TLS_PORT:-5349}:5349/tcp"
networks: networks:
default: default:
ipv4_address: 10.10.10.10 ipv4_address: 10.10.10.10
+41 -6
View File
@@ -14,6 +14,19 @@ services:
ports: ports:
- "5432:5432" - "5432:5432"
mas-postgres:
image: postgres:16
restart: unless-stopped
networks:
default:
ipv4_address: 10.10.10.14
volumes:
- mas_postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=mas
- POSTGRES_USER=mas_user
- POSTGRES_PASSWORD=mas_password
element: element:
image: vectorim/element-web:latest image: vectorim/element-web:latest
restart: unless-stopped restart: unless-stopped
@@ -40,16 +53,36 @@ services:
- UID=1000 - UID=1000
- GID=1000 - GID=1000
synapse-admin: # synapse-admin removed 2026-05-24 — replaced by custom admin panel (issue 0163)
image: awesometechnologies/synapse-admin:latest # synapse-admin:
# image: awesometechnologies/synapse-admin:latest
# restart: unless-stopped
# networks:
# default:
# ipv4_address: 10.10.10.5
# ports:
# - "8082:80"
# depends_on:
# - synapse
mas:
image: ghcr.io/element-hq/matrix-authentication-service:latest
restart: unless-stopped restart: unless-stopped
depends_on:
- mas-postgres
- synapse
networks: networks:
default: default:
ipv4_address: 10.10.10.5 ipv4_address: 10.10.10.15
volumes:
- ./mas/config.yaml:/etc/mas/config.yaml:ro
- ./mas/secrets:/run/mas/secrets:ro
- ./mas/keys:/run/mas/keys:ro
environment:
- MAS_CONFIG=/etc/mas/config.yaml
command: ["server", "--config", "/etc/mas/config.yaml"]
ports: ports:
- "8082:80" - "8083:8080"
depends_on:
- synapse
wellknown: wellknown:
image: nginx:alpine image: nginx:alpine
@@ -74,6 +107,8 @@ volumes:
matrix_postgres_data: matrix_postgres_data:
external: true external: true
name: matrix_postgres_data name: matrix_postgres_data
mas_postgres_data:
driver: local
networks: networks:
default: default:
+74
View File
@@ -0,0 +1,74 @@
# Matrix Authentication Service setup
Este directorio contiene la configuración base para desplegar
[Matrix Authentication Service (MAS)](https://github.com/element-hq/matrix-authentication-service)
junto al stack de Synapse/Element. MAS es el componente necesario para poder
delegar el inicio de sesión al flujo OIDC moderno y activar el acceso mediante
código QR (MSC4108) desde Element móvil.
## Estructura
```
mas/
├── config.example.yaml # Plantilla de configuración
├── config.yaml # (generado) Config en uso por el contenedor
├── keys/ # Claves de firma de OIDC (no se versionan)
├── scripts/bootstrap.sh # Script para generar secretos/clave y copiar la config
└── secrets/ # Secretos usados tanto por MAS como por Synapse
```
Los archivos dentro de `keys/` y `secrets/` están ignorados en git para evitar
exponer credenciales. El script `scripts/bootstrap.sh` genera la estructura
mínima necesaria y solo debe ejecutarse una vez (puedes volver a lanzarlo si
algún archivo falta).
## Pasos rápidos
1. Copia la plantilla de configuración y genera secretos/clave privada:
```bash
cd mas
./scripts/bootstrap.sh
```
Esto crea:
- `config.yaml` (copiado desde `config.example.yaml`).
- `secrets/encryption.key`: clave hex de 32 bytes para cifrado interno.
- `secrets/shared_secret.txt`: token compartido con Synapse (MAS API).
- `keys/mas_signing.key`: clave RSA 2048 bits para firmar tokens OIDC.
2. Edita `config.yaml` y ajusta:
- `http.public_base`: dominio público donde expondrás MAS
(ej. `https://auth-af2f3d.organic-machine.com/`).
- `matrix.homeserver`: nombre del servidor Matrix si cambia.
- El string de conexión a Postgres si usas credenciales distintas.
3. Copia el contenido de `secrets/shared_secret.txt` y pégalo en
`synapse_data/homeserver.yaml` dentro de
`matrix_authentication_service.secret` (agregado en este PR).
4. Publica MAS detrás de tu reverse-proxy/Coolify redirigiendo
`/_matrix/client/*/(login|logout|refresh)` hacia el puerto del servicio.
Consulta la guía en la raíz (`README.md`) para reiniciar los contenedores con
`docker compose`. Una vez que Synapse y MAS estén en marcha verás el flag
`org.matrix.msc4108: true` al consultar
`https://matrix-af2f3d.organic-machine.com/_matrix/client/versions` y Element
mostrará el inicio de sesión por QR.
## Reverse proxy / Coolify
- Publica MAS en un subdominio (p.ej. `auth-af2f3d.organic-machine.com`) que
apunte al puerto `8083` definido en `docker-compose.yml`.
- Copia las rutas de compatibilidad:
```
location ~ ^/_matrix/client/(.*)/(login|logout|refresh) {
proxy_pass http://10.10.10.7:8080;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
```
Ajusta la IP/puerto si usas otra red interna o si el reverse proxy corre en
otro host. En Coolify puedes crear una regla HTTP adicional que apunte al
contenedor `mas`.
- Expón el endpoint de rendezvous en `https://auth.../_matrix/client/unstable/org.matrix.msc4108/rendezvous`
para que el valor coincida con `msc4108_delegation_endpoint` en
`synapse_data/homeserver.yaml`.
+65
View File
@@ -0,0 +1,65 @@
# Configuration example for Matrix Authentication Service.
# Copia este archivo a `config.yaml` y ajusta los valores necesarios.
http:
public_base: https://auth-af2f3d.organic-machine.com/
listeners:
- name: web
resources:
- name: discovery
- name: human
- name: oauth
- name: compat
- name: graphql
- name: assets
binds:
- host: 0.0.0.0
port: 8080
proxy_protocol: false
trusted_proxies:
- 192.168.0.0/16
- 172.16.0.0/12
- 10.0.0.0/10
- 127.0.0.1/8
- fd00::/8
- ::1/128
database:
uri: postgresql://mas_user:mas_password@mas-postgres:5432/mas
max_connections: 5
min_connections: 1
connect_timeout: 30
email:
transport: blackhole
from: '"Matrix Authentication Service" <noreply@auth.local>'
matrix:
kind: synapse
homeserver: matrix-af2f3d.organic-machine.com
endpoint: http://synapse:8008
secret_file: /run/mas/secrets/shared_secret.txt
secrets:
encryption_file: /run/mas/secrets/encryption.key
keys:
- key_file: /run/mas/keys/mas_signing.key
policy:
path: /usr/local/share/mas-cli/policy.wasm
templates:
path: /usr/local/share/mas-cli/templates/
assets_manifest: /usr/local/share/mas-cli/assets/manifest.json
translations_path: /usr/local/share/mas-cli/translations/
compat:
login:
enabled: true
logout:
enabled: true
refresh:
enabled: true
clients: []
View File
+64
View File
@@ -0,0 +1,64 @@
#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CONFIG_FILE="${ROOT_DIR}/config.yaml"
CONFIG_TEMPLATE="${ROOT_DIR}/config.example.yaml"
SECRETS_DIR="${ROOT_DIR}/secrets"
KEYS_DIR="${ROOT_DIR}/keys"
ENCRYPTION_FILE="${SECRETS_DIR}/encryption.key"
SHARED_SECRET_FILE="${SECRETS_DIR}/shared_secret.txt"
SIGNING_KEY_FILE="${KEYS_DIR}/mas_signing.key"
command -v openssl >/dev/null 2>&1 || {
echo "openssl es requerido para generar los secretos." >&2
exit 1
}
mkdir -p "${SECRETS_DIR}" "${KEYS_DIR}"
if [ ! -f "${CONFIG_TEMPLATE}" ]; then
echo "No se encontró ${CONFIG_TEMPLATE}, abortando." >&2
exit 1
fi
if [ ! -f "${CONFIG_FILE}" ]; then
cp "${CONFIG_TEMPLATE}" "${CONFIG_FILE}"
echo "Se creó ${CONFIG_FILE} a partir de la plantilla."
else
echo "Ya existe ${CONFIG_FILE}, se deja intacto."
fi
if [ ! -f "${ENCRYPTION_FILE}" ]; then
openssl rand -hex 32 > "${ENCRYPTION_FILE}"
chmod 600 "${ENCRYPTION_FILE}"
echo "Generada clave de cifrado en ${ENCRYPTION_FILE}"
else
echo "Ya existe ${ENCRYPTION_FILE}"
fi
if [ ! -f "${SHARED_SECRET_FILE}" ]; then
openssl rand -hex 48 > "${SHARED_SECRET_FILE}"
chmod 600 "${SHARED_SECRET_FILE}"
echo "Generado secreto compartido en ${SHARED_SECRET_FILE}"
else
echo "Ya existe ${SHARED_SECRET_FILE}"
fi
if [ ! -f "${SIGNING_KEY_FILE}" ]; then
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out "${SIGNING_KEY_FILE}" >/dev/null
chmod 600 "${SIGNING_KEY_FILE}"
echo "Generada clave RSA en ${SIGNING_KEY_FILE}"
else
echo "Ya existe ${SIGNING_KEY_FILE}"
fi
cat <<MSG
============================================
Recuerda copiar el contenido de:
${SHARED_SECRET_FILE}
al bloque matrix_authentication_service.secret en synapse_data/homeserver.yaml.
Revisa también ${CONFIG_FILE} para ajustar dominios/URLs públicas.
============================================
MSG
View File