serveur_collabora : rôle codifié depuis le spike (Docker, WOPI)

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 <noreply@anthropic.com>
This commit is contained in:
Daniel Allaire 2026-07-05 15:03:07 -04:00
parent 79d0529686
commit da4976aa98
6 changed files with 124 additions and 0 deletions

View file

@ -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

View file

@ -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.<domaine>`) — 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.<domaine>` → 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.<domaine>` 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`.

View file

@ -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"

View file

@ -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

View file

@ -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é."

View file

@ -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