---
title: "Quire diegimas su Docker Compose"
description: "Įdiekite Quire savo infrastruktūroje su Docker Compose."
image: "https://docs.quirelms.com/og.png"
---

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

# Quire diegimas su Docker Compose

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

Tai visas produktas vienoje sistemoje: LMS, jo foninis darbas, realiojo laiko
ir bendro redagavimo paslaugos ir kiekviena pasirenkama paslauga už profilio.
Projekto aprašas yra `docs/architecture/23-ops.md` 2 skyrius.

Kiti tikslai: [Vercel](/lt/ops/vercel/) ir [Cloudflare Workers](/lt/ops/cloudflare/)
vykdo tik tinklo sluoksnį. Atnaujinimai yra [upgrade.md](/lt/ops/upgrade/), o
atsatinės kopijos ir atkūrimo pratybos – [backup-restore.md](/lt/ops/backup-restore/).

## Ko jums reikia <!--quire:what-you-need-->

- Docker Engine 27 arba vėlesnis su Compose įskiepiu 2.30 arba vėlesniu.
- 4 CPU branduoliai ir 8 GB atminties numatytajam masyvui; 8 branduoliai ir
  16 GB su `--profile full` (vienas ClamAV laiko apie 1,5 GB parašų).
- DNS vardas tinklo sluoksniui ir antras nepatikimam turiniui. Jie turi būti
  skirtingi šeimininkai: SCORM paketai ir įkeltas HTML veikia turinio
  kilmės vietose, todėl jie niekada negali perskaityti LMS slapukų.
- Vietiniam bandymui `lvh.me` ir `*.localhost` išsprendžiami į 127.0.0.1,
  ką ir naudoja `docker/.env.example`. Pati masyvo `proxy` paslauga tiekia
  abu per https su vietine liudijimų įstaiga, todėl nieko kito neįdiegiama
  (žr. „TLS“).
- 80 ir 443 prievadai laisvi sistemoje (`QUIRE_PROXY_HTTP_PORT` ir
  `QUIRE_PROXY_HTTPS_PORT` juos perkelia).

## Pirmasis paleidimas <!--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` įrašo `docker/.env` iš `docker/.env.example` su
sugeneruota kiekviena paslaptimi (duomenų bazės slaptažodžiai, pasirašymo ir
pagrindiniai raktai, turinio paleidimo raktų pora) ir audito kontrolinio
taško pasirašymo raktu faile `docker/secrets/audit-signing-key.pem`, kurį
Compose prijungia prie darbininkų kaip paslaptį. Jam reikia tik `sh`, `awk`
ir `openssl`, ir jis atsisako perrašyti jau esamą `docker/.env`. Nukopijuokite
abu failus už sistemos ribų: be `QUIRE_MASTER_KEY` atkurta duomenų bazė negali
iššifruoti savo išsaugotų prisijungimo duomenų. Jei norite failą užpildyti
ranka, `cp docker/.env.example docker/.env`; faile parašyta, kaip sugeneruoti
kiekvieną paslaptį.

Abu kilmės adresai turi būti `https`: turinio paslauga atsisako paprasto
http gamyboje, ir jie negali dalytis registruojamu domenu. Paslauga `proxy`
nutraukia TLS abiem (žr. „TLS“); `init-env.sh` atmeta `http://` kilmės adresą.

Masyvas paleidžiamas fiksuota tvarka, ir kiekvienas žingsnis laukia
ankstesnio:

1. `postgres` tampa sveikas. Pirmojo paleidimo metu jo paleidimo skriptas
   (`docker/postgres/init/90-passwords.sh`) nustato keturių vaidmenų
   slaptažodžius.
2. `migrate` pritaiko kiekvieną migraciją ir įkuria užduočių eilę valdymo
   duomenų bazėje ir kiekvienoje atskiroje nuomininko duomenų bazėje,
   patikrina, ar jos visos sutampa, tada išeina (docs/ops/upgrade.md).
   Migracijos vykdomos kiekvieną kartą paleidus ir yra idempotentiškos,
   todėl atnaujinimas yra naujas atvaizdas ir paleidimas iš naujo.
3. `init` (`apps/web/src/first-run.ts`) užregistruoja programų duomenų bazę
   po `QUIRE_DATABASE_ID` ir, kai nustatytas `QUIRE_SETUP_ADMIN_EMAIL`,
   sukuria pirmąją organizaciją ir jos administratorių. Prisijungimo adresas
   ir sugeneruotas slaptažodis atspausdinami vieną kartą, `docker compose
   logs init`.
4. Paleidžiami `web`, `content`, `worker`, `scheduler`, `collab` ir
   `centrifugo`.
5. `proxy` paleidžiamas, kai `web` ir `content` yra sveiki.

Atidarykite `https://demo.` ir po jo savo programos domeną (`init` žurnalas
atspausdina tikslų prisijungimo adresą) ir prisijunkite. Diegiant vietoje
pirmiausia pasitikėkite proxy liudijimų įstaiga (žr. „TLS“). Pakeiskite
sugeneruotą slaptažodį adresu `/account/security`.

Procesas, paleistas be privalomos paslapties, atsisako paleisti ir savo
žurnale įvardija trūkstamą nustatymą. Niekas nepaleidžiamas pusiau
sukonfigūruotas.

## Paslaugos ir profiliai <!--quire:services-and-profiles-->

| Paslauga | Profilis | Ką daro |
| --- | --- | --- |
| postgres | visada | Duomenų bazė (PostgreSQL 18 su pgvector, pastatyta iš `docker/postgres.Dockerfile`), su WAL archyvavimu nuo pirmojo paleidimo |
| migrate, init | visada | Vienkartinė: migracijos, tada pirmasis paleidimas |
| web | visada | LMS ant `QUIRE_HTTP_PORT` (8080) |
| content | visada | Nepatikimo turinio kilmės vieta ant `QUIRE_CONTENT_PORT` (8081) |
| worker | visada | Fono užduotys: el. paštas, ataskaitos, failų apdorojimas, „webhooks“ |
| scheduler | visada | Pasikartojančios užduotys: registruoja 64 vykdymo tvarkaraščius ir perduoda juos darbininkui; vienas lyderis vienu metu |
| collab | visada | Bendro redagavimo websocket ant `QUIRE_COLLAB_HTTP_PORT` (1234) |
| centrifugo | visada | Realiojo laiko skirstymas ant `QUIRE_REALTIME_PORT` (8000) |
| proxy | visada | Caddy, TLS priekinės durys 80 ir 443 prievaduose (žr. „TLS“) |
| valkey | `cache` | Podėliai ir greičio ribojimai |
| clamav | `scan` | Kenksmingų programų skenavimas įkėlimų |
| gotenberg | `preview` | Office į PDF peržiūros, liudijimų generavimas |
| imgproxy | `images` | Keičiamo dydžio ir konvertuoti paveikslėliai |
| transcoder | `video` | Darbininko atvaizdas su tik LGPL ffmpeg, vaizdo pavidalams |
| seaweedfs | `storage` | S3 suderinta objektų saugyklas šioje sistemoje |
| otelcol | `observability` | OpenTelemetry rinktuvas |
| mailpit | `devmail` | Sugaudo visą išeinantį paštą, kad galėtumėte išbandyti Quire |
| backup | `backup` | Vienkartinė bazinė atsarginė kopija; žr. backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | Bazinė atsarginė kopija kas `QUIRE_BACKUP_INTERVAL_HOURS` ir užšifruotos kopijos už sistemos ribų su kasdiene patikros pratyba |
| h5p | `h5p` | H5P LTI 1.3 įrankio atvaizdas, kurį tiekiate `QUIRE_H5P_IMAGE`, ant `QUIRE_H5P_PORT` (8090); žr. „H5P teikėjo prijungimas“ |

`--profile full` paleidžia kiekvieną pasirenkamą paslaugą, išskyrus `backup`
ir `h5p`. Vieną paslaugą paleiskite su
`docker compose -f docker/compose.yaml --profile scan up -d`. Be pasirenkamos
paslaugos Quire vis tiek veikia ir pasako, ko trūksta: be skenerio įkėlimai
saugomi neskeniuojami ir administratorius apie tai informuojamas; be
„Gotenberg“ failai vietoj peržiūros siūlo atsisiųsti; be transkoderio vaizdo
įrašas groja toks, koks yra originalus failas.

Kiekvienas trečiosios šalies atvaizdas ir jo licencijos įsipareigojimai
išvardyti faile `docker/third-party-containers.yaml`.

### H5P teikėjo prijungimas <!--quire:connecting-an-h5p-provider-->

Quire neįdeda ir neteikia H5P vykdyklo arba šalutinio proceso (ADR 0019). Jei
naudojate H5P, patys tiekite prieglobos prenumeratą arba valdykite savo
H5P instanciją atskirai nuo Quire. Užregistruokite tą teikėją kaip LTI 1.3
išorinį įrankį ir pridėkite jo turinį prie kursų kaip įrankio veiklas. Quire
keičiasi įvertinimais ir veiklos / tikrinimo eiga per LTI Priskyrimo ir
įvertinimo paslaugas (AGS). Jei teikėjas taip pat siunčia xAPI teiginius,
sukonfigūruokite tai atskirai Quire xAPI teiginių saugyklai; AGS įvertinimų /
eigos keitimasis xAPI teiginių nesiunčia. Moodle importai praneša, kad H5P
veikloms reikia LTI įrankio ryšio. Teikėjas ir toliau atsakingas už savo H5P
vykdyklą, redagavimą, turinio banką ir bandymų istoriją.

Kad paleistumėte savo H5P instanciją šioje sistemoje, nustatykite
`QUIRE_H5P_IMAGE` į jos atvaizdą ir paleiskite profilį `h5p`. Compose jį
paskelbia ant `QUIRE_H5P_PORT` (8090) ir saugo jo duomenis `h5p-data` tome;
atsakomybė už atvaizdą ir kartu su juo ateinančius įsipareigojimus lieka jūsų.

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

Kiekvienas procesas skaito `docker/.env`. Šablonas `docker/.env.example`
išvardija kiekvieną nustatymą su jo numatytąja reikšme. Grupės:

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

| Nustatymas | Reikšmė |
| --- | --- |
| `QUIRE_APP_ORIGIN` | LMS viešasis adresas, pavyzdžiui `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Turinio kilmės vieta, kitas šeimininkas |
| `QUIRE_PLATFORM_DOMAINS` | Domenai, po kuriais gyvena organizacijos, skiriami kableliais |
| `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` | Čia `compose`. Kituose vadovuose žr. `vercel` ir `cloudflare` |
| `QUIRE_TRUSTED_PROXY_CIDRS` | Įėjimo taškai, kurių `X-Forwarded-For` tikima |

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

| Nustatymas | Reikšmė |
| --- | --- |
| `QUIRE_SECRET_KEY` | Pasirašo sesijas ir žetonus. 64 šešioliktainiai simboliai |
| `QUIRE_MASTER_KEY` | Suvynioja išsaugotus prisijungimo duomenis, tokius kaip SSO ir „webhook“ paslaptys. 32 baitai, base64. Tinklo sluoksniui ir darbininkui reikia tos pačios reikšmės. Rotavimas: [key-rotation.md](/lt/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Pagrindinio rakto versijos žyma, kai nenustatyta – `v1`. Pakelkite ją rotuodami |
| `QUIRE_MASTER_KEY_RETIRED` | Ankstesni pagrindiniai raktai, kurių vis dar reikia perskaityti tai, ką jie užkabino, kaip `v1=<base64>`. Pašalinkite, kai rotavimas baigiamas nieko neišsprendus |
| `QUIRE_COLLAB_SIGNING_KEY` | Dalijamas web ir collab pasirašyti redagavimo žetonus |
| `QUIRE_BACKUP_SIGNING_KEY` | Pasirašo kursų atsatines kopijas (neprivaloma) |

Laikykite `QUIRE_MASTER_KEY` kopiją kur kitur, ne šioje sistemoje. Duomenų
bazė, atkurta be jo, negali iššifruoti joje esančių prisijungimo duomenų.

### Duomenų bazė <!--quire:database-->

| Nustatymas | Reikšmė |
| --- | --- |
| `POSTGRES_PASSWORD` | Superuseris, naudojamas konteinerio ir atsatinių kopijų |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | Vaidmenų slaptažodžiai, nustatomi pirmojo paleidimo metu |
| `DATABASE_URL` | Programų vaidmuo. Eilučių lygio apsauga taikoma kiekvienai jo užklausai |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | Migratoriaus vaidmuo `migrate` ir `init` |
| `QUIRE_SUPERUSER_URL` | Naudojamas tik pirmojo paleidimo |
| `QUIRE_REPORT_DATABASE_URL` | Tik skaitymui skirtas ataskaitų vaidmuo ataskaitoms ir ataskaitų kūrėjui |
| `QUIRE_AUDIT_DATABASE_URL` | Audito vaidmuo audito konsolei ir SIEM eksportui |
| `QUIRE_DATABASE_ID` | Bet koks UUID, fiksuotas visam diegimo gyvenimui |

Vaidmenų slaptažodžiai taikomi tik tada, kai duomenų bazės tomas sukuriamas
pirmą kartą. Norėdami vėliau pakeisti vieną, naudokite `ALTER ROLE` ir tada
atnaujinkite atitinkamą URL.

`QUIRE_REPORT_DATABASE_URL` naudojamas fizinei duomenų bazei, sukonfigūruotai
`DATABASE_URL`. Kiekvienai kitai registruotai fizinei duomenų bazei nustatykite
jos pačios `quire_report` ryšio URL web ir darbininko aplinkose, tada į tą
duomenų bazę įrašykite kintamojo pavadinimą į lauką **Reporting environment
variable** kaip `env:NAME`. Nuoroda turi nurodyti į tą pačią duomenų bazę,
kaip ir jos programų ryšys, pageidautina, jos skaitymo kopiją. Kiekvienas
ataskaitų paviršius seka nuomininką į jo paties duomenų bazės ataskaitų
ryšį: ataskaitų kūrėjas ir išsaugotos ataskaitos, planiniai pristatymai,
ataskaitų eksportai, analitika, audito žurnalas, REST audito ištekliai ir
asistento audito paieška. Nė vienas iš jų niekados nesiima kitos duomenų
bazės ataskaitų URL. Kai duomenų bazė neturi ataskaitų ryšio, eilinės
ataskaitos vykdomos tos duomenų bazės paties programų ryšiu, o analitika ir
kiekvienas audito skaitymas atmetami su paaiškinimu, nes programų vaidmuo
negali skaityti audito pėdsako.

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

| Nustatymas | Ši versija | Pastabos |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (pagal nutylėjimą), `s3` arba `azure` | `local` laiko failus `files` tome. `s3` apima AWS S3, R2, GCS suderinamumą ir kitas S3 suderintas saugyklas, su tęstiniais daugiadaliniais įkėlimais |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (pagal nutylėjimą), `sse`, `centrifugo` arba `durable_objects` | `inprocess` tinka vienam web konteineriui; kai jų keletas, naudokite `centrifugo` arba `sse` |
| `QUIRE_CACHE_DRIVER` | `memory` (pagal nutylėjimą), `postgres` arba `valkey` | `memory` yra kiekvienam procesui; naudokite `valkey` arba `postgres`, kad greičio ribojimai galiotų tarp konteinerių |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (pagal nutylėjimą) arba `progressive_mp4` | Arba prieglobos teikėjas: Cloudflare Stream, Mux arba Bunny, pagal jų raktus |
| `QUIRE_IMAGE_DRIVER` | `noop` (pagal nutylėjimą), `imgproxy` arba `cloudflare` | `noop` tiekia kiekvieną paveikslėlį jo originaliu dydžiu. `imgproxy` reikia profilio `images` ir toliau nurodytų nustatymų; `cloudflare` naudoja Cloudflare Images |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` arba `in_process` | Platformos numatytoji tiesioginių sesijų reikšmė. Nenustatyta, tiesioginės sesijos praneša, kad nesukonfigūruotos, kol organizacija neprijungia savo paskyros skiltyje Integracijos, tiesioginių sesijų teikėjas. Organizacijos paties paskyra visada laimi prieš šią reikšmę. Kiekvieno teikėjo patys nustatymai (`BBB_URL` ir `BBB_SECRET`, `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*` ir `JITSI_*` kintamieji) skaitomi tik čia pavadinto teikėjo |
| `QUIRE_MEETING_REGIONS` | Kableliais skiriamas `eu`, `uk`, `us` sąrašas | Kur platformos numatytasis teikėjas tvarko susitikimus. Nenustatyta, tai nėra tikrinama prieš organizaciją, pririštą prie regiono, kaip anksčiau. Organizacijos paties paskyra nurodo savo regionus savo puslapyje |

Variklio reikšmės, kurios šios versijos nėra, tinklo sluoksniui paleidžiant
atmetamos su nurodytu nustatymu, vietoj to, kad būtų tyliai pakeista
numatąja reikšme.

### Paveikslėliai <!--quire:images-->

Puslapiai prašo paveikslėlių keturiais fiksuotais dydžiais per
`/api/files/{id}/image/{size}`, kuris tikrina tą patį prieinamumą kaip ir
pats failas, o tada nukreipia į paveikslėlių paslaugą. Kiekviena organizacija
gali per valandą paprašyti `QUIRE_IMAGE_SPECS_PER_HOUR` (pagal nutylėjimą
2000) naujų paveikslėlio ir dydžio porų; tą valandą jau pagaminti dydžiai
nesiskaičiuoja. Kai web konteinerių daugiau nei vienas, naudokite `valkey`
arba `postgres` kaip `QUIRE_CACHE_DRIVER`, kad limitas galiotų per visus.

| Nustatymas | Variklis | Pastabos |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Adresas, kuriuo naršyklės pasiekia imgproxy, pavyzdžiui `https://images.example.org`. Profilis `images` jį paskelbia ant `QUIRE_IMAGES_PORT` (8082) |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | Šešioliktainės eilutės, tos pačios reikšmės, su kuriomis paleidžiamas imgproxy. Kiekvieną sugeneruokite su `openssl rand -hex 32`. Quire jomis pasirašo kiekvieną paveikslėlio adresą, todėl imgproxy nieko nepiešia, ko Quire neprašė |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | `imgproxy` su vietine saugykla | Kur imgproxy ima originalus. Compose nustato `http://web:3000`. Su `s3` arba `azure` saugykla imgproxy ima iš kibiro ir to nereikia |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | API žetonas su Images redagavimo teise ir paskyros maiša iš Images, Developer resources. Įjunkite lanksčius variantus paskyrai |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | Neprivaloma. Kai nustatyta, paveikslėliai yra privatūs ir kiekvienas adresas pasirašomas ir galioja ribotą laiką. Be jo paveikslėliai vieši adresais, išvestais iš `QUIRE_SECRET_KEY`, kurių niekas negali atspėti |

Cloudflare Images laiko savo kiekvieno originalo, kurį tiekia, kopiją. Kai
failas ištrinamas, darbininkas tą kopiją ištrina prieš originalą.

### Eilė <!--quire:queue-->

Fono užduotys naudoja pg-boss toje pačioje Postgres duomenų bazėje, todėl
eilės paslaugos paleisti nereikia ir nėra ko konfigūruoti. Užduotys dedamos
į eilę toje pačioje transakcijoje, kaip ir pakeitimas, ją sukėlęs, todėl
kritimas negali nė vienos prarasti arba nė vienos išsiųsti du kartus.
`QUIRE_QUEUE_DRIVER` čia yra `pgboss`, jo numatytoji reikšmė; `vercel` ir
`cloudflare` perkelia tik lengvus pranešimų ir „webhook“ pristatymus į
pačios platformos eilę, o Vercel ir Cloudflare vadovai juos aprašo ir tai,
kaip jų tinklo sluoksniai deda į eilę.

### El. paštas <!--quire:email-->

Nustatykite vieną iš:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: JSON objektas, įvardijantis HTTP teikėją ir
  jo prisijungimo duomenis, pavyzdžiui
  `{"provider":"postmark","token":"..."}`. Palaikomi Postmark, Amazon SES,
  Mailgun, SendGrid ir Resend.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. Tik šiam tikslui;
  be serverio tikslai SMTP blokuoja.

`QUIRE_MAIL_FROM` yra siuntėjas. Norėdami išbandyti Quire, paleiskite profilį
`devmail`, nustatykite `QUIRE_SMTP_URL=smtp://mailpit:1025` ir skaitykite
paštą adresu `http://localhost:8025`.

### Pasirenkamos paslaugos <!--quire:optional-services-->

| Nustatymas | Su profiliu |
| --- | --- |
| `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` arba `QUIRE_MEILISEARCH_URL` | Išorinė paieška; kitaip Postgres pilno teksto |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Slaptažodžių pažeidimo patikra. Pagal nutylėjimą įjungta prieš `api.pwnedpasswords.com` (siunčiamas tik penkių simbolių maišos priešdėlis); `off` ją išjungia, o URL nurodo į jūsų prieglobos diapazono API |

### Stebėsena <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` įvardija rinktuvą, į kurį kiekvienas procesas
siunčia pėdsakus ir matuoklius; su profiliumi `observability` tai yra
`http://otelcol:4318`, o `docker/otel-collector.yaml` yra vieta, kur pridedate
eksportuotoją savo sistemai. Tinklo sluoksnio, darbininko, tvarkytuvo, turinio
ir bendradarbiavimo procesai eksportuoja intervalus per OTLP/HTTP (web
užklausos, nuomininko duomenų bazės transakcijos, darbininko užduotys ir
išeinančios užklausos), kai tai nustatyta, ir matuoklius į tą patį adresą
kas minutę (`OTEL_METRICS_EXPORTER=none` juos išjungia).
`OTEL_TRACES_SAMPLER_ARG` nustato laikomų pėdsakų dalį. Žurnalai eina į
standartinę išvestį su `LOG_LEVEL`, o Compose juos sukasi. Pėdsakuose niekada
nėra asmens duomenų.

### Regioninis išėjimas (ES duomenų rezidavimas) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` sako, kad masyvas aptarnauja Europos Sąjungos organizacijas.
Tada darbininkas kiekvieną išeinantį užklausą, padarytą organizacijai,
pririštai prie ES, laiko pagal leidžiamų adresų sąrašą (21-compliance.md 8.1
skyrius). Leidžiamų adresų sąrašą sudaro šeimininkai, kuriuos sukonfigūruotos
paslaugos deklaruoja regionui (saugyklos adresas, el. pašto teikėjas,
prieglobos vaizdo teikėjas, pačios organizacijos saugyklų adresai, DI
teikėjai ir el. pašto paskyra), bet kokios paslaugos, esančios aktyvioje
nuolaidoje, šeimininkai, ir jūsų išvardyti šeimininkai faile
`QUIRE_EGRESS_ALLOW_HOSTS`. Užklausa į bet kokį kitą viešą šeimininką
atmetama dar prieš ją išsiunčiant, atmetimas įrašomas į organizacijos audito
pėdsaką kaip `privacy/egress_refused`, ir jis išvardijamas skiltyje
Atitiktis, Duomenų rezidavimas.

| Nustatymas | Reikšmės | Poveikis |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Kableliais skiriamas šeimininkų vardų sąrašas arba `*.example.org` kiekvienam subdomenui | Papildomi šeimininkai, kuriuos ES organizacija gali pasiekti. „Webhook“, xAPI ir SIEM taškai, tinklaraščių srautai ir Amazon SES šeimininkai priklauso čia, nes jie yra pačios organizacijos pasirinkimas ir jų nedeklaruoja jokia paslauga. Loopback, privatūs adresai ir vienžodžiai vardai, tokie kaip `web` arba `clamav`, yra jūsų paties tinklas ir niekada netikrinami |

JK ir JAV organizacijos nelaikomos šeimininkų sąrašu; jos išlaiko paslaugos
regiono patikras. Nustatykite sąrašą darbininkui; administratoriaus puslapis
jį skaito tinklo sluoksnyje, kad parodytų leidžiamų adresų sąrašą, todėl
įrašykite jį į `docker/.env`, kurį skaito kiekviena paslauga.

Programos patikra duoda aiškią klaidą ir audito įrašą, ir tai nėra garantija:
kodas gali būti klaidingas. Garantija yra tinklas. Compose to jums neįgyvendina.
Regioniniam masyvui dėkite `worker` ir `web` paslaugas į `internal: true`
tinklą, kurio vienintelis išėjimas yra išėjimo įėjimo taškas (pavyzdžiui
Squid arba tinyproxy konteineris), leidžiantis tuos pačius šeimininkus kaip
`QUIRE_EGRESS_ALLOW_HOSTS` ir jūsų sukonfigūruotų paslaugų šeimininkus, ir
nustatykite `HTTPS_PROXY` toms paslaugoms. Rezidavimo puslapis išvardija
tikslius šeimininkus, kuriuos leidžia programa, todėl tuos du sąrašus galima
palyginti.

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

| Taškas | Reikšmė |
| --- | --- |
| `/healthz` | Gyvybingumas: procesas atsako. Compose sveikatos patikros tai naudoja |
| `/readyz` | Pasirengimas: priklausomybės pasiekiamos ir kiekviena pasirenkama paslauga pranešta, ar sukonfigūruota. Nukreipkite čia savo apkrovos paskirstytuvą |

`docker compose -f docker/compose.yaml ps` rodo kiekvienos paslaugos sveikatą.

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

Paslauga `proxy` (Caddy, Apache-2.0, `docker/caddy/Caddyfile`) yra numatytojo
masyvo dalis. Ji atsako 80 ir 443 prievaduose ir maršrutizuoja:

| Šeimininkas arba kelias | Kur eina |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, kiekvienas nuomininko subdomenas ir pasirinktinis domenas | `web` |
| `/_collab/` tuose šeimininkuose | `collab` (websocket, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` tuose šeimininkuose | `centrifugo` kliento websocket; jo serverio API niekada neatveriama |
| `/_images/` tuose šeimininkuose | `imgproxy`, su profiliumi `images` (`IMGPROXY_URL`) |

`init-env.sh` išveda `QUIRE_PROXY_APP_HOST`, `QUIRE_PROXY_CONTENT_HOST`,
`QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` ir `IMGPROXY_URL` iš dviejų
kilmės adresų, todėl jie negali išsiskirtyti. Redaguokite juos kartu, jei
kilmės adresą keičiate ranka.

Liudijimai vadovaujasi `QUIRE_PROXY_TLS`:

- `internal` (pagal nutylėjimą): pati Caddy liudijimų įstaiga `localhost`,
  `*.localhost` ir `lvh.me`. Kartą pasitikėkite jos šaknimi, tada naršykite:

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

  Pridėkite `quire-local-ca.crt` prie sistemos arba naršyklės pasitikėjimo
  saugyklos. `curl` jį priima su `--cacert`.
- El. pašto adresas: automatiniai ACME liudijimai (Let's Encrypt, tada
  ZeroSSL) tikriems vardams. Abiejų kilmės sričių ir kiekvieno nuomininko
  šeimininko DNS turi nurodyti čia, o 80 ir 443 prievadai turi būti pasiekiami
  iš interneto.

Nuomininkų šeimininkai išduodami pagal poreikį, pirmojo apsilankymo metu, ir
tik tada, kai web patvirtina, kad vardas priklauso šiam diegimui (`/tls-allowed`,
klausiama Compose tinkle). Nereikia nei pakaitinio liudijimo, nei DNS teikėjo
įskiepio, ir svetimas žmogus, nukreipęs vardą į sistemą, negali priversti jos
prašyti liudijimų. Liudijimai ir vietinė įstaiga gyvena `caddy-data` tome;
jei naudojate `internal`, atsarginę kopiją darykite kartu su likusia dalimi.

Web tikima `X-Forwarded-For` tik iš įėjimo taško: jis turi fiksuotą adresą
(`QUIRE_PROXY_ADDRESS`, pagal nutylėjimą `172.29.64.10`) fiksuotame tinkle
(`QUIRE_COMPOSE_SUBNET`), ir `QUIRE_TRUSTED_PROXY_CIDRS` įvardija tą adresą.
Jei tinklas susiduria su tinklu sistemoje, pakeiskite abu ir paleiskite
`docker compose down` prieš `up`.

## Už savo atvirkštinio įėjimo taško <!--quire:behind-your-own-reverse-proxy-->

Norėdami naudoti apkrovos paskirstytuvą arba įėjimo tašką, kurį jau turite,
palikite `proxy` už (`docker compose up -d --scale proxy=0`) ir nutraukite
TLS priekyje `web` (8080), `content` (8081), `collab` (1234, websocket) ir
`centrifugo` (8000, websocket). Nustatykite viešuosius adresus
`QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN` ir `QUIRE_COLLAB_URL` (`wss://`),
ir savo įėjimo taško adresų intervalą `QUIRE_TRUSTED_PROXY_CIDRS`.

## Trikčių šalinimas <!--quire:troubleshooting-->

- `init` išeina su "QUIRE_DATABASE_ID is not a UUID": nustatykite jį su
  `uuidgen`.
- `web` paleidžiamas iš naujo su "did not start on compose": žurnale
  išvardijamas kiekvienas nustatymas, kurio jis negali įgyvendinti, ir ką
  vietoj jo naudoti.
- Vaidmens slaptažodžio pakeitimas faile `.env` po pirmojo paleidimo nieko
  nedaro: paleidimo skriptas veikia vieną kartą. Naudokite `ALTER ROLE`.
- Įkėlimai nepavyksta su klaida dėl skenavimo, kai nustatytas `CLAMAV_URL`:
  ClamAV parsisiunčia savo parašus pirmojo paleidimo metu, o tai užtrunka
  kelias minutes.

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