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, etOrderedReadydémarre d’abordoverleaf-0seul, 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-hade son nœud. V1_HISTORY_URLpar 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
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
Pourquoi balance leastconn ?
Pourquoi balance leastconn ?
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.Puis-je utiliser mon contrôleur d'ingress à la place de HAProxy ?
Puis-je utiliser mon contrôleur d'ingress à la place de HAProxy ?
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.Comment ajouter un quatrième réplica ?
Comment ajouter un quatrième réplica ?


replicas: 4dans70-overleaf.yaml, et ajoutez une ligneserver overleaf-3 ...à la configuration HAProxy (et incrémentezconfig-hashpour que HAProxy redémarre).