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

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

Počínaje verzí 3.5.6 Server Pro podporuje horizontální škálování.

Tento dokument uvádí technické požadavky a poskytuje pokyny pro provoz Server Pro na více než jednom uzlu.

{% hint style="danger" %}
Počínaje 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í předponu (např. `SHARELATEX_SITE_URL` namísto `OVERLEAF_SITE_URL`)
{% endhint %}

Nastavení horizontálního škálování vyžaduje značné úsilí. Doporučujeme o horizontálním škálování uvažovat **pouze** při dosažení určitého rozsahu. Jako příklad lze uvést, že instalace Server Pro pro 1 000 celkových uživatelů byla úspěšně nastavena na jediném serveru vybaveném dvěma 4jádrovými procesory a 32 GB systémové paměti. Viz [hardwarové požadavky](/on-premises/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 vyrovnávač zatížení a úložiště kompatibilní s S3.

Můžeme pomoci s odstraňování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 nemůžeme poskytovat pomoc s konfigurací aplikací/systémů třetích stran.

Řešení technických problémů specifických pro váš hardware/software, aby bylo možné zajistit externí komponenty, není zahrnuto v našich podmínkách podpory.

### Požadavky

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

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

* **MongoDB**

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

  **Poznámka:** Bohužel v tuto chvíli neexistuje oficiální podpora databází kompatibilních 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 jejich zapsáním 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ď místní instanci, nebo externí instanci.<br>

  **Poznámka:** Bohužel v tuto chvíli neexistuje oficiální podpora úložišť klíč/hodnota kompatibilních 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 (Server Pro 3.5 a novější) ukládá historii také mimo MongoDB.
  * Pro malé samostatné instance podporujeme buď místní souborový systém (který může být podložen místním SSD, NFS nebo EBS), nebo [úložiště dat kompatibilní s S3](/on-premises/on-premises-cs/konfigurace/overleaf-toolkit/s3.md).
  * Pro horizontální škálování **pouze** podporujeme úložiště dat kompatibilní s S3.<br>

  **Důležité:** NFS/Amazon EFS/Amazon EBS jsou **ne** podporovány pro horizontální škálování. Další podrobnosti naleznete v sekci [hardwarového úložiště](/on-premises/on-premises-cs/zaciname/requirements/hardware-requirements.md#storage) požadavků na škálování úložiště v Server Pro.
* **Dočasné soubory**
  * Pro optimální výkon musí běhy kompilace LaTeXu probíhat na rychlých místních discích. Výstup kompilace není nutné trvale ukládat ani zálohovat.
  * Z ukládání nových nahraných souborů do vyrovnávací paměti a vytváření zip souborů projektu také těží použití místního disku.

{% hint style="danger" %}
Důrazně doporučujeme používat místní 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 k dispozici od verze 4.0.1.
{% endhint %}

Git repozitáře jsou ukládány lokálně na disk. Nejsou k dispozici žádné možnosti replikace. Git-bridge by měl běžet jako **singleton**. Pro optimální výkon doporučujeme pro data git-bridge používat místní 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í úložiště kompatibilní s S3 pro soubory projektu a historie
* místní disk na každé instanci pro dočasné soubory
* místní disk na instanci, která hostí kontejner git-bridge, pro data git-bridge

#### Požadavky na vyrovnávač zatížení

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

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

  * Funkce úprav v reálném čase v Server Pro používá WebSockets s fallbackem na dotazování XHR. 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/) ke sdílení aktualizací mezi více instancemi Server Pro.
  * Kompilace LaTeXu uchovává výstup a mezipaměť kompilace lokálně pro volitelný výkon. Po odeslání požadavku na kompilaci na jednu instanci Server Pro musí být následující požadavky na stažení PDF/logů směrovány na stejnou instanci Server Pro.
* **Dlouhé časové limity požadavků** pro podporu kompilace velkých dokumentů LaTeXu
* **Podpora WebSocketů** pro optimální výkon
* **Velikost těla POSTu 50 MB**
* **Keep-alive timeout** musí být nižší než keep-alive timeout Server Pro

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

  S výchozím nastavením funguje keep-alive timeout 60 s ve vyrovnávači zatížení.

  S `NGINX_KEEPALIVE_TIMEOUT=120`může vyrovnávač zatížení nastavit 115 s.
* **IP adresy klientů**

  Nastavte hlavičku požadavku `X-Forwarded-For` na IP adresu klienta.
* Když **ukončení SSL**

  Vyrovnávač zatížení 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 je sticky nedostupný
  option                  redispatch 1
  # Tato opakování jsou pro chyby připojení TCP, ne pro odpovědi HTTP se stavem 500
  retries                 3

  # Sticky session po 24 h nečinnosti -- výstup kompilace je po 24 h smazán
  cookie                  server-pro-ha insert maxidle 24h

  # Zkuste se připojit k libovolnému backendu po dobu 1 min, poté vraťte 503
  timeout queue           1m
  # Dejte instancím Server Pro 15 s na spuštění
  timeout connect         15s

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

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

  # Odpojte 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 skvěle funguje s výchozím nastavením keepalive v Server Pro.
  #       Haproxy na pozadí čistí spojení a v případě potřeby znovu přidělí 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

  # Řekněte aplikaci, že jsme za https
  http-request set-header X-Forwarded-Proto https

  # Řekněte aplikaci skutečnou IP adresu 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` (ověřování webového API)
* `STAGING_PASSWORD` a `V1_HISTORY_PASSWORD` stejná hodnota (ověřování historie)
* `CRYPTO_RANDOM` (pro cookie relace)
* `OT_JWT_AUTH_KEY` (ověřování 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žadavky neprojdou ověřovacími kontrolami a buď budou často přesměrováni na přihlašovací stránku, nebo jejich akce v uživatelském rozhraní selžou neočekávaným způsobem.

Pokud nejsou nakonfigurovány, Server Pro používá pro každý tajný údaj novou náhodnou hodnotu založenou na 32 náhodných bajtech 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.

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

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

**Dočasné soubory**

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

{% hint style="danger" %}
Důrazně doporučujeme používat místní 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 vyrovnávače zatížení (lze zadat více CIDR oddělených čárkou).

**Integrace Git-bridge**

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

Kontejner git-bridge potřebuje sousední kontejner Server Pro pro zpracování příchozích git požadavků. Tento sousední kontejner může obsluhovat také běžný uživatelský provoz. Ve vzorové konfiguraci funguje jako sousední 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 sousední 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 sousedního kontejneru server-pro>:3100/api`.

  Poznámka: To je nutné pouze na sousední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 sousedního kontejneru server-pro>/api/v0`, např. `http://server-pro-ha-1/api/v0`
* Nastavte `GIT_BRIDGE_OAUTH2_SERVER` na `http://<název sousední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ý SSL klíč/certifikát a upravit `OVERLEAF_SITE_URL` (`SHARELATEX_SITE_URL` pro verze `4.x` a starší). Pro skutečné nasazení musíte nahradit zástupné tajné údaje skutečnými tajnými údaji, jak je uvedeno přímo v textu. Pro skutečné nasazení musíte přesunout jednotlivé kontejnery na vyhrazené uzly a upravit IP adresy podle nastavení vaší lokální sítě.

```yaml
version: '2.2'

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

services:
    # 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 hostitelskou síť, 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 řádky, 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
        # Označení by mělo odpovídat štítku 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.
            - ~/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 tento záznam.
            git-bridge:
                condition: service_started

            # Skutečné nastavení horizontálního škálování: ty níže odstraňte, 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í: poskytně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
            # Pouze potřeba 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 vyrovnávačů zátěže
            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 vystavte 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 vystavte 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 vystavte 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 dokumentace 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 vystavte port
        # ports:
        #     - "9000:9000"
        networks:
            default:
                ipv4_address: 198.18.0.5

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

                # Vložte obsah zásady z předchozí sekce do policy-filestore.json
                # Připomínka: názvy bucketů odpovídajícím způsobem nahraďte.
                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 vystavte 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
        příkazu:
            - '-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 vystavte 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í pro [hardwarové specifikace](/on-premises/on-premises-cs/zaciname/requirements/hardware-requirements.md) pro instance Server Pro platí.

#### Aktualizace Server Pro

V rámci procesu aktualizace Server Pro automaticky spouští migrace databáze. Tyto migrace jsou **ne** navrženy tak, aby se spouštěly z více instancí paralelně.

Migrace musí dokončit předtím, než se spustí samotná webová aplikace. Můžete buď zkontrolovat v logu záznam o `Migrace dokončeny` nebo počkat, dokud aplikace nezačne přijímat provoz.

Postup aktualizace vypadá takto:

1. Naplánujte údržbové okno
2. Zastavte všechny instance Server Pro
3. Vytvořte konzistentní zálohu, jak je popsáno v [dokumentaci](/on-premises/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://overleaf-pro.ayaka.space/on-premises/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.
