---
title: "Quire'i paigaldamine Docker Compose'iga"
description: "Paigalda Quire Docker Compose'i abil enda taristusse."
image: "https://docs.quirelms.com/og.png"
---

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

# Quire'i paigaldamine Docker Compose'iga

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

See on täisfunktsionaalne toode ühes hostis: õppehaldussüsteem, selle taustatööd,
reaalaja- ja ühise muutmise teenused ning kõik profiili taga olevad valikulised
teenused. Arhitektuur on dokumendi `docs/architecture/23-ops.md` jaotises 2.

Muud sihtkohad: [Vercel](/et/ops/vercel/) ja [Cloudflare Workers](/et/ops/cloudflare/)
käitavad ainult veebikihti. Uuendused on juhendis [upgrade.md](/et/ops/upgrade/),
varundamine ja taastamise proov aga juhendis [backup-restore.md](/et/ops/backup-restore/).

## Vajalikud eeldused <!--quire:what-you-need-->

- Docker Engine 27 või uuem koos Compose'i pistikprogrammiga 2.30 või uuem.
- Vaikimisi virna jaoks 4 protsessorituuma ja 8 GB mälu; `--profile full`
  korral 8 tuuma ja 16 GB (ainuüksi ClamAV hoiab umbes 1,5 GB signatuure).
- Veebikihile DNS-nimi ja usaldamatu sisu jaoks teine nimi. Need peavad olema
  eri hostid: SCORM-paketid ja üleslaaditud HTML töötavad sisu päritolus, et nad
  ei saaks kunagi lugeda õppehaldussüsteemi küpsiseid.
- Kohalikuks katseks lahenduvad `lvh.me` ja `*.localhost` aadressiks 127.0.0.1,
  mida kasutab `docker/.env.example`. Virna `proxy`-teenus serveerib mõlemat
  HTTPS-i kaudu kohaliku sertimiskeskusega, nii et midagi muud pole vaja
  paigaldada (vt „TLS”).
- Hostis peavad olema vabad pordid 80 ja 443; neid saab muuta seadetega
  `QUIRE_PROXY_HTTP_PORT` ja `QUIRE_PROXY_HTTPS_PORT`.

## Esmakäivitus <!--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` loob faili `docker/.env` failist
`docker/.env.example`, genereerides kõik saladused (andmebaasi paroolid,
allkirjastamis- ja peavõtmed ning sisu käivitamise võtmed) ning auditi
kontrollpunkti allkirjastamisvõtme failis `docker/secrets/audit-signing-key.pem`.
Compose ühendab selle töötlejatele saladusena. Skript vajab ainult `sh`, `awk`
ja `openssl`-i ning keeldub olemasolevat `docker/.env`-i üle kirjutamast.
Kopeeri mõlemad failid hostist välja: `QUIRE_MASTER_KEY`-ta taastatud andmebaas
ei saa salvestatud mandaate dekrüptida. Faili võib täita ka käsitsi, kopeerides
`cp docker/.env.example docker/.env`; mall kirjeldab iga saladuse genereerimist.

Mõlemad päritolud peavad olema `https`: tootmiskeskkonnas keeldub sisuteenus
lihtsast HTTP-st ning neil ei tohi olla sama registreeritavat domeeni. `proxy`
teenus lõpetab mõlema TLS-i (vt „TLS”); `init-env.sh` keeldub `http://`
aadressist.

Virn käivitub kindlas järjekorras ning iga samm ootab eelmist:

1. `postgres` muutub terveks. Esmakäivitusel määrab selle algskript
   (`docker/postgres/init/90-passwords.sh`) nelja rolli paroolid.
2. `migrate` rakendab kõik migratsioonid ja algseadistab tööjärjekorra
   juhtandmebaasis ning igas eriandmebaasiga rentniku andmebaasis; see kontrollib,
   et need ühtivad, ja väljub (docs/ops/upgrade.md). Migratsioonid käivituvad
   igal korral ning on korduskindlad, seega on uuendus uus kujutis ja taaskäivitus.
3. `init` (`apps/web/src/first-run.ts`) registreerib rakenduse andmebaasi
   `QUIRE_DATABASE_ID` all ning loob muutuja `QUIRE_SETUP_ADMIN_EMAIL` määramisel
   esimese organisatsiooni ja selle halduri. Sisselogimisaadress ja genereeritud
   parool trükitakse ühe korra `docker compose logs init` väljundisse.
4. Käivituvad `web`, `content`, `worker`, `scheduler`, `collab` ja `centrifugo`.
5. `proxy` käivitub pärast seda, kui `web` ja `content` on terved.

Ava `https://demo.` koos rakenduse domeeniga (täpse sisselogimisaadressi leiab
`init`-logist) ja logi sisse. Kohalikus paigaldises usalda esmalt puhverserveri
sertimiskeskust (vt „TLS”). Muuda genereeritud parool aadressil `/account/security`.

Nõutava saladuseta protsess keeldub käivitumast ja nimetab logis puuduva seade.
Miski ei käivitu pooliku seadistusega.

## Teenused ja profiilid <!--quire:services-and-profiles-->

| Teenus | Profiil | Mida teeb |
| --- | --- | --- |
| postgres | alati | Andmebaas (PostgreSQL 18 koos pgvectoriga, ehitatud failist `docker/postgres.Dockerfile`), WAL arhiveeritakse esimesest käivitusest |
| migrate, init | alati | Ühekordne käivitus: migratsioonid, seejärel algseadistus |
| web | alati | Õppehaldussüsteem pordil `QUIRE_HTTP_PORT` (8080) |
| content | alati | Usaldamatu sisu päritolu pordil `QUIRE_CONTENT_PORT` (8081) |
| worker | alati | Taustatööd: e-post, aruanded, failitöötlus, veebikonksud |
| scheduler | alati | Korduvad tööd: registreerib 64 käitusajagraafikut ja annab need töötlejale; korraga juhib üks ajastaja |
| collab | alati | Ühise muutmise veebipesa pordil `QUIRE_COLLAB_HTTP_PORT` (1234) |
| centrifugo | alati | Reaalajasõnumite levitamine pordil `QUIRE_REALTIME_PORT` (8000) |
| proxy | alati | Caddy, TLS-i sissepääs pordidel 80 ja 443 (vt „TLS”) |
| valkey | `cache` | Vahemälu ja päringupiirangud |
| clamav | `scan` | Üleslaadimiste pahavarakontroll |
| gotenberg | `preview` | Office'i failide PDF-eelvaated ja tunnistuste renderdamine |
| imgproxy | `images` | Piltide suuruse muutmine ja vormingu teisendamine |
| transcoder | `video` | Töötleja kujutis LGPL-litsentsiga ffmpegiga, videoversioonide loomiseks |
| seaweedfs | `storage` | S3-ühilduv objektisalvestus selles hostis |
| otelcol | `observability` | OpenTelemetry koguja |
| mailpit | `devmail` | Kogub Quire'i proovimiseks kõik väljaminevad kirjad |
| backup | `backup` | Ühekordne põhi-varukoopia; vt backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | Põhi-varukoopia iga `QUIRE_BACKUP_INTERVAL_HOURS` järel ning krüptitud välised koopiad koos iganädalase kontrollkatsega |
| h5p | `h5p` | Sinu antud H5P LTI 1.3 tööriista kujutis muutujas `QUIRE_H5P_IMAGE`, pordil `QUIRE_H5P_PORT` (8090); vt „H5P pakkuja ühendamine” |

`--profile full` käivitab kõik valikulised teenused peale `backup`i ja `h5p`.
Käivita üks profiil näiteks käsuga `docker compose -f docker/compose.yaml
--profile scan up -d`. Ilma valikulise teenuseta töötab Quire edasi ja selgitab,
mis puudu: skannerita salvestatakse üleslaadimised kontrollimata ning haldurit
teavitatakse; Gotenbergita pakutakse eelvaate asemel allalaadimist; videokodeerijata
esitatakse algne fail.

Kolmanda osapoole kujutised ja nendega seotud litsentsikohustused on loetletud
failis `docker/third-party-containers.yaml`.

### H5P pakkuja ühendamine <!--quire:connecting-an-h5p-provider-->

Quire ei lisa ega tarni H5P käituskeskkonda ega kõrvalprotsessi (ADR 0019).
H5P kasutamiseks hangi majutatud tellimus või käita enda H5P eksemplari
Quire'ist eraldi. Registreeri pakkuja välise LTI 1.3 tööriistana ja lisa selle
sisu kursusele tööriistategevusena. Quire vahetab hindeid ning tegevuse ja
hindamise edenemist LTI Assignment and Grade Servicesi (AGS) kaudu. Kui pakkuja
saadab ka xAPI-lauseid, seadista need Quire'i xAPI lausete salvesti jaoks eraldi;
AGS-i hinde- ja edenemisvahetus xAPI-lauseid ei saada. Moodle'i impordiaruanded
märgivad H5P-tegevused LTI-tööriista ühendust vajavaks. Pakkuja vastutab enda
H5P käituskeskkonna, sisu loomise, sisupanga ja katsete ajaloo eest.

Oma hostis paikneva eksemplari käivitamiseks määra `QUIRE_H5P_IMAGE` selle
kujutiseks ja käivita `h5p`-profiil. Compose avaldab selle pordil
`QUIRE_H5P_PORT` (8090) ja säilitab andmeid köites `h5p-data`; kujutis ning
sellega kaasnevad kohustused jäävad sinu vastutusele.

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

Iga protsess loeb faili `docker/.env`. Mall `docker/.env.example` loetleb iga
seade koos vaikeväärtusega. Rühmad:

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

| Seade | Tähendus |
| --- | --- |
| `QUIRE_APP_ORIGIN` | Õppehaldussüsteemi avalik aadress, näiteks `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Sisu päritolu, eraldi host |
| `QUIRE_PLATFORM_DOMAINS` | Organisatsioonide domeenid komadega eraldatult |
| `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` | Siin `compose`; `vercel`i ja `cloudflare` kohta vaata teisi juhendeid |
| `QUIRE_TRUSTED_PROXY_CIDRS` | Puhverserverid, mille `X-Forwarded-For` väärtust usaldatakse |

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

| Seade | Tähendus |
| --- | --- |
| `QUIRE_SECRET_KEY` | Allkirjastab seansse ja tokeneid; 64 kuueteistkümnendsüsteemi märki |
| `QUIRE_MASTER_KEY` | Pakib salvestatud mandaate, nagu SSO ja veebikonksude saladused; 32 baiti base64-vormingus. Veebikiht ja töötleja vajavad sama väärtust. Vahetamine: [key-rotation.md](/et/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Peavõtme versioonimärgend, vaikimisi `v1`; tõsta vahetamisel |
| `QUIRE_MASTER_KEY_RETIRED` | Varasemad võtmed, mida on vaja pakitud andmete lugemiseks, kujul `v1=<base64>`; eemalda pärast vahetuse lõppu, kui midagi pole lahendamata |
| `QUIRE_COLLAB_SIGNING_KEY` | Veebirakenduse ja collab-teenuse ühine võti muutmismärkide allkirjastamiseks |
| `QUIRE_BACKUP_SIGNING_KEY` | Allkirjastab kursuse varukoopiaid (valikuline) |

Hoia `QUIRE_MASTER_KEY`-i koopiat hostist eemal. Ilma selleta taastatud andmebaas
ei suuda selles hoitavaid mandaate dekrüptida.

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

| Seade | Tähendus |
| --- | --- |
| `POSTGRES_PASSWORD` | Superkasutaja parool, mida kasutavad konteiner ja varundamine |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | Rollide paroolid, määratakse esmakäivitusel |
| `DATABASE_URL` | Rakenduseroll; selle päringutele kehtib rea-taseme turve |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | Migraatorroll teenustele `migrate` ja `init` |
| `QUIRE_SUPERUSER_URL` | Kasutusel ainult esmakäivitusel |
| `QUIRE_REPORT_DATABASE_URL` | Kirjutuskaitstud aruanderoll aruannete ja aruandelooja jaoks |
| `QUIRE_AUDIT_DATABASE_URL` | Auditiroll auditi konsooli ja SIEM-ekspordi jaoks |
| `QUIRE_DATABASE_ID` | Suvaline UUID, mis jääb paigalduse kasutusajaks samaks |

Rollide paroolid rakendatakse ainult andmebaasiköite loomisel. Hiljem ühe
muutmiseks kasuta `ALTER ROLE`-i ja uuenda vastavat URL-i.

`QUIRE_REPORT_DATABASE_URL` on füüsilise andmebaasi jaoks, mille määrab
`DATABASE_URL`. Iga muu registreeritud füüsilise andmebaasi jaoks määra oma
`quire_report` ühenduse URL nii veebirakenduse kui ka töötleja keskkonnas ning
registreeri selle andmebaasi väljal **Reporting environment variable** muutuja
nimi kujul `env:NAME`. Viide peab osutama samale andmebaasile kui rakenduse
ühendus, soovitatavalt selle lugemiskoopiale. Iga aruandepind kasutab rentniku
enda andmebaasi aruandeühendust: aruandelooja ja salvestatud aruanded, ajastatud
edastused, aruannete eksport, analüütika, auditilogi, REST-i auditite ressursid
ning assistendi auditiotsing. Ükski neist ei laena teise andmebaasi aruande-URL-i.
Kui andmebaasil aruandeühendust pole, käitatakse tavapärased aruanded selle enda
rakendusühenduses; analüütika ja auditi lugemine aga keelduvad, sest rakenduseroll
ei saa auditijälge lugeda.

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

| Seade | Selles väljalaskes | Märkused |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | Vaikimisi `local`, või `s3` või `azure` | `local` hoiab failid `files`-köites. `s3` toetab AWS S3, R2, GCS-i koostalitlust ja muid S3-ühilduvaid hoidlaid koos jätkatava mitmeosalise üleslaadimisega |
| `QUIRE_REALTIME_DRIVER` | Vaikimisi `inprocess`, või `sse`, `centrifugo` või `durable_objects` | `inprocess` sobib ühele veebikonteinerile; mitme puhul kasuta `centrifugo` või `sse` |
| `QUIRE_CACHE_DRIVER` | Vaikimisi `memory`, või `postgres` või `valkey` | `memory` kehtib ühe protsessi kohta; konteinerite vaheliseks päringupiiranguks kasuta `valkey` või `postgres` |
| `QUIRE_VIDEO_DRIVER` | Vaikimisi `ffmpeg` või `progressive_mp4` | Või majutatud pakkuja Cloudflare Stream, Mux või Bunny oma võtmetega |
| `QUIRE_IMAGE_DRIVER` | Vaikimisi `noop`, või `imgproxy` või `cloudflare` | `noop` esitab iga pildi algses mõõdus. `imgproxy` vajab `images`-profiili ja alltoodud seadeid; `cloudflare` kasutab Cloudflare Imagesi |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` või `in_process` | Reaalajasessioonide platvormi vaikepakkuja. Kui väärtust pole, kuvatakse sessioonides seadistuse puudumise teade, kuni organisatsioon ühendab jaotises Integrations oma konto. Organisatsiooni konto on alati tähtsam. Pakkuja seaded (`BBB_URL`, `BBB_SECRET`, `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*`, `JITSI_*`) loetakse vaid siis, kui siin on see pakkuja valitud |
| `QUIRE_MEETING_REGIONS` | Komadega eraldatud loend `eu`, `uk`, `us` | Platvormi vaikepakkuja koosolekute töötlemispiirkonnad. Määramata korral ei kontrollita neid varasema tava järgi kindla piirkonnaga seotud organisatsiooni suhtes. Oma konto piirkonnad määratakse organisatsiooni lehel |

Selles väljalaskes mittesisalduv draiver lükatakse veebikihi käivitamisel tagasi
ning seade nimetatakse, mitte ei asendata vaikimisi väärtusega.

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

Lehed küsivad pilte neljas kindlas suuruses marsruudi kaudu
`/api/files/{id}/image/{size}`, mis kontrollib faili ligipääsu ning suunab seejärel
pildivõrku. Iga organisatsioon võib küsida `QUIRE_IMAGE_SPECS_PER_HOUR`
(vaikimisi 2000) uut pildi ja suuruse paari tunnis; samal tunnil juba loodud
suuruseid selle hulka ei loeta. Kui veebikonteinereid on mitu, kasuta
Kasuta `valkey` või `postgres` väärtust muutujas `QUIRE_CACHE_DRIVER`, et limiit kehtiks nende kõigi
peale.

| Seade | Draiver | Märkused |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Aadress, mille kaudu brauserid imgproxyga ühenduvad, näiteks `https://images.example.org`. `images`-profiil avaldab selle pordil `QUIRE_IMAGES_PORT` (8082) |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | Kuueteistkümnendväärtused, samad, millega imgproxy käivitub. Loo kumbki käsuga `openssl rand -hex 32`. Quire allkirjastab iga pildiaadressi nendega, nii et imgproxy renderdab ainult Quire'i soovitud pildi |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | `imgproxy` koos kohaliku salvestusega | Päritolu, kust imgproxy algpildi hangib. Compose määrab `http://web:3000`. `s3` või `azure` kasutamisel hangib imgproxy pildi ämbrist ja seda seadet ei kasutata |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | Imagesi muutmisõigusega API tunnus ja Imagesi jaotise Developer resources kontoräsi. Lülita kontol sisse paindlikud variandid |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | Valikuline. Määramisel on pildid privaatsed ning iga aadress allkirjastatakse ja aegub. Määramata jätmisel on pildid avalikud ning aadressid tuletatakse `QUIRE_SECRET_KEY`-st nii, et neid ei saa ära arvata |

Cloudflare Images salvestab iga esitatud algpildi enda koopiana. Faili kustutamisel
kustutab töötleja koopia enne algfaili.

### Tööjärjekord <!--quire:queue-->

Taustatööd kasutavad sama Postgresi andmebaasi pg-bossi, seega eraldi
järjekorrateenust käivitada ega seadistada pole vaja. Tööd lisatakse järjekorda
muudatuse tekitava andmebaasitehingu sees, nii et krahh ei saa tööd kaotada ega
seda kaks korda saata. Siin on `QUIRE_QUEUE_DRIVER` vaikeväärtus `pgboss`;
`vercel` ja `cloudflare` suunavad ainult kerged teavituste ning veebikonksude
edastused platvormi järjekorda. Nende järjekordade ja veebikihtide kaudu lisamise
kohta leiad juhised Verceli ja Cloudflare'i juhenditest.

### E-post <!--quire:email-->

Määra üks järgmistest:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: HTTP-pakkujat ja selle mandaate nimetav JSON-objekt,
  näiteks `{"provider":"postmark","token":"..."}`. Toetatud on Postmark,
  Amazon SES, Mailgun, SendGrid ja Resend.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. Ainult see sihtkoht; serverita
  keskkondades blokeeritakse SMTP.

`QUIRE_MAIL_FROM` on saatja aadress. Quire'i katsetamiseks käivita `devmail`
profiil, määra `QUIRE_SMTP_URL=smtp://mailpit:1025` ja vaata kirju aadressil
`http://localhost:8025`.

### Valikulised teenused <!--quire:optional-services-->

| Seade | Vajalik profiil |
| --- | --- |
| `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` või `QUIRE_MEILISEARCH_URL` | Väline otsing; muul juhul kasutatakse Postgresi täistekstiotsingut |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Parooli lekkekontroll. Vaikimisi küsitakse teenuselt `api.pwnedpasswords.com` (saadetakse ainult räsitunnuse viie märgi pikkune prefiks); `off` lülitab selle välja, URL osutab sinu majutatud vahemiku-API-le |

### Jälgitavus <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` määrab koguja, kuhu iga protsess saadab jäljed ja
mõõdikud; profiiliga `observability` on väärtus `http://otelcol:4318` ning
failis `docker/otel-collector.yaml` saab lisada taustsüsteemi eksportija. Selle
seadmisel ekspordivad veebikiht, töötleja, ajastaja, sisu- ja collab-protsessid
vahemäluprotokolli HTTP kaudu lõigud (veebipäringud, rentniku andmebaasitehingud,
töötleja tööd ja väljaminevad kutsed) ning saadavad iga minuti järel samasse
kohta mõõdikud (`OTEL_METRICS_EXPORTER=none` lülitab need välja). Jälgede
säilitatavat osa määrab `OTEL_TRACES_SAMPLER_ARG`. Logid lähevad tasemel
`LOG_LEVEL` standardväljundisse ning Compose pöörab neid. Jäljed ei sisalda
isikuandmeid.

### Piirkondlik väljaminev liiklus (EL-i andmeresidentsus) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` näitab, et virn teenindab Euroopa Liidu organisatsioone.
Töötleja piirab seejärel kõigi EL-i piirkonnaga seotud organisatsioonide nimel
tehtavad väljaminevad päringud lubatud loendiga (21-compliance.md jaotis 8.1).
Loendis on piirkonnale seadistatud teenuste deklareeritud hostid
(salvestuslõpp-punkt, e-posti pakkuja, majutatud videopakkuja, organisatsiooni
enda salvestuskohad, tehisintellektipakkujad ja meilikonto), aktiivse erandi all
oleva teenuse hostid ning `QUIRE_EGRESS_ALLOW_HOSTS` loetletud hostid. Iga muu
avalikule hostile minev päring lükatakse enne saatmist tagasi, keeld kantakse
organisatsiooni auditi jälge kirjena `privacy/egress_refused` ning see kuvatakse
jaotises Compliance, Data residency.

| Seade | Väärtused | Mõju |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Komadega eraldatud hostinimed või `*.example.org` kõigi alamdomeenide jaoks | Täiendavad hostid, kuhu EL-i organisatsioonid võivad ühenduda. Siia kuuluvad veebikonksude, xAPI ja SIEM-i lõpp-punktid, blogivood ning Amazon SES-i hostid, sest need valib organisatsioon ise ja teenus neid ei deklareeri. Tagasiside-, privaatsed IP-aadressid ja üheosalised nimed nagu `web` või `clamav` kuuluvad sinu võrku ning neid ei kontrollita kunagi |

Ühendkuningriigi ja USA organisatsioone hostiloend ei piira; nende puhul
kontrollitakse endiselt ainult teenuse piirkonda. Määra loend töötlejal;
haldusleht loeb seda veebikihis, et kuvada lubatud hostid, seega lisa see faili
`docker/.env`, mida loevad kõik teenused.

Rakenduse kontroll annab selge vea ja auditisissekande, kuid see pole tagatis:
kood võib eksida. Tagatise annab võrk. Compose ei rakenda seda sinu eest.
Piirkondliku virna jaoks pane teenused `worker` ja `web` sisevõrku
(`internal: true`), mille ainus väljamineku tee on liiklust filtreeriv puhverserver
(näiteks Squid või pisike tinyproxy), mis lubab samu hoste kui
`QUIRE_EGRESS_ALLOW_HOSTS` ja seadistatud teenuste hostid; määra nendele
teenustele `HTTPS_PROXY`. Residentsusleht loetleb rakenduse lubatud hostid, et
saaksid kahte loendit võrrelda.

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

| Lõpp-punkt | Tähendus |
| --- | --- |
| `/healthz` | Elusolek: protsess vastab. Compose'i tervisekontrollid kasutavad seda |
| `/readyz` | Valmidus: sõltuvused on kättesaadavad ning iga valikulise teenuse seadistusolek on teatatud. Suuna siia koormusjaotur |

`docker compose -f docker/compose.yaml ps` näitab iga teenuse terviseolekut.

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

`proxy`-teenus (Caddy, Apache-2.0, `docker/caddy/Caddyfile`) kuulub vaikimisi
virna. See vastab portidel 80 ja 443 ning suunab päringuid järgmiselt:

| Host või tee | Sihtkoht |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, kõik rentniku alamdomeenid ja kohandatud domeenid | `web` |
| `/_collab/` neil hostidel | `collab` (veebipesa, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` neil hostidel | `centrifugo` kliendi veebipesa; serveri API-d ei avaldata kunagi |
| `/_images/` neil hostidel | `imgproxy`, `images`-profiiliga (`IMGPROXY_URL`) |

`init-env.sh` tuletab kahe päritolu põhjal väärtused `QUIRE_PROXY_APP_HOST`,
`QUIRE_PROXY_CONTENT_HOST`, `QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` ja
`IMGPROXY_URL`, et need lahku ei läheks. Kui muudad lähteaadressi käsitsi,
tuleb neid muuta koos.

Sertifikaadid määrab `QUIRE_PROXY_TLS`:

- `internal` (vaikimisi): Caddy enda sertimiskeskus hostidele `localhost`,
  `*.localhost` ja `lvh.me`. Usalda juursertifikaati üks kord ja ava seejärel
  järgmise käsuga:

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

  Lisa `quire-local-ca.crt` süsteemi või brauseri usaldatud sertifikaatide
  hoidlasse. `curl`-iga kasuta valikut `--cacert`.
- E-posti aadressina antud väärtus: automaatsed ACME sertifikaadid (esmalt
  Let's Encrypt, seejärel ZeroSSL) päris hostinimedele. Mõlema päritolu ja iga
  rentniku hosti DNS peab siia osutama ning pordid 80 ja 443 peavad internetist
  ligipääsetavad olema.

Rentniku hostide sertifikaadid väljastatakse vajaduse korral esmakülastusel ning
ainult pärast seda, kui veebikiht kinnitab, et nimi kuulub sellele paigaldusele
(`/tls-allowed`, päring tehakse Compose'i võrgus). Tärniga sertifikaati ega
DNS-pakkuja pistikprogrammi pole vaja; võõras, hostile osutav nimi ei saa panna
seda sertifikaati taotlema. Sertifikaadid ja kohalik sertimiskeskus asuvad
`caddy-data`-köites; varunda see koos ülejäänuga, kui kasutad `internal`-režiimi.

Veebikiht usaldab `X-Forwarded-For` päist ainult puhverserverist: sellel on
fikseeritud aadress `QUIRE_PROXY_ADDRESS` (vaikimisi `172.29.64.10`) fikseeritud
alamvõrgus `QUIRE_COMPOSE_SUBNET` ning `QUIRE_TRUSTED_PROXY_CIDRS` määrab selle
aadressi. Kui alamvõrk kattub hosti võrguga, muuda mõlemat ning käivita käsk
`docker compose down` enne `up`-i.

## Oma vastupidise puhverserveri taga <!--quire:behind-your-own-reverse-proxy-->

Olemasoleva koormusjaoturi või puhverserveri kasutamiseks jäta `proxy` välja
(`docker compose up -d --scale proxy=0`) ning lõpeta TLS nende ees:
`web` (8080), `content` (8081), `collab` (1234, veebipesa) ja `centrifugo`
(8000, veebipesa). Määra avalikud aadressid muutujates `QUIRE_APP_ORIGIN`,
`QUIRE_CONTENT_ORIGIN` ja `QUIRE_COLLAB_URL` (`wss://`) ning puhverserveri
aadressivahemik muutujas `QUIRE_TRUSTED_PROXY_CIDRS`.

## Tõrkeotsing <!--quire:troubleshooting-->

- `init` väljub veaga "QUIRE_DATABASE_ID is not a UUID": määra see käsuga `uuidgen`.
- `web` taaskäivitub teatega "did not start on compose": logi loetleb seaded,
  mida ei saa rakendada, ja soovitatud väärtused.
- Rolli parooli muutmine failis `.env` pärast esmakäivitust ei mõju: algskript
  käivitub vaid ühe korra. Kasuta `ALTER ROLE`-i.
- Üleslaadimine ebaõnnestub skannimise veaga, kuigi `CLAMAV_URL` on määratud:
  esmakäivitusel laadib ClamAV signatuurid alla, milleks kulub mõni minut.
bun apps/docs-site/scripts/import-guide.ts et ops/install.md

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