> 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/fi/yllapito/horizontal-scaling.md).

# Vaakasuuntainen skaalautuminen

Versiosta 3.5.6 alkaen Server Pro tukee horisontaalista skaalautumista.

Tämä dokumentti luettelee tekniset vaatimukset ja antaa ohjeita Server Pron ajamiseen useammalla kuin yhdellä solmulla.

{% hint style="danger" %}
Server CE/Server Pro -versiosta alkaen `5.0.3` ympäristömuuttujat on nimetty uudelleen `SHARELATEX_*` versiosta `OVERLEAF_*`.

Jos käytät `4.x` versiota (tai aiempaa), varmista, että muuttujien etuliite on sen mukainen (esim. `SHARELATEX_SITE_URL` eikä `OVERLEAF_SITE_URL`)
{% endhint %}

Horisontaalisen skaalautumisen käyttöönotto vaatii huomattavan paljon työtä. Suosittelemme harkitsemaan horisontaalista skaalautumista **vain** kun saavutetaan tietty mittakaava. Esimerkiksi Server Pro -asennus, jossa on yhteensä 1 000 käyttäjää, on saatu onnistuneesti toimimaan yhdellä palvelimella, jossa on kaksi 4-ydintä prosessoria ja 32 Gt järjestelmämuistia. Katso [laitteistovaatimukset](/on-premises/fi/aloitus/requirements/hardware-requirements.md) dokumentaatiosta suosituksia varten.

Server Pron käyttöönotto horisontaalisella skaalautumisella sisältää joukon ulkoisia komponentteja, kuten kuormantasaimen ja S3-yhteensopivan tallennusbackendin.

Voimme auttaa vianetsinnässä Server Pro -konttien virheissä, jotka saattavat johtua virheellisestä määrityksestä, ja antaa yleisiä neuvoja tämän dokumentin perusteella. Valitettavasti emme voi auttaa kolmannen osapuolen sovellusten/järjestelmien määrityksessä.

Ulkoisten komponenttien tarjoamiseen tarvittavien laitteisto- tai ohjelmistokohtaisten teknisten ongelmien ratkaiseminen ei kuulu tukiehtojemme piiriin.

### Vaatimukset

#### Ulkoinen, keskitetty tietojen tallennus

Server Pron tietojen tallennus voidaan jakaa neljään tietovarastoon:

* **MongoDB**

  * Suurin osa tiedoista tallennetaan MongoDB:hen.
  * Tuemme joko paikallista instanssia tai ulkoista instanssia, kuten [MongoDB](https://www.mongodb.com/atlas) Atlasia (täysin hallinnoitu MongoDB-palvelu, joka toimii AWS-infrastruktuurin sisällä).<br>

  **Huom:** Valitettavasti MongoDB-yhteensopiville tietokannoille, kuten CosmoDB/DocumentDB:lle, ei ole tällä hetkellä virallista tukea, koska emme ole testanneet Server Prota niiden kanssa. Vaikka Server Pron käyttöönotto yhteensopivilla tietokannoilla **voi** olla mahdollista, tuemme virallisesti vain MongoDB:tä käyttäviä käyttöönottoja.<br>
* **Redis**

  * Redis tallentaa väliaikaisia tietoja, kuten odottavia dokumenttipäivityksiä ennen kuin ne kirjoitetaan MongoDB:hen.
  * Redisia käytetään dokumenttipäivitysten välittämiseen eri palveluiden välillä ja editorin ilmoittamiseen tilamuutoksista tietyssä projektissa.
  * Redisia käytetään käyttäjäistuntojen tallentamiseen.
  * Tuemme joko paikallista instanssia tai ulkoista instanssia.<br>

  **Huom:** Valitettavasti Redis-yhteensopiville avain-/arvotietovarastoille, kuten KeyDB/Valkeylle, ei ole tällä hetkellä virallista tukea, koska emme ole testanneet Server Prota niiden kanssa. Vaikka Server Pron käyttöönotto yhteensopivilla tietovarastoilla **voi** voi olla mahdollista, tuemme virallisesti vain Redisia käyttäviä käyttöönottoja.<br>
* **Projektitiedostot ja historiatiedostot**

  * Muokattamattomat projektitiedostot tallennetaan MongoDB:n ulkopuolelle.

    Myös uusi projektin historiajärjestelmä (Server Pro 3.5:stä alkaen) tallentaa historian MongoDB:n ulkopuolelle.
  * Pienissä yksittäisissä instansseissa tuemme joko paikallista tiedostojärjestelmää (joka voi olla paikallisen SSD:n, NFS:n tai EBS:n tukema) tai [S3-yhteensopivaa tietojen tallennusjärjestelmää](/on-premises/fi/konfiguraatio/overleaf-toolkit/s3.md).
  * Horisontaalista skaalautumista varten **vain** tuemme S3-yhteensopivia tietojen tallennusjärjestelmiä.<br>

  **Tärkeää:** NFS/Amazon EFS/Amazon EBS ovat **ei** tuettuja horisontaalisessa skaalautumisessa. Katso [laitteistotallennuksen](/on-premises/fi/aloitus/requirements/hardware-requirements.md#storage) vaatimukset-osiosta lisätietoja Server Pron tallennustilan skaalaamisesta.
* **Väliaikaiset tiedostot**
  * LaTeX-käännösten on toimittava nopeilla, paikallisilla levyillä optimaalisen suorituskyvyn saavuttamiseksi. Käännöksen tulosta ei tarvitse säilyttää pysyvästi tai varmuuskopioida.
  * Myös uusien tiedostolatausten puskurointi ja projektin zip-tiedostojen luominen hyötyvät paikallisen levyn käytöstä.

{% hint style="danger" %}
Suosittelemme vahvasti paikallisen levyn käyttöä. Kaikenlaiset verkkoon liitetyt levyt (kuten NFS tai EBS) voivat aiheuttaa odottamattomia käännösvirheitä ja muita suorituskykyongelmia.
{% endhint %}

#### **Git-bridge**

{% hint style="info" %}
Git-bridge on käytettävissä Server Prossa versiosta 4.0.1 alkaen.
{% endhint %}

git-tietovarastot tallennetaan paikallisesti levylle. Replikointivaihtoehtoja ei ole saatavilla. Git-bridge tulisi ajaa **yksittäisenä instanssina**. Parhaan suorituskyvyn saavuttamiseksi suosittelemme käyttämään git-bridge-datalle paikallista levyä. Git-bridge-datalevy tulisi varmuuskopioida säännöllisesti.

Horisontaalisen skaalautumisen tietojen tallennusta varten tarvitset:

* keskitetyn MongoDB-instanssin, johon kaikilla Server Pro -instansseilla on pääsy
* keskitetyn Redis-instanssin, johon kaikilla Server Pro -instansseilla on pääsy
* keskitetyn S3-yhteensopivan tallennusbackendin projekti- ja historiatiedostoille
* paikallisen levyn jokaisella instanssilla väliaikaisia tiedostoja varten
* paikallisen levyn instanssilla, joka isännöi git-bridge-säilöä, git-bridge-dataa varten

#### Kuormantasaimen vaatimukset

* **Pysyvä reititys**, esim. evästeen avulla

  Tämä vaatimus johtuu näistä komponenteista:

  * Server Pron reaaliaikainen muokkausominaisuus käyttää WebSocket-yhteyksiä, joiden varamenetelmänä on XHR-pollaus. Jokaisella muokkausistunnolla on palvelinpuolella paikallinen tila, ja tietyn muokkausistunnon pyynnöt on aina ohjattava samaan Server Pro -instanssiin. Yhteistyöominaisuus käyttää Redisia [Pub/Subia](https://redis.io/docs/latest/develop/interact/pubsub/) päivitysten jakamiseen useiden Server Pro -instanssien välillä.
  * LaTeX-käännös pitää tuloksen ja käännösvälimuistin paikallisesti optimaalisen suorituskyvyn vuoksi. Kun käännöspyyntö tehdään yhdelle Server Pro -instanssille, seuraavat PDF-/lokitiedoston latauspyynnöt on ohjattava samaan Server Pro -instanssiin.
* **Pitkät pyyntöaikakatkaisut** suurempien LaTeX-dokumenttien kääntämisen tukemiseksi
* **WebSocket-tuki** optimaalisen suorituskyvyn vuoksi
* **50 Mt:n POST-payloadin koko**
* **Keep-alive-aikakatkaisu** sen on oltava pienempi kuin Server Pron keep-alive-aikakatkaisu

  Server Pron keep-alive-aikakatkaisu voidaan määrittää ympäristömuuttujalla `NGINX_KEEPALIVE_TIMEOUT`. Oletusarvo on 65 s.

  Oletuksella 60 s:n keep-alive-aikakatkaisu kuormantasaimessa toimii.

  Kun `NGINX_KEEPALIVE_TIMEOUT=120`, kuormantasain voisi asettaa 115 s.
* **Asiakas-IP-osoitteet**

  Aseta pyyntöotsikko `X-Forwarded-For` asiakkaan IP-osoitteeksi.
* Kun **SSL-terminointi**

  Kuormantasaimen on lisättävä pyyntöotsikko `X-Forwarded-Proto: https`.

<details>

<summary>Esimerkkimääritys HAProxylle</summary>

```
global
  group haproxy
  user haproxy

  # Yksityiskohtainen lokitus
  log stdout format raw local0 debug

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

  # Yksityiskohtainen lokitus
  log                     global
  option                  httplog

  # Ohjaa uudelleen eri taustapalvelimeen, jos kiinnitetty on alhaalla
  option                  redispatch 1
  # Nämä uudelleenyritykset koskevat TCP-yhteysvirheitä, eivät HTTP-tilakoodin 500 vastauksia
  retries                 3

  # Kiinnitetty istunto 24 tunnin käyttämättömyyden ajaksi -- käännöksen tulos poistetaan 24 tunnin jälkeen
  cookie                  server-pro-ha insert maxidle 24h

  # Yritä muodostaa yhteys mihin tahansa taustapalvelimeen 1 minuutin ajan ja palauta sitten 503
  timeout queue           1m
  # Anna Server Pro -instansseille 15 s aikaa käynnistyä
  timeout connect         15s

  # Keskeytä erittäin hitaiden asiakkaiden pyynnöt (salli 1 minuutti toimettomuutta pyynnön lukemisen aikana)
  timeout client          1m

  # Salli hitaat käännökset -- clsi:n kovakoodattu raja on 10 min
  timeout server          10m

  # Katkaise editorin yhteys 23 tunnin kuluttua -- 1 tunti viimeistä eilistä käyttöä eteenpäin
  timeout tunnel          23h

  # Huom: haproxy:n keepalive-käyttäytyminen toimii erinomaisesti Server Pron oletus-keepalive-määrityksen kanssa.
  #       Haproxy puhdistaa yhteyksiä taustalla ja ohjaa pyynnöt tarvittaessa uudelleen.

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

  # Kerro sovellukselle, että olemme https:n takana
  http-request set-header X-Forwarded-Proto https

  # Kerro sovellukselle todellinen asiakas-IP
  option forwardfor

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

  # Ohjaa git-liikenne git-bridge-säilön sisarsäilöön
  use-server server-pro-ha-1 if { path_beg /git/ }

  # Vianetsintä
  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>

#### Server Pro -määritys

**Salaisuudet**

Server Pro -instanssien on sovittava jaetuista salaisuuksista:

* `WEB_API_PASSWORD` (web-sovellusrajapinnan todennus)
* `STAGING_PASSWORD` ja `V1_HISTORY_PASSWORD` sama arvo (historian todennus)
* `CRYPTO_RANDOM` (istuntoevästettä varten)
* `OT_JWT_AUTH_KEY` (historian todennus)

Kaikille näille salaisuuksille on määritettävä oma yksilöllinen arvonsa, ja ne on jaettava instanssien kesken.

Kun niitä ei ole määritetty ja käyttäjien pyynnöt ohjataan eri Server Pro -instansseille, heidän pyyntönsä eivät läpäise todennustarkistuksia, ja heidät joko ohjataan usein kirjautumissivulle tai heidän toimenpiteensä käyttöliittymässä epäonnistuvat odottamattomilla tavoilla.

Kun niitä ei ole määritetty, Server Pro käyttää jokaiselle salaisuudelle uutta satunnaisarvoa, joka perustuu 32 satunnaistavuun `/dev/urandom` (256 satunnaisbittiä).

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

Osoita `OVERLEAF_MONGO_URL` (`SHARELATEX_MONGO_URL` versioille `4.x` ja sitä aiemmille keskitettyyn MongoDB-instanssiin.

**Redis**

Osoita `OVERLEAF_REDIS_HOST` (`SHARELATEX_REDIS_HOST` versioille `4.x` ja sitä aiemmille sekä `REDIS_HOST` keskitettyyn Redis-instanssiin.

**S3-yhteensopiva tallennus projekti- ja historiatiedostoille**

Katso dokumentaatiosta [S3-yhteensopivaa tallennustilaa](/on-premises/fi/konfiguraatio/overleaf-toolkit/s3.md) lisätietoja.

**Väliaikaiset tiedostot**

Paikallisen SSD:n oletus bind-mount kohtaan `/var/lib/overleaf` (`/var/lib/sharelatex` versioille `4.x` ja sitä aiemmille) riittää. Varmista, että osoitat `SANDBOXED_COMPILES_HOST_DIR` isäntäkoneen kiinnityspisteeseen.

{% hint style="danger" %}
Suosittelemme vahvasti paikallisen levyn käyttöä. Kaikenlaiset verkkoon liitetyt levyt (kuten NFS tai EBS) voivat aiheuttaa odottamattomia käännösvirheitä ja muita suorituskykyongelmia.
{% endhint %}

**Välityspalvelimen määritys**

* Aseta `OVERLEAF_BEHIND_PROXY=true` (`SHARELATEX_BEHIND_PROXY` versioille `4.x` ja sitä aiemmissa versioissa) tarkkojen asiakas-IP-osoitteiden saamiseksi.
* Aseta `TRUSTED_PROXY_IPS` kuormantasaimen IP-osoitteeseen (useita CIDR-alueita voidaan määrittää pilkulla erotettuna).

**Git-bridge-integraatio**

{% hint style="info" %}
Git-bridge on käytettävissä Server Prossa versiosta 4.0.1 alkaen.
{% endhint %}

git-bridge-kontti tarvitsee viereisen Server Pro -kontin saapuvien git-pyyntöjen käsittelemiseen. Tämä viereinen kontti voi palvella myös tavallista käyttäjäliikennettä. Esimerkkimäärityksessä ensimmäinen instanssi toimii git-bridge-kontin viereisenä konttina, mutta mikä tahansa instanssi voisi oikeastaan toimia siinä roolissa.

Miksi meidän täytyy nimetä yksi Server Pro -kontti git-bridge-kontin viereiseksi? Server Pro antaa git-bridgelle historiapalvelun lataus-URL-osoitteet. Nämä historia-URL-osoitteet on määritettävä niin, että ne ovat saavutettavissa git-bridge-kontista.

Server Pro -kontin määritys:

* Aseta `GIT_BRIDGE_ENABLED` versiosta `'true'`
* Aseta `GIT_BRIDGE_HOST` versiosta `<git-bridge-kontin nimi>` esim. `git-bridge`
* Aseta `GIT_BRIDGE_PORT` versiosta `8000`
* Aseta `V1_HISTORY_URL` versiosta `http://<server-pro-sisarsäilön nimi>:3100/api`.

  Huom: Tämä on tarpeen vain git-bridge-kontin viereisessä kontissa. Muut instanssit voivat käyttää localhost-URL-osoitetta, joka on oletus.

git-bridge-kontin määritys:

* Aseta `GIT_BRIDGE_API_BASE_URL` versiosta `http://<server-pro-sisarsäilön nimi>/api/v0`, esim. `http://server-pro-ha-1/api/v0`
* Aseta `GIT_BRIDGE_OAUTH2_SERVER` versiosta `http://<server-pro-sisarsäilön nimi>`, esim. `http://server-pro-ha-1`
* Aseta `GIT_BRIDGE_POSTBACK_BASE_URL` versiosta `http://<git-bridge-kontin nimi>:8000`, esim. `http://git-bridge:8000`
* Aseta `GIT_BRIDGE_ROOT_DIR` bind-mountatulle git-bridge-datalevylle, esim. `/data/git-bridge`

<details>

<summary>Esimerkkimääritys docker-compose.yml:lle</summary>

Seuraava määritys näyttää itsenäisen asennuksen. Demon toimimiseksi sinun on annettava kelvollinen SSL-avain/-varmenne ja säädettävä `OVERLEAF_SITE_URL` (`SHARELATEX_SITE_URL` versioille `4.x` ja sitä aiemmissa versioissa). Varsinaisessa asennuksessa sinun on korvattava vale-salaisuudet oikeilla salaisuuksilla, kuten alla on mainittu. Varsinaisessa asennuksessa sinun on siirrettävä yksittäiset kontit omistetuille solmuille ja säädettävä IP-osoitteet paikallisen verkkosi mukaisiksi.

```yaml
version: '2.2'

# Varsinainen horisontaalisen skaalautumisen asetus: valitse oma verkko ja korvaa IP-osoitteet määrityksessä.
networks:
    default:
        ipam:
            config:
                # Tämä aliverkko on osa varattua aliverkkoa, jota käytetään vertailuajoihin
                # https://tools.ietf.org/html/rfc2544
                # Koko aliverkko on 198.18.0.0/15
                # Käytä 198.18.0.0/24:ää kuormantasaimelle ja tietokannoille
                # Käytä 198.18.1.0/24:ää server-prolle
                # Käytä 198.18.0.128/25:tä väliaikaiselle kontille
                - gateway: 198.18.0.1
                  ip_range: 198.18.0.128/25
                  subnet: 198.18.0.0/23

services:
    # Varsinainen horisontaalisen skaalautumisen asetus: aja haproxy Dockerin ulkopuolella erillisellä isännällä.
    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
        # Vaihtoehto "ports"-asetukselle: käytä isäntäverkkoa, jotta docker-proxy-ylläpito vältetään
        network_mode: host

        # Vaihtoehto "network_mode: host" -asetukselle: käytä docker-proxya verkkoeristyksen vuoksi
        # ports:
        #     - "80:80"
        #     - "443:443"
        # networks:
        #     default:
        #         ipv4_address: 198.18.0.2

        # Varsinainen horisontaalisen skaalautumisen asetus: poista nämä, koska ne toimivat muilla isännillä.
        depends_on:
            server-pro-ha-1:
                condition: service_started
            server-pro-ha-2:
                condition: service_started
            server-pro-ha-3:
                condition: service_started

    # Varsinainen horisontaalisen skaalautumisen asetus: aja tämä kontti server-pro-ha-1:n vieressä.
    # Server Pro 4.0:stä alkaen.
    git-bridge:
        restart: always
        # Tunnisteen tulisi vastata `server-pro-ha-1`-kontin tunnistetta.
        image: quay.io/sharelatex/git-bridge:4.0.1
        volumes:
            # Varsinainen horisontaalisen skaalautumisen asetus: osoita /data/git-bridge erilliselle paikalliselle SSD-levylle.
            - ~/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"]

        # Varsinainen horisontaalisen skaalautumisen asetus: aja isännällä 198.18.0.6 ja avaa portti
        # ports:
        #     - "8000:8000"
        networks:
            default:
                ipv4_address: 198.18.0.6

    # Varsinainen horisontaalisen skaalautumisen asetus: aja tämä kontti erillisellä isännällä.
    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:
            # Varsinainen horisontaalisen skaalautumisen asetus: pidä tämä merkintä.
            git-bridge:
                condition: service_started

            # Varsinainen horisontaalisen skaalautumisen asetus: poista alla olevat, koska ne toimivat muilla isännillä.
            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
            # Varsinainen horisontaalisen skaalautumisen asetus: anna oma verkkotunnus/sovelluksen nimi.
            OVERLEAF_SITE_URL: 'https://overleaf.example.com'
            OVERLEAF_APP_NAME: Server Pro -horisontaalisen skaalautumisen 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
            # Varsinainen horisontaalisen skaalautumisen asetus: valitse turvalliset tunnistetiedot.
            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
            # Tarvitaan vain git-bridge-veljeksessä-instanssissa
            V1_HISTORY_URL: "http://server-pro-ha-1:3100/api"
            # /git-bridge

            # Vaakasuuntainen skaalaus
            # Varsinainen horisontaalisen skaalautumisen asetus: valitse turvalliset tunnistetiedot.
            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'
            # Varsinainen vaakasuuntaisen skaalauksen asetus: kuormantasaimien IP-osoitteet
            TRUSTED_PROXY_IPS: 198.18.0.1,198.18.0.2
            # /Vaakasuuntainen skaalaus

        # Varsinainen vaakasuuntaisen skaalauksen asetus: suorita isännällä 198.18.1.1 ja avaa portit
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.1

    # Varsinainen horisontaalisen skaalautumisen asetus: aja tämä kontti erillisellä isännällä.
    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"

        # Varsinainen vaakasuuntaisen skaalauksen asetus: suorita isännällä 198.18.1.2 ja avaa portit
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.2

    # Varsinainen horisontaalisen skaalautumisen asetus: aja tämä kontti erillisellä isännällä.
    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"

        # Varsinainen vaakasuuntaisen skaalauksen asetus: suorita isännällä 198.18.1.3 ja avaa portit
        # ports:
        #     - "80:80"
        networks:
            default:
                ipv4_address: 198.18.1.3

    # Varsinainen horisontaalisen skaalautumisen asetus: aja tämä kontti erillisellä isännällä.
    minio:
        image: minio/minio:RELEASE.2023-05-18T00-05-36Z
        container_name: minio
        command: server /data
        volumes:
            # Varsinainen vaakasuuntaisen skaalauksen asetus: aja minio useilla levyillä, katso minion dokumentaatio.
            - ~/minio_data:/data
        environment:
            # Varsinainen horisontaalisen skaalautumisen asetus: valitse turvalliset tunnistetiedot.
            MINIO_ROOT_USER: MINIO_ROOT_USER
            MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD

        # Varsinainen vaakasuuntaisen skaalauksen asetus: suorita isännällä 198.18.0.5 ja avaa portti
        # ports:
        #     - "9000:9000"
        networks:
            default:
                ipv4_address: 198.18.0.5

    # Varsinainen vaakasuuntaisen skaalauksen asetus: suorita tämä asetus kerran erillisellä isännällä.
    minio_setup:
        depends_on:
            - minio
        image: minio/mc:RELEASE.2023-05-18T16-59-00Z
        entrypoint: sh
        komentoa:
            - '-c'
            # Varsinainen horisontaalisen skaalautumisen asetus: valitse turvalliset tunnistetiedot.
            - |
                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

                # Laita edellisen osion käytännön sisältö tiedostoon policy-filestore.json
                # Muistutus: korvaa säilöjen nimet vastaavasti.
                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

    # Varsinainen horisontaalisen skaalautumisen asetus: aja tämä kontti erillisellä isännällä.
    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

        # Varsinainen vaakasuuntaisen skaalauksen asetus: suorita isännällä 198.18.0.3 ja avaa portti
        # 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
        komentoa:
            - '-c'
            - |
                mongo 198.18.0.3 --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"198.18.0.3:27017\" } ] })"

    # Varsinainen horisontaalisen skaalautumisen asetus: aja tämä kontti erillisellä isännällä.
    redis:
        restart: always
        image: redis:6.2
        container_name: redis
        expose:
            - 6379
        volumes:
            - ~/redis_data:/data

        # Varsinainen vaakasuuntaisen skaalauksen asetus: suorita isännällä 198.18.0.4 ja avaa portti
        # ports:
        #     - "6379:6379"
        networks:
            default:
                ipv4_address: 198.18.0.4
```

</details>

#### Laitteisto

Suosittelemme käyttämään samoja laitteistospecifikaatioita kaikille Server Pro -instansseille, jotka osallistuvat vaakasuuntaiseen skaalaukseen.

Yleiset suositukset [laitemäärityksistä](/on-premises/fi/aloitus/requirements/hardware-requirements.md) Server Pro -instansseille pätevät.

#### Server Pron päivittäminen

Päivitysprosessin osana Server Pro suorittaa automaattisesti tietokantamigraatiot. Nämä migraatiot **ei** on suunniteltu suoritettaviksi useista instansseista rinnakkain.

Migraatioiden on valmistuttava ennen kuin varsinainen verkkosovellus käynnistetään. Voit joko tarkistaa lokit merkinnän `Migraatiot valmiit` varalta tai odottaa, kunnes sovellus vastaanottaa liikennettä.

Päivitysprosessi näyttää tältä:

1. Varaa huoltokatko
2. Pysäytä kaikki Server Pro -instanssit
3. Tee yhdenmukainen varmuuskopio kuten on kuvattu [dokumentaatio](/on-premises/fi/yllapito/data-and-backups.md#performing-a-consistent-backup)
4. Käynnistä yksi Server Pro -instanssi uudella versiolla
5. Varmista, että uusi instanssi toimii odotetusti
6. Käynnistä muut instanssit uudella versiolla


---

# 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/fi/yllapito/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.
