---
title: "Quiren asentaminen Docker Composella"
description: "Asenna Quire omaan infrastruktuuriisi Docker Composella."
image: "https://docs.quirelms.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.quirelms.com/fi/llms.txt
> Use this file to discover all available pages before exploring further.

# Quiren asentaminen Docker Composella

<span id="installing-quire-with-docker-compose"></span>

Tämä asentaa koko tuotteen yhdelle isännälle: oppimisympäristön, taustatyöt, reaaliaikaisuus- ja yhteistyömuokkauspalvelut sekä profiileista valittavat lisäpalvelut. Rakenne kuvataan tiedoston `docs/architecture/23-ops.md` kohdassa 2.

Muut kohteet: [Vercel](/fi/ops/vercel/) ja [Cloudflare Workers](/fi/ops/cloudflare/) suorittavat vain verkkopalvelutason. Päivitykset käsitellään [päivitysoppaassa](/fi/ops/upgrade/), varmuuskopiot ja palautusharjoitus [varmuuskopiointioppaassa](/fi/ops/backup-restore/).

## Tarvittavat asiat <!--quire:what-you-need-->

- Docker Engine 27 tai uudempi ja Compose-lisäosa 2.30 tai uudempi.
- Oletuspinolle 4 CPU-ydintä ja 8 Gt muistia; `--profile full` -valinnalla 8 ydintä ja 16 Gt muistia. Pelkät ClamAV:n allekirjoitustiedot käyttävät noin 1,5 Gt.
- Verkkotunnus verkkopalvelutasolle ja toinen epäluotettavalle sisällölle. Niiden on oltava eri palvelinnimiä: SCORM-paketit ja ladattu HTML suoritetaan sisältöalkuperässä, jotta ne eivät koskaan voi lukea oppimisympäristön evästeitä.
- Paikallista kokeilua varten `lvh.me` ja `*.localhost` osoittavat osoitteeseen 127.0.0.1, kuten `docker/.env.example` olettaa. Pinon oma `proxy`-palvelu palvelee molempia HTTPS-yhteydellä paikallisen varmenneviranomaisen avulla, joten muuta ei tarvitse asentaa (katso "TLS").
- Isännän vapaat portit 80 ja 443 (`QUIRE_PROXY_HTTP_PORT` ja `QUIRE_PROXY_HTTPS_PORT` vaihtavat niitä).

## Ensimmäinen käynnistys <!--quire:first-run-->

```sh
QUIRE_APP_ORIGIN=https://learn.example.org \
QUIRE_CONTENT_ORIGIN=https://content.example-content.org \
QUIRE_SETUP_ADMIN_EMAIL=you@example.org \
  docker/scripts/init-env.sh
docker compose -f docker/compose.yaml up -d --build
docker compose -f docker/compose.yaml logs init
```

`docker/scripts/init-env.sh` luo tiedoston `docker/.env` mallista `docker/.env.example` ja muodostaa kaikki salaisuudet (tietokannan salasanat, allekirjoitus- ja pääavaimet sekä sisällön käynnistysavaimen parin). Se luo myös auditointitarkistuspisteen allekirjoitusavaimen tiedostoon `docker/secrets/audit-signing-key.pem`, jonka Compose liittää työntekijöille salaisuutena. Se tarvitsee vain komennot `sh`, `awk` ja `openssl`, eikä suostu korvaamaan olemassa olevaa `docker/.env`-tiedostoa. Kopioi molemmat tiedostot pois isännältä: ilman `QUIRE_MASTER_KEY`-avainta palautetussa tietokannassa olevia tunnistetietoja ei voi purkaa. Jos täytät tiedoston käsin, kopioi ensin komennolla `cp docker/.env.example docker/.env`; tiedostossa kerrotaan, miten kukin salaisuus luodaan.

Molempien alkuperäosoitteiden on käytettävä `https`-yhteyttä. Sisältöpalvelu ei hyväksy tuotannossa pelkkää HTTP:tä eivätkä osoitteet saa kuulua samaan rekisteröitävään verkkotunnukseen. `proxy`-palvelu päättää TLS-yhteyden kummallekin (katso "TLS"). `init-env.sh` hylkää `http://`-alkuiset osoitteet.

Pino käynnistyy kiinteässä järjestyksessä. Kukin vaihe odottaa edellisen valmistumista:

1. `postgres` muuttuu terveeksi. Ensimmäisellä käynnistyskerralla sen alustuskomentosarja (`docker/postgres/init/90-passwords.sh`) asettaa neljän roolin salasanat.
2. `migrate` suorittaa kaikki migraatiot ja alustaa työjonon ohjaustietokannassa sekä jokaisessa omistetussa vuokraajatietokannassa. Se varmistaa tietokantojen yhteneväisyyden ja päättyy sitten (katso docs/ops/upgrade.md). Migraatiot suoritetaan jokaisella käynnistyskerralla. Ne ovat idempotentteja, joten päivitykseen riittää uusi levykuva ja uudelleenkäynnistys.
3. `init` (`apps/web/src/first-run.ts`) kirjaa sovellustietokannan tunnisteen `QUIRE_DATABASE_ID`-arvolla. Jos `QUIRE_SETUP_ADMIN_EMAIL` on asetettu, se luo ensimmäisen organisaation ja sen ylläpitäjän. Kirjautumisosoite ja luotu salasana tulostetaan kerran komennon `docker compose logs init` lokiin.
4. Käynnistetään `web`, `content`, `worker`, `scheduler`, `collab` ja `centrifugo`.
5. `proxy` käynnistyy, kun `web` ja `content` ovat terveitä.

Avaa osoite `https://demo.` ja lisää sen perään sovelluksen verkkotunnus (tarkka kirjautumisosoite näkyy `init`-lokissa). Kirjaudu sisään. Luota paikallisen asennuksen tapauksessa ensin välityspalvelimen varmenneviranomaiseen (katso "TLS"). Vaihda luotu salasana osoitteessa `/account/security`.

Vaadittavan salaisuuden puuttuessa prosessi kieltäytyy käynnistymästä ja nimeää puuttuvan asetuksen lokissa. Osittain määritettyä kokoonpanoa ei käynnistetä.

## Palvelut ja profiilit <!--quire:services-and-profiles-->

| Palvelu | Profiili | Tehtävä |
| --- | --- | --- |
| postgres | aina | Tietokanta (PostgreSQL 18 ja pgvector, luodaan tiedostosta `docker/postgres.Dockerfile`); WAL arkistoidaan ensimmäisestä käynnistyksestä alkaen |
| migrate, init | aina | Kertaluonteisesti: migraatiot ja ensimmäinen käynnistys |
| web | aina | Oppimisympäristö portissa `QUIRE_HTTP_PORT` (8080) |
| content | aina | Epäluotettavan sisällön alkuperä portissa `QUIRE_CONTENT_PORT` (8081) |
| worker | aina | Taustatyöt: sähköposti, raportit, tiedostojen käsittely ja webhookit |
| scheduler | aina | Toistuvat työt: rekisteröi 64 ajastusta ja välittää ne työntekijälle; vain yksi johtaja kerrallaan |
| collab | aina | Yhteistyömuokkauksen WebSocket portissa `QUIRE_COLLAB_HTTP_PORT` (1234) |
| centrifugo | aina | Reaaliaikaisten tapahtumien jakelu portissa `QUIRE_REALTIME_PORT` (8000) |
| proxy | aina | Caddy, TLS-etuovi porteissa 80 ja 443 (katso "TLS") |
| valkey | `cache` | Välimuisti ja kutsurajat |
| clamav | `scan` | Ladattujen tiedostojen haittaohjelmatarkistus |
| gotenberg | `preview` | Office-tiedostojen PDF-esikatselut ja todistusten muodostaminen |
| imgproxy | `images` | Kuvien koon muuttaminen ja muuntaminen |
| transcoder | `video` | Työntekijäkuva, jossa on vain LGPL-lisensoitu ffmpeg videoversioita varten |
| seaweedfs | `storage` | Tämän isännän S3-yhteensopiva objektitallennus |
| otelcol | `observability` | OpenTelemetry-kerääjä |
| mailpit | `devmail` | Sieppaa kaikki lähtevät sähköpostit Quiren kokeilemista varten |
| backup | `backup` | Kertaluonteinen perusvarmuuskopio; katso backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | Perusvarmuuskopio `QUIRE_BACKUP_INTERVAL_HOURS`-asetuksen välein ja salatut kopiot toiseen sijaintiin viikoittaisella varmennusharjoituksella |
| h5p | `h5p` | Antamasi H5P LTI 1.3 -välinekuva muuttujassa `QUIRE_H5P_IMAGE`, portissa `QUIRE_H5P_PORT` (8090); katso "H5P-palveluntarjoajan yhdistäminen" |

`--profile full` käynnistää kaikki valinnaiset palvelut paitsi `backup` ja `h5p`. Käynnistä yksittäinen profiili komennolla `docker compose -f docker/compose.yaml --profile scan up -d`. Quire toimii ilman valinnaisia palveluja ja ilmoittaa, mitä puuttuu: ilman tarkistinta lataukset tallennetaan ilman haittaohjelmatarkistusta ja ylläpitäjälle kerrotaan siitä; ilman Gotenbergia tiedostot voi ladata mutta niitä ei esikatsella; ilman muunninta videot toistetaan alkuperäisinä.

Kaikki kolmannen osapuolen kuvat ja niiden lisenssivelvoitteet luetellaan tiedostossa `docker/third-party-containers.yaml`.

### H5P-palveluntarjoajan yhdistäminen <!--quire:connecting-an-h5p-provider-->

Quire ei sisällä eikä toimita H5P-suoritusympäristöä tai apupalvelua (ADR 0019). Jos käytät H5P:tä, hanki oma isännöity tilaus tai ylläpidä H5P-asennusta erillään Quiresta. Rekisteröi tarjoaja ulkoisena LTI 1.3 -välineenä ja lisää sen sisältö kursseille välinetoimintoina. Quire vaihtaa arvosanat ja toiminnon tai arvioinnin edistymistiedot LTI Assignment and Grade Services (AGS) -palvelun kautta. Jos tarjoaja lähettää myös xAPI-tietueita, määritä erikseen yhteys Quiren xAPI-tietuevarastoon. AGS:n arvosana- ja edistymistietojen vaihto ei lähetä xAPI-tietueita. Moodle-tuonti ilmoittaa H5P-toiminnoista, jotka vaativat LTI-välineen. Tarjoaja vastaa edelleen H5P-suoritusympäristöstä, sisällön luomisesta, sisältöpankista ja yrityshistoriasta.

Jos haluat käyttää tällä isännällä omaa H5P-asennusta, aseta `QUIRE_H5P_IMAGE` sen levykuvaksi ja käynnistä `h5p`-profiili. Compose julkaisee sen portissa `QUIRE_H5P_PORT` (8090) ja säilyttää sen tiedot `h5p-data`-taltiolla. Levykuva ja siihen liittyvät velvoitteet pysyvät sinun vastuullasi.

## Asetukset <!--quire:settings-->

Jokainen prosessi lukee tiedoston `docker/.env`. Malli `docker/.env.example` luettelee asetukset ja niiden oletukset. Ryhmät:

### Osoitteet <!--quire:addresses-->

| Asetus | Merkitys |
| --- | --- |
| `QUIRE_APP_ORIGIN` | Oppimisympäristön julkinen osoite, esimerkiksi `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Eri palvelimessa oleva sisällön alkuperä |
| `QUIRE_PLATFORM_DOMAINS` | Organisaatioiden verkkotunnukset pilkuilla erotettuina |
| `QUIRE_MARKETING_ORIGIN` | Optional. The marketing site, default `https://quirelms.com`. The only origin the waitlist form (`POST /api/waitlist`, `POST /waitlist`) accepts and redirects to. Comma separated; a `www.` variant is allowed only if listed |
| `QUIRE_DEPLOY_TARGET` | Tässä `compose`. Muiden kohteiden oppaat: `vercel` ja `cloudflare` |
| `QUIRE_TRUSTED_PROXY_CIDRS` | Välityspalvelimet, joiden `X-Forwarded-For`-otsakkeeseen luotetaan |

### Salaisuudet <!--quire:secrets-->

| Asetus | Merkitys |
| --- | --- |
| `QUIRE_SECRET_KEY` | Istuntojen ja tokenien allekirjoittamiseen; 64 heksadesimaalimerkkiä |
| `QUIRE_MASTER_KEY` | Säilytettyjen tunnistetietojen, kuten SSO- ja webhook-salaisuuksien, suojaamiseen; 32 tavua base64-muodossa. Verkkopalvelu ja työntekijä tarvitsevat saman arvon. Katso kierrätys: [key-rotation.md](/fi/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Pääavaimen versiotunniste; oletus on `v1`. Kasvata sitä kierrättäessä. |
| `QUIRE_MASTER_KEY_RETIRED` | Aiemmat pääavaimet, joita tarvitaan niiden suojaamien tietojen lukemiseen, muodossa `v1=<base64>`. Poista vasta kun kierrätys on valmis eikä mitään ole jäänyt selvittämättä. |
| `QUIRE_COLLAB_SIGNING_KEY` | Verkkopalvelun ja collab-palvelun yhteinen avain muokkaustokenien allekirjoitukseen |
| `QUIRE_BACKUP_SIGNING_KEY` | Kurssivarmuuskopioiden allekirjoittamiseen (valinnainen) |

Säilytä `QUIRE_MASTER_KEY`-avaimen kopio muualla kuin tällä isännällä. Ilman sitä palautettu tietokanta ei voi purkaa tallennettuja tunnistetietoja.

### Tietokanta <!--quire:database-->

| Asetus | Merkitys |
| --- | --- |
| `POSTGRES_PASSWORD` | Säilön ja varmuuskopioiden käyttämän pääkäyttäjän salasana |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | Roolien salasanat, asetetaan ensimmäisellä käynnistyskerralla |
| `DATABASE_URL` | Sovellusrooli. Riviin kohdistuva tietoturva koskee jokaista sen tekemää kyselyä. |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | Migraattorirooli `migrate`- ja `init`-palveluille |
| `QUIRE_SUPERUSER_URL` | Käytetään vain ensikäynnistyksessä |
| `QUIRE_REPORT_DATABASE_URL` | Vain luku -muotoinen raporttirooli raportteja ja raporttien rakentajaa varten |
| `QUIRE_AUDIT_DATABASE_URL` | Auditointirooli auditointikonsolia ja SIEM-vientiä varten |
| `QUIRE_DATABASE_ID` | Mikä tahansa UUID, joka pysyy samana koko asennuksen ajan |

Roolien salasanat asetetaan vain, kun tietokantataltio luodaan ensimmäisen kerran. Vaihda salasana myöhemmin komennolla `ALTER ROLE` ja päivitä vastaava yhteysosoite.

`QUIRE_REPORT_DATABASE_URL` koskee fyysistä tietokantaa, jonka `DATABASE_URL` määrittää. Aseta jokaiselle muulle rekisteröidylle fyysiselle tietokannalle sen oma `quire_report`-yhteysosoite verkkopalvelun ja työntekijän ympäristöön. Aseta sen jälkeen tietokannan **Raportoinnin ympäristömuuttuja** -kenttään muuttujan nimi muodossa `env:NAME`. Viitteen on osoitettava samaan tietokantaan kuin sovellusyhteyden, mieluiten sen lukureplikaan. Jokainen raporttinäkymä käyttää vuokraajan oman tietokannan raporttiyhteyttä: raporttien rakentaja ja tallennetut raportit, ajastetut toimitukset, raporttien viennit, analytiikka, auditointiloki, REST-auditointiresurssit ja avustajan auditointihaku. Mikään niistä ei käytä toisen tietokannan raporttiosoitetta. Jos tietokannalla ei ole raporttiyhteyttä, tavalliset raportit suoritetaan sen omalla sovellusyhteydellä. Analytiikka ja kaikki auditointiluvut hylätään ilmoituksella, sillä sovellusrooli ei voi lukea auditointiketjua.

### Ajurit <!--quire:drivers-->

| Asetus | Tämän julkaisun arvot | Huomioita |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (oletus), `s3` tai `azure` | `local` säilyttää tiedostot `files`-taltiolla. `s3` tukee AWS S3:a, R2:ta, GCS-yhteensopivuutta ja muita S3-yhteensopivia tallennuspalveluja sekä jatkettavia osalähetyksiä. |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (oletus), `sse`, `centrifugo` tai `durable_objects` | `inprocess` sopii yhdelle verkkosäiliölle. Käytä useammalla säiliöllä `centrifugo`- tai `sse`-ajuria. |
| `QUIRE_CACHE_DRIVER` | `memory` (oletus), `postgres` tai `valkey` | `memory` on prosessikohtainen. Käytä `valkey`- tai `postgres`-ajuria, jotta kutsurajat jaetaan säiliöiden kesken. |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (oletus) tai `progressive_mp4` | Tai avaimilla määritetty isännöity palvelu: Cloudflare Stream, Mux tai Bunny. |
| `QUIRE_IMAGE_DRIVER` | `noop` (oletus), `imgproxy` tai `cloudflare` | `noop` tarjoaa kuvat alkuperäisessä koossa. `imgproxy` tarvitsee `images`-profiilin ja alla olevat asetukset; `cloudflare` käyttää Cloudflare Imagesia. |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` tai `in_process` | Alustan oletuspalvelu live-istunnoille. Jos asetus puuttuu, live-istunnot ilmoittavat, ettei palvelua ole määritetty, kunnes organisaatio yhdistää oman tilin kohdassa Integrations, Live session provider. Organisaation oma tili ohittaa aina tämän arvon. Palveluntarjoajan omat asetukset (`BBB_URL` ja `BBB_SECRET` sekä `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*` ja `JITSI_*`) luetaan vain, jos tässä on vastaava palveluntarjoaja. |
| `QUIRE_MEETING_REGIONS` | Pilkuilla erotettu `eu`, `uk`, `us`-luettelo | Alustan oletuspalveluntarjoajan kokoustenkäsittelyalueet. Jos arvo puuttuu, palveluntarjoajaa ei tarkisteta alueeseen sidotun organisaation varalta, kuten aiemminkin. Organisaatio määrittää oman tilinsä alueet sen asetussivulla. |

Jos tämän julkaisun ajurivalikoimaan kuulumatonta arvoa käytetään, verkkopalvelun käynnistys hylätään ja virheessä nimetään asetus. Oletusarvoa ei oteta käyttöön hiljaisesti.

### Kuvat <!--quire:images-->

Sivut pyytävät kuvia neljässä kiinteässä koossa osoitteesta `/api/files/{id}/image/{size}`. Palvelu tarkistaa samat käyttöoikeudet kuin itse tiedostolle ja uudelleenohjaa kuvapalveluun. Jokainen organisaatio voi pyytää tunnissa enintään `QUIRE_IMAGE_SPECS_PER_HOUR` uutta kuva- ja kokoparia (oletus 2000). Sillä tunnilla jo tuotettuja kokoja ei lasketa mukaan. Jos käytössä on useampi verkkosäiliö, aseta `valkey` tai `postgres` ajuriksi muuttujaan `QUIRE_CACHE_DRIVER`, jotta raja on yhteinen.

| Asetus | Ajuri | Huomioita |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Osoite, josta selaimet tavoittavat imgproxyn, esimerkiksi `https://images.example.org`. `images`-profiili julkaisee sen portissa `QUIRE_IMAGES_PORT` (8082). |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | Heksadesimaalimerkkijonot, joiden on vastattava imgproxyn käynnistysarvoja. Luo kumpikin komennolla `openssl rand -hex 32`. Quire allekirjoittaa jokaisen kuvaosoitteen näillä arvoilla, joten imgproxy ei muunna Quiren pyytämättömiä kuvia. |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | `imgproxy` paikallisella tallennuksella | Alkuperäiskuvien nouto-osoite; Compose asettaa arvoksi `http://web:3000`. `s3`- tai `azure`-tallennuksella imgproxy noutaa kuvat säilöstä eikä käytä asetusta. |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | Images-muokkausoikeudella varustettu API-token ja tilin tiiviste kohdasta Images, Developer resources. Ota tilillä käyttöön joustavat versiot. |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | Valinnainen. Kun asetus on määritetty, kuvat ovat yksityisiä ja jokainen osoite allekirjoitetaan sekä vanhenee. Ilman sitä kuvat ovat julkisia `QUIRE_SECRET_KEY`-arvosta johdettujen arvaamattomien osoitteiden kautta. |

Cloudflare Images säilyttää itse kopion jokaisesta tarjoamastaan alkuperäiskuvasta. Kun tiedosto poistetaan, työntekijä poistaa ensin tämän kopion ja sitten alkuperäisen.

### Työjono <!--quire:queue-->

Taustatyöt käyttävät pg-bossia samassa Postgres-tietokannassa. Erillistä jonopalvelua ei tarvitse suorittaa eikä määrittää. Työt lisätään jonoon samassa tapahtumassa kuin ne käynnistävä muutos, joten kaatuminen ei voi kadottaa työtä tai lähettää sitä kahdesti. `QUIRE_QUEUE_DRIVER` on tässä oletusarvoinen `pgboss`. Ajurit `vercel` ja `cloudflare` siirtävät vain kevyet ilmoitus- ja webhook-toimitukset alustan omaan jonoon. Vercel- ja Cloudflare-oppaissa kuvataan niiden toiminta ja verkkopalvelutason jonoon lisäämät työt.

### Sähköposti <!--quire:email-->

Aseta jompikumpi seuraavista:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: HTTP-palveluntarjoajan ja sen tunnistetiedot nimeävä JSON-objekti, esimerkiksi `{"provider":"postmark","token":"..."}`. Tuettuja ovat Postmark, Amazon SES, Mailgun, SendGrid ja Resend.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. Tämä kohde tukee asetusta; palvelimettomat kohteet estävät SMTP:n.

`QUIRE_MAIL_FROM` määrittää lähettäjän. Kokeillaksesi Quirea käynnistä `devmail`-profiili, aseta `QUIRE_SMTP_URL=smtp://mailpit:1025` ja lue viestit osoitteesta `http://localhost:8025`.

### Valinnaiset palvelut <!--quire:optional-services-->

| Asetus | Profiili |
| --- | --- |
| `CLAMAV_URL=tcp://clamav:3310` | `scan` |
| `GOTENBERG_URL=http://gotenberg:3000` | `preview` |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `images` |
| `VALKEY_URL=redis://valkey:6379` | `cache` |
| `QUIRE_OPENSEARCH_URL` tai `QUIRE_MEILISEARCH_URL` | Ulkoinen haku; muussa tapauksessa Postgresin kokotekstihaku |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Salasanan vuototarkistus. Oletuksena päällä osoitteeseen `api.pwnedpasswords.com` (lähetetään vain viiden merkin tiiviste-alku); `off` poistaa sen käytöstä. URL-osoitteella määritetään oma rajapintapalvelusi. |

### Havainnoitavuus <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` määrittää kerääjän, jolle kaikki prosessit lähettävät jäljet ja mittarit. `observability`-profiilissa sen arvo on `http://otelcol:4318`. Lisää taustajärjestelmän vientipalvelu tiedostoon `docker/otel-collector.yaml`. Jos asetus on määritetty, verkkopalvelu, työntekijä, ajastin, sisältöpalvelu ja collab-prosessit vievät pyynnöistä, vuokraajien tietokantatapahtumista, työntekijätöistä ja lähtevistä kutsuista muodostetut jäljet OTLP/HTTP:llä sekä mittarit samaan osoitteeseen minuutin välein. `OTEL_METRICS_EXPORTER=none` poistaa mittarit käytöstä. `OTEL_TRACES_SAMPLER_ARG` määrittää säilytettävien jälkien osuuden. Lokit kirjoitetaan vakiotulosteeseen muuttujalla `LOG_LEVEL` määritetyllä tasolla, ja Compose kierrättää ne. Jäljissä ei ole henkilötietoja.

### Alueellinen ulosmenevä liikenne (EU:n tietojen sijainti) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` kertoo pinon palvelevan Euroopan unionin organisaatioita. Työntekijä rajaa tämän jälkeen EU-alueeseen kiinnitetyn organisaation kaikki lähtevät pyynnöt sallittujen listaan (21-compliance.md, kohta 8.1). Lista sisältää niiden määritettyjen palvelujen isännät, jotka ilmoittavat toimivansa alueella (tallennuspäätepiste, sähköpostipalvelu, isännöity videopalvelu, organisaation omat tallennuskohteet, tekoälypalvelut ja sähköpostitili), aktiivisen poikkeusluvan alaisten palvelujen isännät sekä muuttujassa `QUIRE_EGRESS_ALLOW_HOSTS` luettelemasi isännät. Pyyntö muihin julkisiin osoitteisiin estetään ennen lähetystä. Esto kirjataan organisaation auditointiketjuun tunnisteella `privacy/egress_refused` sekä kohdassa Compliance, Data residency.

| Asetus | Arvot | Vaikutus |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Pilkuilla erotettu isäntänimiluettelo tai `*.example.org` kaikille aliverkkotunnuksille | EU-organisaation lisäsallitut osoitteet. Webhook-, xAPI- ja SIEM-päätepisteet, blogisyötteet ja Amazon SES -isännät kuuluvat tähän, sillä organisaatio valitsee ne itse eikä mikään palvelu ilmoita niitä. Loopback- ja yksityisosoitteita sekä yksiosaisia nimiä, kuten `web` tai `clamav`, ei tarkisteta, sillä ne kuuluvat omaan verkkoosi. |

Isäntänimilista ei koske Ison-Britannian eikä Yhdysvaltojen organisaatioita. Niille tehdään edelleen palvelun alueen tarkistukset. Aseta lista työntekijälle. Ylläpitosivu lukee sen verkkopalvelutasolta ja näyttää sallitut isännät. Lisää muuttuja siis tiedostoon `docker/.env`, jota kaikki palvelut lukevat.

Sovelluksen tarkistus antaa selkeän virheen ja auditointimerkinnän, mutta se ei ole varsinainen takuu, sillä koodi voi olla virheellistä. Takuun muodostaa verkko. Compose ei valvo sitä puolestasi. Alueellisessa pinossa aseta `worker`- ja `web`-palvelut verkkoon `internal: true`, jonka ainoa ulospääsy on ulosmenevää liikennettä välittävä palvelin (esimerkiksi Squid tai tinyproxy-säiliö). Rajaa se samoihin osoitteisiin kuin `QUIRE_EGRESS_ALLOW_HOSTS` sekä määrittämiesi palvelujen isäntiin. Aseta palveluille myös `HTTPS_PROXY`. Alueellisen sijainnin sivu näyttää sovelluksen sallimat osoitteet, jotta voit verrata luetteloita.

## Terveys <!--quire:health-->

| Päätepiste | Merkitys |
| --- | --- |
| `/healthz` | Elossaolo: prosessi vastaa. Compose-kuntotarkistukset käyttävät tätä. |
| `/readyz` | Valmius: riippuvuuksiin saadaan yhteys ja jokainen valinnainen palvelu ilmoittaa, onko se määritetty. Käytä tätä kuormantasaajassa. |

`docker compose -f docker/compose.yaml ps` näyttää jokaisen palvelun terveystilan.

## TLS <!--quire:tls-->

Oletuspino sisältää `proxy`-palvelun (Caddy, Apache-2.0, `docker/caddy/Caddyfile`). Se kuuntelee portteja 80 ja 443 ja reitittää pyynnöt näin:

| Isäntä tai polku | Kohde |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, kaikki vuokraajien aliverkkotunnukset ja mukautetut verkkotunnukset | `web` |
| `/_collab/` näissä isännissä | `collab` (WebSocket, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` näissä isännissä | `centrifugo`-asiakkaan WebSocket; sen palvelin-API:a ei koskaan tuoda julki |
| `/_images/` näissä isännissä | `imgproxy`, kun `images`-profiili on käytössä (`IMGPROXY_URL`) |

`init-env.sh` johtaa kahdesta alkuperäosoitteesta asetukset `QUIRE_PROXY_APP_HOST`, `QUIRE_PROXY_CONTENT_HOST`, `QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` ja `IMGPROXY_URL`, jotta ne eivät voi ajautua eri arvoihin. Muuta ne yhdessä, jos vaihdat alkuperäosoitetta käsin.

Varmenteet määräytyvät asetuksen `QUIRE_PROXY_TLS` mukaan:

- `internal` (oletus): Caddyn oma varmenneviranomainen osoitteille `localhost`, `*.localhost` ja `lvh.me`. Luota sen juurivarmenteeseen kerran ja avaa sitten sivusto:

  ```sh
  docker compose -f docker/compose.yaml cp \
    proxy:/data/caddy/pki/authorities/local/root.crt ./quire-local-ca.crt
  ```

  Lisää `quire-local-ca.crt` järjestelmän tai selaimen luotettujen varmenteiden joukkoon. `curl`-komennossa käytetään valintaa `--cacert`.
- Sähköpostiosoite: automaattiset ACME-varmenteet (Let's Encrypt, sitten ZeroSSL) oikeille verkkotunnuksille. Molempien alkuperäosoitteiden ja jokaisen vuokraajan isännän DNS-tietojen on osoitettava tänne, ja porttien 80 ja 443 on oltava saavutettavissa internetistä.

Vuokraajien isännille myönnetään varmenne tarpeen mukaan ensimmäisen käynnin yhteydessä, ja vain jos web-palvelu varmistaa, että nimi kuuluu asennukseen (kysely `/tls-allowed` Compose-verkossa). Wildcard-varmennetta tai DNS-palveluntarjoajan liitännäistä ei tarvita. Väärän verkkotunnuksen tähän isäntään osoittava ulkopuolinen ei voi pakottaa varmenteen pyytämistä. Varmenteet ja paikallinen varmenneviranomainen säilyvät `caddy-data`-taltiolla. Jos käytät `internal`-asetusta, varmuuskopioi taltio muiden mukana.

Web-palvelu luottaa välityspalvelimen `X-Forwarded-For`-otsakkeeseen. Välityspalvelimen osoite on kiinteä (`QUIRE_PROXY_ADDRESS`, oletus `172.29.64.10`) ja se on kiinteässä aliverkossa (`QUIRE_COMPOSE_SUBNET`). `QUIRE_TRUSTED_PROXY_CIDRS` nimeää kyseisen osoitteen. Jos aliverkko on ristiriidassa isäntäkoneen verkon kanssa, vaihda molemmat asetukset ja suorita `docker compose down` ennen `up`-komentoa.

## Oman käänteisvälityspalvelimen takana <!--quire:behind-your-own-reverse-proxy-->

Jos käytät nykyistä kuormantasaajaa tai välityspalvelinta, älä sisällytä `proxy`-palvelua (`docker compose up -d --scale proxy=0`). Päätä TLS-yhteys niiden palvelujen edessä: `web` (8080), `content` (8081), `collab` (1234, WebSocket) ja `centrifugo` (8000, WebSocket). Aseta julkiset osoitteet muuttujiin `QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN` ja `QUIRE_COLLAB_URL` (`wss://`) sekä välityspalvelimen osoitealue muuttujaan `QUIRE_TRUSTED_PROXY_CIDRS`.

## Vianmääritys <!--quire:troubleshooting-->

- `init` pysähtyy viestiin "QUIRE_DATABASE_ID is not a UUID": aseta tunniste komennolla `uuidgen`.
- `web` käynnistyy uudelleen ja ilmoittaa "did not start on compose": lokissa luetellaan asetukset, joita ei voida käyttää, ja niiden korvaamiseen tarvittavat arvot.
- Roolin salasanan vaihtaminen `.env`-tiedostossa ensimmäisen käynnistyksen jälkeen ei vaikuta: alustusskripti ajetaan vain kerran. Käytä `ALTER ROLE` -komentoa.
- Lataus epäonnistuu tarkistusvirheeseen, kun `CLAMAV_URL` on asetettu: ClamAV lataa allekirjoitustietonsa ensimmäisellä käynnistyskerralla, mikä kestää muutaman minuutin.

Source: https://docs.quirelms.com/fi/ops/install/index.mdx
