Architecture du rendu de documents Typst
Typst est un système de composition par balisage pour les documents académiques : articles, thèses, notes de cours, examens et courriers administratifs. Il compile en PDF avec des builds incrémentaux rapides, un langage de script intégré et un écosystème de paquets ; c'est l'alternative moderne à LaTeX pour la production documentaire institutionnelle.
openEduSuite explose Typst comme un service de suite à part entière : fork suivi en amont, images multi-architectures, API de rendu HTTP et câblage de déploiement pour les deux piles : Kubernetes (enseignement supérieur) et Docker Compose (PME).
Politique de fork et de suivi amont
La suite utilise tobias-weiss-ai-xr/typst, un fork de typst/typst amont :
- Synchro hebdomadaire : un workflow planifié fusionne le
mainamont dans le fork ; les conflits échouent volontairement bruyamment (résolution manuelle). - Le code spécifique au fork vit exclusivement sous
render-service/et.github/workflows/, ce qui laisse les fusions amont sans conflit. - Les versions suivent la version amont (
v0.15.1), réinitialisée à chaque synchro. Chaque release GitHub publie deux images multi-arch (linux/amd64 + arm64) :ghcr.io/tobias-weiss-ai-xr/typst: la CLI typst intacteghcr.io/tobias-weiss-ai-xr/typst-render: le service de rendu (CLI + API HTTP + polices Liberation)
Service de rendu
Le service de rendu est un petit wrapper HTTP volontairement minimal autour de la CLI typst (bibliothèque standard Python uniquement) :
POST /render {"source": "= Bonjour", "format": "pdf|png|svg",
"assets": {"data.csv": "..."}} -> octets du document
GET /healthz -> {"status": "ok", "typst": "typst 0.15.1 ..."}
Frontières de confiance appliquées dans le processus :
- Limites de taille (5 Mo par requête, 2 Mo par source) et délai de compilation par requête (60 s).
- Noms d'assets restreints aux identifiants plats
[A-Za-z0-9._-], sans traversal de chemin. - Compilation dans un répertoire temporaire isolé avec confinement
--root; la CLI typst n'effectue aucun accès réseau. - Concurrence de compilation bornée (4 par défaut) pour protéger les nœuds du cluster.
- Le service tourne sous un utilisateur non privilégié (UID 1000) dans le conteneur.
Les polices Liberation sont intégrées à l'image, couvrant les familles Arial/Times/Courier métriquement compatibles utilisées par la plupart des modèles institutionnels.
Déploiement
| Pile | Câblage |
|---|---|
| Kubernetes (enseignement supérieur) | Chart Helmfile typst-render dans le dépôt openEduSuite-hrz, épinglé sur un tag de version |
| Docker Compose (PME) | Profil de service typst-render dans openSME-compose |
Les deux déploiements exposent le service sur un chemin réseau interne, utilisent une sonde de vivacité /healthz et épinglent les images par tag de version, la même discipline que pour tous les autres services de la suite. Le service est destiné aux machines (pipelines de modèles, outils d'administration, backends de portail) et non à l'exposition directe aux navigateurs des utilisateurs.
Surface d'intégration
Typst complète les éditeurs collaboratifs de la suite (Collabora, CryptPad, HedgeDoc) sans les remplacer : ceux-ci couvrent la co-édition interactive ; Typst couvre la composition de production déterministe, pilotée par des modèles, par exemple générer des sujets d'examen depuis un dépôt de modèles, produire des certificats ou des courriers en série à partir des données du registre.