---
title: "Instalacija Quirea pomoću Docker Composea"
description: "Instalirajte Quire na vlastitoj infrastrukturi pomoću Docker Composea."
image: "https://docs.quirelms.com/og.png"
---

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

# Instalacija Quirea pomoću Docker Composea

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

Ovo je cijeli proizvod na jednom poslužitelju: LMS, pozadinska obrada,
usluge za rad u stvarnom vremenu i zajedničko uređivanje te sve neobavezne
usluge koje se pokreću putem profila. Dizajn je opisan u odjeljku 2 dokumenta
`docs/architecture/23-ops.md`.

Ostala odredišta: [Vercel](/hr/ops/vercel/) i [Cloudflare Workers](/hr/ops/cloudflare/)
pokreću samo web sloj. Nadogradnje su opisane u [upgrade.md](/hr/ops/upgrade/), a
sigurnosne kopije i proba vraćanja u [backup-restore.md](/hr/ops/backup-restore/).

## Što vam je potrebno <!--quire:what-you-need-->

- Docker Engine 27 ili noviji s dodatkom Compose 2.30 ili novijim.
- Četiri procesorske jezgre i 8 GB memorije za zadani skup usluga; 8 jezgri i
  16 GB uz `--profile full` (ClamAV sam zauzima oko 1,5 GB za potpise).
- DNS naziv za web sloj i drugi za nepouzdani sadržaj. Moraju biti na
  različitim domaćinima: paketi SCORM i preneseni HTML pokreću se na izvornom
  poslužitelju sadržaja kako nikad ne bi mogli čitati kolačiće LMS-a.
- Za lokalno testiranje, `lvh.me` i `*.localhost` razrješavaju se na
  127.0.0.1, kako je postavljeno u `docker/.env.example`. Vlastita usluga
  skupa `proxy` poslužuje oba naziva putem HTTPS-a s lokalnim izdavateljem
  certifikata, pa se ništa drugo ne mora instalirati (pogledajte „TLS”).
- Slobodni portovi 80 i 443 na poslužitelju (`QUIRE_PROXY_HTTP_PORT` i
  `QUIRE_PROXY_HTTPS_PORT` mijenjaju ih).

## Prvo pokretanje <!--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` stvara `docker/.env` iz datoteke
`docker/.env.example`, generira sve tajne (lozinke baza podataka, ključeve za
potpisivanje i glavni ključ te par ključeva za pokretanje sadržaja) i zapisuje
ključ za potpisivanje kontrolne točke nadzora u
`docker/secrets/audit-signing-key.pem`. Compose tu datoteku priključuje
radnicima kao tajnu. Potrebni su samo `sh`, `awk` i `openssl`, a postojeću
datoteku `docker/.env` odbija prebrisati. Obje datoteke kopirajte izvan
poslužitelja: bez `QUIRE_MASTER_KEY` vraćena baza ne može dešifrirati
pohranjene vjerodajnice. Ako datoteku želite popuniti ručno, pokrenite
`cp docker/.env.example docker/.env`; u datoteci je objašnjeno kako generirati
svaku tajnu.

Oba izvora moraju koristiti `https`: usluga sadržaja u produkciji odbija obični
HTTP, a izvori ne smiju dijeliti registrabilnu domenu. Usluga `proxy` završava
TLS vezu za oba (pogledajte „TLS”); `init-env.sh` odbija izvor s prefiksom
`http://`.

Skup usluga pokreće se utvrđenim redoslijedom, a svaki korak čeka prethodni:

1. `postgres` postaje zdrav. Pri prvom pokretanju njegova inicijalizacijska
   skripta (`docker/postgres/init/90-passwords.sh`) postavlja lozinke četiriju
   uloga.
2. `migrate` primjenjuje sve migracije i postavlja red poslova u upravljačkoj
   bazi i u svakoj namjenskoj bazi klijenta, provjerava podudaraju li se, pa se
   gasi (docs/ops/upgrade.md). Migracije se pokreću pri svakom pokretanju i
   idempotentne su, pa se nadogradnja svodi na novu sliku i ponovno pokretanje.
3. `init` (`apps/web/src/first-run.ts`) bilježi bazu aplikacije pod nazivom
   `QUIRE_DATABASE_ID` te, ako je postavljeno `QUIRE_SETUP_ADMIN_EMAIL`, stvara
   prvu organizaciju i njezina administratora. Adresa za prijavu i generirana
   lozinka ispisuju se samo jednom u izlazu naredbe `docker compose logs init`.
4. Pokreću se `web`, `content`, `worker`, `scheduler`, `collab` i `centrifugo`.
5. `proxy` se pokreće kad `web` i `content` postanu zdravi.

Otvorite `https://demo.` iza čega slijedi domena aplikacije (zapis `init`
ispisuje točnu adresu za prijavu) i prijavite se. Na lokalnoj instalaciji
najprije vjerujte izdavatelju certifikata posrednika (pogledajte „TLS”).
Promijenite generiranu lozinku na `/account/security`.

Proces koji se pokrene bez obavezne tajne odbija rad i u zapis navodi
nedostajuću postavku. Ništa se ne pokreće s nepotpunom konfiguracijom.

## Usluge i profili <!--quire:services-and-profiles-->

| Usluga | Profil | Namjena |
| --- | --- | --- |
| postgres | uvijek | Baza podataka (PostgreSQL 18 s pgvectorom, izgrađen iz `docker/postgres.Dockerfile`), s arhiviranjem WAL-a od prvog pokretanja |
| migrate, init | uvijek | Jednokratni zadaci: migracije, zatim prvo pokretanje |
| web | uvijek | LMS na `QUIRE_HTTP_PORT` (8080) |
| content | uvijek | Izvor nepouzdanog sadržaja na `QUIRE_CONTENT_PORT` (8081) |
| worker | uvijek | Pozadinski poslovi: e-pošta, izvješća, obrada datoteka i web-dojavnici |
| scheduler | uvijek | Ponavljajući poslovi: registrira 64 rasporeda tijekom rada i predaje ih radniku; u svakom je trenutku samo jedan vodeći |
| collab | uvijek | WebSocket za zajedničko uređivanje na `QUIRE_COLLAB_HTTP_PORT` (1234) |
| centrifugo | uvijek | Distribucija događaja u stvarnom vremenu na `QUIRE_REALTIME_PORT` (8000) |
| proxy | uvijek | Caddy, TLS ulazna točka na portovima 80 i 443 (pogledajte „TLS”) |
| valkey | `cache` | Predmemorija i ograničavanje učestalosti zahtjeva |
| clamav | `scan` | Skeniranje prenesenih datoteka na zlonamjerni softver |
| gotenberg | `preview` | Pretpregledi uredskih datoteka u PDF-u i prikaz certifikata |
| imgproxy | `images` | Promjena veličine i pretvaranje slika |
| transcoder | `video` | Slika radnika s ffmpegom isključivo uz LGPL za pretvorbu videozapisa |
| seaweedfs | `storage` | Pohrana objekata kompatibilna sa S3 na ovom poslužitelju |
| otelcol | `observability` | Sakupljač OpenTelemetry podataka |
| mailpit | `devmail` | Hvata svu odlaznu poštu za isprobavanje Quirea |
| backup | `backup` | Jednokratna osnovna sigurnosna kopija; pogledajte backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | Osnovna sigurnosna kopija svakih `QUIRE_BACKUP_INTERVAL_HOURS` i šifrirane kopije izvan poslužitelja uz tjednu probu provjere |
| h5p | `h5p` | Slika alata H5P LTI 1.3 koju sami osiguravate u `QUIRE_H5P_IMAGE`, na `QUIRE_H5P_PORT` (8090); pogledajte „Povezivanje pružatelja H5P-a” |

`--profile full` pokreće sve neobavezne usluge osim `backup` i `h5p`.
Pojedinu pokrenite naredbom `docker compose -f docker/compose.yaml --profile scan up -d`.
Quire radi i bez neobaveznih usluga te navodi što nedostaje: bez skenera se
prenesene datoteke pohranjuju bez skeniranja, a administrator dobiva obavijest;
bez Gotenberga datoteke se mogu preuzeti umjesto da se prikaže pretpregled; bez
pretvarača video se reproducira kao izvorna datoteka.

Sve slike trećih strana i pripadajuće obveze licenciranja navedene su u
`docker/third-party-containers.yaml`.

### Povezivanje pružatelja H5P-a <!--quire:connecting-an-h5p-provider-->

Quire ne ugrađuje niti isporučuje izvršno okruženje ili pomoćni proces H5P-a
(ADR 0019). Ako koristite H5P, sami osigurajte hostiranu pretplatu ili
upravljajte vlastitom, odvojeno hostiranom instancom H5P-a. Registrirajte
pružatelja kao vanjski alat LTI 1.3 i dodajte njegov sadržaj kolegijima kao
aktivnosti alata. Quire razmjenjuje ocjene te napredak aktivnosti i ocjenjivanja
kroz LTI Assignment and Grade Services (AGS). Ako pružatelj šalje i iskaze
xAPI-ja, zasebno ga konfigurirajte za Quireovo spremište iskaza xAPI-ja;
razmjena ocjena i napretka putem AGS-a ne šalje iskaze xAPI-ja. Uvozi iz
Moodla prikazuju aktivnosti H5P-a kao one kojima je potrebna veza s alatom
LTI. Pružatelj je i dalje odgovoran za izvršno okruženje H5P-a, izradu sadržaja,
bazu sadržaja i povijest pokušaja.

Da biste vlastitu instancu hostirali na ovom poslužitelju, postavite
`QUIRE_H5P_IMAGE` na njezinu sliku i pokrenite profil `h5p`. Compose je
objavljuje na `QUIRE_H5P_PORT` (8090), a podatke čuva u volumenu `h5p-data`;
slika i sve povezane obveze ostaju vaša odgovornost.

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

Svaki proces čita `docker/.env`. Predložak `docker/.env.example` navodi svaku
postavku sa zadanom vrijednošću. Skupine su:

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

| Postavka | Značenje |
| --- | --- |
| `QUIRE_APP_ORIGIN` | Javna adresa LMS-a, primjerice `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Izvor sadržaja na drugom domaćinu |
| `QUIRE_PLATFORM_DOMAINS` | Domene pod kojima se nalaze organizacije, odvojene zarezima |
| `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` | Ovdje `compose`. U ostalim vodičima pogledajte `vercel` i `cloudflare` |
| `QUIRE_TRUSTED_PROXY_CIDRS` | Posrednički poslužitelji čijem se zaglavlju `X-Forwarded-For` vjeruje |

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

| Postavka | Značenje |
| --- | --- |
| `QUIRE_SECRET_KEY` | Potpisuje sesije i tokene. 64 heksadekadska znaka |
| `QUIRE_MASTER_KEY` | Omata pohranjene vjerodajnice, primjerice tajne SSO-a i web-dojavnika. 32 bajta u base64 kodiranju. Web sloj i radnik trebaju istu vrijednost. Rotacija: [key-rotation.md](/hr/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Oznaka verzije glavnog ključa; `v1` ako nije postavljena. Povećajte je pri rotaciji |
| `QUIRE_MASTER_KEY_RETIRED` | Stariji glavni ključevi potrebni za čitanje vrijednosti koje su omotali, u obliku `v1=<base64>`. Uklonite ih nakon završetka rotacije bez nerazriješenih stavki |
| `QUIRE_COLLAB_SIGNING_KEY` | Web i collab dijele ga za potpisivanje tokena za uređivanje |
| `QUIRE_BACKUP_SIGNING_KEY` | Potpisuje sigurnosne kopije kolegija (neobavezno) |

Sačuvajte kopiju `QUIRE_MASTER_KEY` izvan ovog poslužitelja. Vraćena baza bez
njega ne može dešifrirati vjerodajnice koje sadrži.

### Baza podataka <!--quire:database-->

| Postavka | Značenje |
| --- | --- |
| `POSTGRES_PASSWORD` | Lozinka superkorisnika koju koriste spremnik i sigurnosne kopije |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | Lozinke uloga koje se postavljaju pri prvom pokretanju |
| `DATABASE_URL` | Uloga aplikacije. Sigurnost na razini retka primjenjuje se na svaki njezin upit |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | Uloga migratora za `migrate` i `init` |
| `QUIRE_SUPERUSER_URL` | Koristi se samo pri prvom pokretanju |
| `QUIRE_REPORT_DATABASE_URL` | Uloga samo za čitanje izvješća, za izvješća i njihov alat za izradu |
| `QUIRE_AUDIT_DATABASE_URL` | Uloga nadzora za konzolu nadzora i izvoz u SIEM |
| `QUIRE_DATABASE_ID` | Proizvoljan UUID koji ostaje nepromijenjen tijekom cijelog vijeka instalacije |

Lozinke uloga primjenjuju se samo pri prvoj izradi volumena baze podataka.
Želite li ih promijeniti kasnije, upotrijebite `ALTER ROLE`, a zatim
nadogradite odgovarajući URL.

`QUIRE_REPORT_DATABASE_URL` koristi se za fizičku bazu postavljenu u
`DATABASE_URL`. Za svaku drugu registriranu fizičku bazu postavite njezin URL
veze `quire_report` u okruženjima web sloja i radnika, a zatim naziv varijable
upišite u polje **Reporting environment variable** te baze kao `env:NAME`.
Referenca mora pokazivati na istu bazu kao i veza aplikacije, po mogućnosti na
njezinu repliku samo za čitanje. Svaka površina za izvješća prati klijenta do
veze za izvješća vlastite baze: alat za izradu izvješća i spremljena izvješća,
zakazana slanja, izvozi izvješća, analitika, zapis nadzora, resursi nadzora REST
i pretraživanje nadzora pomoćnikom. Nijedna ne koristi URL za izvješća druge
baze. Ako baza nema vezu za izvješća, uobičajena se izvješća izvršavaju preko
vlastite veze aplikacije te baze, dok analitika i sva čitanja nadzora odbijaju
rad i objašnjavaju razlog jer uloga aplikacije ne može čitati trag nadzora.

### Upravljački programi <!--quire:drivers-->

| Postavka | Vrijednosti u ovom izdanju | Napomene |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (zadano), `s3` ili `azure` | `local` čuva datoteke u volumenu `files`. `s3` podržava AWS S3, interoperabilnost s R2 i GCS-om te druga spremišta kompatibilna sa S3 uz višedijelne prijenose koji se mogu nastaviti |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (zadano), `sse`, `centrifugo` ili `durable_objects` | `inprocess` odgovara jednom web-spremniku; uzmite `centrifugo` ili `sse` kad ih ima više |
| `QUIRE_CACHE_DRIVER` | `memory` (zadano), `postgres` ili `valkey` | `memory` vrijedi za pojedini proces; koristite `valkey` ili `postgres` kako bi ograničenja učestalosti vrijedila u svim spremnicima |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (zadano) ili `progressive_mp4` | Ili hostirani pružatelj: Cloudflare Stream, Mux ili Bunny, prema njihovim ključevima |
| `QUIRE_IMAGE_DRIVER` | `noop` (zadano), `imgproxy` ili `cloudflare` | `noop` poslužuje svaku sliku u izvornoj veličini. `imgproxy` zahtijeva profil `images` i donje postavke; `cloudflare` koristi Cloudflare Images |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` ili `in_process` | Zadani pružatelj platforme za sesije uživo. Ako nije postavljen, sesije uživo prikazuju da nisu konfigurirane dok organizacija ne poveže vlastiti račun u Integrations, Live session provider. Račun organizacije uvijek ima prednost. Postavke pojedinog pružatelja (`BBB_URL` i `BBB_SECRET`, varijable `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*` i `JITSI_*`) čitaju se samo za ovdje imenovanog pružatelja |
| `QUIRE_MEETING_REGIONS` | Popis regija `eu`, `uk`, `us` odvojen zarezima | Gdje zadani pružatelj platforme obrađuje sastanke. Ako nije postavljen, ne uspoređuje se s organizacijom prikvačenom na regiju, kao ni dosad. Stranica računa organizacije navodi njegove regije |

Ako ova verzija ne sadrži vrijednost upravljačkog programa, pokretanje web
sloja odbija je i navodi postavku umjesto da je tiho zamijeni zadanom.

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

Stranice traže slike u četiri fiksne veličine putem
`/api/files/{id}/image/{size}`. Ta putanja provjerava isti pristup kao i za
samu datoteku, a zatim preusmjerava na uslugu slika. Svaka organizacija može
zatražiti `QUIRE_IMAGE_SPECS_PER_HOUR` (zadano 2000) novih parova slika i
veličina na sat; veličine već izrađene tijekom tog sata ne računaju se.
Koristite `valkey` ili `postgres` za `QUIRE_CACHE_DRIVER` uz više
web-spremnika kako bi ograničenje vrijedilo u svima.

| Postavka | Upravljački program | Napomene |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Adresa na kojoj preglednici dosežu imgproxy, primjerice `https://images.example.org`. Profil `images` objavljuje ga na `QUIRE_IMAGES_PORT` (8082) |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | Heksadekadski nizovi, jednake vrijednosti s kojima se imgproxy pokreće. Svaki generirajte naredbom `openssl rand -hex 32`. Quire njima potpisuje svaku adresu slike, pa imgproxy ne prikazuje ništa što Quire nije zatražio |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | `imgproxy` s lokalnom pohranom | Odakle imgproxy dohvaća izvornike. Compose postavlja `http://web:3000`. Uz pohranu `s3` ili `azure` imgproxy dohvaća ih iz spremnika i ova se postavka ne koristi |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | API token s ovlastima uređivanja u Images i raspršena vrijednost računa iz Images, Developer resources. Uključite prilagodljive varijante za račun |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | Neobavezno. Kad je postavljen, slike su privatne, a svaka adresa je potpisana i istječe. Bez njega su slike javne na adresama izvedenim iz `QUIRE_SECRET_KEY` koje nitko ne može pogoditi |

Cloudflare Images čuva vlastitu kopiju svakog izvornika koji poslužuje. Kad se
datoteka izbriše, radnik briše tu kopiju prije izvornika.

### Red poslova <!--quire:queue-->

Pozadinski poslovi koriste pg-boss u istoj bazi Postgresa, pa nije potrebno
pokretati zasebnu uslugu reda ni išta konfigurirati. Poslovi se stavljaju u red
u istoj transakciji kao i promjena koja ih je pokrenula, pa rušenje ne može
izgubiti posao ni ga poslati dvaput. Ovdje je `QUIRE_QUEUE_DRIVER` postavljen
na zadanu vrijednost `pgboss`; `vercel` i `cloudflare` premještaju samo lake
obavijesti i isporuke web-dojavnika u vlastiti red platforme. Vodiči za Vercel
i Cloudflare objašnjavaju kako web-slojevi tih platformi stavljaju poslove u
red.

### E-pošta <!--quire:email-->

Postavite jedno od sljedećeg:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: JSON objekt koji navodi HTTP pružatelja i
  njegove vjerodajnice, primjerice `{"provider":"postmark","token":"..."}`.
  Podržani su Postmark, Amazon SES, Mailgun, SendGrid i Resend.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. Ovo odredište podržava tu
  postavku; poslužiteljski odredišni sustavi blokiraju SMTP.

`QUIRE_MAIL_FROM` adresa je pošiljatelja. Da biste isprobali Quire, pokrenite
profil `devmail`, postavite `QUIRE_SMTP_URL=smtp://mailpit:1025` i čitajte
poštu na `http://localhost:8025`.

### Neobavezne usluge <!--quire:optional-services-->

| Postavka | Uz profil |
| --- | --- |
| `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` ili `QUIRE_MEILISEARCH_URL` | Vanjsko pretraživanje; inače se koriste cijeli tekstualni indeksi Postgresa |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Provjera izloženosti lozinki. Prema zadanim postavkama uključena je putem `api.pwnedpasswords.com` (šalje se samo prefiks raspršene vrijednosti od pet znakova); vrijednost `off` isključuje je, a URL pokazuje na API raspona kojim sami upravljate |

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

`OTEL_EXPORTER_OTLP_ENDPOINT` označava sakupljač kojem svaki proces šalje
praćenja i metrike. Uz profil `observability` njegova je vrijednost
`http://otelcol:4318`; u datoteci `docker/otel-collector.yaml` dodaje se
izvoznik za vašu pozadinsku uslugu. Kad je postavljen, web sloj, radnik,
planer, sadržajni poslužitelj i collab izvoze raspona putem OTLP/HTTP-a
(web-zahtjevi, transakcije baza klijenata, poslovi radnika i odlazni pozivi)
te svake minute šalju metrike na istu adresu (`OTEL_METRICS_EXPORTER=none`
isključuje ih). `OTEL_TRACES_SAMPLER_ARG` postavlja udio zadržanih praćenja.
Zapisi se ispisuju na standardni izlaz na razini `LOG_LEVEL`, a Compose ih
rotira. Praćenja nikad ne sadrže osobne podatke.

### Regionalni izlazni promet (rezidentnost podataka u EU-u) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` znači da skup usluga poslužuje organizacije iz Europske
unije. Radnik tada sva odlazna usmjerenja za organizaciju prikvačenu na EU
ograničava popisom dopuštenih odredišta (odjeljak 8.1 dokumenta
21-compliance.md). Popis obuhvaća domaćine koje za regiju navode konfigurirane
usluge (krajnju točku pohrane, pružatelja e-pošte, hostiranog videopružatelja,
ciljeve vlastite pohrane organizacije, pružatelje umjetne inteligencije i
račun e-pošte), domaćine usluga obuhvaćenih aktivnim izuzećem i domaćine koje
navedete u `QUIRE_EGRESS_ALLOW_HOSTS`. Zahtjev prema bilo kojem drugom javnom
domaćinu odbija se prije slanja, odbijanje se bilježi u tragu nadzora
organizacije kao `privacy/egress_refused`, a domaćin se prikazuje u odjeljku
Compliance, Data residency.

| Postavka | Vrijednosti | Učinak |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Popis naziva domaćina odvojenih zarezima ili `*.example.org` za sve poddomene | Dodatni domaćini dostupni organizacijama iz EU-a. Ovdje pripadaju krajnje točke web-dojavnika, xAPI-ja i SIEM-a, izvori članaka te domaćini Amazon SES-a jer su to odabiri same organizacije, a nijedna usluga ih ne navodi. Povratne, privatne i jednokomponentne adrese kao što su `web` ili `clamav` pripadaju vašoj mreži i nikad se ne provjeravaju |

Organizacije iz UK-a i SAD-a ne ograničavaju se popisom domaćina; za njih i
dalje vrijede provjere regije usluge. Popis postavite radniku, a stranica
administracije čita ga u web-sloju radi prikaza dopuštenih odredišta, pa ga
upišite u `docker/.env`, koji čitaju sve usluge.

Provjera aplikacije daje jasnu pogrešku i zapis nadzora, ali nije jamstvo:
kod može biti pogrešan. Jamstvo pruža mreža, a Compose ga ne provodi umjesto
vas. Za regionalni skup povežite usluge `worker` i `web` s mrežom `internal:
true` kojoj je jedina izlazna ruta posrednički poslužitelj za izlazni promet
(primjerice spremnik Squid ili tinyproxy) koji dopušta iste domaćine kao
`QUIRE_EGRESS_ALLOW_HOSTS`, uz domaćine konfiguriranih usluga, i postavite
`HTTPS_PROXY` za te usluge. Stranica rezidentnosti navodi točne domaćine koje
aplikacija dopušta, pa možete usporediti oba popisa.

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

| Krajnja točka | Značenje |
| --- | --- |
| `/healthz` | Živost: proces odgovara. To se koristi pri provjerama zdravlja Composea |
| `/readyz` | Spremnost: ovisnosti su dostupne, a za svaku neobaveznu uslugu navodi se je li konfigurirana. Ovdje usmjerite uravnoteživač opterećenja |

`docker compose -f docker/compose.yaml ps` prikazuje stanje svake usluge.

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

Usluga `proxy` (Caddy, licenca Apache-2.0, `docker/caddy/Caddyfile`) dio je
zadane konfiguracije. Odgovara na portovima 80 i 443 te usmjerava:

| Domaćin ili putanja | Odredište |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, svaka poddomena klijenta i prilagođena domena | `web` |
| `/_collab/` na tim domaćinima | `collab` (WebSocket, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` na tim domaćinima | WebSocket klijenta za `centrifugo`; API poslužitelja nikad se ne izlaže |
| `/_images/` na tim domaćinima | `imgproxy`, uz profil `images` (`IMGPROXY_URL`) |

`init-env.sh` izvodi `QUIRE_PROXY_APP_HOST`, `QUIRE_PROXY_CONTENT_HOST`,
`QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` i `IMGPROXY_URL` iz obaju izvora
kako se njihove vrijednosti ne bi razišle. Ako ručno promijenite izvor,
uređujte ih zajedno.

Certifikati ovise o `QUIRE_PROXY_TLS`:

- `internal` (zadano): vlastiti izdavatelj certifikata Caddyja za `localhost`,
  `*.localhost` i `lvh.me`. Jednom vjerujte njegovom korijenskom certifikatu,
  a zatim otvorite:

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

  Dodajte `quire-local-ca.crt` u spremište pouzdanih certifikata sustava ili
  preglednika. `curl` ga koristi putem opcije `--cacert`.
- Adresa e-pošte: automatski ACME certifikati (Let's Encrypt, zatim ZeroSSL)
  za stvarne nazive domaćina. DNS za oba izvora i sve domaćine klijenata mora
  pokazivati ovamo, a portovi 80 i 443 moraju biti dostupni s interneta.

Certifikati za domaćine klijenata izdaju se na zahtjev pri prvom posjetu, i to
samo kad web-sloj potvrdi da naziv pripada ovoj instalaciji putem
`/tls-allowed` na mreži Composea. Nije potreban zamjenski certifikat ni dodatak
pružatelja DNS usluge, a neznanac ne može postaviti naziv koji pokazuje na ovaj
poslužitelj i time zatražiti certifikat. Certifikati i lokalni izdavatelj
nalaze se u volumenu `caddy-data`; koristite li `internal`, uključite ga u
sigurnosne kopije.

Web-sloj vjeruje zaglavlju `X-Forwarded-For` samo od posrednika: posrednik ima
fiksnu adresu (`QUIRE_PROXY_ADDRESS`, zadano `172.29.64.10`) u fiksnoj
podmreži (`QUIRE_COMPOSE_SUBNET`), a `QUIRE_TRUSTED_PROXY_CIDRS` navodi tu
adresu. Ako se podmreža preklapa s mrežom na poslužitelju, promijenite obje
postavke, pokrenite `docker compose down`, a zatim `up`.

## Iza vlastitog povratnog posredničkog poslužitelja <!--quire:behind-your-own-reverse-proxy-->

Želite li umjesto toga koristiti postojeći uravnoteživač opterećenja ili
posrednički poslužitelj, izostavite `proxy` (`docker compose up -d --scale proxy=0`)
i završite TLS ispred `web` (8080), `content` (8081), `collab` (1234,
WebSocket) i `centrifugo` (8000, WebSocket). Postavite javne adrese u
`QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN` i `QUIRE_COLLAB_URL` (`wss://`), a
raspon adresa posrednika u `QUIRE_TRUSTED_PROXY_CIDRS`.

## Rješavanje problema <!--quire:troubleshooting-->

- `init` završava uz poruku „QUIRE_DATABASE_ID is not a UUID”: postavite ga
  naredbom `uuidgen`.
- `web` se ponovno pokreće uz poruku „did not start on compose”: zapis navodi
  svaku postavku koju ne može podržati i prikazuje što umjesto nje treba
  koristiti.
- Promjena lozinke uloge u `.env` nakon prvog pokretanja nema učinka:
  inicijalizacijska skripta pokreće se samo jednom. Upotrijebite `ALTER ROLE`.
- Prijenos ne uspijeva zbog pogreške skeniranja dok je postavljen `CLAMAV_URL`:
  ClamAV pri prvom pokretanju preuzima potpise, što traje nekoliko minuta.

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