---
title: "Quire uzstādīšana ar Docker Compose"
description: "Uzstādiet Quire uz sava infrastruktūras ar Docker Compose."
image: "https://docs.quirelms.com/og.png"
---

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

# Quire uzstādīšana ar Docker Compose

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

Šis ir pilns produkts uz viena servera: LMS, tā fona darbi, reāllaika un kopīgās
rediģēšanas pakalpojumi un katrs izvēles pakalpojums aiz profila. Konstrukcija
ir `docs/architecture/23-ops.md` 2. sadaļa.

Citi mērķi: [Vercel](/lv/ops/vercel/) un [Cloudflare Workers](/lv/ops/cloudflare/) darbina
tikai tīmekļa slāni. Jauninājumi ir [upgrade.md](/lv/ops/upgrade/), bet dublējumi un
atjaunošanas mācība — [backup-restore.md](/lv/ops/backup-restore/).

## Kas jums nepieciešams <!--quire:what-you-need-->

- Docker Engine 27 vai jaunāks ar Compose spraudni 2.30 vai jaunāku.
- 4 CPU kodoli un 8 GB atmiņas noklusētajai kopklasei; 8 kodoli un 16 GB
  ar `--profile full` (tikai ClamAV tur aptuveni 1,5 GB parakstu).
- DNS vārds tīmekļa slānim un otrs neuzticamajam saturam. Tiem jābūt atšķirīgiem
  saimniekiem: SCORM pakotnes un augšupielādētais HTML darbojas uz satura
  izcelsmes, lai tie nekad nevarētu lasīt LMS sīkdatnes.
- Vietējam testam `lvh.me` un `*.localhost` atrisinās uz 127.0.0.1, ko izmanto
  `docker/.env.example`. Pašas kopklases `proxy` pakalpojums apkalpo abus ar
  https, izmantojot vietējo sertifikācijas iestādi, tāpēc nekas cits netiek
  uzstādīts (skat. "TLS").
- Porti 80 un 443 brīvi uz servera (`QUIRE_PROXY_HTTP_PORT` un
  `QUIRE_PROXY_HTTPS_PORT` tos pārvieto).

## Pirmais starts <!--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` uzraksta `docker/.env` no `docker/.env.example` ar
izģenerētiem katru noslēpumu (datubāzes paroles, paraksta un galvenās atslēgas,
satura palaišanas atslēgu pāri) un audita kontrolpunkta paraksta atslēgu vietnē
`docker/secrets/audit-signing-key.pem`, ko Compose montē darbinīkos kā
slepenību. Tam vajag tikai `sh`, `awk` un `openssl`, un tas atsakās
pārrakstīt jau esošu `docker/.env`. Nokopējiet abus failus no servera: bez
`QUIRE_MASTER_KEY` atjaunota datubāze nevar atsifrēt savus saglabātos
akreditācijas datus. Lai failu aizpildītu ar roku, `cp docker/.env.example
docker/.env`; fails pasaka, kā izģenerēt katru noslēpumu.

Abām izcelsmēm jābūt `https`: satura pakalpojums ražotnē atsaka parastu http, un
tām nedrīkst būt kopīgs reģistrējams domēns. `proxy` pakalpojums abām pārtrauc
TLS (skat. "TLS"); `init-env.sh` atsaka `http://` izcelsmi.

Kopklase sākas fiksētā secībā, un katrs solis gaida iepriekšējo:

1. `postgres` kļūst veselīgs. Pirmajā startēšanā tās init skripts
   (`docker/postgres/init/90-passwords.sh`) iestata četru lomu paroles.
2. `migrate` piemēro katru migrāciju un sagatavo darbu rindu kontroldatubāzē
   un katrā atsevišķajā nomnieku datubāzē, pārbauda, ka tās visas piekrīt,
   pēc tam iziet (docs/ops/upgrade.md).
   Migrācijas tiek palaistas katrā startēšanā un ir idempotas, tāpēc jauninājums
   ir jauns attēls un restarts.
3. `init` (`apps/web/src/first-run.ts`) reģistrē lietojumprogrammas datubāzi
   zem `QUIRE_DATABASE_ID` un, ja `QUIRE_SETUP_ADMIN_EMAIL` ir iestatīts,
   izveido pirmo organizāciju un tās administratoru. Pierakstīšanās adrese un
   ģenerētā parole tiek izdrukātas vienu reizi `docker compose logs init`.
4. `web`, `content`, `worker`, `scheduler`, `collab` un `centrifugo` sākas.
5. `proxy` sākas, tiklīdz `web` un `content` ir veselīgi.

Atveriet `https://demo.` un savu lietojumprogrammas domēnu (`init` žurnāls
izdrukā precīzo pierakstīšanās adresi) un pierakstieties. Vietējā uzstādīšanā
vispirms uzticieties proxy sertifikācijas iestādei (skat. "TLS"). Nomainiet
ģenerēto paroli vietnē `/account/security`.

Process, kas palaists bez vajadzīgās slepenības, atsakās startēt un savā
žurnālā nosaka trūkstošo iestatījumu. Nekas nepuskonfigurēts nesākas.

## Pakalpojumi un profili <!--quire:services-and-profiles-->

| Pakalpojums | Profils | Ko tas dara |
| --- | --- | --- |
| postgres | vienmēr | Datubāze (PostgreSQL 18 ar pgvector, uzbūvēta no `docker/postgres.Dockerfile`), ar WAL arhivēšanu no pirmās ielādes |
| migrate, init | vienmēr | Vienreizējs: migrācijas, pēc tam pirmais starts |
| web | vienmēr | LMS uz `QUIRE_HTTP_PORT` (8080) |
| content | vienmēr | Neuzticamā satura izcelsme uz `QUIRE_CONTENT_PORT` (8081) |
| worker | vienmēr | Fona darbi: e-pasts, atskaites, failu apstrāde, tīmekļa āķi |
| scheduler | vienmēr | Atkārtotie darbi: reģistrē 64 izpildlaika grafikus un nodod tos darbinīkam; viens vadonis vienlaikus |
| collab | vienmēr | Kopīgās rediģēšanas websocket uz `QUIRE_COLLAB_HTTP_PORT` (1234) |
| centrifugo | vienmēr | Reāllaika izplatīšana uz `QUIRE_REALTIME_PORT` (8000) |
| proxy | vienmēr | Caddy, TLS priekšējā durvis portos 80 un 443 (skat. "TLS") |
| valkey | `cache` | Kešs un ātruma ierobežojumi |
| clamav | `scan` | Ļaunprātīgas programmatūras skenēšana augšupielādēm |
| gotenberg | `preview` | Office uz PDF priekšskatījumiem, sertifikātu renderēšana |
| imgproxy | `images` | Mainīta izmēra un konvertēti attēli |
| transcoder | `video` | Darbinīka attēls ar tikai LGPL ffmpeg video renderējumiem |
| seaweedfs | `storage` | Saderīga objektu glabātuve uz šī servera |
| otelcol | `observability` | OpenTelemetry vācējs |
| mailpit | `devmail` | Ķer visu izejošo pastu, lai izmēģinātu Quire |
| backup | `backup` | Vienu reizi bāzes dublējums; skat. backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | Bāzes dublējums ik pēc `QUIRE_BACKUP_INTERVAL_HOURS`, un šifrētas kopijas ārpus servera ar nedēļas pārbaudes mācību |
| h5p | `h5p` | H5P LTI 1.3 rīka attēls, ko piegādājat `QUIRE_H5P_IMAGE`, uz `QUIRE_H5P_PORT` (8090); skat. "H5P pakalpojuma sniedzēja pievienošana" |

`--profile full` sāk katru izvēles pakalpojumu, izņemot `backup` un `h5p`. Vienu
palaist var ar `docker compose -f docker/compose.yaml --profile scan up -d`.
Bez izvēles pakalpojuma Quire joprojām darbojas un saka, kā trūkst: bez
skenētāja augšupielādes tiek glabātas neskenētas, un administrators tiek
informēts; bez Gotenberg faili piedāvā lejupielādi nevis priekšskatījumu; bez
pārveidotāja video atskaņojas kā oriģinālais fails.

Katrs trešās puses attēls un tā licences saistības ir uzskaitītas failā
`docker/third-party-containers.yaml`.

### H5P pakalpojuma sniedzēja pievienošana <!--quire:connecting-an-h5p-provider-->

Quire neievieto un neizplata H5P izpildlaiku vai sānu procesu (ADR 0019). Ja
izmantojat H5P, nodrošiniet savu mitināto abonementu vai darbiniet savu
pašmitināto H5P instanci atsevišķi no Quire. Reģistrējiet to pakalpojumu
sniedzēju kā ārējo LTI 1.3 rīku un pievienojiet tā saturu kursiem kā rīka
nodarbības. Quire apmainās ar atzīmēm un nodarbību/vērtēšanas progresu caur LTI
Assignment and Grade Services (AGS). Ja pakalpojums sniedzējs arī sūta xAPI
paziņojumus, konfigurējiet to atsevišķi Quire xAPI paziņojumu glabātuvei; AGS
atzīmju/progresu apmaiņa nesūta xAPI paziņojumus. Moodle importi ziņo, ka H5P
nodarbībām vajag LTI rīka savienojumu. Pakalpojuma sniedzējs joprojām ir
atbildīgs par savu H5P izpildlaiku, autorēšanu, satura banku un mēģinājumu
vēsturi.

Lai uz šī servera palaistu savu pašmitināto instanci, iestatiet
`QUIRE_H5P_IMAGE` uz tās attēlu un ieslēdziet profilu `h5p`. Compose to publicē
uz `QUIRE_H5P_PORT` (8090) un glabā tā datus `h5p-data` sējumā; attēls un tā
saistības paliek jūsu.

## Iestatījumi <!--quire:settings-->

Katrs process lasa `docker/.env`. Veidne `docker/.env.example` uzskaita katru
iestatījumu ar tā noklusējumu. Grupas:

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

| Iestatījums | Nozīme |
| --- | --- |
| `QUIRE_APP_ORIGIN` | LMS publiskā adrese, piemēram, `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Satura izcelsme, cits saimnieks |
| `QUIRE_PLATFORM_DOMAINS` | Domēni, zem kuriem dzīvo organizācijas, atdalīti ar komatiem |
| `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` | Šeit `compose`. Par `vercel` un `cloudflare` skat. citos ceļvežos |
| `QUIRE_TRUSTED_PROXY_CIDRS` | Starpniekserverji, kuru `X-Forwarded-For` tic |

### Noslēpumi <!--quire:secrets-->

| Iestatījums | Nozīme |
| --- | --- |
| `QUIRE_SECRET_KEY` | Paraksta sesijas un žetonus. 64 heksadecimālas rakstzīmes |
| `QUIRE_MASTER_KEY` | Ietīj saglabātos akreditācijas datus, piemēram, SSO un tīmekļa āķu noslēpumus. 32 baiti, base64. Tīmekļa slānim un darbinīkam jābūt ar vienādu vērtību. Maiņa: [key-rotation.md](/lv/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Galvenās atslēgas versijas etiķete, `v1`, ja nav iestatīts. Palieliniet to, kad maināt |
| `QUIRE_MASTER_KEY_RETIRED` | Iepriekšējās galvenās atslēgas, kas vēl vajadzīgas, lai lasītu to noslēgto, kā `v1=<base64>`. Noņemiet pēc maiņas pabeigšanas bez nekā neatrisināta |
| `QUIRE_COLLAB_SIGNING_KEY` | Koplieto web un collab, lai parakstītu rediģēšanas žetonus |
| `QUIRE_BACKUP_SIGNING_KEY` | Paraksta kursu dublējumus (izvēles) |

Saglabājiet `QUIRE_MASTER_KEY` kopiju kaut kur citur ārpus šī servera. Datubāze, kas
atjaunota bez tā, nevar atsifrēt tajā esošos akreditācijas datus.

### Datubāze <!--quire:database-->

| Iestatījums | Nozīme |
| --- | --- |
| `POSTGRES_PASSWORD` | Superlietotājs, ko izmanto konteiners un dublējumi |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | Lomu paroles, iestatītas pirmajā startēšanā |
| `DATABASE_URL` | Lietojumprogrammas loma. Rindu līmeņa drošība attiecas uz katru tās vaicājumu |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | Migrētāja loma `migrate` un `init` |
| `QUIRE_SUPERUSER_URL` | Izmanto tikai pirmais starts |
| `QUIRE_REPORT_DATABASE_URL` | Tikai lasāmā atskaišu loma atskaitēm un atskaišu veidotājam |
| `QUIRE_AUDIT_DATABASE_URL` | Audita loma audita konsolei un SIEM eksportam |
| `QUIRE_DATABASE_ID` | Jebkurš UUID, fiksēts visas instalācijas mūžam |

Lomu paroles tiek piemērotas tikai tad, kad datubāzes sējums tiek izveidots
pirmo reizi. Lai vēlāk kādu mainītu, lietojiet `ALTER ROLE` un pēc tam
atjauniniet atbilstošo URL.

`QUIRE_REPORT_DATABASE_URL` tiek izmantots fiziskajai datubāzei, ko nosaka
`DATABASE_URL`. Jebkurai citai reģistrētai fiziskai datubāzei iestatiet tās pašas
`quire_report` savienojuma URL web un darbinīka vidē, pēc tam ielieciet
mainīgā nosaukumu tās datubāzes **Atskaišu vides mainīgā** laukā kā `env:NAME`.
Atsaucei jārāda uz to pašu datubāzi kā tās lietotnes savienojumam, vēlams, tās
lasīšanas replikai. Katra atskaišu virsma seko nomniekam uz tās pašas datubāzes
atskaišu savienojumu: atskaišu veidotājs un saglabātās atskaites, plānotās
piegādes, atskaišu eksporti, analītika, audita žurnāls, REST audita resursi un
palīga audita meklēšana. Neviena no tām nekad neaizņem citas datubāzes atskaišu
URL. Kad datubāzei nav atskaišu savienojuma, parastās atskaites darbojas uz tās
pašas datubāzes lietotnes savienojuma, bet analītika un katra audita lasīšana
atsakās un to saka, jo lietojumprogrammas loma nevar lasīt izsekojamības ķēdi.

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

| Iestatījums | Šī versija | Piezīmes |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (noklusējums), `s3` vai `azure` | `local` glabā failus `files` sējumā. `s3` aptver AWS S3, R2, GCS savietojamību un citas S3 saderīgas glabātuves ar atsākjamām daļskaitļa augšupielādēm |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (noklusējums), `sse`, `centrifugo` vai `durable_objects` | `inprocess` der vienam web konteineram; izmantojiet `centrifugo` vai `sse`, kad to ir vairāki |
| `QUIRE_CACHE_DRIVER` | `memory` (noklusējums), `postgres` vai `valkey` | `memory` ir katram procesam; izmantojiet `valkey` vai `postgres`, lai ātruma ierobežojumi turētos starp konteineriem |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (noklusējums) vai `progressive_mp4` | Vai mitināts pakalpojums sniedzējs: Cloudflare Stream, Mux vai Bunny, ar to atslēgām |
| `QUIRE_IMAGE_DRIVER` | `noop` (noklusējums), `imgproxy` vai `cloudflare` | `noop` apkalpo katru attēlu tā oriģinālajā izmērā. `imgproxy` vajag profilu `images` un zemākos iestatījumus; `cloudflare` izmanto Cloudflare Images |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` vai `in_process` | Platformas noklusējums tiešraides sesijām. Ja nav iestatīts, tiešraides sesijas saka, ka nav konfigurētas, līdz organizācija pieslēdz savu kontu sadaļā Integrācijas, Tiešraides sesiju pakalpojuma sniedzējs. Organizācijas paša konts vienmēr uzvar šo vērtību. Katra pakalpojuma sniedzēja pašie iestatījumi (`BBB_URL` un `BBB_SECRET`, `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*` un `JITSI_*` mainīgie) tiek lasīti tikai šeit nosauktajam pakalpojumam |
| `QUIRE_MEETING_REGIONS` | Saraksts ar `eu`, `uk`, `us`, atdalīti ar komatiem | Kur platformas noklusētā pakalpojuma sniedzējs apstrādā sapulces. Ja nav iestatīts, tas netiek pārbaudīts pret organizāciju, kas piesaistīta reģionam, tāpat kā iepriekš. Organizācijas paša konts savus reģionus norāda savā lapā |

Draivera vērtība, ko šī versija neietver, tiek noraidīta, kad tīmekļa slānis
sākas, nosaucot iestatījumu, nevis klusībā aizstājot ar noklusējumu.

### Attēli <!--quire:images-->

Lapas pieprasa attēlus četros fiksētos izmēros caur
`/api/files/{id}/image/{size}`, kas pārbauda to pašu piekļuvi kā pats fails un
pēc tam novirza uz attēlu pakalpojumu. Katra organizācija stundā drīkst pieprasīt
`QUIRE_IMAGE_SPECS_PER_HOUR` (noklusējums 2000) jaunus attēlu un izmēra pārus;
tajā stundā jau izveidotie izmēri neskaitās. Izmantojiet `valkey` vai `postgres`
`QUIRE_CACHE_DRIVER` ar vairāk nekā vienu web konteineru, lai limits turētos
starp tiem.

| Iestatījums | Draivers | Piezīmes |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Adrese, pa kuru pārlūki sasniedz imgproxy, piemēram, `https://images.example.org`. Profils `images` to publicē uz `QUIRE_IMAGES_PORT` (8082) |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | Heksadecimālas virknes, tās pašas vērtības, ar kurām imgproxy tiek palaists. Katru ģenerējiet ar `openssl rand -hex 32`. Quire ar tām paraksta katru attēla adresi, tāpēc imgproxy nerenderē neko, ko Quire nav pieprasījis |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | `imgproxy` ar vietējo krātuvi | No kurienes imgproxy saņem oriģinālus. Compose iestata `http://web:3000`. Ar `s3` vai `azure` krātuvi imgproxy saņem no spaiņa, un to neizmanto |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | API žetons ar Images rediģēšanas atļauju un konta maiņas kods no sadaļas Images, Izstrādātāja resursi. Ieslēdziet kontam elastīgos variantus |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | Izvēles. Kad iestatīts, attēli ir privāti un katra adrese ir parakstīta un beidzas. Bez tā attēli ir publiski adresēs, kas izvestas no `QUIRE_SECRET_KEY` un kuras neviens nevar uzminēt |

Cloudflare Images glabā savu katru kopiju oriģinālam, ko tas apkalpo. Kad fails
tiek izdzēsts, darbinīks vispirms izdzēš šo kopiju un pēc tam oriģinālu.

### Rinda <!--quire:queue-->

Fona darbi izmanto pg-boss tai pašā Postgres datubāzē, tāpēc nav neviena
rindas pakalpojuma, kas jāpalaiž, un nekas, kas jākonfigurē. Darbi tiek likti
rindā tajā pašā darījumā, kas izraisīja izmaiņu, tāpēc avārija nevar zaudēt
vienu vai nosūtīt divreiz. `QUIRE_QUEUE_DRIVER` šeit ir `pgboss`, tā noklusējums;
`vercel` un `cloudflare` pārvieto tikai vieglos paziņojumu un tīmekļa āķu
piegādes uz platformas pašu rindu, un Vercel un Cloudflare ceļvedī tās ir
aprakstītas un to, kā to tīmekļa slāņi liek rindā.

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

Iestatiet vienu no:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: JSON objekts, kas nosauc HTTP pakalpojuma
  sniedzēju un tā akreditācijas datus, piemēram,
  `{"provider":"postmark","token":"..."}`. Atbalstīti Postmark, Amazon SES,
  Mailgun, SendGrid un Resend.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. Tikai šim mērķim;
  bezservera mērķi SMTP bloķē.

`QUIRE_MAIL_FROM` ir sūtītājs. Lai izmēģinātu Quire, ieslēdziet profilu
`devmail`, iestatiet `QUIRE_SMTP_URL=smtp://mailpit:1025` un lasiet pastu
vietnē `http://localhost:8025`.

### Izvēles pakalpojumi <!--quire:optional-services-->

| Iestatījums | Ar profilu |
| --- | --- |
| `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` vai `QUIRE_MEILISEARCH_URL` | Ārējā meklēšana; citādi Postgres pilnteksta meklēšana |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Paroles noplūdes pārbaude. Pēc noklusējuma ieslēgta pret `api.pwnedpasswords.com` (tiek nosūtīts tikai piecu rakstzīmju hash prefikss); `off` to izslēdz, un URL norāda uz pašu mitinātu diapazona API |

### Novērojamība <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` nosauc vācēju, kuram katrs process sūta izsekošanas
ierakstus un metrikas; ar profilu `observability` tas ir `http://otelcol:4318`,
un `docker/otel-collector.yaml` ir vieta, kur pievienot eksportētāju savam
aizmugurei. Tīmekļa slānis, darbinīks, plānotājs, satura un collab procesi, kad
tas ir iestatīts, eksportē posmus pār OTLP/HTTP (tīmekļa pieprasījumi, nomnieku
datubāžu darījumi, darbinīka darbi un izejošie izsaukumi) un metrikas uz to pašu
punktu ik pēc minūtes (`OTEL_METRICS_EXPORTER=none` tos izslēdz).
`OTEL_TRACES_SAMPLER_ARG` nosaka izsekojumu daļu, ko patur. Žurnāli iet uz
standarta izvadi ar `LOG_LEVEL`, un Compose tos apgriež. Izsekojumi nekad nes
personas datus.

### Reģionālā izeja (ES datu atrašanās vieta) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` norāda, ka kopklase apkalpo Eiropas Savienības organizācijas.
Darbinīks tad katrai organizācijai, kas piesaistīta ES, izejošo pieprasījumu
ierobežo ar atļauto sarakstu (21-compliance.md 8.1. sadaļa). Atļauto sarakstu
veido tie saimnieki, ko konfigurētie pakalpojumi paziņo šim reģionam (glabātuves
punkts, e-pasta pakalpojums, mitināts video pakalpojums, pašas organizācijas
glabātuves mērķi, mākslīgā intelekta pakalpojumi un e-pasta konts), jebkura
pakalpojuma saimnieki zem aktīvas atkāpes un tie saimnieki, ko uzskaitāt vietnē
`QUIRE_EGRESS_ALLOW_HOSTS`. Pieprasījums jebkuram citam publiskam saimniekam
tiek noraidīts pirms nosūtīšanas, noraidījums tiek ierakstītas organizācijas
izsekojamības ķēdī kā `privacy/egress_refused`, un tas ir uzskaitīts sadaļā
Atbilstība, Datu atrašanās vieta.

| Iestatījums | Vērtības | Efekts |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Saraksts ar saimnieku nosaukumiem, atdalītiem ar komatiem, vai `*.example.org` katram apakšdomēnam | Papildu saimnieki, kurus ES organizācija drīkst sasniegt. Tīmekļa āķu, xAPI un SIEM gala punkti, emuāru barotnes un Amazon SES saimnieki pieder šeit, jo tie ir pašas organizācijas izvēle un neviens pakalpojums tos nepaziņo. Apgrieztā adrese, privātās adreses un vienzīmju nosaukumi, piemēram, `web` vai `clamav`, ir jūsu pašu tīkls un nekad netiek pārbaudīti |

UK un ASV organizācijas nav ierobežotas ar saimnieku sarakstu; tās patur
pakalpojuma reģiona pārbaudes. Sarakstu iestatiet darbinīkā; admin lapa to lasa
tīmekļa slānī, lai parādītu atļauto sarakstu, tāpēc ielieciet to `docker/.env`,
ko lasa katrs pakalpojums.

Lietojumprogrammas pārbaude dod skaidru kļūdu un audita ierakstu, un tā nav
garantija: kods var būt nepareizs. Garantija ir tīkls. Compose to jūsu vietā
nespēj ieviest. Reģionālai kopklasei ielieciet `worker` un `web` pakalpojumus
uz `internal: true` tīkla, kura vienīgais izejas maršruts ir izejas
starpniekserveris (piemēram, Squid vai tinyproxy konteiners), kas ļauj tos pašus
saimniekus kā `QUIRE_EGRESS_ALLOW_HOSTS` plus jūsu konfigurēto pakalpojumu
saimniekus, un tiem pakalpojumiem iestatiet `HTTPS_PROXY`. Atrašanās vietas lapa
uzskaita precīzos saimniekus, kurus atļauj lietotne, lai abus sarakstus varētu
salīdzināt.

## Veselība <!--quire:health-->

| Gala punkts | Nozīme |
| --- | --- |
| `/healthz` | Dzīvotne: process atbild. Compose veselības pārbaudes izmanto šo |
| `/readyz` | Gatavība: atkarības ir sasniedzamas, un katrs izvēles pakalpojums ir ziņojis, vai tas ir konfigurēts. Norādiet šeit savu slodzes līdzsvarotāju |

`docker compose -f docker/compose.yaml ps` rāda katra pakalpojuma veselību.

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

`proxy` pakalpojums (Caddy, Apache-2.0, `docker/caddy/Caddyfile`) ir noklusētās
kopklases sastāvdaļa. Tas atbild portos 80 un 443 un maršrutē:

| Saimnieks vai ceļš | Kur ved |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, katrs nomnieka apakšdomēns un pielāgotais domēns | `web` |
| `/_collab/` uz šiem saimniekiem | `collab` (websocket, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` uz šiem saimniekiem | `centrifugo` klienta websocket; tā servera API nekad netiek atvērts |
| `/_images/` uz šiem saimniekiem | `imgproxy` ar profilu `images` (`IMGPROXY_URL`) |

`init-env.sh` izved `QUIRE_PROXY_APP_HOST`, `QUIRE_PROXY_CONTENT_HOST`,
`QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` un `IMGPROXY_URL` no abām
izcelsmēm, lai tās nevarētu aiziet prom citā virzienā. Mainiet tās kopā, ja
kādu izcelsmi maināt ar roku.

Sertifikāti seko `QUIRE_PROXY_TLS`:

- `internal` (noklusējums): Caddy paša sertifikācijas iestāde `localhost`,
  `*.localhost` un `lvh.me`. Uzticieties tās saknei vienreiz un pēc tam
  pārlūkojiet:

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

  Pievienojiet `quire-local-ca.crt` sistēmas vai pārlūka uzticamo sarakstu.
  `curl` to pieņem ar `--cacert`.
- E-pasta adrese: automātiski ACME sertifikāti (Let's Encrypt, pēc tam ZeroSSL)
  īstiem saimnieku nosaukumiem. Abu izcelsmju un katra nomnieka saimnieka DNS
  jānorāda šeit, un portiem 80 un 443 jābūt sasniedzamiem no interneta.

Nomnieku saimnieki tiek izsniegi pēc pieprasījuma, pirmajā apmeklējumā, un tikai
tad, kad web apstiprina, ka vārds pieder šai instalācijai (`/tls-allowed`,
vaicāts Compose tīklā). Nav vajadzīgs nekāds aizstājējsertifikāts ne DNS
pakalpojuma sniedzēja spraudnis, un svešinieks, kas norāda vārdu uz serveri, nevar
panākt, lai tas pieprasītu sertifikātus. Sertifikāti un vietējā iestāde dzīvo
`caddy-data` sējumā; dublējiet to kopā ar pārējo, ja izmantojat `internal`.

Web tic tikai `X-Forwarded-For` no proxy: proxy ir fiksēta adrese
(`QUIRE_PROXY_ADDRESS`, noklusējums `172.29.64.10`) uz fiksēta apakštīkla
(`QUIRE_COMPOSE_SUBNET`), un `QUIRE_TRUSTED_PROXY_CIDRS` nosauc šo adresi. Ja
apakštīkls saduras ar tīklu uz servera, mainiet abus un palaidiet
`docker compose down` pirms `up`.

## Aiz sava apgrieztā starpniekservera <!--quire:behind-your-own-reverse-proxy-->

Lai izmantotu slodzes līdzsvarotāju vai starpniekserveri, ko jau darbināt, tā
vietā, izlaidiet `proxy` (`docker compose up -d --scale proxy=0`) un pārtrauciet
TLS priekšā `web` (8080), `content` (8081), `collab` (1234, websocket) un
`centrifugo` (8000, websocket). Iestatiet publiskās adreses `QUIRE_APP_ORIGIN`,
`QUIRE_CONTENT_ORIGIN` un `QUIRE_COLLAB_URL` (`wss://`) un sava starpniekservera
adresu diapazonu `QUIRE_TRUSTED_PROXY_CIDRS`.

## Problēmu novēršana <!--quire:troubleshooting-->

- `init` iziet ar "QUIRE_DATABASE_ID is not a UUID": iestatiet to ar `uuidgen`.
- `web` startās no jauna ar "did not start on compose": žurnāls uzskaita katru
  iestatījumu, ko tas nevar ievērot, un ko lietot tā vietā.
- Lomu paroles maiņa `.env` pēc pirmās startēšanās neko nedara: init skripts
  darbojas vienreiz. Lietojiet `ALTER ROLE`.
- Augšupielādes neizdodas ar skenēšanas kļūdu, kamēr `CLAMAV_URL` ir
  iestatīts: ClamAV lejupielādē savus parakstus pirmajā startēšanā, kas aizņem
  dažas minūtes.

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