Skip to main content
Satu replika menggunakan CPU dari satu node untuk setiap kompilasi: pada node uji kami dengan 2 vCPU, enam kompilasi serentak memakan waktu tiga kali lebih lama daripada satu, sementara node lainnya menganggur. Beberapa replika menyebarkan pengguna, beserta kompilasinya, ke seluruh node. Ini mengikuti desain Penskalaan horizontal dari Overleaf, yang diterjemahkan ke Kubernetes:
Rencanakan S3 sejak awal. Instans yang sudah menyimpan file di volumenya memerlukan migrasi S3 terlebih dahulu. Penyiapan ini menggantikan Deployment dari langkah 5: hapus Deployment tersebut (kubectl delete -f 40-overleaf.yaml) sebelum Anda menerapkan StatefulSet.
1

Penyimpanan S3

Siapkan tiga bucket dan dua pengguna seperti dijelaskan di S3, dengan layanan S3 Anda atau dengan Garage di dalam kluster, lalu masukkan keempat kunci ke Secret overleaf-s3. Konfigurasi di bawah ini menggunakan contoh Garage dari halaman tersebut.
2

Konfigurasi

ConfigMap ini menggantikan 30-config.yaml. ConfigMap ini menambahkan S3 dan git-bridge serta mengarahkan OVERLEAF_SITE_URL ke load balancer:
60-config.yaml
3

Replika

70-overleaf.yaml
  • StatefulSet, bukan Deployment. Setiap replika mendapat nama yang stabil (overleaf-0, overleaf-1, …) yang dirujuk oleh cookie load balancer dan git-bridge, dan OrderedReady memulai overleaf-0 sendirian terlebih dahulu, sehingga hanya satu replika yang menjalankan migrasi database.
  • Satu replika per node. Setiap replika memulai kompilasinya melalui Docker di node-nya dan menyimpannya di /srv/overleaf-ha pada node-nya.
  • V1_HISTORY_URL per replika. Setiap replika membagikan tautan riwayat dengan namanya sendiri, sehingga git-bridge dapat menjangkaunya.
4

git-bridge

75-git-bridge.yaml
Lihat Integrasi Git untuk alasan mengapa GIT_BRIDGE_HOST berupa alamat IP tetap.
5

Load balancer

Konfigurasi HAProxy adalah contoh dari Overleaf dengan lima perubahan: /project/<id>/mcp dirutekan ke overleaf-0 seperti /git/ (lihat MCP Server), HTTP biasa pada port 8080 (image berjalan sebagai pengguna non-root, yang tidak dapat melakukan bind ke port 80 di bawah containerd), server ditemukan melalui DNS kluster (IP pod berubah setiap kali restart), DaemonSet agar setiap node menjawab, dan balance leastconn sebagai pengganti roundrobin default (lihat Tanya Jawab di bawah).
80-haproxy.yaml
externalTrafficPolicy: Local mempertahankan alamat IP pengguna di X-Forwarded-For.
6

TLS

Terminasikan HTTPS di HAProxy seperti dijelaskan di Proxy TLS, lalu atur OVERLEAF_SITE_URL ke alamat https:// dan OVERLEAF_SECURE_COOKIE: "true" di 60-config.yaml.

Apa yang dapat diharapkan

Kami menguji tiga replika pada tiga node dengan masing-masing 2 vCPU dan 4 GB, dengan MongoDB, Redis, Garage, git-bridge, dan HAProxy di node yang sama:
  • 12 pengguna mengompilasi dokumen 600 halaman secara bersamaan: kedua belas pengguna berhasil mengompilasi dan mengambil PDF mereka, 4 pengguna per replika; satu putaran memakan waktu 8 hingga 18 detik. Setiap node tetap memiliki setidaknya 1,3 GB memori yang tersedia.
  • Setiap pengguna tetap berada di satu replika (cookie server-pro-ha), termasuk unduhan PDF yang harus berasal dari replika yang mengompilasinya. Hal yang sama berlaku melalui HTTPS, termasuk WebSocket editor.
  • Saat sebuah replika berhenti, penggunanya mendapat error selama sekitar 15 hingga 20 detik, hingga HAProxy menandainya sebagai down; kemudian mereka berpindah ke replika lain dan tetap login, karena sesi disimpan di Redis.

Tanya Jawab

Jawaban: Dengan contoh dari Overleaf (roundrobin, satu HAProxy per node), 12 pengguna baru terbagi menjadi 8, 3, dan 1 di ketiga replika dalam pengujian kami, dan replika tersibuk membuat pengguna yang paling lambat menunggu 29 detik. Dengan leastconn, yang mengutamakan replika dengan koneksi terbuka paling sedikit (setiap editor membiarkan WebSocket tetap terbuka), pengujian yang sama menghasilkan 4, 4, dan 4 serta 18 detik. Stickiness tidak berubah: berasal dari cookie.
Jawaban: Ya, jika ingress controller tersebut merutekan berdasarkan cookie ke replika yang stabil, mendukung WebSocket, mengizinkan waktu permintaan 10 menit dan unggahan 50 MB, menjaga timeout keep-alive di bawah 65 detik, mengirim X-Forwarded-For dan X-Forwarded-Proto, serta mengirim /git/ dan /project/<id>/mcp ke overleaf-0. Rutekan ke nama masing-masing replika (overleaf-N.overleaf-hl), bukan ke Service yang menyeimbangkan setiap permintaan.
Jawaban: Tambahkan node dengan Docker dan image TeX Live, atur replicas: 4 di 70-overleaf.yaml, dan tambahkan baris server overleaf-3 ... ke konfigurasi HAProxy (serta naikkan config-hash agar HAProxy di-restart).
Terakhir diubah pada 2 November 2026