Paillasse/ansible/roles/visio/tasks/main.yml
Adam Belkacemi ec4eae3744 ajoute la visio de classe : Jitsi auto-hébergé, jetons du portail, prof seul modérateur
Jitsi (docker-jitsi-meet, version figée) derrière Nginx sur meet.syllabuslab.fr,
accès par jeton JWT signé par le portail, modération du micro, mains levées
synchronisées avec l'application. Pare-feu : UDP 10000 et pont interne
br-visio (accords d'Adam). Jicofo n'authentifie plus lui-même : il donnait
le rôle de propriétaire aux élèves. Capacité ramenée à 20 VM.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 12:35:35 +02:00

126 lines
4.3 KiB
YAML

---
# Étape 15 : visio de classe. Jitsi Meet (docker-jitsi-meet, version figée)
# derrière le Nginx de l'hôte ; accès par jeton JWT signé par le portail.
- name: créer les dossiers de la visio
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: root
group: root
mode: "0750"
loop:
- /etc/visio
- "{{ visio_dossier }}"
- name: créer les dossiers des conteneurs (au nom de leur utilisateur)
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: "{{ visio_uid_conteneurs }}"
group: "{{ visio_uid_conteneurs }}"
mode: "0750"
loop:
- "{{ visio_dossier }}/config"
- "{{ visio_dossier }}/config/web"
- "{{ visio_dossier }}/config/storage/web"
- "{{ visio_dossier }}/config/storage/transcripts"
- "{{ visio_dossier }}/config/tmp/web-load-test"
- "{{ visio_dossier }}/config/prosody/config"
- "{{ visio_dossier }}/config/prosody/prosody-plugins-custom"
- "{{ visio_dossier }}/config/storage/prosody"
- "{{ visio_dossier }}/config/jicofo"
- "{{ visio_dossier }}/config/jvb"
# Générés une seule fois sur le serveur, jamais dans Git ni affichés.
- name: générer les secrets de la visio (première fois seulement)
ansible.builtin.copy:
dest: /etc/visio/secrets.env
owner: root
group: root
mode: "0600"
force: false
content: |
JICOFO_AUTH_PASSWORD={{ lookup('community.general.random_string', length=40, special=false) }}
JVB_AUTH_PASSWORD={{ lookup('community.general.random_string', length=40, special=false) }}
JWT_APP_SECRET={{ lookup('community.general.random_string', length=64, special=false) }}
no_log: true
- name: déployer la configuration de la visio
ansible.builtin.template:
src: visio.env.j2
dest: /etc/visio/visio.env
owner: root
group: root
mode: "0640"
register: visio_config
- name: déployer docker-compose.yml de la visio
ansible.builtin.template:
src: docker-compose.yml.j2
dest: "{{ visio_dossier }}/docker-compose.yml"
owner: root
group: root
mode: "0640"
register: visio_compose
- name: démarrer Jitsi (web, prosody, jicofo, jvb)
community.docker.docker_compose_v2:
project_src: "{{ visio_dossier }}"
project_name: visio
state: present
pull: missing
recreate: "{{ 'always' if (visio_config.changed or visio_compose.changed) else 'auto' }}"
- name: attendre que Jitsi web réponde sur 127.0.0.1
ansible.builtin.uri:
url: "http://127.0.0.1:{{ visio_port_web }}/"
status_code: [200]
register: visio_web
retries: 20
delay: 3
until: visio_web.status == 200
- name: vérifier que JVB écoute l'UDP {{ visio_port_media }}
ansible.builtin.shell:
cmd: "ss -Hulnp 'sport = :{{ visio_port_media }}' | grep -q java"
register: visio_jvb
retries: 20
delay: 3
until: visio_jvb.rc == 0
changed_when: false
# Jicofo doit voir un JVB opérationnel : c'est la preuve que les quatre
# services se parlent (cassé tant que le pare-feu jetait le trafic entre
# conteneurs, voir durcissement_ponts_internes).
- name: vérifier que Jicofo voit un JVB opérationnel
ansible.builtin.shell:
cmd: >-
docker compose -p visio -f {{ visio_dossier }}/docker-compose.yml exec -T jicofo
curl -s http://127.0.0.1:8888/stats
register: visio_stats_jicofo
retries: 20
delay: 5
until: >-
visio_stats_jicofo.rc == 0 and
(visio_stats_jicofo.stdout | from_json).bridge_selector.operational_bridge_count | int >= 1
changed_when: false
# Le portail signe les jetons avec le même secret (portail/config/visio.php).
- name: lire le secret de signature des jetons
ansible.builtin.slurp:
src: /etc/visio/secrets.env
register: visio_secrets_brut
no_log: true
- name: transmettre la configuration de la visio au portail
ansible.builtin.lineinfile:
path: /var/www/portail/.env
regexp: "^{{ item.cle }}="
line: "{{ item.cle }}={{ item.valeur }}"
loop:
- { cle: "VISIO_DOMAINE", valeur: "{{ visio_domaine }}" }
- { cle: "VISIO_JWT_APP_ID", valeur: "{{ visio_jwt_app_id }}" }
- { cle: "VISIO_JWT_AUDIENCE", valeur: "{{ visio_jwt_audience }}" }
- { cle: "VISIO_JWT_SECRET", valeur: "{{ visio_secrets_brut.content | b64decode | regex_search('JWT_APP_SECRET=(\\S+)', '\\1') | first }}" }
no_log: true
notify: remettre en cache la configuration du portail