---
title: "Quire bi Docker Compose sazkirin"
description: "Quire li ser infrastrukturiya xwe bi Docker Compose saz bike."
image: "https://docs.quirelms.com/og.png"
---

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

# Quire bi Docker Compose sazkirin

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

Ev berhevoka tewaf li serverekî ye: LMS, karek paşî, xizmetên dema rastîn û nivîsariya beşdar, û her xizmeteke ikhtîyarî di pey profîlek. Rêşebeciya `docs/architecture/23-ops.md` beş 2 e.

Armancên din: [Vercel](/ku/ops/vercel/) û [Cloudflare Workers](/ku/ops/cloudflare/) tenê navûpa web bixebitînin. Nûvekirin di [upgrade.md](/ku/ops/upgrade/) de, û veparîstin û ceribandina sererastkirinê di [backup-restore.md](/ku/ops/backup-restore/) de.

## Çi te pêwîst e <!--quire:what-you-need-->

- Docker Engine 27 an bilindtr bi plugîna Compose 2.30 an bilindtr.
- 4 hilpîlkera CPU û 8 GB bîranîn ji bo stacka veberî; 8 hilpîlker û 16 GB bi `--profile full` (tenê ClamAV nêzîkî 1.5 GB îşaret dihêle).
- Naveke DNS ji bo navûpa web û yekî din ji bo naveroka bêbawer. Divê serverên cihên bin: pakêtên SCORM û HTMLya hatiye bar kirin di originê naverokê de xebitînin ta nikare kukiyan LMS bixwînin.
- Ji bo ceribandinekî nexweş, `lvh.me` û `*.localhost` biçe 127.0.0.1, ku `docker/.env.example` bikar tîne. Xizmeta `proxy` a stacka xwe herduyan bi https di ser authorityyeke sertîfîkayê nexweş de diêpe, ji ber vê tiştî din ne tê sazkirin (binêre "TLS").
- Portên 80 û 443 vala li ser serverê (`QUIRE_PROXY_HTTP_PORT` û `QUIRE_PROXY_HTTPS_PORT` wan diguherîne).

## Yekemcaran bixebitîn <!--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` `docker/.env` ji `docker/.env.example` ve nivîsî bi her nepûrekî hatiye çêkirin (şîfreyên danegirş, kilîtên qedandin û sereke, geşta kilîta naverok) û kilîta qedandina kontrola denetinê di `docker/secrets/audit-signing-key.pem` de, ku Compose wê wek nepûr di karmeran de girê dike. Tenê `sh`, `awk` û `openssl` pêwîst dike, û `docker/.env` ku hê meye veşarî nake. Herdu dosye ji serverê derke: bê `QUIRE_MASTER_KEY` danegirşek hatiye sererastkirin nikare têketnaverên xwe şifra. Ji bo tijekirina dosyê bi dest, `cp docker/.env.example docker/.env`; dosye dibêje çawa her nepûr tê çêkirin.

Herdu origin divê `https` bin: xizmeta naverokê di productionê de httpyê ada raqûl dike, û divê domainekî îskan parve nekin. Xizmeta `proxy` ji bo herdu TLS tê axtin (binêre "TLS"); `init-env.sh` originekî `http://` raqûl dike.

Stack bi rêzekî sabit dest pê dike, û her gav li yekê berê dîsaikîne:

1. `postgres` dike sag. Gava yekem dest pê dike skrîpta init wê (`docker/postgres/init/90-passwords.sh`) şîfreyên çûar rol mîhaz dike.
2. `migrate` her guhertin tê serbilindkirin û kuya ereng di danegirşa kontrol û her danegirşî tenantê taybet de dest pê dike, çawas dike ka hemû hevççûn in, paş derdike (docs/ops/upgrade.md). Guhertin her destpêkê tên xebitandin û idempotent in, ji ber vê nûvekirinek wêneke nû û destpekveke ye.
3. `init` (`apps/web/src/first-run.ts`) danegirşa nivîsbariyê di `QUIRE_DATABASE_ID` de tomarkî dike û, gava `QUIRE_SETUP_ADMIN_EMAIL` saz bûye, rêxistina yekem û rêvebera wê çêdike. Navnivîsa têketinê û şîreke hatiye çêkirin carekê tê nivîsandin, di `docker compose logs init` de.
4. `web`, `content`, `worker`, `scheduler`, `collab` û `centrifugo` dest pê dikin.
5. `proxy` gava `web` û `content` sag in dest pê dike.

`https://demo.` bi domaina nivîsbariya te re veke (loga `init` navnivîsa têketinê ya rast tê nivîsandin), û têkeve. Li sazkirinekî nexweş, berê authorityyeke sertîfîkayê ya proxy bawer bin (binêre "TLS"). Şîreka hatiye çêkirin di `/account/security` biguherîne.

Prosekek bê nepûrekî pêwîst dest pê dike raqûl dike û mîhazê ku kêm e di loga xwe de navdide. Tiştek bi nîv mîhaz dest pê nake.

## Xizmet û profîl <!--quire:services-and-profiles-->

| Xizmet | Profîl | Çi dike |
| --- | --- | --- |
| postgres | her tim | Danegirş (PostgreSQL 18 bi pgvector, ji `docker/postgres.Dockerfile` hatiye biafirîn), bi WALya ji yekem boot ve arşîvkirî |
| migrate, init | her tim | Carekê: guhertin, paş yekemcaran bixebitîn |
| web | her tim | LMS, li `QUIRE_HTTP_PORT` (8080) |
| content | her tim | Originê naveroka bêbawer, li `QUIRE_CONTENT_PORT` (8081) |
| worker | her tim | Erengên paşî: e-poşt, rapor, karê dosye, webhook |
| scheduler | her tim | Erengên rastîn: 64 pêşnîşana dema ranawayê qeyd dike û wan bişîne bo worker; her dem pêşvebirek |
| collab | her tim | Nivîsariya beşdar websocket, li `QUIRE_COLLAB_HTTP_PORT` (1234) |
| centrifugo | her tim | Dema rastîn fêrbûn, li `QUIRE_REALTIME_PORT` (8000) |
| proxy | her tim | Caddy, deriyê TLS li portên 80 û 443 (binêre "TLS") |
| valkey | `cache` | Cache û sinorên lez |
| clamav | `scan` | Çawaskiriya malware ji bo barkevan |
| gotenberg | `preview` | Pêşdîtinên Office bo PDF, avakirina şahadetname |
| imgproxy | `images` | Wêneyên biguherî û veguherî |
| transcoder | `video` | Wênea worker bi ffmpegya tenê LGPL, ji bo rendîtên vîdyoyê |
| seaweedfs | `storage` | Hilanîneyeke tiştên hevpeyman bi S3 li ser vê serverê |
| otelcol | `observability` | Komekareke OpenTelemetry |
| mailpit | `devmail` | Her posta derkevan digire, ji bo ceribandina Quire |
| backup | `backup` | Veparîstineke bingehî carekê; binêre backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | Veparîstineke bingehî her `QUIRE_BACKUP_INTERVAL_HOURS`, û kopîyên şifrakirî ji serverê derve bi ceribandineke çawaskirinê hefteyî |
| h5p | `h5p` | Wênea alîkariyeke H5P LTI 1.3 ku tu di `QUIRE_H5P_IMAGE` de didî, li `QUIRE_H5P_PORT` (8090); binêre "Vekekirina dabînekê H5P" |

`--profile full` her xizmeteke ikhtîyarî bi deng serdana `backup` û `h5p` dest pê dike. Yekê bi `docker compose -f docker/compose.yaml --profile scan up -d` bide dest pê. Bê xizmeteke ikhtîyarî Quire hê karekî dike û dibêje çi kêm e: nebûna scanner tê were ku barkev bê çawaskirin tê hilanîn û rêveber tê agahdarkirin; nebûna Gotenberg tê were ku dosye dagirtinê pêşkêş dikin bi dengê pêşdîtinê; nebûna transcoder tê were ku vîdyo bi dosyeke orîjînal lê dike.

Her wêneyekî parisî û peymanên lesanê wê di `docker/third-party-containers.yaml` de li lîsteyê ne.

### Vekekirina dabînekê H5P <!--quire:connecting-an-h5p-provider-->

Quire runtimeek H5P an sidecar nevêşîne an nebar dike (ADR 0019). Ger tu H5P bikar tîne, abonebûneke xwe ya hatiye mîhankirin pêşkêş bike an nênsa H5P ya xwe ya ji aliyê xwe ve bi cuda ji Quire xebitîne. Ew dabînker wek alîkariyeke derveyê LTI 1.3 qeyd bike û naveroka wê bi wek çalakiyên alîkariyê li kursan zêde bike. Quire nîşan û pêşketina çalakiyê/nîşandanê bi LTI Assignment and Grade Services (AGS) tablê dike. Ger dabînker bayanên xAPI jî dişîne, wê ji bo darigeha bayanên xAPI ya Quire bi cuda mîhaz bike; tablêbûna AGS nîşan/pêşketin bayanên xAPI nadişîne. Barkevên Moodle rapor dike ku çalakiyên H5P girêtiyeke alîkariyeke LTI pêwîst in. Dabînker berpirsyarî runtimeya H5P, nivîsariya, banka naverokê û dîroka hercemê ye.

Ji bo xebitandina nênsa xwe ya ji aliyê xwe ve li vê serverê, `QUIRE_H5P_IMAGE` bi wêneya wê saz bike û profîla `h5p` bide dest pê. Compose wê li `QUIRE_H5P_PORT` (8090) belav dike û datayê di volume `h5p-data` de parastî dike; wêneya û peymanên bi wê re hatîn belîq li xwe ye.

## Mîhaz <!--quire:settings-->

Her proses `docker/.env` dixwîne. Şablon, `docker/.env.example`, her mîhaz bi veberî wê li lîsteyê dide. Komek:

### Navnivîş <!--quire:addresses-->

| Mîhaz | Mani |
| --- | --- |
| `QUIRE_APP_ORIGIN` | Navnivîsa giştî a LMS, mîna `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Originê naverok, serverekî cuda |
| `QUIRE_PLATFORM_DOMAINS` | Domainên ku rêxistin di bin wan de ne, bi virgul veşartî |
| `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` | `compose` li vir. Binêre rêbeberên din ji bo `vercel` û `cloudflare` |
| `QUIRE_TRUSTED_PROXY_CIDRS` | Proxyên ku `X-Forwarded-For` wê bawer tê |

### Nepûr <!--quire:secrets-->

| Mîhaz | Mani |
| --- | --- |
| `QUIRE_SECRET_KEY` | Seans û tokeyan qedê dike. 64 tîpa hejmaran |
| `QUIRE_MASTER_KEY` | Têketnaverên hatiye parastî wek nepûrên SSO û webhook veşarî dike. 32 hejmara, base64. Navûpa web û worker heman nirx pêwîst in. Biguherîn: [key-rotation.md](/ku/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Nîşanera nûşeya kilîta sereke, gava neyê sazkirin `v1`. Gava tu biguherînî bilind bike |
| `QUIRE_MASTER_KEY_RETIRED` | Kilîtên sereke yên berê ku hê pêwîst in ji bo xwînina ewên mühûrkiriye, wek `v1=<base64>`. Piştî ku biguherînek bê tiştî neçareser temam bibe rake |
| `QUIRE_COLLAB_SIGNING_KEY` | Bi web û collab ve parvekirî ji bo qedandina tokeyên guhertin |
| `QUIRE_BACKUP_SIGNING_KEY` | Veparîstinên kurs qedê dike (ikhtîyarî) |

Kopîyeke `QUIRE_MASTER_KEY` di cîgeke dinî ji vê serverê biparîzê. Danegirşek bê wê hatiye sererastkirin nikare têketnaverên dihêle şifra.

### Danegirş <!--quire:database-->

| Mîhaz | Mani |
| --- | --- |
| `POSTGRES_PASSWORD` | Superuser, bi konteyner û veparîstinan tê bikaranîn |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | Şîfreyên rol, gava yekem dest pê dike tên sazkirin |
| `DATABASE_URL` | Rolê nivîsbariyê. Parastina rizê li her pirsgirî ku wê dike tê serbilind kirin |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | Rolê migrator, ji bo `migrate` û `init` |
| `QUIRE_SUPERUSER_URL` | Tenê ji aliyê yekemcaran bixebitînê tê bikaranîn |
| `QUIRE_REPORT_DATABASE_URL` | Rolê raporê ya tenê dixwîne, ji bo raporan û avakera rapor |
| `QUIRE_AUDIT_DATABASE_URL` | Rolê denetinê, ji bo konsola denetinê û hiştartina SIEM |
| `QUIRE_DATABASE_ID` | Her UUIDyek, ji bo demê sazkirinê sabit |

Şîfreyên rol tenê gava volumeya danegirşê yekemcaran tê çêkirin tên serbilindkirin. Ji bo biguherîna yekê paşî, `ALTER ROLE` bikar bîne û paş URLya hevççûn nûve bike.

`QUIRE_REPORT_DATABASE_URL` ji bo danegirşa fizîkî ya bi `DATABASE_URL` mîhazkirî tê bikaranîn. Ji bo her danegirşî fizîkî ezmûnî, navnivîsa girêtiya `quire_report` ya xwe di derdikevariya web û worker de saz bike, paş navê guhertoyê di qada **Reporting environment variable** ya wê danegirşê de wek `env:NAME` bide. Nîşankera divê biçe heman danegirşê wek girêtiya sepanê wê, ji bo çêt, replica ya xwe yê dixwîne. Her rûwek raporê tenantê biçe girêtiya rapora danegirşa xwe: avakera rapor û raporên hatiye panîkirin, şandinên rabeşkirî, hiştartina rapor, analîz, loga denetinê, sarveyên denetinê ya REST û lêgerdina denetinê ya alîkar. Yek ji wan her tim girêtiya rapora danegirşekî din bikar nîne. Gava danegirşek girêtiya rapora tune, raporên adî li girêtiya nivîsbariya xwe ya danegirşê tên xebitandin, lê analîz û her dixwînina denetinê raqûl dikin û wê dibêjin, ji ber ku rolê nivîsbariyê nikare serîdana denetinê bixwîne.

### Drivér <!--quire:drivers-->

| Mîhaz | Vê wêşanê | Tîp |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (veberî), `s3` an `azure` | `local` dosyên di volume `files` de parastî dike. `s3` AWS S3, R2, hevpeymaniya GCS û hilanîneyên S3 yên din diqetîne, bi barkevên multipart ku diceribînin |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (veberî), `sse`, `centrifugo` an `durable_objects` | `inprocess` ji bo konteyneke web Şah; bi `centrifugo` an `sse` bikar bîne gava pir in |
| `QUIRE_CACHE_DRIVER` | `memory` (veberî), `postgres` an `valkey` | `memory` ji bo her proses e; bi `valkey` an `postgres` bikar bîne ta sinorên lez di nav konteyneran de bimînin |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (veberî) an `progressive_mp4` | An dabînekek hatiye mîhankirin: Cloudflare Stream, Mux an Bunny, bi kilîtan wê |
| `QUIRE_IMAGE_DRIVER` | `noop` (veberî), `imgproxy` an `cloudflare` | `noop` her wêne bi mezinahiya orîjînal diêpe. `imgproxy` profîla `images` û mîhazên jêrîn pêwîst dike; `cloudflare` Cloudflare Images bikar tîne |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` an `in_process` | Veberiya platform ji bo seansên nû. Neyê sazkirin, seansên nû dibêjin ne mîhazkirî ne, heta rêxistinek qeyda xwe di bin Yekkêşin, Dabînkera seansê de veke. Qeyda xwe ya rêxistinê her tim serkeftî dike li ser vê nirxê. Mîhazên xwe ya her dabînker (`BBB_URL` û `BBB_SECRET`, guhertoyên `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*` û `JITSI_*`) tenê ji bo dabînkera li vir navdar tê xwînandin |
| `QUIRE_MEETING_REGIONS` | Lîsteya bi virgul a `eu`, `uk`, `us` | Li kêyê dabînka veberiya platform meeting parç dike. Neyê sazkirin, li rêxistinek bi herêmek veşartî nayê çawaskirin, wek berê. Qeyda xwe ya rêxistinê herêmên xwe di rûpela xwe de nîşan dike |

Nirxeke driverek ku vê wêşanê tune gava navûpa web dest pê dike raqûl dike, bi navdan mîhazê, bila ne bi gizengî veşareke veberî ve biguherîne.

### Wêne <!--quire:images-->

Rûpel ji bo wêneyan bi çûar mezinahiya sabit diçe `/api/files/{id}/image/{size}`, ku heman gihîştina wek dosye xwe çawas dike û paş biçe xizmeta wêneyê. Her rêxistin dikare di saetekê de `QUIRE_IMAGE_SPECS_PER_HOUR` (veberî 2000) cuftên nû wêne û mezinahî bixwaze; mezinahiyên ku hê di wê saetê de hatine çêkirin tê hesibîn. Bi `valkey` an `postgres` ji bo `QUIRE_CACHE_DRIVER` bikar bîne gava zêdetir ji konteyneke web heye, ta sinor di nav wan de bimîne.

| Mîhaz | Drivér | Tîp |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Navnivîsa ku gerok biçe imgproxy, mîna `https://images.example.org`. Profîla `images` wê li `QUIRE_IMAGES_PORT` (8082) belav dike |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | Bişka hejmaran, heman nirxên ku imgproxy bi wê dest pê dike. Her yek bi `openssl rand -hex 32` çêke. Quire her navnivîsa wêneyê bi wan qedê dike, ji ber vê imgproxy tiştekî nayê nivîsandin ku Quire nedaxwaz kirîye |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | `imgproxy` bi hilanîna nexweş | Li kêyê imgproxy orîjinan dihêle. Compose `http://web:3000` mîhaz dike. Bi hilanîna `s3` an `azure` imgproxy ji bucketê dihêle û ev nayê bikaranîn |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | Tokeke API bi destûra guhertina Images, û hasha hesabê ji Images, sarvekên pêşeniker. Ji bo hesabê guhertoyên elastîk veke |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | Ikhtîyarî. Gava saz bûye, wêne tinî ne û her navnivîs qedê dike û derdike. Bê wê, wêne bi navnivîşên ku ji `QUIRE_SECRET_KEY` tên derkirin giştî in ku kes nikare qeye bikî |

Cloudflare Images kopîya xwe ya her orîjînek ku diêpe parastî dike. Gava dosyeke rakirî ye, worker ew kopî berî orîjînalê rakîne.

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

Erengên paşî bi pg-boss di heman danegirşa Postgres de bikar tînin, ji ber vê xizmeteke ku yê ku naxebite tune û tiştekî ji bo mîhazkirinê nîn e. Ereng di heman transaksiyonê de ku guhertina ku wê çêkirîye ve tên nûşîşkirin, ji ber vê derkevek nikare yekê kulîlêne an du caran bişîne. `QUIRE_QUEUE_DRIVER` li vir `pgboss` ye, veberiya wê; `vercel` û `cloudflare` tenê şandinên sivik ê agahdarî û webhook biçe kuya platforma xwe, û rêbeberên Vercel û Cloudflare wan û çawa navûpa wan nûşîşînin şîrokînin.

### E-poşt <!--quire:email-->

Yek ji van saz bike:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: tiştekî JSON ku dabînkeke HTTP û têketnavera wê navdide, mîna `{"provider":"postmark","token":"..."}`. Postmark, Amazon SES, Mailgun, SendGrid û Resend piştgirî tên.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. Tenê ji bo vê armancê; armancên bêservers SMTP digirin.

`QUIRE_MAIL_FROM` şandekar e. Ji bo ceribandina Quire, profîla `devmail` bide dest pê, `QUIRE_SMTP_URL=smtp://mailpit:1025` saz bike, û posta li `http://localhost:8025` bixwîne.

### Xizmetên ikhtîyarî <!--quire:optional-services-->

| Mîhaz | Bi profîl |
| --- | --- |
| `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` an `QUIRE_MEILISEARCH_URL` | Lêgerdineke dûr; paşî Postgres tevahî |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Çawaskiriya şîfreyan hatiye rakerandin. Bi veberî li gorî `api.pwnedpasswords.com` veke (tenê pêşgota heşt tîp û tê şandin); `off` wê raked, û URL biçe rangeyek API ku xwe dibîne |

### Dîtin <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` navdide komekarek ku her proses ji bo tracing û metrîk dişîne; bi profîla `observability` wê `http://otelcol:4318` ye, û `docker/otel-collector.yaml` cîgeke ku tu exporter bo backenda xwe zêde dikî. Navûpa web, worker, scheduler, content û prosesên collab gava saz bûye spanên xwe bi OTLP/HTTP (daxwazên web, transaksiyonên danegirşa tenant, erengên worker û dawiyên derkevan) dişînin, û metrîkan her deqîqeyek biçe heman navnivîs (`OTEL_METRICS_EXPORTER=none` wan raked). `OTEL_TRACES_SAMPLER_ARG` parçeya tracingên ku tê parastin mîhaz dike. Log bi standard output li `LOG_LEVEL` derdike, û Compose wan diguherîne. Trace her tim datayî şexsî nade.

### Derkevina herêmî (datayên EU) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` dibêje ku stack rêxistên Îropayê diêpe. Worker paş her daxwazeke derkevan ku ji bo rêxistinek bi EU veşartî ye bi allowlistek (21-compliance.md beş 8.1) dihêle. Allowlist ev in: hostên ku xizmetên mîhazkirî ji bo herêmê derdike (navnivîsa hilanînê, dabînka e-poşt, dabîneke vîdyoyê hatiye mîhankirin, armancên hilanîna xwe ya rêxistinê, dabînkerên AI û qeyda e-poşt), hostên her xizmetekî ku dilovanîyeke çalak heye, û hostên ku tu di `QUIRE_EGRESS_ALLOW_HOSTS` de nivîsî. Daxwazeke bi hostekî giştî yên din nayê şandin berî ku wê, raqûlikirin di serîdana denetinê ya rêxistinê de bi navê `privacy/egress_refused` tê nivîsandin, û li bin Pejûhkirin, Wêcibariya herêmê tê lîstekirin.

| Mîhaz | Nirx | Encam |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Lîsteya bi virgul a navên host, an `*.example.org` ji bo her subdomain | Hostên zêde ku rêxistinekî EU dikare biçe. Endpointên webhook, xAPI û SIEM, çavkaniyên blog û hostên Amazon SES li vir ne, ji ber ku valbûna rêxistinê ye û tiştekî xizmet navdide. Loopback, navnivîşên taybet û navên tenê label wek `web` an `clamav` tora xwe ye û her tim ne tên çawaskirin |

Rêxistên UK û US bi lîsteyekî host tên nihêrtin; çawaskirinên herêmê xizmetê parastî dike. Lîsteyê li worker saz bike; rûpela rêveber wê di navûpa web de dixwîne ta allowlist nîşan bide, ji ber vê wê di `docker/.env` de, ku her xizmet dixwîne, bide.

Çawaskiriya nivîsbariyê çelteke pak û têgilîyeke denetinê dide, û ew peşdengiya nîn e: kod dikare şaş be. Peşdengiya tor e. Compose ew ji bo te neyê belavkirin. Ji bo stackê herêmî, xizmetên `worker` û `web` biçe torekî `internal: true` ku tenê reçika derkevanê wê proxyyeke derkevan (mîna Squid an konteyneke tinyproxy) e ku heman hostên `QUIRE_EGRESS_ALLOW_HOSTS` bi qet hostên xizmetên mîhazkirî re destûr dike, û ji bo wan xizmet `HTTPS_PROXY` saz bike. Rûpela wêcibariyê hostên rast ê ku nivîsbariyê destûr dike li lîsteyê dide, ta du lîsteyan tên veñartin.

## Sagiyê <!--quire:health-->

| Endpoint | Mani |
| --- | --- |
| `/healthz` | Zindîbûn: proses bersiv dike. Çawaskirinên Compose ev bikar tînin |
| `/readyz` | Amadebûn: pêşbîn bila gihiştin, û her xizmeteke ikhtîyarî bi wek mîhazkirî an nî raport dike. Load balancera xwe biçe vir |

`docker compose -f docker/compose.yaml ps` sagiya her xizmetê nîşan dike.

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

Xizmeta `proxy` (Caddy, Apache-2.0, `docker/caddy/Caddyfile`) beşeka stacka veberî ye. Li portên 80 û 443 bersiv dike û raport dike:

| Host an reçike | Biçe |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, her subdomainê tenant û domain taybet | `web` |
| `/_collab/` li wan hostan | `collab` (websocket, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` li wan hostan | websocket a mirov ya `centrifugo`; server API wê her tim ne tê beran |
| `/_images/` li wan hostan | `imgproxy`, bi profîla `images` (`IMGPROXY_URL`) |

`init-env.sh` `QUIRE_PROXY_APP_HOST`, `QUIRE_PROXY_CONTENT_HOST`, `QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` û `IMGPROXY_URL` ji du originan derdike, ji ber vê nikare veşqirin. Ger tu originek bi dest biguherînî wan bi hev re biguherîne.

Sertîfîkatan bi `QUIRE_PROXY_TLS` bişopînin:

- `internal` (veberî): authorityyeke sertîfîkayê ya Caddy, ji bo `localhost`, `*.localhost` û `lvh.me`. Root wê carekê bawer bike, paş bigere:

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

  `quire-local-ca.crt` biçe storeya baweriya pergalê an gerokê. `curl` bi `--cacert` wê digire.
- Navnivîseke e-poştê: sertîfîkayên ACME (Let's Encrypt, paş ZeroSSL) ji bo navên rastîn. DNS ji bo herdu origin û her hostê tenant divê biçe vir, û portên 80 û 443 divê ji înternetê debide.

Hostên tenant gava daxwaz bûye, di sereke serdana yekem de tên danîn, û tenê gava web piştrîn dike ku nav belî vê sazkirinê ye (`/tls-allowed`, ku di tora Compose de tê daxwazkirin). Sertîfîkayeke wildcard an plugîneke dabînkera DNS pêwîst nîne, û miroveke nenas ku navek biçe serverê nikare wê bivêje sertîfîkaya begêrîn. Sertîfîk û authorityyeke nexweş di volume `caddy-data` de ne; ger tu `internal` bikar tîne wê bi yên din re veparîste.

Web `X-Forwarded-For` ji proxy ve tenê bawer dike: proxy navnivîseke sabit heye (`QUIRE_PROXY_ADDRESS`, veberî `172.29.64.10`) di subnetekî sabit de (`QUIRE_COMPOSE_SUBNET`), û `QUIRE_TRUSTED_PROXY_CIDRS` ew navnivîs navdide. Ger subnet bi tora sereke a serverê bireke, herdu biguherîne û `docker compose down` bixebitîne berî `up`.

## Bi pey proxea xwe yê versa <!--quire:behind-your-own-reverse-proxy-->

Ji bo bikaranîna load balançerek an proxyek ku tu hê xebitîne, `proxy` derxe (`docker compose up -d --scale proxy=0`) û TLS bi pêşî `web` (8080), `content` (8081), `collab` (1234, websocket) û `centrifugo` (8000, websocket) axtine. Navnivîşên giştî di `QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN` û `QUIRE_COLLAB_URL` (`wss://`) saz bike, û navnivîsa proxya xwe di `QUIRE_TRUSTED_PROXY_CIDRS` de.

## Çareserkirina pirsgirêk <!--quire:troubleshooting-->

- `init` bi "QUIRE_DATABASE_ID is not a UUID" derdike: bi `uuidgen` saz bike.
- `web` bi "did not start on compose" dest pê nake: log her mîhazê ku nikare bêhna bike û çi bikar tîne li lîsteyê dide.
- Biguherîna şîfreya rolek di `.env` de dûpiştî yekem dest pêkirinê tiştek nake: skrîpta init carekê bixebitîne. `ALTER ROLE` bikar bîne.
- Barkev bi çelteke scanê serneketin gava `CLAMAV_URL` saz bûye: ClamAV îşaretên xwe di yekem dest pêkirinê de daxe, ku çend deqîqe digire.

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