> 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/cs/udrzba/horizontal-scaling.md).

# Horizontální škálování

{% hint style="success" %}
Ayakaleaf Pro podporuje horizontální škálování. Otestovali jsme a ověřili, že běží správně s více replikami.
{% endhint %}

Tento dokument uvádí technické požadavky a poskytuje pokyny pro spuštění Ayakaleaf Pro ve více než jednom uzlu.

{% hint style="danger" %}
Od Server CE/Server Pro `5.0.3` proměnné prostředí byly přejmenovány z `SHARELATEX_*` na `OVERLEAF_*`.

Pokud používáte `4.x` verzi (nebo starší), ujistěte se prosím, že proměnné mají odpovídající prefix (např. `SHARELATEX_SITE_URL` místo `OVERLEAF_SITE_URL`)
{% endhint %}

Nastavení horizontálního škálování vyžaduje značné úsilí. Doporučujeme zvažovat horizontální škálování **pouze** při dosažení určitého rozsahu. Jako příklad: instalace Server Pro pro celkem 1 000 uživatelů byla úspěšně zprovozněna na jediném serveru vybaveném dvěma čtyřjádrovými procesory a 32 GB systémové paměti. Viz [požadavky na hardware](/on-premises/cs/zaciname/requirements/hardware-requirements.md) dokumentaci s doporučeními.

Nasazení Server Pro s horizontálním škálováním zahrnuje sadu externích komponent, jako je load balancer a úložiště kompatibilní se S3.

Můžeme pomoci s řešením chyb v kontejnerech Server Pro, které mohou být důsledkem chybné konfigurace, a poskytnout obecné rady na základě tohoto dokumentu. Bohužel nejsme schopni poskytovat pomoc s konfigurací aplikací/systémů třetích stran.

Řešení technických problémů specifických pro váš hardware/software, aby byly zajištěny externí komponenty, není kryto našimi podmínkami podpory.

### Požadavky

<figure><img src="/files/b78661ab159d8861fc0cf4ec734db2dd21729cdf" alt=""><figcaption></figcaption></figure>

#### Externí, centrální datové úložiště

Datové úložiště v Server Pro lze rozdělit do čtyř úložišť dat:

* **MongoDB**

  * Většina dat je ukládána do MongoDB.
  * Podporujeme buď lokální instanci, nebo externí instanci, jako je [MongoDB](https://www.mongodb.com/atlas) Atlas (plně spravovaná služba MongoDB, která běží v infrastruktuře AWS).<br>

  **Poznámka:** Bohužel v tuto chvíli není oficiální podpora pro databáze kompatibilní s MongoDB, jako jsou CosmoDB/DocumentDB, protože jsme s nimi Server Pro netestovali. Ačkoli nasazení Server Pro s kompatibilními databázemi **může** být možné, oficiálně podporujeme pouze nasazení používající MongoDB.<br>
* **Redis**

  * Redis ukládá dočasná data, například čekající aktualizace dokumentů před tím, než jsou zapsány do MongoDB.
  * Redis se používá ke komunikaci aktualizací dokumentů mezi různými službami a k oznamování editoru změn stavu v daném projektu.
  * Redis se používá k ukládání uživatelských relací.
  * Podporujeme buď lokální instanci, nebo externí instanci.<br>

  **Poznámka:** Bohužel v tuto chvíli není oficiální podpora pro key/value úložiště kompatibilní s Redis, jako jsou KeyDB/Valkey, protože jsme s nimi Server Pro netestovali. Ačkoli nasazení Server Pro s kompatibilními úložišti **může** může být možné, oficiálně podporujeme pouze nasazení používající Redis.<br>
* **Soubory projektu a soubory historie**

  * Needitovatelné soubory projektu jsou ukládány mimo MongoDB.

    Nový systém historie projektu (od Server Pro 3.5 dále) ukládá historii také mimo MongoDB.
  * Pro malé samostatné instance podporujeme buď lokální souborový systém (který může být založen na lokálním SSD, NFS nebo EBS), nebo [S3 kompatibilní systém datového úložiště](/on-premises/cs/konfigurace/overleaf-toolkit/s3.md).
  * Pro horizontální škálování **pouze** podporujeme S3 kompatibilní systémy datového úložiště.<br>

  **Důležité:** NFS/Amazon EFS/Amazon EBS **nejsou** pro horizontální škálování podporovány. Další podrobnosti najdete v sekci [požadavky na hardwarové úložiště](/on-premises/cs/zaciname/requirements/hardware-requirements.md#storage) o škálování úložiště v Server Pro.
* **Dočasné soubory**
  * Kompilace LaTeX musí pro optimální výkon běžet na rychlých místních discích. Výstup kompilace není třeba uchovávat ani zálohovat.
  * Buffering nových nahraných souborů a vytváření zip souborů projektu také těží z použití lokálního disku.

{% hint style="danger" %}
Důrazně doporučujeme používat lokální disk. Použití jakéhokoli síťového disku (například NFS nebo EBS) může vést k neočekávaným chybám kompilace a dalším problémům s výkonem.
{% endhint %}

#### **Git-bridge**

{% hint style="info" %}
Git-bridge je v Server Pro dostupný od verze 4.0.1.
{% endhint %}

Git repozitáře jsou ukládány lokálně na disku. Nejsou k dispozici žádné možnosti replikace. Git-bridge by měl běžet jako **jedna instance**. Pro optimální výkon doporučujeme pro data git-bridge používat lokální disk. Datový disk git-bridge by měl být pravidelně zálohován.

Pro datové úložiště s horizontálním škálováním potřebujete:

* centrální instanci MongoDB přístupnou ze všech instancí Server Pro
* centrální instanci Redis přístupnou ze všech instancí Server Pro
* centrální backend úložiště kompatibilní se S3 pro soubory projektu a historie
* lokální disk na každé instanci pro dočasné soubory
* lokální disk na instanci, která hostuje kontejner git-bridge, pro data git-bridge

#### Požadavky na load balancer

* **Trvalé směrování**, např. pomocí cookie

  Tento požadavek vyplývá z těchto komponent:

  * Funkce úpravy v reálném čase v Server Pro používá WebSockets s fallbackem na XHR polling. Každá editační relace má na straně serveru lokální stav a požadavky dané editační relace musí být vždy směrovány na stejnou instanci Server Pro. Funkce spolupráce používá Redis [Pub/Sub](https://redis.io/docs/latest/develop/interact/pubsub/) pro sdílení aktualizací mezi více instancemi Server Pro.
  * Kompilace LaTeX uchovává výstup a kompilovací cache lokálně pro optimální výkon. Po odeslání požadavku na kompilaci jedné instanci Server Pro musí být následující požadavky na stažení PDF/logu směrovány na tutéž instanci Server Pro.
* **Dlouhé časové limity požadavků** pro podporu kompilace velkých dokumentů LaTeX
* **Podpora WebSocketů** pro optimální výkon
* **velikost payloadu POST 50 MB**
* **Keep-alive timeout** musí být nižší než keep-alive timeout Server Pro

  Keep-alive timeout v Server Pro lze nakonfigurovat pomocí proměnné prostředí `NGINX_KEEPALIVE_TIMEOUT`. Výchozí hodnota je 65 s.

  S výchozí hodnotou funguje keep-alive timeout 60 s v load balanceru.

  S `NGINX_KEEPALIVE_TIMEOUT=120`, by load balancer mohl nastavit 115 s.
* **IP adresy klientů**

  Nastavte hlavičku požadavku `X-Forwarded-For` na IP klienta.
* Při **ukončování SSL**

  Load balancer musí přidat hlavičku požadavku `X-Forwarded-Proto: https`.

<details>

<summary>Ukázková konfigurace HAProxy</summary>

```
global
  group haproxy
  user haproxy

  # Podrobné protokolování
  log stdout format raw local0 debug

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

  # Podrobné protokolování
  log                     global
  option                  httplog

  # Přesměrujte na jiný backend, pokud ten se sticky relací nefunguje
  option                  redispatch 1
  # Tyto retry jsou pro chyby připojení TCP, ne pro HTTP status 500
  retries                 3

  # Vytrvalá relace po 24 h nečinnosti -- výstup kompilace se po 24 h smaže
  cookie                  server-pro-ha insert maxidle 24h

  # Zkus se připojit k jakémukoli backendu po dobu 1 min, pak vrať 503
  timeout queue           1m
  # Dejte instancím Server Pro 15 s na spuštění
  timeout connect         15s

  # Přeruš požadavky od velmi pomalých klientů (při čtení požadavku povol 1 min nečinnosti)
  timeout client          1m

  # Povolit pomalé kompilace -- pevně daný limit v clsi je 10 min
  timeout server          10m

  # Odpojit editor po 23 h -- 1 h před jejich posledním použitím včera
  timeout tunnel          23h

  # Poznámka: Chování keepalive v haproxy funguje skvěle s výchozím nastavením keepalive v Server Pro.
  #       Haproxy čistí spojení na pozadí a v případě potřeby přesměrovává požadavky.

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

  # Sděl aplikaci, že jsme za https
  http-request set-header X-Forwarded-Proto https

  # Sděl aplikaci skutečnou IP klienta
  option forwardfor

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

  # Směrujte git provoz do souběžného kontejneru git-bridge
  use-server server-pro-ha-1 if { path_beg /git/ }

  # Ladění
  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>

#### Konfigurace Server Pro

**Tajné údaje**

Instance Server Pro se musí shodnout na sdílených tajných údajích:

* `WEB_API_PASSWORD` (autentizace webového API)
* `STAGING_PASSWORD` a `V1_HISTORY_PASSWORD` stejná hodnota (autentizace historie)
* `CRYPTO_RANDOM` (pro cookie relace)
* `OT_JWT_AUTH_KEY` (autentizace historie)

Všechny tyto tajné údaje musí být nakonfigurovány s vlastní jedinečnou hodnotou a sdíleny mezi instancemi.

Pokud nejsou nakonfigurovány a požadavky uživatelů jsou směrovány na různé instance Server Pro, jejich požadavek nesplní autentizační kontroly a buď budou často přesměrováni na přihlašovací stránku, nebo jejich akce v uživatelském rozhraní budou selhávat neočekávaným způsobem.

Pokud nejsou nakonfigurovány, Server Pro použije novou náhodnou hodnotu pro každý tajný údaj na základě 32 náhodných bajtů z `/dev/urandom` (256 náhodných bitů).

{% 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**

Nasměrujte `OVERLEAF_MONGO_URL` (`SHARELATEX_MONGO_URL` pro verze `4.x` a starší) na centrální instanci MongoDB.

**Redis**

Nasměrujte `OVERLEAF_REDIS_HOST` (`SHARELATEX_REDIS_HOST` pro verze `4.x` a starší) a `REDIS_HOST` na centrální instanci Redis.

**S3 kompatibilní úložiště pro soubory projektu a historie**

Další informace naleznete v dokumentaci k [S3 kompatibilní úložiště](/on-premises/cs/konfigurace/overleaf-toolkit/s3.md) pro podrobnosti.

**Dočasné soubory**

Výchozí připojení lokálního SSD k `/var/lib/overleaf` (`/var/lib/sharelatex` pro verze `4.x` a starší) bude dostačující. Ujistěte se, že ukazujete `SANDBOXED_COMPILES_HOST_DIR` na připojovací bod na hostiteli.

{% hint style="danger" %}
Důrazně doporučujeme používat lokální disk. Použití jakéhokoli síťového disku (například NFS nebo EBS) může vést k neočekávaným chybám kompilace a dalším problémům s výkonem.
{% endhint %}

**Konfigurace proxy**

* Nastavte `OVERLEAF_BEHIND_PROXY=true` (`SHARELATEX_BEHIND_PROXY` pro verze `4.x` a starší) pro přesné IP adresy klientů.
* Nastavte `TRUSTED_PROXY_IPS` na IP adresu load balanceru (lze zadat více CIDR, oddělených čárkou).

**Integrace Git-bridge**

{% hint style="info" %}
Git-bridge je v Server Pro dostupný od verze 4.0.1.
{% endhint %}

Kontejner git-bridge potřebuje vedlejší kontejner Server Pro pro zpracování příchozích git požadavků. Tento vedlejší kontejner může obsluhovat i běžný uživatelský provoz. V ukázkové konfiguraci funguje jako vedlejší kontejner pro git-bridge první instance, ale ve skutečnosti by tuto roli mohla plnit kterákoli instance.

Proč musíme určit jeden kontejner Server Pro jako vedlejší pro git-bridge? Server Pro předává git-bridge adresy URL pro stahování služby historie. Tyto adresy URL historie musíme nakonfigurovat tak, aby byly přístupné z kontejneru git-bridge.

Konfigurace kontejneru Server Pro:

* Nastavte `GIT_BRIDGE_ENABLED` na `'true'`
* Nastavte `GIT_BRIDGE_HOST` na `<název kontejneru git-bridge>` např. `git-bridge`
* Nastavte `GIT_BRIDGE_PORT` na `8000`
* Nastavte `V1_HISTORY_URL` na `http://<název vedlejšího kontejneru server-pro>:3100/api`.

  Poznámka: Toto je nutné pouze na vedlejším kontejneru pro kontejner git-bridge. Ostatní instance mohou používat URL localhost, což je výchozí hodnota.

Konfigurace kontejneru git-bridge:

* Nastavte `GIT_BRIDGE_API_BASE_URL` na `http://<název vedlejšího kontejneru server-pro>/api/v0`, např. `http://server-pro-ha-1/api/v0`
* Nastavte `GIT_BRIDGE_OAUTH2_SERVER` na `http://<název vedlejšího kontejneru server-pro>`, např. `http://server-pro-ha-1`
* Nastavte `GIT_BRIDGE_POSTBACK_BASE_URL` na `http://<název kontejneru git-bridge>:8000`, např. `http://git-bridge:8000`
* Nastavte `GIT_BRIDGE_ROOT_DIR` na připojený datový disk git-bridge, např. `/data/git-bridge`

<details>

<summary>Ukázková konfigurace docker-compose.yml</summary>

Následující konfigurace ukazuje samostatné nastavení. Aby demo fungovalo, musíte poskytnout platný klíč/certifikát SSL a upravit `OVERLEAF_SITE_URL` (`SHARELATEX_SITE_URL` pro verze `4.x` a starší). Pro skutečné nasazení musíte nahradit ukázkové tajné údaje skutečnými, jak je uvedeno přímo v textu. Pro skutečné nasazení je třeba přesunout jednotlivé kontejnery na vyhrazené uzly a upravit IP adresy podle vašeho lokálního síťového nastavení.

```yaml
verze: '2.2'

# Skutečné nastavení horizontálního škálování: zvolte vlastní síť a nahraďte IP adresy v konfiguraci.
networks:
    default:
        ipam:
            config:
                # Tato podsíť je součástí vyhrazené podsítě používané pro benchmarky
                # https://tools.ietf.org/html/rfc2544
                # Celá podsíť je 198.18.0.0/15
                # Použijte 198.18.0.0/24 pro lb a dbs
                # Použijte 198.18.1.0/24 pro server-pro
                # Použijte 198.18.0.128/25 pro dočasný kontejner
                - brána: 198.18.0.1
                  ip_range: 198.18.0.128/25
                  subnet: 198.18.0.0/23

služby:
    # Skutečné nastavení horizontálního škálování: spusťte haproxy mimo docker na samostatném hostiteli.
    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
        # Alternativa k "ports": použijte síť hostitele, abyste se vyhnuli režii docker-proxy
        network_mode: host

        # Alternativa k "network_mode: host": použijte docker-proxy pro izolaci sítě
        # ports:
        #     - "80:80"
        #     - "443:443"
        # networks:
        #     default:
        #         ipv4_address: 198.18.0.2

        # Skutečné nastavení horizontálního škálování: odstraňte tyto, protože běží na jiných hostitelích.
        depends_on:
            server-pro-ha-1:
                condition: service_started
            server-pro-ha-2:
                condition: service_started
            server-pro-ha-3:
                condition: service_started

    # Skutečné nastavení horizontálního škálování: spusťte tento kontejner vedle server-pro-ha-1.
    # Pro Server Pro 4.0 a novější.
    git-bridge:
        restart: always
        # Značka by měla odpovídat značce kontejneru `server-pro-ha-1`.
        image: quay.io/sharelatex/git-bridge:4.0.1
        volumes:
            # Skutečné nastavení horizontálního škálování: nasměrujte /data/git-bridge na vyhrazený místní SSD disk.
            - ~/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"]

        # Skutečné nastavení horizontálního škálování: spusťte na hostiteli 198.18.0.6 a vystavte port
        # ports:
        #     - "8000:8000"
        networks:
            default:
                ipv4_address: 198.18.0.6

    # Skutečné nastavení horizontálního škálování: spusťte tento kontejner na samostatném hostiteli.
    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:
            # Skutečné nastavení horizontálního škálování: ponechte tuto položku.
            git-bridge:
                condition: service_started

            # Skutečné nastavení horizontálního škálování: odstraňte níže uvedené, protože běží na jiných hostitelích.
            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
            # Skutečné nastavení horizontálního škálování: uveďte vlastní doménu/název aplikace.
            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
            # Skutečné nastavení horizontálního škálování: zvolte bezpečné přihlašovací údaje.
            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
            # Potřebné pouze na sesterské instanci git-bridge
            V1_HISTORY_URL: "http://server-pro-ha-1:3100/api"
            # /git-bridge

            # Horizontální škálování
            # Skutečné nastavení horizontálního škálování: zvolte bezpečné přihlašovací údaje.
            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'
            # Skutečné nastavení horizontálního škálování: IP adresy load balancerů
            TRUSTED_PROXY_IPS: 198.18.0.1,198.18.0.2
            # /Horizontální škálování

        # Skutečné nastavení horizontálního škálování: spusťte na hostiteli 198.18.1.1 a zpřístupněte porty
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.1

    # Skutečné nastavení horizontálního škálování: spusťte tento kontejner na samostatném hostiteli.
    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"

        # Skutečné nastavení horizontálního škálování: spusťte na hostiteli 198.18.1.2 a zpřístupněte porty
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.2

    # Skutečné nastavení horizontálního škálování: spusťte tento kontejner na samostatném hostiteli.
    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"

        # Skutečné nastavení horizontálního škálování: spusťte na hostiteli 198.18.1.3 a zpřístupněte porty
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.3

    # Skutečné nastavení horizontálního škálování: spusťte tento kontejner na samostatném hostiteli.
    minio:
        image: minio/minio:RELEASE.2023-05-18T00-05-36Z
        container_name: minio
        command: server /data
        volumes:
            # Skutečné nastavení horizontálního škálování: spusťte minio s více disky, viz dokumentaci minio.
            - ~/minio_data:/data
        environment:
            # Skutečné nastavení horizontálního škálování: zvolte bezpečné přihlašovací údaje.
            MINIO_ROOT_USER: MINIO_ROOT_USER
            MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD

        # Skutečné nastavení horizontálního škálování: spusťte na hostiteli 198.18.0.5 a zpřístupněte port
        # ports:
        #     - "9000:9000"
        networks:
            default:
                ipv4_address: 198.18.0.5

    # Skutečné nastavení horizontálního škálování: tuto konfiguraci spusťte jednou na samostatném hostiteli.
    minio_setup:
        depends_on:
            - minio
        image: minio/mc:RELEASE.2023-05-18T16-59-00Z
        entrypoint: sh
        command:
            - '-c'
            # Skutečné nastavení horizontálního škálování: zvolte bezpečné přihlašovací údaje.
            - |
                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

                # Obsah politiky z předchozí části vložte do souboru policy-filestore.json
                # Připomínka: odpovídajícím způsobem nahraďte názvy bucketů.
                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

    # Skutečné nastavení horizontálního škálování: spusťte tento kontejner na samostatném hostiteli.
    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

        # Skutečné nastavení horizontálního škálování: spusťte na hostiteli 198.18.0.3 a zpřístupněte 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\" } ] })"

    # Skutečné nastavení horizontálního škálování: spusťte tento kontejner na samostatném hostiteli.
    redis:
        restart: always
        image: redis:6.2
        container_name: redis
        expose:
            - 6379
        volumes:
            - ~/redis_data:/data

        # Skutečné nastavení horizontálního škálování: spusťte na hostiteli 198.18.0.4 a zpřístupněte port
        # ports:
        #     - "6379:6379"
        networks:
            default:
                ipv4_address: 198.18.0.4
```

</details>

#### Hardware

Doporučujeme používat stejné hardwarové specifikace pro všechny instance Server Pro, které se účastní horizontálního škálování.

Obecná doporučení k [hardwarovým specifikacím](/on-premises/cs/zaciname/requirements/hardware-requirements.md) pro instance Server Pro platí.

#### Upgrade Server Pro

V rámci procesu upgradu Server Pro automaticky spouští migrace databáze. Tyto migrace jsou **nejsou** navrženy tak, aby mohly být spuštěny z více instancí paralelně.

Migrace musí doběhnout před tím, než se skutečná webová aplikace spustí. Můžete buď zkontrolovat protokoly kvůli záznamu o `Dokončeno migrací` nebo počkat, až aplikace začne přijímat provoz.

Postup upgradu vypadá takto:

1. Naplánujte servisní okno
2. Zastavte všechny instance Server Pro
3. Vytvořte konzistentní zálohu, jak je popsáno v [dokumentaci](/on-premises/cs/udrzba/data-and-backups.md#performing-a-consistent-backup)
4. Spusťte jednu instanci Server Pro s novou verzí
5. Ověřte, že nová instance funguje podle očekávání
6. Spusťte ostatní instance s novou verzí


---

# 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/cs/udrzba/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.
