Compare commits

..

2 Commits

Author SHA1 Message Date
948358971d feat(stacks): fix version for matrix 2026-08-19 18:39:09 +02:00
1b221dfec8 feat(stacks): readme for matrix 2026-08-19 18:36:33 +02:00
2 changed files with 37 additions and 36 deletions

View File

@@ -77,10 +77,9 @@ Cinq valeurs dans `secrets.env.yaml`, injectées par `sops exec-env` :
| `LIVEKIT_KEY`, `LIVEKIT_SECRET` | `livekit` (via `LIVEKIT_KEYS`) et `lk-jwt` | | `LIVEKIT_KEY`, `LIVEKIT_SECRET` | `livekit` (via `LIVEKIT_KEYS`) et `lk-jwt` |
| `TURN_STATIC_AUTH_SECRET`, `TURN_CLI_PASSWORD` | `coturn` | | `TURN_STATIC_AUTH_SECRET`, `TURN_CLI_PASSWORD` | `coturn` |
`LIVEKIT_KEY` est un identifiant plus qu'un secret, et la convention du dépôt `LIVEKIT_KEY` tient plus de l'identifiant que du secret. Il est chiffré avec
laisserait ce genre de valeur en clair. Il est chiffré quand même : il ne se son secret parce que les deux se tournent toujours ensemble : les séparer sur
tourne jamais seul, toujours en paire avec son secret, et le séparer sur deux deux mécanismes rendrait la rotation facile à ne faire qu'à moitié.
mécanismes rendrait la rotation facile à rater à moitié.
```bash ```bash
sops edit secrets.env.yaml sops edit secrets.env.yaml
@@ -110,14 +109,13 @@ command:
- --cli-password=${TURN_CLI_PASSWORD:?} - --cli-password=${TURN_CLI_PASSWORD:?}
``` ```
Le compromis est explicite : les valeurs ne sont pas dans un fichier Le compromis est : les deux valeurs sont visibles dans `docker inspect
versionnable, mais elles sont visibles dans `docker inspect coturn` et dans la coturn` et dans la table des processus de l'hôte. Un secret Compose ferait
table des processus de l'hôte. C'est strictement mieux qu'un fichier mieux, coturn ne sait pas le lire.
versionné, ce n'est pas aussi bon qu'un secret Compose.
`turnserver.conf` ne doit donc jamais reprendre de lignes `turnserver.conf` ne doit jamais porter de ligne `static-auth-secret=` ou
`static-auth-secret=` ou `cli-password=` : ce serait à la fois un secret en `cli-password=` : ce serait un secret en clair dans le dépôt, et une seconde
clair dans le dépôt et une seconde source concurrente. source concurrente de celle du `command:`.
### Rotation ### Rotation
@@ -128,9 +126,15 @@ les appels échouent simplement à établir un relais.
```bash ```bash
sops edit secrets.env.yaml # TURN_STATIC_AUTH_SECRET sops edit secrets.env.yaml # TURN_STATIC_AUTH_SECRET
docker compose exec synapse vi /data/homeserver.yaml # turn_shared_secret
sops exec-env secrets.env.yaml 'docker compose up -d --force-recreate coturn' # homeserver.yaml s'édite depuis l'hôte : l'image Synapse n'a pas d'éditeur.
sudo vi "$(docker volume inspect matrix_poneyworld_matrix_data \
--format '{{.Mountpoint}}')/homeserver.yaml" # turn_shared_secret
sops exec-env secrets.env.yaml '
docker compose up -d --force-recreate coturn &&
docker compose restart synapse docker compose restart synapse
'
``` ```
`macaroon_secret_key` (dans `homeserver.yaml`) signe les jetons d'accès : le `macaroon_secret_key` (dans `homeserver.yaml`) signe les jetons d'accès : le
@@ -156,23 +160,19 @@ retirer un ne changerait rien au volume réel, mais ferait diverger sa
déclaration, et Compose proposerait alors de le **recréer**. Ne pas toucher au déclaration, et Compose proposerait alors de le **recréer**. Ne pas toucher au
bloc `volumes:` du compose. bloc `volumes:` du compose.
### Pourquoi `POSTGRES_DB` est indispensable ### `POSTGRES_DB` conditionne le dump
`backup_docker.sh` détermine la base à dumper ainsi : `backup_docker.sh` lit la base à dumper dans l'environnement du conteneur
`db` :
```bash ```bash
db_name=$(docker exec "$container" printenv POSTGRES_DB 2>/dev/null || echo "postgres") db_name=$(docker exec "$container" printenv POSTGRES_DB 2>/dev/null || echo "postgres")
``` ```
Sans `POSTGRES_DB` dans l'environnement du conteneur `db`, `printenv` sort en Sans `POSTGRES_DB`, le repli s'applique : le script dumpe la base système
erreur, le repli s'applique, et le script dumpe `postgres` — la base système, `postgres`, vide, et journalise un succès. `POSTGRES_DB=synapse` dans
vide — avec succès et sans le moindre avertissement. Le dump obtenu fait l'`env_file` n'a pas d'autre fonction que d'être visible par ce `printenv`
quelques centaines d'octets et ne contient aucune table. PostgreSQL, lui, ne lit cette variable qu'à l'initialisation du cluster.
`POSTGRES_DB=synapse` dans l'`env_file` est ce qui garantit que le dump porte
sur la bonne base. La variable n'est lue par PostgreSQL qu'à l'initialisation
du cluster : elle est sans effet sur une base existante, sa seule fonction ici
est d'être visible par `printenv`.
Vérification, après tout changement touchant `db` : Vérification, après tout changement touchant `db` :
@@ -194,15 +194,16 @@ elle.** Aucun des deux ne le signalera : coturn et LiveKit démarrent
normalement en annonçant une adresse erronée, et seuls les appels échouent — normalement en annonçant une adresse erronée, et seuls les appels échouent —
sans erreur dans les logs, puisque du point de vue des serveurs tout va bien. sans erreur dans les logs, puisque du point de vue des serveurs tout va bien.
C'est déjà arrivé : `external-ip` a pointé pendant des mois sur ## Versions d'images
`91.121.90.228`, l'adresse d'`admin.opytex.org`.
## Défauts connus Toutes les images sont épinglées au patch. Les tags d'amont ne suivent pas la
même forme : `livekit-server` préfixe d'un `v`, `lk-jwt-service` non — bien
que son tag *git* le porte. Le label OCI
`org.opencontainers.image.version` du conteneur donne la forme du tag d'image,
c'est lui qui fait foi.
**Trois images en tag flottant** : `nginx:latest`, `livekit` et `lk-jwt` se montent ensemble : ils s'authentifient mutuellement et
`livekit/livekit-server:latest`, `ghcr.io/element-hq/lk-jwt-service:latest`. suivent le même protocole MatrixRTC.
La convention du dépôt veut une version en dur, et Renovate ne sait rien faire
d'un `latest`.
Références : Références :

View File

@@ -46,7 +46,7 @@ services:
- default - default
nginx: nginx:
image: nginx:latest image: nginx:1.29.7
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- ./nginx/matrix.conf:/etc/nginx/conf.d/matrix.conf:ro - ./nginx/matrix.conf:/etc/nginx/conf.d/matrix.conf:ro
@@ -79,7 +79,7 @@ services:
- traefik.http.services.element.loadbalancer.server.port=80 - traefik.http.services.element.loadbalancer.server.port=80
livekit: livekit:
image: livekit/livekit-server:latest image: livekit/livekit-server:v1.10.1
command: --config /etc/livekit.yaml command: --config /etc/livekit.yaml
restart: unless-stopped restart: unless-stopped
environment: environment:
@@ -103,7 +103,7 @@ services:
- traefik.http.services.livekit.loadbalancer.server.port=7880 - traefik.http.services.livekit.loadbalancer.server.port=7880
lk-jwt: lk-jwt:
image: ghcr.io/element-hq/lk-jwt-service:latest image: ghcr.io/element-hq/lk-jwt-service:0.4.1
restart: unless-stopped restart: unless-stopped
environment: environment:
LIVEKIT_JWT_BIND: ":8081" LIVEKIT_JWT_BIND: ":8081"