> ## Documentation Index
> Fetch the complete documentation index at: https://ayakaleaf-pro.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Horisontaalinen skaalaus

<Check>
  Ayakaleaf Pro tukee horisontaalista skaalausta. Olemme testanneet ja varmistaneet, että se toimii oikein useilla replikoilla.
</Check>

Tässä dokumentissa luetellaan tekniset vaatimukset ja annetaan ohjeita Ayakaleaf Pron ajamiseen useammalla kuin yhdellä solmulla.

<Danger>
  Server CE:n/Server Pron versiosta `5.0.3` alkaen ympäristömuuttujien etuliite on muutettu muodosta `SHARELATEX_*` muotoon `OVERLEAF_*`.

  Jos käytät versiota `4.x` (tai vanhempaa), varmista, että muuttujissa on oikea etuliite (esim. `SHARELATEX_SITE_URL` eikä `OVERLEAF_SITE_URL`)
</Danger>

Horisontaalisen skaalauksen pystyttäminen vaatii huomattavan paljon työtä. Suosittelemme harkitsemaan horisontaalista skaalausta **vasta** tietyn mittakaavan saavuttamisen jälkeen. Esimerkiksi 1 000 käyttäjän Server Pro -asennus on pystytetty onnistuneesti yhdelle palvelimelle, jossa on kaksi 4-ytimistä suoritinta ja 32 Gt keskusmuistia. Suosituksia on [laitteistovaatimusten](/fi/on-premises/getting-started/requirements/hardware-requirements) dokumentaatiossa.

Horisontaalisesti skaalattu Server Pro -käyttöönotto sisältää joukon ulkoisia komponentteja, kuten kuormantasaajan ja S3-yhteensopivan tallennustaustajärjestelmän.

Voimme auttaa selvittämään Server Pro -konttien virheitä, jotka saattavat johtua virheellisestä määrityksestä, ja antaa yleisiä neuvoja tämän dokumentin perusteella. Valitettavasti emme voi auttaa kolmansien osapuolten sovellusten tai järjestelmien määrittämisessä.

Tukiehtomme eivät kata ulkoisten komponenttien tarjoamiseen käytettävään laitteistoosi tai ohjelmistoosi liittyvien teknisten ongelmien ratkaisemista.

### Vaatimukset

<Frame>
  <img src="https://mintcdn.com/ayakaleaf-pro/GmaXa-Cu4QQRFT4C/images/on-premises/img-f045c922.jpg?fit=max&auto=format&n=GmaXa-Cu4QQRFT4C&q=85&s=fc2eadc84a202a5ad07dd34ca6f903d4" alt="" width="2617" height="2319" data-path="images/on-premises/img-f045c922.jpg" />
</Frame>

#### Ulkoinen, keskitetty tallennustila

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

* **MongoDB**

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

  <strong>Huomaa:</strong> Valitettavasti MongoDB-yhteensopiville tietokannoille, kuten CosmoDB/DocumentDB, ei tällä hetkellä ole 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 siirretään MongoDB:hen.
  * Redisiä käytetään dokumenttipäivitysten välittämiseen eri palveluiden välillä ja editorin ilmoittamiseen tietyn projektin tilamuutoksista.
  * Redisiä käytetään käyttäjäistuntojen tallentamiseen.
  * Tuemme joko paikallista instanssia tai ulkoista instanssia.<br />

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

  * Ei-muokattavat projektitiedostot tallennetaan MongoDB:n ulkopuolelle.

    Uusi projektihistoriajärjestelmä (Server Pro 3.5:stä alkaen) tallentaa myös historian MongoDB:n ulkopuolelle.
  * Pienille yksittäisille instansseille tuemme joko paikallista tiedostojärjestelmää (jonka taustalla voi olla paikallinen SSD, NFS tai EBS) tai [S3-yhteensopivaa tallennusjärjestelmää](/fi/on-premises/configuration/overleaf-toolkit/s3).
  * Horisontaalisessa skaalauksessa tuemme **vain** S3-yhteensopivia tallennusjärjestelmiä.<br />

  <strong>Tärkeää:</strong> NFS/Amazon EFS/Amazon EBS **eivät** ole tuettuja horisontaalisessa skaalauksessa. Lisätietoja Server Pron tallennustilan skaalaamisesta on [laitteiston tallennustilan](/fi/on-premises/getting-started/requirements/hardware-requirements#storage) vaatimuksia käsittelevässä osiossa.
* **Tilapäiset tiedostot**
  * LaTeX-käännökset on parhaan suorituskyvyn saavuttamiseksi ajettava nopeilla paikallisilla levyillä. Käännöksen tulostetta ei tarvitse tallentaa pysyvästi eikä varmuuskopioida.
  * Myös uusien tiedostolatausten puskurointi ja projektien zip-tiedostojen luominen hyötyvät paikallisen levyn käytöstä.

<Danger>
  Suosittelemme vahvasti paikallisen levyn käyttöä. Minkä tahansa verkkolevyn (kuten NFS tai EBS) käyttö voi aiheuttaa odottamattomia käännösvirheitä ja muita suorituskykyongelmia.
</Danger>

#### **Git-bridge**

<Info>
  Git-bridge on saatavilla Server Prossa versiosta 4.0.1 alkaen.
</Info>

Git-repositoriot tallennetaan paikallisesti levylle. Replikointivaihtoehtoja ei ole saatavilla. Git-bridgeä tulee ajaa **yksittäisenä instanssina** (singleton). Parhaan suorituskyvyn saavuttamiseksi suosittelemme paikallisen levyn käyttöä git-bridgen tiedoille. Git-bridgen datalevy tulee varmuuskopioida säännöllisesti.

Horisontaalisessa skaalauksessa tietojen tallennukseen tarvitset:

* keskitetyn MongoDB-instanssin, johon pääsee kaikista Server Pro -instansseista
* keskitetyn Redis-instanssin, johon pääsee kaikista Server Pro -instansseista
* keskitetyn S3-yhteensopivan tallennustaustajärjestelmän projekti- ja historiatiedostoille
* paikallisen levyn jokaisessa instanssissa tilapäisille tiedostoille
* paikallisen levyn git-bridge-konttia isännöivässä instanssissa git-bridgen tiedoille

#### Kuormantasaajan vaatimukset

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

  Tämä vaatimus johtuu seuraavista komponenteista:

  * Server Pron reaaliaikainen muokkausominaisuus käyttää WebSocket-yhteyksiä, ja varavaihtoehtona on XHR-kysely (polling). Jokaisella muokkausistunnolla on palvelinpuolella paikallinen tila, ja tietyn muokkausistunnon pyynnöt on aina reititettävä samaan Server Pro -instanssiin. Yhteistyöominaisuus käyttää Redisin [Pub/Sub](https://redis.io/docs/latest/develop/interact/pubsub/)-toimintoa päivitysten jakamiseen useiden Server Pro -instanssien välillä.
  * LaTeX-käännös säilyttää tulosteen ja käännösvälimuistin paikallisesti suorituskyvyn optimoimiseksi. Kun käännöspyyntö on lähetetty yhdelle Server Pro -instanssille, sitä seuraavat PDF- ja lokilatauspyynnöt on reititettävä samaan Server Pro -instanssiin.
* **Pitkät pyyntöjen aikakatkaisut** suurten LaTeX-dokumenttien kääntämisen tukemiseksi
* **WebSocket-tuki** parhaan suorituskyvyn saavuttamiseksi
* **POST-hyötykuorman koko 50 Mt**
* **Keep-alive-aikakatkaisun** on oltava lyhyempi kuin Server Pron keep-alive-aikakatkaisu

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

  Oletusarvolla kuormantasaajan 60 sekunnin keep-alive-aikakatkaisu toimii.

  Asetuksella `NGINX_KEEPALIVE_TIMEOUT=120` kuormantasaaja voisi käyttää arvoa 115 s.
* **Asiakkaiden IP-osoitteet**

  Aseta pyyntöotsake `X-Forwarded-For` asiakkaan IP-osoitteeksi.
* Kun **SSL päätetään** kuormantasaajassa

  Kuormantasaajan on lisättävä pyyntöotsake `X-Forwarded-Proto: https`.

<Accordion title="Esimerkki HAProxy-määrityksestä">
  ```text theme={null}
  global
    group haproxy
    user haproxy

    # Verbose logging
    log stdout format raw local0 debug

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

    # Verbose logging
    log                     global
    option                  httplog

    # Reroute to a different backend if the sticky one is down
    option                  redispatch 1
    # These retries are for TCP connect errors, not on HTTP status 500 responses
    retries                 3

    # Sticky session for 24h of inactivity -- compile output is deleted after 24h
    cookie                  server-pro-ha insert maxidle 24h

    # Try to connect to any backend for 1min, then return 503
    timeout queue           1m
    # Give Server Pro instances 15s to startup
    timeout connect         15s

    # Abort requests from very slow clients (allow 1min of inactivity when reading a request)
    timeout client          1m

    # Allow slow compiles -- hard-coded limit in clsi is 10min
    timeout server          10m

    # Disconnect the editor after 23h -- 1h ahead of their last use yesterday
    timeout tunnel          23h

    # Note: The keepalive behavior in haproxy works great with the default keepalive setup in Server Pro.
    #       Haproxy is cleaning up connections in the background and it will redispatch requests when needed.

  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

    # Tell the application that we are behind https
    http-request set-header X-Forwarded-Proto https

    # Tell the application the actual client ip
    option forwardfor

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

    # Route git traffic to the sibling container of the git-bridge
    use-server server-pro-ha-1 if { path_beg /git/ }

    # Debugging
    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
  ```
</Accordion>

#### Server Pron määritys

**Salaisuudet**

Server Pro -instanssien on käytettävä yhteisiä jaettuja salaisuuksia:

* `WEB_API_PASSWORD` (web-API:n todennus)
* `STAGING_PASSWORD` ja `V1_HISTORY_PASSWORD` samalla arvolla (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 arvot on jaettava instanssien kesken.

Jos niitä ei ole määritetty ja käyttäjien pyynnöt reititetään eri Server Pro -instansseihin, pyynnöt eivät läpäise todennustarkistuksia, ja käyttäjät joko ohjataan toistuvasti kirjautumissivulle tai heidän toimintonsa käyttöliittymässä epäonnistuvat odottamattomilla tavoilla.

Jos niitä ei ole määritetty, Server Pro käyttää jokaiselle salaisuudelle uutta satunnaista arvoa, joka perustuu 32 satunnaiseen tavuun laitteesta `/dev/urandom` (256 satunnaista bittiä).

```bash wrap theme={null}
# 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+/'
```

**MongoDB**

Osoita `OVERLEAF_MONGO_URL` (`SHARELATEX_MONGO_URL` versioissa `4.x` ja vanhemmissa) keskitettyyn MongoDB-instanssiin.

**Redis**

Osoita `OVERLEAF_REDIS_HOST` (`SHARELATEX_REDIS_HOST` versioissa `4.x` ja vanhemmissa) ja `REDIS_HOST` keskitettyyn Redis-instanssiin.

**S3-yhteensopiva tallennustila projekti- ja historiatiedostoille**

Lisätietoja on [S3-yhteensopivaa tallennustilaa](/fi/on-premises/configuration/overleaf-toolkit/s3) käsittelevässä dokumentaatiossa.

**Tilapäiset tiedostot**

Paikallisen SSD-levyn oletusarvoinen bind-liitos hakemistoon `/var/lib/overleaf` (`/var/lib/sharelatex` versioissa `4.x` ja vanhemmissa) riittää. Muista osoittaa `SANDBOXED_COMPILES_HOST_DIR` isäntäkoneen liitoskohtaan.

<Danger>
  Suosittelemme vahvasti paikallisen levyn käyttöä. Minkä tahansa verkkolevyn (kuten NFS tai EBS) käyttö voi aiheuttaa odottamattomia käännösvirheitä ja muita suorituskykyongelmia.
</Danger>

**Välityspalvelimen määritys**

* Aseta `OVERLEAF_BEHIND_PROXY=true` (`SHARELATEX_BEHIND_PROXY` versioissa `4.x` ja vanhemmissa), jotta asiakkaiden IP-osoitteet ovat oikein.
* Aseta `TRUSTED_PROXY_IPS` kuormantasaajan IP-osoitteeksi (useita CIDR-alueita voidaan määrittää pilkuilla eroteltuina).

**Git-bridge-integraatio**

<Info>
  Git-bridge on saatavilla Server Prossa versiosta 4.0.1 alkaen.
</Info>

Git-bridge-kontti tarvitsee rinnakkaisen (sibling) Server Pro -kontin saapuvien git-pyyntöjen käsittelyyn. Tämä rinnakkainen kontti voi palvella myös tavallista käyttäjäliikennettä. Esimerkkimäärityksessä ensimmäinen instanssi toimii git-bridgen rinnakkaisena konttina, mutta käytännössä mikä tahansa instanssi voisi toimia siinä roolissa.

Miksi yksi Server Pro -kontti on nimettävä git-bridgen rinnakkaiseksi kontiksi? Server Pro antaa git-bridgelle historiapalvelun latausosoitteita. Nämä historia-URL-osoitteet on määritettävä siten, että niihin pääsee git-bridge-kontista.

Server Pro -kontin määritys:

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

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

git-bridge-kontin määritys:

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

<Accordion title="Esimerkki docker-compose.yml-määrityksestä">
  Seuraava määritys esittää itsenäisen kokoonpanon. Jotta esittely toimisi, sinun on annettava kelvollinen SSL-avain/-varmenne ja muutettava `OVERLEAF_SITE_URL` (`SHARELATEX_SITE_URL` versioissa `4.x` ja vanhemmissa). Todellisessa kokoonpanossa sinun on korvattava malliksi annetut salaisuudet oikeilla salaisuuksilla, kuten tekstin sisällä on mainittu. Todellisessa kokoonpanossa sinun on siirrettävä yksittäiset kontit omille solmuilleen ja mukautettava IP-osoitteet paikallisen verkkosi kokoonpanoon.

  ```yaml theme={null}
  version: '2.2'

  # Actual horizontal scaling setup: pick your own network and replace IPs in config.
  networks:
      default:
          ipam:
              config:
                  # This subnet is part of a reserved subnet used for benchmarking
                  # https://tools.ietf.org/html/rfc2544
                  # The full subnet is 198.18.0.0/15
                  # Use 198.18.0.0/24 for lb and dbs
                  # Use 198.18.1.0/24 for server-pro
                  # Use 198.18.0.128/25 for ephemeral container
                  - gateway: 198.18.0.1
                    ip_range: 198.18.0.128/25
                    subnet: 198.18.0.0/23

  services:
      # Actual horizontal scaling setup: run haproxy outside docker on a separate host.
      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
          # Alternative to "ports": use host network to avoid docker-proxy overhead
          network_mode: host

          # Alternative to "network_mode: host": use docker-proxy for network isolation
          # ports:
          #     - "80:80"
          #     - "443:443"
          # networks:
          #     default:
          #         ipv4_address: 198.18.0.2

          # Actual horizontal scaling setup: remove these as they run on other hosts.
          depends_on:
              server-pro-ha-1:
                  condition: service_started
              server-pro-ha-2:
                  condition: service_started
              server-pro-ha-3:
                  condition: service_started

      # Actual horizontal scaling setup: run this container next to server-pro-ha-1.
      # For Server Pro 4.0 onwards.
      git-bridge:
          restart: always
          # The tag should match the `server-pro-ha-1` container tag.
          image: quay.io/sharelatex/git-bridge:4.0.1
          volumes:
              # Actual horizontal scaling setup: point /data/git-bridge at a dedicated local ssd.
              - ~/git_bridge_data:/data/git-bridge
          container_name: git-bridge
          environment:
              GIT_BRIDGE_API_BASE_URL: "http://server-pro-ha-1/api/v0"
              GIT_BRIDGE_OAUTH2_SERVER: "http://server-pro-ha-1"
              GIT_BRIDGE_POSTBACK_BASE_URL: "http://198.18.0.6:8000"
              GIT_BRIDGE_ROOT_DIR: "/data/git-bridge"
          user: root
          command: ["/server-pro-start.sh"]

          # Actual horizontal scaling setup: run on host 198.18.0.6 and expose port
          # ports:
          #     - "8000:8000"
          networks:
              default:
                  ipv4_address: 198.18.0.6

      # Actual horizontal scaling setup: run this container on a separate host.
      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:
              # Actual horizontal scaling setup: keep this entry.
              git-bridge:
                  condition: service_started

              # Actual horizontal scaling setup: remove the ones below as they run on other hosts.
              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
              # Actual horizontal scaling setup: provide your own domain/app name.
              OVERLEAF_SITE_URL: 'https://overleaf.example.com'
              OVERLEAF_APP_NAME: Server Pro Horizontal Scaling Demo

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

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

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

              # S3
              # Actual horizontal scaling setup: pick secure credentials.
              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
              # Only needed on the sibling instance of git-bridge
              V1_HISTORY_URL: "http://server-pro-ha-1:3100/api"
              # /git-bridge

              # Horizontal scaling
              # Actual horizontal scaling setup: pick secure credentials.
              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'
              # Actual horizontal scaling setup: IPs of load balancers
              TRUSTED_PROXY_IPS: 198.18.0.1,198.18.0.2
              # /Horizontal scaling

          # Actual horizontal scaling setup: run on host 198.18.1.1 and expose ports
          # ports:
          #     - "80:80"
          networks:
              default:
                  ipv4_address: 198.18.1.1

      # Actual horizontal scaling setup: run this container on a separate host.
      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"

          # Actual horizontal scaling setup: run on host 198.18.1.2 and expose ports
          # ports:
          #     - "80:80"
          networks:
              default:
                  ipv4_address: 198.18.1.2

      # Actual horizontal scaling setup: run this container on a separate host.
      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"

          # Actual horizontal scaling setup: run on host 198.18.1.3 and expose ports
          # ports:
          #     - "80:80"
          networks:
              default:
                  ipv4_address: 198.18.1.3

      # Actual horizontal scaling setup: run this container on a separate host.
      minio:
          image: minio/minio:RELEASE.2023-05-18T00-05-36Z
          container_name: minio
          command: server /data
          volumes:
              # Actual horizontal scaling setup: run minio with multiple disks, see minio docs.
              - ~/minio_data:/data
          environment:
              # Actual horizontal scaling setup: pick secure credentials.
              MINIO_ROOT_USER: MINIO_ROOT_USER
              MINIO_ROOT_PASSWORD: MINIO_ROOT_PASSWORD

          # Actual horizontal scaling setup: run on host 198.18.0.5 and expose port
          # ports:
          #     - "9000:9000"
          networks:
              default:
                  ipv4_address: 198.18.0.5

      # Actual horizontal scaling setup: run this setup once on a separate host.
      minio_setup:
          depends_on:
              - minio
          image: minio/mc:RELEASE.2023-05-18T16-59-00Z
          entrypoint: sh
          command:
              - '-c'
              # Actual horizontal scaling setup: pick secure credentials.
              - |
                  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

                  # Put the contents of the policy from the previous section in policy-filestore.json
                  # Reminder: Replace the bucket names accordingly.
                  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

      # Actual horizontal scaling setup: run this container on a separate host.
      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

          # Actual horizontal scaling setup: run on host 198.18.0.3 and expose port
          # ports:
          #     - "27017:27017"
          networks:
              default:
                  ipv4_address: 198.18.0.3

      mongo_replica_set_setup:
          image: mongo:4.4
          entrypoint: sh
          depends_on:
              mongo:
                  condition: service_healthy
          command:
              - '-c'
              - |
                  mongo 198.18.0.3 --eval "rs.initiate({ _id: \"overleaf\", members: [ { _id: 0, host: \"198.18.0.3:27017\" } ] })"

      # Actual horizontal scaling setup: run this container on a separate host.
      redis:
          restart: always
          image: redis:6.2
          container_name: redis
          expose:
              - 6379
          volumes:
              - ~/redis_data:/data

          # Actual horizontal scaling setup: run on host 198.18.0.4 and expose port
          # ports:
          #     - "6379:6379"
          networks:
              default:
                  ipv4_address: 198.18.0.4
  ```
</Accordion>

#### Laitteisto

Suosittelemme käyttämään samoja laitteistomäärityksiä kaikissa horisontaaliseen skaalaukseen osallistuvissa Server Pro -instansseissa.

Server Pro -instansseja koskevat yleiset [laitteistomäärityksiä](/fi/on-premises/getting-started/requirements/hardware-requirements) koskevat suositukset ovat voimassa.

#### Server Pron päivittäminen

Osana päivitysprosessia Server Pro suorittaa automaattisesti tietokantasiirrot (migrations). Näitä siirtoja **ei** ole suunniteltu suoritettaviksi useista instansseista rinnakkain.

Siirtojen on valmistuttava ennen varsinaisen verkkosovelluksen käynnistymistä. Voit joko tarkistaa lokeista merkinnän `Finished migrations` tai odottaa, kunnes sovellus ottaa vastaan liikennettä.

Päivitysmenettely on seuraava:

1. Varaa huoltoikkuna
2. Pysäytä kaikki Server Pron instanssit
3. Ota johdonmukainen varmuuskopio [dokumentaatiossa](/fi/on-premises/maintenance/data-and-backups#performing-a-consistent-backup) kuvatulla tavalla
4. Käynnistä yksi Server Pron instanssi uudella versiolla
5. Varmista, että uusi instanssi toimii odotetusti
6. Käynnistä muut instanssit uudella versiolla


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.