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/— les fusions amont restent 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._-]— pas de 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 openEDU-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.