From da4976aa981ae58c1eca7ab42228cefe76e040a5 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Sun, 5 Jul 2026 15:03:07 -0400 Subject: [PATCH] =?UTF-8?q?serveur=5Fcollabora=20:=20r=C3=B4le=20codifi?= =?UTF-8?q?=C3=A9=20depuis=20le=20spike=20(Docker,=20WOPI)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Conteneur collabora/code (restart always), publié sur localhost + IP LAN (gotcha : bind localhost seul → 502 depuis l'edge), aliasgroup = domaine Nextcloud, ssl.termination à l'edge, attente santé /hosting/capabilities. meta/flux.yml (ingress 9980 depuis edge) alimente le registre des flux. Docker (prouvé au spike) ; CODE natif = option future à spiker. Tag à épingler. ansible-lint profil production : 0 échec. Co-Authored-By: Claude Opus 4.8 --- playbooks/groupes/serveur_collabora.yml | 15 +++++++++ roles/serveur_collabora/README.md | 27 +++++++++++++++ roles/serveur_collabora/defaults/main.yml | 22 ++++++++++++ roles/serveur_collabora/meta/empreinte.yml | 6 ++++ roles/serveur_collabora/meta/flux.yml | 15 +++++++++ roles/serveur_collabora/tasks/main.yml | 39 ++++++++++++++++++++++ 6 files changed, 124 insertions(+) create mode 100644 playbooks/groupes/serveur_collabora.yml create mode 100644 roles/serveur_collabora/README.md create mode 100644 roles/serveur_collabora/defaults/main.yml create mode 100644 roles/serveur_collabora/meta/empreinte.yml create mode 100644 roles/serveur_collabora/meta/flux.yml create mode 100644 roles/serveur_collabora/tasks/main.yml diff --git a/playbooks/groupes/serveur_collabora.yml b/playbooks/groupes/serveur_collabora.yml new file mode 100644 index 0000000..fad4c49 --- /dev/null +++ b/playbooks/groupes/serveur_collabora.yml @@ -0,0 +1,15 @@ +--- +- name: Appliquer le groupe serveur_collabora + hosts: serveur_collabora + become: true + gather_facts: true + + pre_tasks: + - name: Vérifier que la cible est Debian + ansible.builtin.assert: + that: + - ansible_facts.distribution == "Debian" + fail_msg: "Ce playbook est prévu pour Debian." + + roles: + - serveur_collabora diff --git a/roles/serveur_collabora/README.md b/roles/serveur_collabora/README.md new file mode 100644 index 0000000..c941364 --- /dev/null +++ b/roles/serveur_collabora/README.md @@ -0,0 +1,27 @@ +# serveur_collabora + +Serveur d'édition de documents **Collabora Online (CODE)**, protocole WOPI, consommé +par Nextcloud (`richdocuments`). **Codifié depuis le spike du 2026-07-05** (Docker, prouvé). + +## Ce que le rôle fait +- Installe Docker + lance le conteneur `collabora/code` (`restart: always`) ; +- publie sur `127.0.0.1:9980` (Nextcloud co-localisé) **ET** l'IP LAN `:9980` (l'edge) — gotcha spike : bind localhost seul ⇒ **502** depuis l'edge ; +- `aliasgroup1` = le domaine Nextcloud (`cloud.`) — Collabora n'accepte le WOPI que de cet hôte ; +- `ssl.enable=false` + `ssl.termination=true` (TLS terminé à l'edge) ; +- attend la santé (`/hosting/capabilities` = 200). + +## Dépendances / exposition (à fournir) +- **Vhost edge WebSocket-aware** : `bureau.` → ce nœud:9980 avec `map $http_upgrade` + + en-têtes `Upgrade`/`Connection` + `proxy_read_timeout` long. **Le vhost générique ne suffit pas** + (l'édition live échoue sans WebSocket) ; +- FQDN `bureau.` dans les SAN du cert edge ; +- port 9980 à firewaller (voir `meta/flux.yml` : ingress depuis l'edge seulement). + +## Docker vs natif +Le spike a prouvé **Docker** → on codifie Docker. Le **CODE natif** (paquets Collabora, +`loolwsd`) serait plus « Set-OPS » (natif, pas de moteur Docker) mais exigerait **son propre +spike**. Décision à trancher. + +## Robustesse +- **Épingler `serveur_collabora_tag`** en prod (pas de `:latest` surprise) ; +- surveillance Icinga sur `/hosting/capabilities`. diff --git a/roles/serveur_collabora/defaults/main.yml b/roles/serveur_collabora/defaults/main.yml new file mode 100644 index 0000000..c96bb95 --- /dev/null +++ b/roles/serveur_collabora/defaults/main.yml @@ -0,0 +1,22 @@ +--- +# ========================================================================= +# serveur_collabora — serveur d'édition de documents (Collabora Online / CODE), +# protocole WOPI, consommé par Nextcloud (richdocuments). Codifié depuis le spike +# du 2026-07-05 (Docker, prouvé). Le CODE natif (paquets Collabora) reste une +# option future — nécessiterait son propre spike. +# ========================================================================= +serveur_collabora_conteneur: "collabora" +serveur_collabora_image: "collabora/code" +serveur_collabora_tag: "latest" # À ÉPINGLER en prod (robustesse / pas d'upgrade surprise) + +serveur_collabora_port: 9980 +# L'edge (autre hôte) doit joindre le conteneur → publier sur localhost ET l'IP LAN +# (gotcha spike : bind 127.0.0.1 seul => 502 depuis l'edge). Firewaller via le registre des flux. +serveur_collabora_lan_ip: "{{ ansible_default_ipv4.address | default(ansible_host) }}" + +# Domaine Nextcloud autorisé (aliasgroup) — Collabora n'accepte le WOPI que de cet hôte. +serveur_collabora_domaine_nextcloud: "cloud.{{ domaine_interne }}" +serveur_collabora_aliasgroup: "https://{{ serveur_collabora_domaine_nextcloud | regex_escape }}:443" + +# TLS terminé à l'edge : Collabora sert en HTTP derrière le proxy. +serveur_collabora_extra_params: "--o:ssl.enable=false --o:ssl.termination=true" diff --git a/roles/serveur_collabora/meta/empreinte.yml b/roles/serveur_collabora/meta/empreinte.yml new file mode 100644 index 0000000..adda7b0 --- /dev/null +++ b/roles/serveur_collabora/meta/empreinte.yml @@ -0,0 +1,6 @@ +--- +# Empreinte de dimensionnement (propriété du rôle). Collabora exécute des cœurs +# LibreOffice à la demande : mémoire notable, image conteneur ~1.5 Go. +coeurs: 2 +memoire_mo: 2048 +disque_go: 10 diff --git a/roles/serveur_collabora/meta/flux.yml b/roles/serveur_collabora/meta/flux.yml new file mode 100644 index 0000000..e88a72c --- /dev/null +++ b/roles/serveur_collabora/meta/flux.yml @@ -0,0 +1,15 @@ +--- +# Flux réseau de Collabora Online (propriété du rôle). Voir docs/flux-conception.md. +flux: + - sens: ingress + port: 9980 + protocole: tcp + pair: edge + chiffrement: clair + raison: "Éditeur servi au navigateur via l'edge (WebSocket WOPI ; TLS terminé à l'edge)." + - sens: ingress + port: 9980 + protocole: tcp + pair: localhost + chiffrement: clair + raison: "Vérifications WOPI serveur→Collabora depuis Nextcloud co-localisé." diff --git a/roles/serveur_collabora/tasks/main.yml b/roles/serveur_collabora/tasks/main.yml new file mode 100644 index 0000000..b2ab6ce --- /dev/null +++ b/roles/serveur_collabora/tasks/main.yml @@ -0,0 +1,39 @@ +--- +- name: Installer Docker (moteur du conteneur Collabora) + ansible.builtin.apt: + name: docker.io + state: present + update_cache: true + cache_valid_time: 3600 + +- name: Activer et demarrer Docker + ansible.builtin.systemd: + name: docker + enabled: true + state: started + when: not ansible_check_mode + +- name: Lancer le conteneur Collabora CODE (WOPI, publie sur localhost + IP LAN) + community.docker.docker_container: + name: "{{ serveur_collabora_conteneur }}" + image: "{{ serveur_collabora_image }}:{{ serveur_collabora_tag }}" + state: started + pull: true + restart_policy: always + ports: + - "127.0.0.1:{{ serveur_collabora_port }}:9980" + - "{{ serveur_collabora_lan_ip }}:{{ serveur_collabora_port }}:9980" + env: + aliasgroup1: "{{ serveur_collabora_aliasgroup }}" + extra_params: "{{ serveur_collabora_extra_params }}" + when: not ansible_check_mode + +- name: Attendre que Collabora reponde (capabilities) + ansible.builtin.uri: + url: "http://127.0.0.1:{{ serveur_collabora_port }}/hosting/capabilities" + status_code: 200 + register: serveur_collabora_sante + until: serveur_collabora_sante.status == 200 + retries: 12 + delay: 5 + when: not ansible_check_mode