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

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

Od verze 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 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 horizontální škálování zvažovat **pouze** při dosažení určitého rozsahu. Jako příklad lze uvést instalaci Server Pro pro 1 000 celkových uživatelů, která byla úspěšně zprovozněna na jednom 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) v 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 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 byly zajištěny externí komponenty, není součástí našich podmínek 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 uložena v MongoDB.
  * Podporujeme buď lokální 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. I když může být nasazení Server Pro s kompatibilními databázemi **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 zápisem do MongoDB.
  * Redis se používá pro komunikaci aktualizací dokumentů mezi různými službami a pro informování editoru o změnách stavu v daném projektu.
  * Redis se používá pro ukládání uživatelských relací.
  * Podporujeme buď lokální instanci, nebo externí instanci.<br>

  **Poznámka:** Bohužel v tuto chvíli neexistuje oficiální podpora klíčových/hodnotových úložišť kompatibilních s Redis, jako jsou KeyDB/Valkey, protože jsme s nimi Server Pro netestovali. I když může být nasazení Server Pro s kompatibilními úložišti **možné,** 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) ukládá historii také mimo MongoDB.
  * Pro malé samostatné instance podporujeme buď lokální souborový systém (který může být podložen lokálním SSD, NFS nebo EBS), nebo [datové úložiště kompatibilní se S3](/on-premises/on-premises-cs/konfigurace/overleaf-toolkit/s3.md).
  * Pro horizontální škálování **pouze** podporujeme datová úložiště kompatibilní se S3.<br>

  **Důležité:** NFS/Amazon EFS/Amazon EBS jsou **ne** podporovány pro horizontální škálování. Podívejte se prosím na [hardwarové úložiště](/on-premises/on-premises-cs/zaciname/requirements/hardware-requirements.md#storage) sekci s požadavky na škálování úložiště v Server Pro pro více podrobností.
* **Dočasné soubory**
  * Kompilace LaTeXu musí pro optimální výkon běžet na rychlých lokálních discích. Výsledek kompilace není třeba trvale ukládat ani zálohovat.
  * Zásobní ukládání 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 při kompilaci 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 používat pro data git-bridge lokální disk. Datový disk git-bridge by měl být pravidelně zálohován.

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

* centrální instanci MongoDB, která je přístupná ze všech instancí Server Pro
* centrální instanci Redis, která je přístupná ze všech instancí Server Pro
* centrální ú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

* **Perzistentní 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á WebSockety s alternativou v podobě 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ě kvůli lepšímu výkonu. Po odeslání požadavku na kompilaci do jedné instance 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 POST payloadu 50 MB**
* **Časový limit keep-alive** musí být nižší než časový limit keep-alive v Server Pro

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

  S výchozím nastavením funguje časový limit keep-alive 60 s v load balanceru.

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

  Nastavte hlavičku požadavku `X-Forwarded-For` na IP adresu klienta.
* Když **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é logování
  log stdout format raw local0 debug

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

  # Podrobné logování
  log                     global
  option                  httplog

  # Přesměruj na jiný backend, pokud je ten připnutý nedostupný
  option                  redispatch 1
  # Tyto pokusy jsou pro chyby při TCP připojení, ne pro odpovědi HTTP se stavem 500
  retries                 3

  # Perzistentní session po 24 hodinách neaktivity -- výstup kompilace je po 24 hodinách smazán
  cookie                  server-pro-ha insert maxidle 24h

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

  # Zruš požadavky od velmi pomalých klientů (při čtení požadavku povol 1 minutu neaktivity)
  timeout client          1m

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

  # Odpojit editor po 23 hodinách -- o 1 hodinu dříve než jeho poslední použití 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 v pozadí čistí spojení a v případě potřeby znovu přesměruje 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

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

  # Řekni 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ěruj 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 web 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 nastaveny s vlastní jedinečnou hodnotou a sdíleny mezi instancemi.

Pokud nejsou nastaveny a uživatelské požadavky jsou směrovány na různé instance Server Pro, jejich požadavky neprojdou ověřením a buď budou často přesměrovávány 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 nastaveny, Server Pro použije 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**

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

**Redis**

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

**Úložiště kompatibilní se S3 pro soubory projektů a historie**

Podívejte se prosím do dokumentace k [úložiště kompatibilní se S3](/on-premises/on-premises-cs/konfigurace/overleaf-toolkit/s3.md) pro podrobnosti.

**Dočasné soubory**

Výchozí bind-mount lokálního SSD na `/var/lib/overleaf` (`/var/lib/sharelatex` pro verze `4.x` a starší) bude postačovat. 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 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 při kompilaci 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 k dispozici od verze 4.0.1.
{% endhint %}

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

Proč potřebujeme určit jeden kontejner Server Pro jako souběžný pro git-bridge? Server Pro předává git-bridge adresy URL pro stahování ze služby historie. Je třeba nakonfigurovat tyto adresy URL historie 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 souběžného kontejneru server-pro>:3100/api`.

  Poznámka: Toto je potřeba pouze na souběžném kontejneru pro kontejner git-bridge. Ostatní instance mohou používat URL localhost, což je výchozí.

Konfigurace kontejneru git-bridge:

* Nastavte `GIT_BRIDGE_API_BASE_URL` na `http://<název souběžného kontejneru server-pro>/api/v0`, např. `http://server-pro-ha-1/api/v0`
* Nastavte `GIT_BRIDGE_OAUTH2_SERVER` na `http://<název souběžné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 ukázka fungovala, 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é nastavení musíte nahradit zástupné 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 nastavení vaší lokální sítě.

```yaml
version: '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í rezervované podsítě používané pro benchmarkování
                # 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

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'
        svazky:
            - ./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 host network, 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 položky, 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
        svazky:
            # Skutečné nastavení horizontálního škálování: namapujte /data/git-bridge na vyhrazené lokální SSD.
            - ~/git_bridge_data:/data/git-bridge
        container_name: git-bridge
        prostředí:
            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 zveřejněte 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í: odstraňte ty níže, 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
        svazky:
            - /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: Ukázka horizontálního škálování Server Pro

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

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

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

            # S3
            # 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 vyvažovačů 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 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
        svazky:
            - /tmp/scratch-disk2:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        prostředí:
            <<: *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
        svazky:
            - /tmp/scratch-disk3:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        prostředí:
            <<: *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
        svazky:
            # Skutečné nastavení horizontálního škálování: spusťte minio s více disky, viz dokumentaci minio.
            - ~/minio_data:/data
        prostředí:
            # 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í: 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: 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
        svazky:
            - ~/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
        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
        svazky:
            - ~/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 pro všechny instance Server Pro, které se účastní horizontálního škálování, stejné hardwarové specifikace.

Platí obecná doporučení ohledně [hardwarových specifikací](/on-premises/on-premises-cs/zaciname/requirements/hardware-requirements.md) pro instance Server Pro.

#### Aktualizace Server Pro

V rámci procesu aktualizace Server Pro automaticky spouští migrace databáze. Tyto migrace jsou **ne** navrženy tak, aby je bylo možné spouštět z více instancí souběžně.

Migrace musí být dokončeny před spuštěním samotné webové aplikace. Můžete buď zkontrolovat logy, zda obsahují položku `Dokončené migrace` nebo počkejte, až aplikace zač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://ayakaleaf-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.
