Skip to main content
Одна репліка використовує CPU одного вузла для кожної компіляції: на наших тестових вузлах із 2 vCPU шість одночасних компіляцій тривали втричі довше за одну, тоді як інші вузли простоювали. Кілька реплік розподіляють користувачів і їхні компіляції між вузлами. Це відповідає архітектурі Горизонтального масштабування Overleaf, перенесеній на Kubernetes:
Плануйте S3 від самого початку. Екземпляр, який уже зберігає файли на своєму томі, спочатку потребує міграції на S3. Це налаштування замінює Deployment із кроку 5: видаліть його (kubectl delete -f 40-overleaf.yaml), перш ніж застосовувати StatefulSet.
1

Сховище S3

Налаштуйте три бакети й двох користувачів, як описано в розділі S3, за допомогою своєї служби S3 або Garage у кластері, і додайте чотири ключі до Secret overleaf-s3. Наведена нижче конфігурація використовує приклад Garage з тієї сторінки.
2

Конфігурація

Цей ConfigMap замінює 30-config.yaml. Він додає S3 і git-bridge та спрямовує OVERLEAF_SITE_URL на балансувальник навантаження:
60-config.yaml
3

Репліки

70-overleaf.yaml
  • StatefulSet, а не Deployment. Кожна репліка отримує стабільне ім’я (overleaf-0, overleaf-1, …), на яке посилаються cookie балансувальника навантаження та git-bridge, а OrderedReady спершу запускає лише overleaf-0, тож міграції бази даних виконує тільки одна репліка.
  • Одна репліка на вузол. Кожна репліка запускає свої компіляції через Docker свого вузла і зберігає їх у /srv/overleaf-ha свого вузла.
  • V1_HISTORY_URL для кожної репліки. Кожна репліка видає посилання на історію зі своїм власним ім’ям, щоб git-bridge міг до них звертатися.
4

git-bridge

75-git-bridge.yaml
Чому GIT_BRIDGE_HOST — це фіксована IP-адреса, див. у розділі Інтеграція з Git.
5

Балансувальник навантаження

Конфігурація HAProxy — це приклад Overleaf із п’ятьма змінами: /project/<id>/mcp маршрутизується до overleaf-0, як і /git/ (див. MCP-сервер), звичайний HTTP на порту 8080 (образ працює від імені користувача без прав root, який не може зайняти порт 80 під containerd), сервери знаходяться через DNS кластера (IP-адреси подів змінюються під час кожного перезапуску), DaemonSet, щоб відповідав кожен вузол, і balance leastconn замість стандартного roundrobin (див. розділ «Запитання та відповіді» нижче).
80-haproxy.yaml
externalTrafficPolicy: Local зберігає IP-адреси користувачів у X-Forwarded-For.
6

TLS

Завершуйте HTTPS у HAProxy, як описано в розділі TLS-проксі, а потім задайте в 60-config.yaml для OVERLEAF_SITE_URL адресу https:// і OVERLEAF_SECURE_COOKIE: "true".

Чого очікувати

Ми протестували три репліки на трьох вузлах із 2 vCPU і 4 ГБ кожен, з MongoDB, Redis, Garage, git-bridge і HAProxy на тих самих вузлах:
  • 12 користувачів одночасно компілюють 600-сторінковий документ: усі 12 скомпілювали й отримали свій PDF, по 4 користувачі на репліку; один цикл тривав від 8 до 18 секунд. На кожному вузлі залишалося щонайменше 1,3 ГБ доступної пам’яті.
  • Кожен користувач залишається на одній репліці (cookie server-pro-ha), включно із завантаженням PDF, яке має надходити з репліки, що його скомпілювала. Те саме діє і через HTTPS, включно з WebSocket редактора.
  • Коли репліка зупиняється, її користувачі отримують помилки приблизно 15–20 секунд, доки HAProxy не позначить її як недоступну; потім вони переходять на іншу репліку й залишаються в системі, оскільки сесії зберігаються в Redis.

Запитання та відповіді

Відповідь: З прикладом Overleaf (roundrobin, один HAProxy на вузол) 12 нових користувачів у нашому тесті розподілилися як 8, 3 і 1 на три репліки, і найзавантаженіша репліка змусила найповільніших користувачів чекати 29 секунд. З leastconn, який віддає перевагу репліці з найменшою кількістю відкритих з’єднань (кожен редактор тримає відкритим WebSocket), той самий тест дав 4, 4 і 4 та 18 секунд. Липкість не змінюється: її забезпечує cookie.
Відповідь: Так, якщо він маршрутизує за cookie до стабільної репліки, підтримує WebSockets, дозволяє запити тривалістю 10 хвилин і завантаження до 50 МБ, тримає свій тайм-аут keep-alive нижче 65 секунд, надсилає X-Forwarded-For і X-Forwarded-Proto, а також спрямовує /git/ і /project/<id>/mcp до overleaf-0. Маршрутизуйте до власних імен реплік (overleaf-N.overleaf-hl), а не до Service, який балансує кожен запит.
Відповідь: Додайте вузол із Docker і образами TeX Live, задайте replicas: 4 у 70-overleaf.yaml і додайте рядок server overleaf-3 ... до конфігурації HAProxy (а також збільште config-hash, щоб HAProxy перезапустився).
Останнє оновлення 2 листопада 2026 р.