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

# Vaakasuuntainen skaalautuminen

Versiosta 3.5.6 alkaen Server Pro tukee vaakasuuntaista skaalautumista.

Tässä dokumentissa luetellaan tekniset vaatimukset ja annetaan ohjeet Server Pron ajamiseen useammassa kuin yhdessä solmussa.

{% hint style="danger" %}
Alkaen Server CE:stä/Server Prosta `5.0.3` ympäristömuuttujat on nimetty uudelleen muodosta `SHARELATEX_*` versioon `OVERLEAF_*`.

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

Vaakasuuntaisen skaalauksen käyttöönotto vaatii merkittävästi työtä. Suosittelemme harkitsemaan vaakasuuntaista skaalautumista **vain** kun tietty mittakaava on saavutettu. Esimerkiksi Server Pro -asennus 1 000 käyttäjälle on onnistuneesti otettu käyttöön käyttämällä yhtä palvelinta, jossa oli kaksi 4-ytimistä prosessoria ja 32 Gt järjestelmämuistia. Katso [laitteistovaatimukset](/on-premises/fi/aloittaminen/requirements/hardware-requirements.md) dokumentaatiosta suosituksia varten.

Server Pron käyttöönotto vaakasuuntaisella skaalauksella sisältää joukon ulkoisia komponentteja, kuten kuormantasaimen ja S3-yhteensopivan tallennusjärjestelmän.

Voimme auttaa vianmäärityksessä Server Pron konteissa esiintyvien virheiden osalta, jotka saattavat johtua virheellisestä konfiguraatiosta, ja antaa tämän dokumentin perusteella yleisiä neuvoja. Valitettavasti emme voi tarjota apua kolmannen osapuolen sovellusten/järjestelmien määrittämisessä.

Ulkoisten komponenttien tarjoamiseen liittyvien laitteisto- ja ohjelmisto-ongelmien ratkaiseminen ei kuulu tukiehtoihimme.

### Vaatimukset

#### Ulkoiset, keskitetyt tietovarastot

Tietojen tallennus Server Prossa 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-infrastruktuurissa).<br>

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

  * Redis tallentaa väliaikaista dataa, kuten odottavia dokumenttipäivityksiä ennen kuin ne siirretään 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/arvotallennuksille, kuten KeyDB/Valkeylle, ei tällä hetkellä ole virallista tukea, koska emme ole testanneet Server Prota niiden kanssa. Vaikka Server Pron käyttöönotto yhteensopivien tallennusratkaisujen kanssa **voi** voi olla mahdollista, tuemme virallisesti vain Redisia käyttäviä käyttöönottoja.<br>
* **Projektitiedostot ja historiatiedostot**

  * Ei-muokattavia projektitiedostoja säilytetään MongoDB:n ulkopuolella.

    Uusi projektihistoriajärjestelmä (Server Pro 3.5:stä alkaen) tallentaa historian myös MongoDB:n ulkopuolelle.
  * Pieniä yksittäisiä instansseja varten tuemme joko paikallista tiedostojärjestelmää (jota voidaan tukea paikallisella SSD:llä, NFS:llä tai EBS:llä) tai [S3-yhteensopivaa tietojen tallennusjärjestelmää](/on-premises/fi/maaritys/overleaf-toolkit/s3.md).
  * Vaakasuuntaisessa skaalautumisessa **vain** tuemme S3-yhteensopivia tietojen tallennusjärjestelmiä.<br>

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

{% hint style="danger" %}
Suosittelemme vahvasti paikallisen levyn käyttöä. Minkä tahansa verkkolevyn (kuten NFS:n tai EBS:n) käyttö voi johtaa odottamattomiin käännösvirheisiin ja muihin suorituskykyongelmiin.
{% endhint %}

#### **Git-bridge**

{% hint style="info" %}
Git-bridge on saatavilla Server Prossa versiosta 4.0.1 alkaen.
{% endhint %}

git-repositoriot tallennetaan paikallisesti levylle. Replikointivaihtoehtoja ei ole saatavilla. Git-bridge tulisi ajaa **yksittäisenä instanssina**. Optimaalisen suorituskyvyn saavuttamiseksi suosittelemme paikallisen levyn käyttöä git-bridge-datalle. Git-bridge-datalevy tulisi varmuuskopioida säännöllisesti.

Vaakasuuntaisen skaalauksen 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 tallennuspalvelun projekti- ja historiatiedostoille
* paikallisen levyn kullekin instanssille väliaikaisia tiedostoja varten
* paikallisen levyn instanssille, joka isännöi git-bridge-konttia, git-bridge-dataa varten

#### Kuormantasaimen vaatimukset

* **Pysyvä reititys**, esim. käyttämällä evästettä

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

  * Server Pron reaaliaikainen muokkausominaisuus käyttää WebSocket-yhteyksiä ja vararatkaisuna XHR-pollingia. Jokaisella muokkausistunnolla on paikallinen tila palvelinpuolella, ja tietyn muokkausistunnon pyynnöt on aina ohjattava samalle Server Pro -instanssille. Yhteistyöominaisuus käyttää Redisia [Pub/Sub](https://redis.io/docs/latest/develop/interact/pubsub/) päivitysten jakamiseen useiden Server Pro -instanssien välillä.
  * LaTeX-käännös pitää tulosteen ja käännösvälimuistin paikallisesti optimaalisen suorituskyvyn vuoksi. Kun käännöspyyntö tehdään yhdelle Server Pro -instanssille, seuraavat PDF-/loki-latauspyynnöt on ohjattava samalle Server Pro -instanssille.
* **Pitkät pyyntöaikakatkaisut** tukemaan suurten LaTeX-dokumenttien kääntämistä
* **WebSocket-tuki** optimaalista suorituskykyä varten
* **50 MB:n POST-paketin koko**
* **Keep-alive-aikakatkaisu** täytyy olla 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.

  Oletusasetuksella kuormantasaimen 60 s:n keep-alive-aikakatkaisu toimii.

  Kun käytössä on `NGINX_KEEPALIVE_TIMEOUT=120`, kuormantasain voisi käyttää 115 s.
* **Asiakkaiden IP-osoitteet**

  Aseta pyyntöotsikko `X-Forwarded-For` asiakkaan IP-osoitteeseen.
* Kun **SSL:n päättäminen**

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

<details>

<summary>Esimerkkikonfiguraatio 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 toiseen taustajärjestelmään, jos kiinnitetty on alhaalla
  option                  redispatch 1
  # Nämä uudelleenyritykset koskevat TCP-yhteysvirheitä, eivät HTTP-tilavastauksia 500
  retries                 3

  # Pysyvä istunto 24 tunnin inaktiivisuudelle -- käännöksen tulos poistetaan 24 tunnin jälkeen
  cookie                  server-pro-ha insert maxidle 24h

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

  # Keskeytä hyvin hitailta asiakkailta tulevat pyynnöt (salli 1 minuutti inaktiivisuutta pyynnön lukemisessa)
  timeout client          1m

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

  # Katkaise editoriyhteys 23 tunnin jälkeen -- 1 tunti heidän eilisen viimeisen käyttönsä jälkeen
  timeout tunnel          23h

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

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 asiakkaan IP-osoite
  option forwardfor

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

  # Reititä git-liikenne git-bridgen sisar-konttiin
  use-server server-pro-ha-1 if { path_beg /git/ }

  # Vianmääritys
  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 -konfiguraatio

**Salaisuudet**

Server Pro -instanssien on sovittava jaetuista salaisuuksista:

* `WEB_API_PASSWORD` (web API -todennus)
* `STAGING_PASSWORD` ja `V1_HISTORY_PASSWORD` sama arvo (historian todennus)
* `CRYPTO_RANDOM` (istuntokeksejä varten)
* `OT_JWT_AUTH_KEY` (historian todennus)

Kaikille näille salaisuuksille on määritettävä oma yksilöllinen arvonsa, ja niiden on oltava jaettuina instanssien välillä.

Kun niitä ei ole määritetty ja käyttäjien pyynnöt ohjautuvat eri Server Pro -instansseihin, niiden todennustarkistukset epäonnistuvat, ja käyttäjät joko ohjataan usein kirjautumissivulle tai heidän toimintonsa käyttöliittymässä epäonnistuvat odottamattomilla tavoilla.

Kun niitä ei ole määritetty, Server Pro käyttää uutta satunnaista arvoa kullekin salaisuudelle, joka perustuu 32 satunnaiseen tavuun tiedostosta `/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 aiemmille) keskitettyyn MongoDB-instanssiin.

**Redis**

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

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

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

**Väliaikaiset tiedostot**

Paikallisen SSD-levyn oletus bind-mount `/var/lib/overleaf` (`/var/lib/sharelatex` versioille `4.x` ja aiemmille) riittää. Varmista, että osoitat `SANDBOXED_COMPILES_HOST_DIR` isännän mount-pisteeseen.

{% hint style="danger" %}
Suosittelemme vahvasti paikallisen levyn käyttöä. Minkä tahansa verkkolevyn (kuten NFS:n tai EBS:n) käyttö voi johtaa odottamattomiin käännösvirheisiin ja muihin suorituskykyongelmiin.
{% endhint %}

**Välityspalvelimen konfigurointi**

* Aseta `OVERLEAF_BEHIND_PROXY=true` (`SHARELATEX_BEHIND_PROXY` versioille `4.x` ja aiemmille) tarkkoja asiakkaan IP-osoitteita varten.
* Aseta `TRUSTED_PROXY_IPS` kuormantasaimen IP-osoitteeseen. (Useita CIDR-osoitteita voidaan määrittää pilkulla erotettuna).

**Git-bridge-integraatio**

{% hint style="info" %}
Git-bridge on saatavilla Server Prossa versiosta 4.0.1 alkaen.
{% endhint %}

git-bridge-kontti tarvitsee rinnakkaisen Server Pro -kontin saapuvien git-pyyntöjen käsittelemiseksi. Tämä rinnakkainen kontti voi palvella myös tavallista käyttäjäliikennettä. Esimerkkikonfiguraatiossa ensimmäinen instanssi toimii git-bridgen rinnakkaiskonttina, mutta käytännössä mikä tahansa instanssi voisi toimia siinä roolissa.

Miksi meidän täytyy nimetä yksi Server Pro -kontti git-bridgen rinnakkaiskontiksi? Server Pro antaa lataus-URL-osoitteet historiapalvelulle git-bridgelle. Meidän on määritettävä nämä historia-URL-osoitteet siten, että ne ovat käytettävissä git-bridge-kontista.

Server Pro -kontin konfiguraatio:

* Aseta `GIT_BRIDGE_ENABLED` versioon `'true'`
* Aseta `GIT_BRIDGE_HOST` versioon `<git-bridge container name>` esim. `git-bridge`
* Aseta `GIT_BRIDGE_PORT` versioon `8000`
* Aseta `V1_HISTORY_URL` versioon `http://<server-pro sibling container name>:3100/api`.

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

git-bridge-kontin konfiguraatio:

* Aseta `GIT_BRIDGE_API_BASE_URL` versioon `http://<server-pro sibling container name>/api/v0`, esim. `http://server-pro-ha-1/api/v0`
* Aseta `GIT_BRIDGE_OAUTH2_SERVER` versioon `http://<server-pro sibling container name>`, esim. `http://server-pro-ha-1`
* Aseta `GIT_BRIDGE_POSTBACK_BASE_URL` versioon `http://<git-bridge container name>:8000`, esim. `http://git-bridge:8000`
* Aseta `GIT_BRIDGE_ROOT_DIR` bind-mountatulle git-bridge-datalevylle, esim. `/data/git-bridge`

<details>

<summary>Esimerkkikonfiguraatio docker-compose.yml:lle</summary>

Seuraava konfiguraatio näyttää itsenäisen asetuksen. Demon toimimiseksi sinun on annettava kelvollinen SSL-avain/sertifikaatti ja säädettävä `OVERLEAF_SITE_URL` (`SHARELATEX_SITE_URL` versioille `4.x` ja aiemmille). Varsinaisessa asennuksessa sinun on korvattava paikkansapitävät salaisuudet todellisilla salaisuuksilla kuten inline-kommenteissa todetaan. Varsinaisessa asennuksessa sinun on siirrettävä yksittäiset kontit omistettuihin solmuihin ja säädettävä IP-osoitteet paikallisen verkkoasetuksesi mukaisiksi.

```yaml
version: '2.2'

# Varsinainen vaakasuuntaisen skaalauksen asennus: valitse oma verkkosi ja korvaa IP-osoitteet konfiguraatiossa.
networks:
    default:
        ipam:
            config:
                # Tämä aliverkko on osa varattua aliverkkoa, jota käytetään suorituskykytestaukseen
                # https://tools.ietf.org/html/rfc2544
                # Koko aliverkko on 198.18.0.0/15
                # Käytä 198.18.0.0/24:ää lb:tä ja tietokantoja varten
                # Käytä 198.18.1.0/24:ää server-prolle
                # Käytä 198.18.0.128/25:ttä väliaikaiselle kontille
                - gateway: 198.18.0.1
                  ip_range: 198.18.0.128/25
                  subnet: 198.18.0.0/23

palvelut:
    # Varsinainen vaakasuuntaisen skaalauksen asennus: 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'
        volyymit:
            - ./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 kohdalle "ports": käytä host-verkkoa docker-proxyn ylikuorman välttämiseksi
        network_mode: host

        # Vaihtoehto kohdalle "network_mode: host": käytä docker-proxya verkkoeristykseen
        # ports:
        #     - "80:80"
        #     - "443:443"
        # networks:
        #     default:
        #         ipv4_address: 198.18.0.2

        # Varsinainen vaakasuuntaisen skaalauksen asennus: poista nämä, koska ne ajetaan 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 vaakasuuntaisen skaalauksen asennus: aja tämä kontti server-pro-ha-1:n vieressä.
    # Server Pro 4.0:stä alkaen.
    git-bridge:
        restart: always
        # Tunnisteen pitäisi vastata `server-pro-ha-1`-kontin tunnistetta.
        image: quay.io/sharelatex/git-bridge:4.0.1
        volyymit:
            # Varsinainen vaakasuuntaisen skaalauksen asennus: osoita /data/git-bridge erilliseen paikalliseen SSD-levyyn.
            - ~/git_bridge_data:/data/git-bridge
        container_name: git-bridge
        ympäristö:
            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 vaakasuuntaisen skaalauksen asennus: aja isännällä 198.18.0.6 ja avaa portti
        # ports:
        #     - "8000:8000"
        networks:
            default:
                ipv4_address: 198.18.0.6

    # Varsinainen vaakasuuntaisen skaalauksen asennus: 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 vaakasuuntaisen skaalauksen asennus: säilytä tämä rivi.
            git-bridge:
                condition: service_started

            # Varsinainen vaakasuuntaisen skaalauksen asennus: poista alla olevat, koska ne ajetaan 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
        volyymit:
            - /tmp/scratch-disk1:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        environment: &server-pro-ha-environment
            # Varsinainen vaakasuuntaisen skaalauksen asennus: anna oma domain-/sovelluksesi nimi.
            OVERLEAF_SITE_URL: 'https://overleaf.example.com'
            OVERLEAF_APP_NAME: Server Pron vaakasuuntaisen skaalauksen 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 vaakasuuntaisen skaalauksen asennus: 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-bridgen sisarinstanssissa
            V1_HISTORY_URL: "http://server-pro-ha-1:3100/api"
            # /git-bridge

            # Horisontaalinen skaalautuminen
            # Varsinainen vaakasuuntaisen skaalauksen asennus: 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'
            # Todellinen horisontaalisen skaalauksen asetus: kuormantasaajien IP-osoitteet
            TRUSTED_PROXY_IPS: 198.18.0.1,198.18.0.2
            # /Horisontaalinen skaalautuminen

        # Todellinen horisontaalisen 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 vaakasuuntaisen skaalauksen asennus: 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
        volyymit:
            - /tmp/scratch-disk2:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        ympäristö:
            <<: *server-pro-ha-environment
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk2/data/compiles'
            V1_HISTORY_URL: "http://localhost:3100/api"

        # Todellinen horisontaalisen 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 vaakasuuntaisen skaalauksen asennus: 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
        volyymit:
            - /tmp/scratch-disk3:/var/lib/sharelatex
            - /var/run/docker.sock:/var/run/docker.sock
        ympäristö:
            <<: *server-pro-ha-environment
            SANDBOXED_COMPILES_HOST_DIR: '/tmp/scratch-disk3/data/compiles'
            V1_HISTORY_URL: "http://localhost:3100/api"

        # Todellinen horisontaalisen 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 vaakasuuntaisen skaalauksen asennus: aja tämä kontti erillisellä isännällä.
    minio:
        image: minio/minio:RELEASE.2023-05-18T00-05-36Z
        container_name: minio
        command: server /data
        volyymit:
            # Todellinen horisontaalisen skaalauksen asetus: aja minio useilla levyillä, katso Minion dokumentaatio.
            - ~/minio_data:/data
        ympäristö:
            # Varsinainen vaakasuuntaisen skaalauksen asennus: valitse turvalliset tunnistetiedot.
            MINIO_ROOT_USER: MINIO_ROOT_USER
            MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD

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

    # Todellinen horisontaalisen 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 vaakasuuntaisen skaalauksen asennus: 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 politiikan sisältö tiedostoon policy-filestore.json
                # Muistutus: vaihda 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 vaakasuuntaisen skaalauksen asennus: aja tämä kontti erillisellä isännällä.
    mongo:
        restart: always
        image: mongo:4.4
        container_name: mongo
        command: "--replSet overleaf"
        expose:
            - 27017
        volyymit:
            - ~/mongo_data:/data/db
        healthcheck:
            test: echo 'db.stats().ok' | mongo localhost:27017/test --quiet
            interval: 10s
            timeout: 10s
            retries: 5

        # Todellinen horisontaalisen 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 vaakasuuntaisen skaalauksen asennus: aja tämä kontti erillisellä isännällä.
    redis:
        restart: always
        image: redis:6.2
        container_name: redis
        expose:
            - 6379
        volyymit:
            - ~/redis_data:/data

        # Todellinen horisontaalisen 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 laitteistomäärityksiä kaikille Server Pro -instansseille, jotka osallistuvat horisontaaliseen skaalaukseen.

Yleiset suositukset [laitteistomäärityksistä](/on-premises/fi/aloittaminen/requirements/hardware-requirements.md) koskevat Server Pro -instansseja.

#### Server Pro -päivitys

Päivitysprosessin osana Server Pro suorittaa automaattisesti tietokantasiirrot. Nämä siirrot on **ei** suunniteltu ajettaviksi useista instansseista rinnakkain.

Siirtojen on valmistuttava ennen kuin varsinainen verkkosovellus käynnistetään. Voit joko tarkistaa lokit merkinnän varalta `Siirrot valmiit` tai odottaa, kunnes sovellus alkaa ottaa liikennettä vastaan.

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

1. Varaa huoltokatko
2. Pysäytä kaikki Server Pro -instanssit
3. Ota johdonmukainen varmuuskopio kuvatulla tavalla [dokumentaatiosta](/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://overleaf-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.
