> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/on-premises/id/pemeliharaan/horizontal-scaling.md).

# Penskalaan horizontal

Mulai versi 3.5.6, Server Pro mendukung penskalaan horizontal.

Dokumen ini mencantumkan persyaratan teknis dan memberikan panduan untuk menjalankan Server Pro di lebih dari satu node.

{% hint style="danger" %}
Mulai dengan Server CE/Server Pro `5.0.3` variabel lingkungan telah diganti mereknya dari `SHARELATEX_*` menjadi `OVERLEAF_*`.

Jika Anda menggunakan `4.x` versi (atau sebelumnya), pastikan variabel diberi awalan yang sesuai (mis. `SHARELATEX_SITE_URL` bukannya `OVERLEAF_SITE_URL`)
{% endhint %}

Menyiapkan penskalaan horizontal membutuhkan upaya yang signifikan. Kami menyarankan untuk mempertimbangkan penskalaan horizontal **hanya** ketika mencapai skala tertentu. Sebagai contoh, instalasi Server Pro untuk total 1.000 pengguna telah berhasil disiapkan menggunakan satu server yang disediakan dengan dua prosesor 4 inti dan memori sistem 32GB. Lihat [persyaratan perangkat keras](/on-premises/id/memulai/requirements/hardware-requirements.md) dokumentasi untuk rekomendasi.

Penerapan Server Pro dengan penskalaan horizontal melibatkan seperangkat komponen eksternal, seperti Load Balancer dan backend penyimpanan yang kompatibel dengan S3.

Kami dapat membantu menelusuri dan memperbaiki kesalahan di kontainer Server Pro yang mungkin disebabkan oleh salah konfigurasi dan memberikan saran umum berdasarkan dokumen ini. Sayangnya, kami tidak dapat memberikan bantuan dalam mengonfigurasi aplikasi/sistem pihak ketiga.

Penyelesaian masalah teknis yang spesifik pada perangkat keras/perangkat lunak Anda untuk menyediakan komponen eksternal tidak tercakup dalam ketentuan dukungan kami.

### Persyaratan

#### Penyimpanan data eksternal, terpusat

Penyimpanan data di Server Pro dapat dibagi menjadi empat penyimpanan data:

* **MongoDB**

  * Sebagian besar data disimpan secara persisten ke MongoDB.
  * Kami mendukung instans lokal atau instans eksternal, seperti [MongoDB](https://www.mongodb.com/atlas) Atlas (layanan MongoDB terkelola penuh yang berjalan di dalam infrastruktur AWS).<br>

  **Catatan:** Sayangnya, saat ini belum ada dukungan resmi untuk basis data yang kompatibel dengan MongoDB seperti CosmoDB/DocumentDB, karena kami belum menguji Server Pro dengannya. Meskipun menerapkan Server Pro dengan basis data yang kompatibel **mungkin** memungkinkan, kami hanya secara resmi mendukung penerapan yang menggunakan MongoDB.<br>
* **Redis**

  * Redis menyimpan data sementara, seperti pembaruan dokumen yang tertunda sebelum dituliskan ke MongoDB.
  * Redis digunakan untuk mengomunikasikan pembaruan dokumen antara layanan yang berbeda dan memberi tahu editor tentang perubahan status dalam suatu proyek.
  * Redis digunakan untuk menyimpan sesi pengguna.
  * Kami mendukung instans lokal atau instans eksternal.<br>

  **Catatan:** Sayangnya, saat ini belum ada dukungan resmi untuk penyimpanan nilai kunci yang kompatibel dengan Redis seperti KeyDB/Valkey, karena kami belum menguji Server Pro dengannya. Meskipun menerapkan Server Pro dengan penyimpanan yang kompatibel **mungkin** memungkinkan, kami hanya secara resmi mendukung penerapan yang menggunakan Redis.<br>
* **Berkas proyek dan berkas riwayat**

  * Berkas proyek yang tidak dapat diedit disimpan di luar MongoDB.

    Sistem riwayat proyek yang baru (Server Pro 3.5 dan seterusnya) juga menyimpan riwayat di luar MongoDB.
  * Untuk instans tunggal kecil, kami mendukung sistem berkas lokal (yang dapat didukung oleh SSD lokal, NFS, atau EBS) atau [sistem penyimpanan data yang kompatibel dengan S3](/on-premises/id/konfigurasi/overleaf-toolkit/s3.md).
  * Untuk penskalaan horizontal, kami **hanya** mendukung sistem penyimpanan data yang kompatibel dengan S3.<br>

  **Penting:** NFS/Amazon EFS/Amazon EBS adalah **tidak** didukung untuk penskalaan horizontal. Silakan lihat [penyimpanan perangkat keras](/on-premises/id/memulai/requirements/hardware-requirements.md#storage) bagian persyaratan tentang penskalaan penyimpanan di Server Pro untuk detail lebih lanjut.
* **Berkas sementara**
  * Kompilasi LaTeX perlu dijalankan pada disk lokal yang cepat untuk performa optimal. Hasil kompilasi tidak perlu disimpan secara persisten atau dicadangkan.
  * Penyanggaan unggahan berkas baru dan pembuatan berkas zip proyek juga diuntungkan dengan penggunaan disk lokal.

{% hint style="danger" %}
Kami sangat menyarankan penggunaan disk lokal. Menggunakan jenis disk jaringan apa pun (seperti NFS atau EBS) dapat mengakibatkan kesalahan kompilasi yang tidak terduga dan masalah performa lainnya.
{% endhint %}

#### **Git-bridge**

{% hint style="info" %}
Git-bridge tersedia di Server Pro mulai versi 4.0.1.
{% endhint %}

Repositori git disimpan secara lokal di disk. Tidak ada opsi replikasi yang tersedia. Git-bridge sebaiknya dijalankan sebagai **instans tunggal**. Untuk performa optimal, kami menyarankan penggunaan disk lokal untuk data git-bridge. Disk data git-bridge harus dicadangkan secara berkala.

Untuk penyimpanan data dengan penskalaan horizontal, Anda memerlukan:

* instans MongoDB terpusat yang dapat diakses dari semua instans Server Pro
* instans Redis terpusat yang dapat diakses dari semua instans Server Pro
* backend penyimpanan yang kompatibel dengan S3 terpusat untuk berkas proyek dan riwayat
* disk lokal pada setiap instans untuk berkas sementara
* disk lokal pada instans yang menampung kontainer git-bridge untuk data git-bridge

#### Persyaratan penyeimbang beban

* **Perutean persisten**, misalnya menggunakan cookie

  Persyaratan ini berasal dari komponen-komponen berikut:

  * Kemampuan pengeditan waktu nyata di Server Pro menggunakan WebSockets dengan fallback ke polling XHR. Setiap sesi pengeditan memiliki status lokal di sisi server dan permintaan dari sesi pengeditan tertentu selalu perlu diarahkan ke instans Server Pro yang sama. Fitur kolaborasi menggunakan Redis [Pub/Sub](https://redis.io/docs/latest/develop/interact/pubsub/) untuk berbagi pembaruan antara beberapa instans Server Pro.
  * Kompilasi LaTeX menyimpan output dan cache kompilasi secara lokal demi performa optimal. Saat mengirim permintaan kompilasi ke satu instans Server Pro, permintaan unduhan PDF/log berikut perlu diarahkan ke instans Server Pro yang sama.
* **Waktu habis permintaan yang lama** untuk mendukung kompilasi dokumen LaTeX yang besar
* **Dukungan WebSocket** untuk performa optimal
* **ukuran payload POST 50MB**
* **Batas waktu keep-alive** harus lebih rendah daripada batas waktu keep-alive Server Pro

  Batas waktu keep-alive di Server Pro dapat dikonfigurasi menggunakan variabel lingkungan `NGINX_KEEPALIVE_TIMEOUT`. Nilai defaultnya adalah 65 detik.

  Dengan nilai default, batas waktu keep-alive 60 detik di penyeimbang beban berfungsi.

  Dengan `NGINX_KEEPALIVE_TIMEOUT=120`, penyeimbang beban dapat memilih 115 detik.
* **IP klien**

  Atur header permintaan `X-Forwarded-For` ke IP klien.
* Saat **mengakhiri SSL**

  Penyeimbang beban perlu menambahkan header permintaan `X-Forwarded-Proto: https`.

<details>

<summary>Contoh konfigurasi HAProxy</summary>

```
global
  group haproxy
  user haproxy

  # Logging verbose
  log stdout format raw local0 debug

defaults
  mode                    http
  option                  httpchk HEAD /status
  http-check              expect status 200
  default-server          check

  # Logging verbose
  log                     global
  option                  httplog

  # Rute ulang ke backend lain jika yang sticky sedang down
  option                  redispatch 1
  # Retry ini untuk kesalahan koneksi TCP, bukan untuk respons status HTTP 500
  retries                 3

  # Sesi sticky selama 24 jam tidak aktif -- output kompilasi dihapus setelah 24 jam
  cookie                  server-pro-ha insert maxidle 24h

  # Coba terhubung ke backend mana pun selama 1 menit, lalu kembalikan 503
  timeout queue           1m
  # Beri instans Server Pro 15 detik untuk memulai
  timeout connect         15s

  # Batalkan permintaan dari klien yang sangat lambat (izinkan 1 menit tidak aktif saat membaca permintaan)
  timeout client          1m

  # Izinkan kompilasi lambat -- batas yang dikodekan secara keras di clsi adalah 10 menit
  timeout server          10m

  # Putuskan koneksi editor setelah 23 jam -- 1 jam lebih awal dari penggunaan terakhir mereka kemarin
  timeout tunnel          23h

  # Catatan: Perilaku keepalive di haproxy bekerja sangat baik dengan pengaturan keepalive default di Server Pro.
  #       Haproxy membersihkan koneksi di latar belakang dan akan merutekan ulang permintaan bila diperlukan.

listen server-pro-ha-http
  bind :80
  http-request redirect scheme https unless { ssl_fc }

listen server-pro-ha-https
  bind :443 ssl crt /etc/ssl/certs/ssl-key-and-certificate-bundle.pem

  # Beri tahu aplikasi bahwa kita berada di belakang https
  http-request set-header X-Forwarded-Proto https

  # Beri tahu aplikasi IP klien yang sebenarnya
  option forwardfor

  # Lihat https://hstspreload.org/#deployment-recommendations
  http-response set-header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload;"

  # Rute lalu lintas git ke kontainer saudara dari git-bridge
  use-server server-pro-ha-1 if { path_beg /git/ }

  # Penelusuran kesalahan
  http-response add-header X-Served-By %s
  stats enable
  stats uri /haproxy

  server server-pro-ha-1 198.18.1.1:80 cookie server-pro-ha-1
  server server-pro-ha-2 198.18.1.2:80 cookie server-pro-ha-2
  server server-pro-ha-3 198.18.1.3:80 cookie server-pro-ha-3
```

</details>

#### Konfigurasi Server Pro

**Rahasia**

Instans Server Pro perlu menyepakati rahasia bersama:

* `WEB_API_PASSWORD` (autentikasi API web)
* `STAGING_PASSWORD` dan `V1_HISTORY_PASSWORD` nilai yang sama (autentikasi riwayat)
* `CRYPTO_RANDOM` (untuk cookie sesi)
* `OT_JWT_AUTH_KEY` (autentikasi riwayat)

Semua rahasia ini perlu dikonfigurasi dengan nilai uniknya sendiri dan dibagikan di antara instans.

Jika tidak dikonfigurasi dan permintaan pengguna diarahkan ke instans Server Pro yang berbeda, permintaan mereka akan gagal dalam pemeriksaan autentikasi dan mereka akan sering dialihkan ke halaman login atau tindakan mereka di UI akan gagal dengan cara yang tidak terduga.

Jika tidak dikonfigurasi, Server Pro menggunakan nilai acak baru untuk setiap rahasia berdasarkan 32 byte acak dari `/dev/urandom` (256 bit acak).

{% code overflow="wrap" %}

```bash
# https://github.com/overleaf/overleaf/blob/45ca0f796c679103efd305ddbef28073c4a5de32/server-ce/init_scripts/00_regen_sharelatex_secrets.sh#L14
dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev | tr -d '\n+/'
```

{% endcode %}

**MongoDB**

Arahkan `OVERLEAF_MONGO_URL` (`SHARELATEX_MONGO_URL` untuk versi `4.x` dan sebelumnya) ke instans MongoDB terpusat.

**Redis**

Arahkan `OVERLEAF_REDIS_HOST` (`SHARELATEX_REDIS_HOST` untuk versi `4.x` dan sebelumnya) dan `REDIS_HOST` ke instans Redis terpusat.

**Penyimpanan yang kompatibel dengan S3 untuk berkas proyek dan riwayat**

Silakan lihat dokumentasi tentang [penyimpanan yang kompatibel dengan S3](/on-premises/id/konfigurasi/overleaf-toolkit/s3.md) untuk detail.

**Berkas sementara**

Bind-mount default SSD lokal ke `/var/lib/overleaf` (`/var/lib/sharelatex` untuk versi `4.x` dan sebelumnya) sudah mencukupi. Pastikan untuk mengarahkan `SANDBOXED_COMPILES_HOST_DIR` ke titik mount pada host.

{% hint style="danger" %}
Kami sangat menyarankan penggunaan disk lokal. Menggunakan jenis disk jaringan apa pun (seperti NFS atau EBS) dapat mengakibatkan kesalahan kompilasi yang tidak terduga dan masalah performa lainnya.
{% endhint %}

**Konfigurasi proxy**

* Atur `OVERLEAF_BEHIND_PROXY=true` (`SHARELATEX_BEHIND_PROXY` untuk versi `4.x` dan sebelumnya) untuk IP klien yang akurat.
* Atur `TRUSTED_PROXY_IPS` ke IP penyeimbang beban (beberapa CIDR dapat ditentukan, dipisahkan dengan koma).

**Integrasi Git-bridge**

{% hint style="info" %}
Git-bridge tersedia di Server Pro mulai versi 4.0.1.
{% endhint %}

Kontainer git-bridge memerlukan kontainer Server Pro saudara untuk menangani permintaan git yang masuk. Kontainer saudara ini juga dapat melayani lalu lintas pengguna biasa. Dalam konfigurasi contoh, instans pertama bertindak sebagai kontainer saudara untuk git-bridge, tetapi sebenarnya instans mana pun dapat berfungsi seperti itu.

Mengapa kita perlu menetapkan satu kontainer Server Pro sebagai saudara untuk git-bridge? Server Pro memberikan URL unduhan untuk layanan riwayat kepada git-bridge. Kita perlu mengonfigurasi URL riwayat ini agar dapat diakses dari kontainer git-bridge.

Konfigurasi kontainer Server Pro:

* Atur `GIT_BRIDGE_ENABLED` menjadi `'true'`
* Atur `GIT_BRIDGE_HOST` menjadi `<nama kontainer git-bridge>` mis. `git-bridge`
* Atur `GIT_BRIDGE_PORT` menjadi `8000`
* Atur `V1_HISTORY_URL` menjadi `http://<nama kontainer saudara server-pro>:3100/api`.

  Catatan: Ini hanya diperlukan pada kontainer saudara untuk kontainer git-bridge. Instans lainnya dapat menggunakan URL localhost, yang merupakan default.

Konfigurasi kontainer git-bridge:

* Atur `GIT_BRIDGE_API_BASE_URL` menjadi `http://<nama kontainer saudara server-pro>/api/v0`, mis. `http://server-pro-ha-1/api/v0`
* Atur `GIT_BRIDGE_OAUTH2_SERVER` menjadi `http://<nama kontainer saudara server-pro>`, mis. `http://server-pro-ha-1`
* Atur `GIT_BRIDGE_POSTBACK_BASE_URL` menjadi `http://<nama kontainer git-bridge>:8000`, mis. `http://git-bridge:8000`
* Atur `GIT_BRIDGE_ROOT_DIR` ke disk data git-bridge yang di-bind-mount, mis. `/data/git-bridge`

<details>

<summary>Contoh konfigurasi docker-compose.yml</summary>

Konfigurasi berikut menunjukkan pengaturan mandiri. Agar demo berfungsi, Anda perlu menyediakan kunci/sertifikat SSL yang valid dan menyesuaikan `OVERLEAF_SITE_URL` (`SHARELATEX_SITE_URL` untuk versi `4.x` dan sebelumnya). Untuk pengaturan yang sebenarnya, Anda harus mengganti rahasia palsu dengan rahasia yang sebenarnya seperti dicatat di dalam teks. Untuk pengaturan yang sebenarnya, Anda perlu memindahkan kontainer-kontainer individual ke node-node khusus dan menyesuaikan alamat IP dengan pengaturan jaringan lokal Anda.

```yaml
version: '2.2'

# Pengaturan penskalaan horizontal yang sebenarnya: pilih jaringan Anda sendiri dan ganti IP di konfigurasi.
networks:
    default:
        ipam:
            config:
                # Subnet ini merupakan bagian dari subnet cadangan yang digunakan untuk benchmarking
                # https://tools.ietf.org/html/rfc2544
                # Subnet penuh adalah 198.18.0.0/15
                # Gunakan 198.18.0.0/24 untuk lb dan dbs
                # Gunakan 198.18.1.0/24 untuk server-pro
                # Gunakan 198.18.0.128/25 untuk kontainer sementara
                - gateway: 198.18.0.1
                  ip_range: 198.18.0.128/25
                  subnet: 198.18.0.0/23

services:
    # Pengaturan penskalaan horizontal yang sebenarnya: jalankan haproxy di luar docker pada host terpisah.
    lb:
        image: haproxy:2.6
        container_name: lb
        user: root
        logging:
            driver: local
            options:
                max-size: 10g
                max-file: '100'
        volumes:
            - ./haproxy.conf:/usr/local/etc/haproxy/haproxy.cfg
            # $ cat certificate.pem key.pem > ssl-key-and-certificate-bundle.pem
            - /path/to/ssl-key-and-certificate-bundle.pem:/etc/ssl/certs/ssl-key-and-certificate-bundle.pem
        # Alternatif untuk "ports": gunakan jaringan host untuk menghindari overhead docker-proxy
        network_mode: host

        # Alternatif untuk "network_mode: host": gunakan docker-proxy untuk isolasi jaringan
        # ports:
        #     - "80:80"
        #     - "443:443"
        # networks:
        #     default:
        #         ipv4_address: 198.18.0.2

        # Pengaturan penskalaan horizontal yang sebenarnya: hapus yang ini karena mereka berjalan di host lain.
        depends_on:
            server-pro-ha-1:
                condition: service_started
            server-pro-ha-2:
                condition: service_started
            server-pro-ha-3:
                condition: service_started

    # Pengaturan penskalaan horizontal yang sebenarnya: jalankan kontainer ini di sebelah server-pro-ha-1.
    # Untuk Server Pro 4.0 dan seterusnya.
    git-bridge:
        restart: always
        # Tag harus cocok dengan tag kontainer `server-pro-ha-1`.
        image: quay.io/sharelatex/git-bridge:4.0.1
        volumes:
            # Pengaturan penskalaan horizontal yang sebenarnya: arahkan /data/git-bridge ke SSD lokal khusus.
            - ~/git_bridge_data:/data/git-bridge
        container_name: git-bridge
        environment:
            GIT_BRIDGE_API_BASE_URL: "http://server-pro-ha-1/api/v0"
            GIT_BRIDGE_OAUTH2_SERVER: "http://server-pro-ha-1"
            GIT_BRIDGE_POSTBACK_BASE_URL: "http://198.18.0.6:8000"
            GIT_BRIDGE_ROOT_DIR: "/data/git-bridge"
        user: root
        command: ["/server-pro-start.sh"]

        # Pengaturan penskalaan horizontal yang sebenarnya: jalankan di host 198.18.0.6 dan buka port
        # ports:
        #     - "8000:8000"
        networks:
            default:
                ipv4_address: 198.18.0.6

    # Pengaturan penskalaan horizontal yang sebenarnya: jalankan kontainer ini di host terpisah.
    server-pro-ha-1: &server-pro-ha-config
        restart: always
        image: quay.io/sharelatex/sharelatex-pro:4.0.1
        container_name: server-pro-ha-1
        hostname: server-pro-ha-1
        depends_on:
            # Pengaturan penskalaan horizontal yang sebenarnya: pertahankan entri ini.
            git-bridge:
                condition: service_started

            # Pengaturan penskalaan horizontal yang sebenarnya: hapus yang di bawah karena mereka berjalan di host lain.
            mongo:
                condition: service_healthy
            redis:
                condition: service_started
            minio:
                condition: service_started
            mongo_replica_set_setup:
                condition: service_completed_successfully
            minio_setup:
                condition: service_completed_successfully
        stop_grace_period: 60s
        volumes:
            - /tmp/scratch-disk1:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment: &server-pro-ha-environment
            # Pengaturan penskalaan horizontal sebenarnya: sediakan domain/nama aplikasi Anda sendiri.
            OVERLEAF_SITE_URL: 'https://overleaf.example.com'
            OVERLEAF_APP_NAME: Demo Penskalaan Horizontal Server Pro

            OVERLEAF_MONGO_URL: mongodb://198.18.0.3/sharelatex
            OVERLEAF_REDIS_HOST: 198.18.0.4
            REDIS_HOST: 198.18.0.4

            ENABLED_LINKED_FILE_TYPES: 'project_file,project_output_file'
            EMAIL_CONFIRMATION_DISABLED: 'true'

            SANDBOXED_COMPILES: 'true'
            SANDBOXED_COMPILES_SIBLING_CONTAINERS: 'true'
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk1/data/compiles'

            # S3
            # Pengaturan penskalaan horizontal sebenarnya: pilih kredensial yang aman.
            OVERLEAF_FILESTORE_BACKEND: s3
            OVERLEAF_FILESTORE_USER_FILES_BUCKET_NAME: overleaf-user-files
            OVERLEAF_FILESTORE_TEMPLATE_FILES_BUCKET_NAME: overleaf-template-files
            OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID: OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID
            OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY: OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY
            OVERLEAF_FILESTORE_S3_ENDPOINT: http://198.18.0.5:9000
            OVERLEAF_FILESTORE_S3_PATH_STYLE: 'true'
            OVERLEAF_FILESTORE_S3_REGION: ''

            OVERLEAF_HISTORY_BACKEND: "s3"
            OVERLEAF_HISTORY_PROJECT_BLOBS_BUCKET: "overleaf-project-blobs"
            OVERLEAF_HISTORY_CHUNKS_BUCKET: "overleaf-chunks"
            OVERLEAF_HISTORY_S3_ACCESS_KEY_ID: "OVERLEAF_HISTORY_S3_ACCESS_KEY_ID"
            OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY: "OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY"
            OVERLEAF_HISTORY_S3_ENDPOINT: http://198.18.0.5:9000
            OVERLEAF_HISTORY_S3_PATH_STYLE: 'true'
            OVERLEAF_HISTORY_S3_REGION: ''
            # /S3

            # git-bridge
            GIT_BRIDGE_ENABLED: 'true'
            GIT_BRIDGE_HOST: 198.18.0.6
            GIT_BRIDGE_PORT: 8000
            # Hanya diperlukan pada instance saudara dari git-bridge
            V1_HISTORY_URL: "http://server-pro-ha-1:3100/api"
            # /git-bridge

            # Penskalaan horizontal
            # Pengaturan penskalaan horizontal sebenarnya: pilih kredensial yang aman.
            WEB_API_PASSWORD: WEB_API_PASSWORD
            STAGING_PASSWORD: V1_HISTORY_PASSWORD
            V1_HISTORY_PASSWORD: V1_HISTORY_PASSWORD
            CRYPTO_RANDOM: CRYPTO_RANDOM
            OT_JWT_AUTH_KEY: OT_JWT_AUTH_KEY
            OVERLEAF_BEHIND_PROXY: 'true'
            # Pengaturan penskalaan horizontal sebenarnya: IP penyeimbang beban
            TRUSTED_PROXY_IPS: 198.18.0.1,198.18.0.2
            # /Penskalaan horizontal

        # Pengaturan penskalaan horizontal sebenarnya: jalankan pada host 198.18.1.1 dan ekspos port
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.1

    # Pengaturan penskalaan horizontal yang sebenarnya: jalankan kontainer ini di host terpisah.
    server-pro-ha-2:
        <<: *server-pro-ha-config
        hostname: server-pro-ha-2
        container_name: server-pro-ha-2
        volumes:
            - /tmp/scratch-disk2:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            <<: *server-pro-ha-environment
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk2/data/compiles'
            V1_HISTORY_URL: "http://localhost:3100/api"

        # Pengaturan penskalaan horizontal sebenarnya: jalankan pada host 198.18.1.2 dan ekspos port
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.2

    # Pengaturan penskalaan horizontal yang sebenarnya: jalankan kontainer ini di host terpisah.
    server-pro-ha-3:
        <<: *server-pro-ha-config
        hostname: server-pro-ha-3
        container_name: server-pro-ha-3
        volumes:
            - /tmp/scratch-disk3:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment:
            <<: *server-pro-ha-environment
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk3/data/compiles'
            V1_HISTORY_URL: "http://localhost:3100/api"

        # Pengaturan penskalaan horizontal sebenarnya: jalankan pada host 198.18.1.3 dan ekspos port
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.3

    # Pengaturan penskalaan horizontal yang sebenarnya: jalankan kontainer ini di host terpisah.
    minio:
        image: minio/minio:RELEASE.2023-05-18T00-05-36Z
        container_name: minio
        command: server /data
        volumes:
            # Pengaturan penskalaan horizontal sebenarnya: jalankan minio dengan beberapa disk, lihat dokumentasi minio.
            - ~/minio_data:/data
        environment:
            # Pengaturan penskalaan horizontal sebenarnya: pilih kredensial yang aman.
            MINIO_ROOT_USER: MINIO_ROOT_USER
            MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD

        # Pengaturan penskalaan horizontal sebenarnya: jalankan pada host 198.18.0.5 dan ekspos port
        # ports:
        #     - "9000:9000"
        networks:
            default:
                ipv4_address: 198.18.0.5

    # Pengaturan penskalaan horizontal sebenarnya: jalankan pengaturan ini sekali pada host terpisah.
    minio_setup:
        depends_on:
            - minio
        image: minio/mc:RELEASE.2023-05-18T16-59-00Z
        entrypoint: sh
        command:
            - '-c'
            # Pengaturan penskalaan horizontal sebenarnya: pilih kredensial yang aman.
            - |
                mc alias set s3 http://198.18.0.5:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
                || sleep 10 && \
                mc alias set s3 http://198.18.0.5:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
                || sleep 10 && \
                mc alias set s3 http://198.18.0.5:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD \
                || sleep 10 && \
                mc alias set s3 http://198.18.0.5:9000 MINIO_ROOT_USER MINIO_ROOT_PASSWORD

                mc mb --ignore-existing s3/overleaf-user-files
                mc mb --ignore-existing s3/overleaf-template-files
                mc admin user add s3 \
                  OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID \
                  OVERLEAF_FILESTORE_S3_SECRET_ACCESS_KEY

                mc mb --ignore-existing s3/overleaf-project-blobs
                mc mb --ignore-existing s3/overleaf-chunks
                mc admin user add s3 \
                  OVERLEAF_HISTORY_S3_ACCESS_KEY_ID \
                  OVERLEAF_HISTORY_S3_SECRET_ACCESS_KEY

                echo '
                  {
                    "Version": "2012-10-17",
                    "Statement": [
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:ListBucket"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-user-files"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:PutObject",
                          "s3:GetObject",
                          "s3:DeleteObject"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-user-files/*"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:ListBucket"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-template-files"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:PutObject",
                          "s3:GetObject",
                          "s3:DeleteObject"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-template-files/*"
                      }
                    ]
                  }' > policy-filestore.json

                echo '
                  {
                    "Version": "2012-10-17",
                    "Statement": [
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:ListBucket"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-project-blobs"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:PutObject",
                          "s3:GetObject",
                          "s3:DeleteObject"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-project-blobs/*"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:ListBucket"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-chunks"
                      },
                      {
                        "Effect": "Allow",
                        "Action": [
                          "s3:PutObject",
                          "s3:GetObject",
                          "s3:DeleteObject"
                        ],
                        "Resource": "arn:aws:s3:::overleaf-chunks/*"
                      }
                    ]
                  }' > policy-history.json

                # Letakkan isi kebijakan dari bagian sebelumnya di policy-filestore.json
                # Pengingat: Ganti nama bucket sesuai kebutuhan.
                mc admin policy create s3 overleaf-filestore policy-filestore.json
                mc admin policy attach s3 overleaf-filestore \
                  --user=OVERLEAF_FILESTORE_S3_ACCESS_KEY_ID || true

                mc admin policy create s3 overleaf-history policy-history.json
                mc admin policy attach s3 overleaf-history \
                  --user=OVERLEAF_HISTORY_S3_ACCESS_KEY_ID || true

    # Pengaturan penskalaan horizontal yang sebenarnya: jalankan kontainer ini di host terpisah.
    mongo:
        restart: always
        image: mongo:4.4
        container_name: mongo
        command: "--replSet overleaf"
        expose:
            - 27017
        volumes:
            - ~/mongo_data:/data/db
        healthcheck:
            test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
            interval: 10s
            timeout: 10s
            retries: 5

        # Pengaturan penskalaan horizontal sebenarnya: jalankan pada host 198.18.0.3 dan ekspos port
        # ports:
        #     - "27017:27017"
        networks:
            default:
                ipv4_address: 198.18.0.3

    mongo_replica_set_setup:
        image: mongo:4.4
        entrypoint: sh
        depends_on:
            mongo:
                condition: service_healthy
        command:
            - '-c'
            - |
                mongo 198.18.0.3 --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"198.18.0.3:27017\" } ] })"

    # Pengaturan penskalaan horizontal yang sebenarnya: jalankan kontainer ini di host terpisah.
    redis:
        restart: always
        image: redis:6.2
        container_name: redis
        expose:
            - 6379
        volumes:
            - ~/redis_data:/data

        # Pengaturan penskalaan horizontal sebenarnya: jalankan pada host 198.18.0.4 dan ekspos port
        # ports:
        #     - "6379:6379"
        networks:
            default:
                ipv4_address: 198.18.0.4
```

</details>

#### Perangkat keras

Kami merekomendasikan menggunakan spesifikasi perangkat keras yang sama untuk semua instance Server Pro yang ikut serta dalam penskalaan horizontal.

Rekomendasi umum tentang [spesifikasi perangkat keras](/on-premises/id/memulai/requirements/hardware-requirements.md) untuk instance Server Pro berlaku.

#### Memperbarui Server Pro

Sebagai bagian dari proses pembaruan, Server Pro secara otomatis menjalankan migrasi basis data. Migrasi ini **tidak** dirancang untuk dijalankan dari beberapa instance secara paralel.

Migrasi harus selesai sebelum aplikasi web yang sebenarnya dimulai. Anda dapat memeriksa log untuk entri `Migrasi selesai` atau tunggu hingga aplikasi menerima lalu lintas.

Prosedur pembaruannya seperti ini:

1. Jadwalkan jendela pemeliharaan
2. Hentikan semua instance Server Pro
3. Buat cadangan yang konsisten seperti dijelaskan di [dokumentasi kami](/on-premises/id/pemeliharaan/data-and-backups.md#performing-a-consistent-backup)
4. Jalankan satu instance Server Pro dengan versi baru
5. Verifikasi bahwa instance baru berfungsi seperti yang diharapkan
6. Nyalakan instance lainnya dengan versi baru


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/on-premises/id/pemeliharaan/horizontal-scaling.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
