> For the complete documentation index, see [llms.txt](https://ayakaleaf-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://ayakaleaf-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 dari Server CE/Server Pro `5.0.3` variabel lingkungan telah diganti nama dari `SHARELATEX_*` ke `OVERLEAF_*`.

Jika Anda menggunakan `4.x` versi (atau yang lebih lama) pastikan variabel-variabel diawali dengan prefix yang sesuai (mis. `SHARELATEX_SITE_URL` alih-alih `OVERLEAF_SITE_URL`)
{% endhint %}

Menyiapkan penskalaan horizontal memerlukan upaya yang signifikan. Kami menyarankan untuk mempertimbangkan penskalaan horizontal **hanya** saat mencapai skala tertentu. Sebagai contoh, instalasi Server Pro untuk total 1.000 pengguna telah berhasil disiapkan menggunakan satu server dengan dua prosesor 4-core 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 kesalahan pada kontainer Server Pro yang mungkin merupakan akibat dari salah konfigurasi dan memberikan saran umum berdasarkan dokumen ini. Sayangnya, kami tidak dapat memberikan bantuan untuk mengonfigurasi aplikasi/sistem pihak ketiga.

Pemecahan masalah teknis yang spesifik untuk perangkat keras/perangkat lunak Anda untuk menyediakan komponen eksternal tidak tercakup oleh 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 instance lokal maupun instance 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 dengan basis data tersebut. Meskipun penerapan Server Pro dengan basis data yang kompatibel **mungkin** dimungkinkan, kami hanya secara resmi mendukung penerapan yang menggunakan MongoDB.<br>
* **Redis**

  * Redis menyimpan data sementara, seperti pembaruan dokumen yang tertunda sebelum disalurkan ke MongoDB.
  * Redis digunakan untuk mengomunikasikan pembaruan dokumen antar layanan yang berbeda dan memberi tahu editor tentang perubahan status dalam proyek tertentu.
  * Redis digunakan untuk menyimpan sesi pengguna.
  * Kami mendukung instance lokal maupun instance eksternal.<br>

  **Catatan:** Sayangnya, saat ini belum ada dukungan resmi untuk penyimpanan key/value yang kompatibel dengan Redis seperti KeyDB/Valkey, karena kami belum menguji Server Pro dengan penyimpanan tersebut. Meskipun penerapan Server Pro dengan penyimpanan yang kompatibel **mungkin** mungkin dimungkinkan, kami hanya secara resmi mendukung penerapan yang menggunakan Redis.<br>
* **File proyek dan file riwayat**

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

    Sistem riwayat proyek baru (Server Pro 3.5 ke atas) juga menyimpan riwayat di luar MongoDB.
  * Untuk instance tunggal berukuran kecil, kami mendukung sistem berkas lokal (yang dapat didukung oleh SSD lokal, NFS, atau EBS) atau sebuah [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 penskalaan penyimpanan di Server Pro untuk detail lebih lanjut.
* **File sementara**
  * Kompilasi LaTeX perlu dijalankan pada disk lokal yang cepat untuk kinerja optimal. Output dari kompilasi tidak perlu disimpan secara persisten atau dicadangkan.
  * Buffering unggahan file baru dan pembuatan file zip proyek juga diuntungkan dengan menggunakan 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 kinerja 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 **instance tunggal**. Untuk kinerja 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:

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

#### Persyaratan load balancer

* **Perutean persisten**, mis. menggunakan cookie

  Persyaratan ini berasal dari komponen-komponen berikut:

  * Kemampuan pengeditan waktu nyata di Server Pro menggunakan WebSocket dengan fallback ke polling XHR. Setiap sesi pengeditan memiliki status lokal di sisi server dan permintaan dari sesi pengeditan tertentu selalu perlu diarahkan ke instance Server Pro yang sama. Fitur kolaborasi menggunakan Redis [Pub/Sub](https://redis.io/docs/latest/develop/interact/pubsub/) untuk berbagi pembaruan antar beberapa instance Server Pro.
  * Kompilasi LaTeX menyimpan output dan cache kompilasi secara lokal demi kinerja yang optimal. Saat mengirim permintaan kompilasi ke satu instance Server Pro, permintaan unduhan PDF/log berikutnya perlu diarahkan ke instance Server Pro yang sama.
* **Batas waktu permintaan yang panjang** untuk mendukung kompilasi dokumen LaTeX berukuran besar
* **Dukungan WebSocket** untuk kinerja optimal
* **Ukuran payload POST sebesar 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 default, batas waktu keep-alive 60 detik di load balancer berfungsi.

  Dengan `NGINX_KEEPALIVE_TIMEOUT=120`, load balancer dapat menggunakan 115 detik.
* **IP klien**

  Setel header permintaan `X-Forwarded-For` ke IP klien.
* Saat **terminasi SSL**

  Load balancer 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

  # Arahkan ulang ke backend lain jika yang sticky sedang down
  option                  redispatch 1
  # Percobaan ulang ini untuk kesalahan koneksi TCP, bukan pada 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 hubungkan ke backend mana pun selama 1 menit, lalu kembalikan 503
  timeout queue           1m
  # Beri instance 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 keras di clsi adalah 10 menit
  timeout server          10m

  # Putuskan 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 bawaan di Server Pro.
  #       Haproxy membersihkan koneksi di latar belakang dan akan mengalihkan 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 kami 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;"

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

  # Penelusuran masalah
  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**

Instance Server Pro perlu menyepakati rahasia bersama:

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

Semua rahasia ini perlu dikonfigurasi dengan nilai uniknya masing-masing dan dibagikan di antara instance.

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

Bila 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**

Tunjuk `OVERLEAF_MONGO_URL` (`SHARELATEX_MONGO_URL` untuk versi `4.x` dan yang lebih lama) pada instance MongoDB terpusat.

**Redis**

Tunjuk `OVERLEAF_REDIS_HOST` (`SHARELATEX_REDIS_HOST` untuk versi `4.x` dan yang lebih lama) dan `REDIS_HOST` pada instance Redis terpusat.

**Penyimpanan S3 yang kompatibel untuk file proyek dan riwayat**

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

**File sementara**

Bind-mount default dari SSD lokal ke `/var/lib/overleaf` (`/var/lib/sharelatex` untuk versi `4.x` dan yang lebih lama) akan cukup. Pastikan untuk menunjuk `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 kinerja lainnya.
{% endhint %}

**Konfigurasi proxy**

* Setel `OVERLEAF_BEHIND_PROXY=true` (`SHARELATEX_BEHIND_PROXY` untuk versi `4.x` dan yang lebih lama) untuk IP klien yang akurat.
* Setel `TRUSTED_PROXY_IPS` ke IP load balancer (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 membutuhkan kontainer saudara Server Pro untuk menangani permintaan git yang masuk. Kontainer saudara ini juga dapat melayani lalu lintas pengguna biasa. Dalam konfigurasi contoh, instance pertama bertindak sebagai kontainer saudara untuk git-bridge, tetapi sebenarnya instance mana pun dapat berfungsi sebagai itu.

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

Konfigurasi kontainer Server Pro:

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

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

Konfigurasi kontainer git-bridge:

* Setel `GIT_BRIDGE_API_BASE_URL` ke `http://<nama kontainer saudara server-pro>/api/v0`, mis. `http://server-pro-ha-1/api/v0`
* Setel `GIT_BRIDGE_OAUTH2_SERVER` ke `http://<nama kontainer saudara server-pro>`, mis. `http://server-pro-ha-1`
* Setel `GIT_BRIDGE_POSTBACK_BASE_URL` ke `http://<nama kontainer git-bridge>:8000`, mis. `http://git-bridge:8000`
* Setel `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 penyiapan 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 yang lebih lama). Untuk penyiapan yang sebenarnya, Anda harus mengganti rahasia dummy dengan rahasia yang sebenarnya seperti dicatat di baris inline. Untuk penyiapan yang sebenarnya, Anda perlu memindahkan kontainer individual ke node-node khusus dan menyesuaikan alamat IP dengan penyiapan jaringan lokal Anda.

```yaml
version: '2.2'

# Penyiapan penskalaan horizontal yang sebenarnya: pilih jaringan Anda sendiri dan ganti IP dalam konfigurasi.
networks:
    default:
        ipam:
            config:
                # Subnet ini merupakan bagian dari subnet yang dipesan untuk benchmarking
                # https://tools.ietf.org/html/rfc2544
                # Subnet lengkapnya adalah 198.18.0.0/15
                # Gunakan 198.18.0.0/24 untuk lb dan db
                # 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:
    # Penyiapan 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 network 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

        # Penyiapan penskalaan horizontal yang sebenarnya: hapus 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

    # Penyiapan penskalaan horizontal yang sebenarnya: jalankan kontainer ini di sebelah server-pro-ha-1.
    # Untuk Server Pro 4.0 ke atas.
    git-bridge:
        restart: always
        # Tag harus cocok dengan tag kontainer `server-pro-ha-1`.
        image: quay.io/sharelatex/git-bridge:4.0.1
        volumes:
            # Penyiapan 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"]

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

    # Penyiapan 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:
            # Penyiapan penskalaan horizontal yang sebenarnya: pertahankan entri ini.
            git-bridge:
                condition: service_started

            # Penyiapan 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
            # Penyiapan penskalaan horizontal yang sebenarnya: sediakan domain/nama aplikasi Anda sendiri.
            OVERLEAF_SITE_URL: 'https://overleaf.example.com'
            OVERLEAF_APP_NAME: Server Pro Horizontal Scaling Demo

            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
            # Penyiapan penskalaan horizontal yang 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
            # Penyiapan penskalaan horizontal yang 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 yang sebenarnya: IP dari penyeimbang beban
            TRUSTED_PROXY_IPS: 198.18.0.1,198.18.0.2
            # /Penskalaan horizontal

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

    # Penyiapan 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 yang sebenarnya: jalankan di host 198.18.1.2 dan buka port
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.2

    # Penyiapan 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 yang sebenarnya: jalankan di host 198.18.1.3 dan buka port
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.3

    # Penyiapan 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 yang sebenarnya: jalankan minio dengan beberapa disk, lihat dokumentasi minio.
            - ~/minio_data:/data
        environment:
            # Penyiapan penskalaan horizontal yang sebenarnya: pilih kredensial yang aman.
            MINIO_ROOT_USER: MINIO_ROOT_USER
            MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD

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

    # Pengaturan penskalaan horizontal yang sebenarnya: jalankan pengaturan ini sekali pada host terpisah.
    minio_setup:
        depends_on:
            - minio
        image: minio/mc:RELEASE.2023-05-18T16-59-00Z
        entrypoint: sh
        perintah:
            - '-c'
            # Penyiapan penskalaan horizontal yang 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

    # Penyiapan 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 yang sebenarnya: jalankan di host 198.18.0.3 dan buka 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
        perintah:
            - '-c'
            - |
                mongo 198.18.0.3 --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"198.18.0.3:27017\" } ] })"

    # Penyiapan 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 yang sebenarnya: jalankan di host 198.18.0.4 dan buka 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) berlaku untuk instance Server Pro.

#### Memutakhirkan Server Pro

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

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

Prosedur pemutakhiran terlihat seperti ini:

1. Jadwalkan jendela pemeliharaan
2. Hentikan semua instance Server Pro
3. Buat cadangan yang konsisten seperti dijelaskan dalam [dokumentasi](/on-premises/id/pemeliharaan/data-and-backups.md#performing-a-consistent-backup)
4. Mulai 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://ayakaleaf-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.
