Skip to main content
Un seul réplica utilise le CPU d’un seul nœud pour chaque compilation : sur nos nœuds de test dotés de 2 vCPU, six compilations simultanées ont pris trois fois plus de temps qu’une seule, tandis que les autres nœuds restaient inactifs. Plusieurs réplicas répartissent les utilisateurs, et leurs compilations, sur les nœuds. Ceci suit la conception de la mise à l’échelle horizontale d’Overleaf, transposée à Kubernetes :
Prévoyez S3 dès le départ. Une instance qui conserve déjà ses fichiers sur son volume doit d’abord effectuer la migration vers S3. Cette configuration remplace le Deployment de l’étape 5 : supprimez-le (kubectl delete -f 40-overleaf.yaml) avant d’appliquer le StatefulSet.
1

Stockage S3

Créez les trois buckets et les deux utilisateurs comme décrit dans S3, avec votre service S3 ou avec Garage dans le cluster, et placez les quatre clés dans le Secret overleaf-s3. La configuration ci-dessous utilise l’exemple Garage de cette page.
2

Configuration

Cette ConfigMap remplace 30-config.yaml. Elle ajoute S3 et git-bridge, et fait pointer OVERLEAF_SITE_URL vers le répartiteur de charge :
60-config.yaml
3

Réplicas

70-overleaf.yaml
  • StatefulSet, et non Deployment. Chaque réplica obtient un nom stable (overleaf-0, overleaf-1, …) auquel se réfèrent le cookie du répartiteur de charge et git-bridge, et OrderedReady démarre d’abord overleaf-0 seul, de sorte qu’un seul réplica exécute les migrations de base de données.
  • Un réplica par nœud. Chaque réplica lance ses compilations via le Docker de son nœud et les conserve dans le répertoire /srv/overleaf-ha de son nœud.
  • V1_HISTORY_URL par réplica. Chaque réplica distribue des liens d’historique portant son propre nom, afin que git-bridge puisse les atteindre.
4

git-bridge

75-git-bridge.yaml
Consultez Intégration Git pour comprendre pourquoi GIT_BRIDGE_HOST est une adresse IP fixe.
5

Répartiteur de charge

La configuration HAProxy est celle de l’exemple d’Overleaf avec cinq modifications : /project/<id>/mcp routé vers overleaf-0 comme /git/ (voir Serveur MCP), HTTP simple sur le port 8080 (l’image s’exécute avec un utilisateur non root, qui ne peut pas se lier au port 80 sous containerd), des serveurs trouvés via le DNS du cluster (les IP des pods changent à chaque redémarrage), un DaemonSet pour que chaque nœud réponde, et balance leastconn au lieu du roundrobin par défaut (voir les questions-réponses ci-dessous).
80-haproxy.yaml
externalTrafficPolicy: Local conserve les adresses IP des utilisateurs dans X-Forwarded-For.
6

TLS

Terminez HTTPS dans HAProxy comme décrit dans Proxy TLS, puis définissez OVERLEAF_SITE_URL sur l’adresse https:// et OVERLEAF_SECURE_COOKIE: "true" dans 60-config.yaml.

À quoi s’attendre

Nous avons testé trois réplicas sur trois nœuds dotés chacun de 2 vCPU et 4 Go, avec MongoDB, Redis, Garage, git-bridge et HAProxy sur les mêmes nœuds :
  • 12 utilisateurs compilant simultanément un document de 600 pages : les 12 ont compilé et récupéré leur PDF, à raison de 4 utilisateurs par réplica ; un cycle a pris de 8 à 18 secondes. Chaque nœud a conservé au moins 1,3 Go de mémoire disponible.
  • Chaque utilisateur reste sur un seul réplica (cookie server-pro-ha), y compris pour le téléchargement du PDF, qui doit provenir du réplica qui l’a compilé. Il en va de même en HTTPS, y compris pour le WebSocket de l’éditeur.
  • Lorsqu’un réplica s’arrête, ses utilisateurs reçoivent des erreurs pendant environ 15 à 20 secondes, jusqu’à ce que HAProxy le marque comme indisponible ; ils passent alors sur un autre réplica et restent connectés, car les sessions sont stockées dans Redis.

Questions-réponses

Réponse : Avec l’exemple d’Overleaf (roundrobin, un HAProxy par nœud), 12 nouveaux utilisateurs se sont répartis à raison de 8, 3 et 1 sur les trois réplicas lors de notre test, et le réplica le plus chargé a fait attendre les utilisateurs les plus lents 29 secondes. Avec leastconn, qui privilégie le réplica ayant le moins de connexions ouvertes (chaque éditeur garde un WebSocket ouvert), le même test a donné 4, 4 et 4, et 18 secondes. La persistance est inchangée : elle provient du cookie.
Réponse : Oui, s’il route selon un cookie vers un réplica stable, prend en charge les WebSockets, autorise des durées de requête de 10 minutes et des téléversements de 50 Mo, maintient son délai keep-alive en dessous de 65 secondes, envoie X-Forwarded-For et X-Forwarded-Proto, et envoie /git/ et /project/<id>/mcp vers overleaf-0. Routez vers les noms propres des réplicas (overleaf-N.overleaf-hl), et non vers un Service qui répartit chaque requête.
Réponse : Ajoutez un nœud avec Docker et les images TeX Live, définissez replicas: 4 dans 70-overleaf.yaml, et ajoutez une ligne server overleaf-3 ... à la configuration HAProxy (et incrémentez config-hash pour que HAProxy redémarre).
Dernière modification le 2 novembre 2026