---
title: "Quire-i Docker Compose ilə quraşdırmaq"
description: "Quire-i öz infrastrukturunuzda Docker Compose ilə quraşdırın."
image: "https://docs.quirelms.com/og.png"
---

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

# Quire-i Docker Compose ilə quraşdırmaq

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

Bu, bir host üzərindəki tam məhsuldur: LMS, onun fon işləri, real vaxt və birgə redaktə xidmətləri, eləcə də profil vasitəsilə qoşulan bütün əlavə xidmətlər. Dizayn `docs/architecture/23-ops.md` sənədinin 2-ci bölməsindədir.

Digər hədəflər: [Vercel](/az/ops/vercel/) və [Cloudflare Workers](/az/ops/cloudflare/) yalnız veb qatını işlədir. Yeniləmələr [upgrade.md](/az/ops/upgrade/), ehtiyat nüsxə və bərpa sınağı isə [backup-restore.md](/az/ops/backup-restore/) sənədindədir.

## Lazım olanlar <!--quire:what-you-need-->

- Compose plagini 2.30 və ya daha yeni olan Docker Engine 27 və ya daha yeni.
- Standart yığın üçün 4 CPU nüvəsi və 8 GB yaddaş; `--profile full` üçün 8 nüvə və 16 GB (tək ClamAV imzaları üçün təxminən 1.5 GB tutur).
- Veb qatı üçün DNS adı, etibarsız məzmun üçün isə ikinci ad. Bunlar ayrı hostlar olmalıdır: SCORM paketləri və yüklənmiş HTML məzmun hostunda işləyir ki, LMS kukilərini heç vaxt oxuya bilməsin.
- Lokal sınaq üçün `lvh.me` və `*.localhost` 127.0.0.1-ə yönəlir; `docker/.env.example` də bundan istifadə edir. Yığının öz `proxy` xidməti lokal sertifikat mərkəzi ilə hər ikisini https üzərindən təqdim edir, ona görə əlavə heç nə quraşdırılmır (“TLS” bölməsinə baxın).
- Hostda 80 və 443 portları boş olmalıdır (`QUIRE_PROXY_HTTP_PORT` və `QUIRE_PROXY_HTTPS_PORT` ilə dəyişdirilir).

## İlk işə salma <!--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` bütün secret-lər yaradılmaqla `docker/.env` faylını `docker/.env.example` əsasında yazır (verilənlər bazası parolları, imza və master açarları, məzmun başlatma açar cütü); həmçinin Compose-un worker-lərə secret kimi qoşduğu audit checkpoint imza açarını `docker/secrets/audit-signing-key.pem` ünvanında yaradır. Yalnız `sh`, `awk` və `openssl` tələb edir, mövcud `docker/.env` faylının üzərinə yazmır. Hər iki faylı hostdan kənara köçürün: `QUIRE_MASTER_KEY` olmadan bərpa edilmiş verilənlər bazası saxlanmış etimadnamələri aça bilməz. Faylı əl ilə doldurmaq üçün `cp docker/.env.example docker/.env` işlədin; hər secret-in yaradılma qaydası faylda yazılıb.

Hər iki origin `https` olmalıdır: istehsal mühitində content xidməti adi http-ni rədd edir və origin-lər eyni qeydiyyata alınan domeni paylaşmamalıdır. `proxy` xidməti hər ikisi üçün TLS-i sonlandırır (“TLS” bölməsinə baxın); `init-env.sh` `http://` origin-i rədd edir.

Yığın müəyyən ardıcıllıqla başlayır, hər addım əvvəlkinin bitməsini gözləyir:

1. `postgres` sağlam vəziyyətə keçir. İlk başladıqda init skripti (`docker/postgres/init/90-passwords.sh`) dörd rol parolunu təyin edir.
2. `migrate` hər miqrasiyanı tətbiq edir, idarəetmə verilənlər bazasında və hər ayrılmış tenant bazasında iş növbəsini qurur, hamısının uyğunluğunu yoxlayır, sonra çıxır (docs/ops/upgrade.md). Miqrasiyalar hər başladıqda işləyir və idempotentdir; yeniləmə yeni obraz və yenidən başlatmadır.
3. `init` (`apps/web/src/first-run.ts`) tətbiq verilənlər bazasını `QUIRE_DATABASE_ID` altında qeydə alır və `QUIRE_SETUP_ADMIN_EMAIL` verilibsə, ilk təşkilatı və administratorunu yaradır. Giriş ünvanı və yaradılmış parol `docker compose logs init` jurnalında bir dəfə göstərilir.
4. `web`, `content`, `worker`, `scheduler`, `collab` və `centrifugo` başlayır.
5. `proxy`, `web` və `content` sağlam olduqdan sonra başlayır.

Tətbiq domeninizdən sonra `https://demo.` ünvanını açın (dəqiq giriş ünvanı `init` jurnalında göstərilir) və daxil olun. Lokal quraşdırmada əvvəlcə proxy sertifikat mərkəzinə etibar edin (“TLS” bölməsinə baxın). Yaradılmış parolu `/account/security` ünvanında dəyişin.

Tələb olunan secret-i olmayan proses başlamır və jurnalında çatışmayan parametrin adını bildirir. Heç nə yarımçıq konfiqurasiya ilə işləmir.

## Xidmətlər və profillər <!--quire:services-and-profiles-->

| Xidmət | Profil | Nə edir |
| --- | --- | --- |
| postgres | həmişə | Verilənlər bazası ( `docker/postgres.Dockerfile` faylından yığılan PostgreSQL 18 və pgvector), ilk başladıqdan WAL arxivlənir |
| migrate, init | həmişə | Birdəfəlik: miqrasiyalar, sonra ilk işə salma |
| web | həmişə | LMS, `QUIRE_HTTP_PORT` portunda (8080) |
| content | həmişə | Etibarsız məzmun origin-i, `QUIRE_CONTENT_PORT` portunda (8081) |
| worker | həmişə | Fon işləri: e-poçt, hesabatlar, fayl emalı, vebhuklar |
| scheduler | həmişə | Təkrarlanan işlər: 64 icra vaxtı cədvəlini qeydə alıb worker-ə ötürür; eyni vaxtda bir lider |
| collab | həmişə | Birgə redaktə websocket-i, `QUIRE_COLLAB_HTTP_PORT` portunda (1234) |
| centrifugo | həmişə | Real vaxt yayımı, `QUIRE_REALTIME_PORT` portunda (8000) |
| proxy | həmişə | Caddy, 80 və 443 portlarında TLS giriş qapısı (“TLS” bölməsinə baxın) |
| valkey | `cache` | Keş və sürət limitləri |
| clamav | `scan` | Yükləmələrdə zərərli proqram axtarışı |
| gotenberg | `preview` | Office sənədlərindən PDF önbaxışı, sertifikatların render edilməsi |
| imgproxy | `images` | Şəkillərin ölçüsünün dəyişdirilməsi və çevrilməsi |
| transcoder | `video` | Video versiyaları üçün yalnız LGPL lisenziyalı ffmpeg-i olan worker obrazı |
| seaweedfs | `storage` | Bu hostda S3 ilə uyğun obyekt saxlama |
| otelcol | `observability` | OpenTelemetry toplayıcısı |
| mailpit | `devmail` | Quire-i sınaqdan keçirərkən bütün çıxan e-poçtları tutur |
| backup | `backup` | Birdəfəlik əsas ehtiyat nüsxə; backup-restore.md bölməsinə baxın |
| backup-scheduler, backup-offsite | `backup` | Hər `QUIRE_BACKUP_INTERVAL_HOURS` müddətində əsas ehtiyat nüsxə və həftəlik yoxlama sınağı ilə hostdan kənar şifrəli surətlər |
| h5p | `h5p` | `QUIRE_H5P_IMAGE`-də verdiyiniz H5P LTI 1.3 alət obrazı, `QUIRE_H5P_PORT` portunda (8090); “H5P provayderini qoşmaq” bölməsinə baxın |

`--profile full` `backup` və `h5p` istisna olmaqla bütün əlavə xidmətləri başladır. Birini başlatmaq üçün `docker compose -f docker/compose.yaml --profile scan up -d` işlədin. Əlavə xidmət olmasa da Quire işləyir və çatışmayanı bildirir: skaner yoxdursa, yükləmələr yoxlanmadan saxlanır və administratora xəbər verilir; Gotenberg yoxdursa, fayl önbaxış əvəzinə endirmə təklif edir; transcoder yoxdursa, video orijinal fayl kimi oynadılır.

Hər üçüncü tərəf obrazı və onun lisenziya öhdəlikləri `docker/third-party-containers.yaml` faylında sadalanır.

### H5P provayderini qoşmaq <!--quire:connecting-an-h5p-provider-->

Quire H5P icra mühitini və ya yan xidməti özünə daxil etmir və göndərmir (ADR 0019). H5P-dən istifadə edirsinizsə, ayrıca hostinq abunəliyinizi təqdim edin və ya öz H5P instansiyanızı Quire-dən ayrı idarə edin. Provayderi LTI 1.3 xarici aləti kimi qeydə alıb məzmununu kurslara alət fəaliyyəti kimi əlavə edin. Quire qiymət və fəaliyyət/qiymətləndirmə irəliləyişini LTI Assignment and Grade Services (AGS) vasitəsilə mübadilə edir. Provayder xAPI bəyanatları da göndərirsə, bunu Quire xAPI bəyanat anbarı üçün ayrıca qurun; AGS qiymət/irəliləyiş mübadiləsi xAPI bəyanatı göndərmir. Moodle idxalı H5P fəaliyyətlərinin LTI aləti bağlantısı tələb etdiyini bildirir. H5P icra mühiti, müəlliflik, məzmun bankı və cəhd tarixçəsi provayderin məsuliyyətində qalır.

Özünüz idarə etdiyiniz instansiyanı bu hostda işlətmək üçün `QUIRE_H5P_IMAGE` parametrinə obrazı verin və `h5p` profilini başladın. Compose onu `QUIRE_H5P_PORT` portunda (8090) yayımlayır, məlumatını isə `h5p-data` həcmində saxlayır; obraz və onun öhdəlikləri sizə aiddir.

## Parametrlər <!--quire:settings-->

Hər proses `docker/.env` faylını oxuyur. Şablon olan `docker/.env.example` standart dəyəri ilə bütün parametrləri sadalayır. Qruplar:

### Ünvanlar <!--quire:addresses-->

| Parametr | Mənası |
| --- | --- |
| `QUIRE_APP_ORIGIN` | LMS-in açıq ünvanı, məsələn, `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Ayrı hostdakı məzmun origin-i |
| `QUIRE_PLATFORM_DOMAINS` | Təşkilatların yerləşdiyi domenlər, vergüllə ayrılır |
| `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` | Burada `compose`. `vercel` və `cloudflare` üçün digər təlimatlara baxın |
| `QUIRE_TRUSTED_PROXY_CIDRS` | `X-Forwarded-For` məlumatına etibar edilən proxy-lər |

### Secret-lər <!--quire:secrets-->

| Parametr | Mənası |
| --- | --- |
| `QUIRE_SECRET_KEY` | Sessiya və tokenləri imzalayır. 64 hexadecimal simvol |
| `QUIRE_MASTER_KEY` | SSO və vebhuk secret-ləri kimi saxlanmış etimadnamələri bükür. 32 bayt, base64. Veb qatı və worker eyni dəyərə ehtiyac duyur. Dəyişdirmə: [key-rotation.md](/az/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Master açarın versiya etiketi; boşdursa `v1`. Dəyişdirəndə artırın |
| `QUIRE_MASTER_KEY_RETIRED` | Əvvəlki açarlar, möhürlədiklərini oxumaq üçün lazımdır; məsələn, `v1=<base64>`. Heç nə açılmamış qalmadan dəyişdirmə tamamlananda silin |
| `QUIRE_COLLAB_SIGNING_KEY` | Redaktə tokenlərini imzalamaq üçün web və collab tərəfindən ortaq istifadə edilir |
| `QUIRE_BACKUP_SIGNING_KEY` | Kurs ehtiyat nüsxələrini imzalayır (istəyə bağlı) |

`QUIRE_MASTER_KEY` surətini bu hostdan başqa yerdə saxlayın. Onsuz bərpa olunmuş verilənlər bazası saxladığı etimadnamələri aça bilməz.

### Verilənlər bazası <!--quire:database-->

| Parametr | Mənası |
| --- | --- |
| `POSTGRES_PASSWORD` | Superuser; konteyner və ehtiyat nüsxələr istifadə edir |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | İlk başladıqda təyin edilən rol parolları |
| `DATABASE_URL` | Tətbiq rolu. Etdiyi hər sorğuya sətir səviyyəli təhlükəsizlik tətbiq olunur |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | `migrate` və `init` üçün miqrator rolu |
| `QUIRE_SUPERUSER_URL` | Yalnız ilk başladıqda istifadə olunur |
| `QUIRE_REPORT_DATABASE_URL` | Hesabatlar və hesabat qurucusu üçün yalnız oxuna bilən hesabat rolu |
| `QUIRE_AUDIT_DATABASE_URL` | Audit konsolu və SIEM ixracı üçün audit rolu |
| `QUIRE_DATABASE_ID` | Quraşdırma müddətində sabit qalan istənilən UUID |

Rol parolları yalnız verilənlər bazası həcmi ilk dəfə yaradıldıqda tətbiq olunur. Sonradan dəyişmək üçün `ALTER ROLE` işlədin və uyğun URL-ni yeniləyin.

`QUIRE_REPORT_DATABASE_URL` `DATABASE_URL` tərəfindən konfiqurasiya edilmiş fiziki verilənlər bazası üçün istifadə edilir. Digər qeydiyyatdan keçmiş fiziki bazalar üçün web və worker mühitlərində öz `quire_report` bağlantı URL-sini təyin edin, sonra həmin bazanın **Reporting environment variable** sahəsinə dəyişən adını `env:NAME` kimi yazın. İstinad tətbiq bağlantısı ilə eyni bazaya, mümkün olduqda oxuma replikasına yönəlməlidir. Hər hesabat səthi tenant-ı onun öz bazasının hesabat bağlantısına izləyir: hesabat qurucusu və saxlanmış hesabatlar, planlaşdırılmış çatdırılmalar, ixraclar, analitika, audit jurnalı, REST audit resursları və köməkçinin audit axtarışı. Başqa bazanın hesabat URL-sindən heç biri istifadə etmir. Bazada hesabat bağlantısı yoxdursa, adi hesabatlar həmin bazanın öz tətbiq bağlantısında işləyir; analitika və audit oxunuşu isə tətbiq rolu audit izini oxuya bilmədiyindən bunu bildirərək imtina edir.

### Sürücülər <!--quire:drivers-->

| Parametr | Bu buraxılış | Qeydlər |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (standart), `s3` və ya `azure` | `local` faylları `files` həcmində saxlayır. `s3` AWS S3, R2, GCS uyğunluğu və digər S3 uyğun saxlama yerlərini, davam etdirilə bilən hissəli yükləmələrlə dəstəkləyir |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (standart), `sse`, `centrifugo` və ya `durable_objects` | Bir web konteyneri üçün `inprocess` uyğundur; bir neçə olduqda `centrifugo` və ya `sse` işlədin |
| `QUIRE_CACHE_DRIVER` | `memory` (standart), `postgres` və ya `valkey` | `memory` proses başına ayrıdır; konteynerlər arasında limitlərin qorunması üçün `valkey` və ya `postgres` istifadə edin |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (standart) və ya `progressive_mp4` | Açarları ilə Cloudflare Stream, Mux və ya Bunny hostinq provayderi də ola bilər |
| `QUIRE_IMAGE_DRIVER` | `noop` (standart), `imgproxy` və ya `cloudflare` | `noop` hər şəkli orijinal ölçüdə təqdim edir. `imgproxy` `images` profili və aşağıdakı parametrləri tələb edir; `cloudflare` Cloudflare Images istifadə edir |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` və ya `in_process` | Canlı sessiyalar üçün platforma standartı. Boşdursa, təşkilat İnteqrasiyalar, Canlı sessiya provayderi altında öz hesabını qoşanadək canlı sessiyalar konfiqurasiya edilmədiyini bildirir. Təşkilatın öz hesabı həmişə bu dəyərdən üstündür. Hər provayderin parametrləri (`BBB_URL` və `BBB_SECRET`, `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*` və `JITSI_*` dəyişənləri) yalnız burada göstərilən provayder üçün oxunur |
| `QUIRE_MEETING_REGIONS` | `eu`, `uk`, `us` dəyərlərindən vergüllə ayrılmış siyahı | Platforma standart provayderinin görüşləri emal etdiyi yerlər. Boş olduqda, əvvəlki kimi, regiona bağlanmış təşkilatla müqayisə edilmir. Təşkilatın öz hesabı regionları öz səhifəsində göstərir |

Bu buraxılışın dəstəkləmədiyi sürücü dəyəri əvəzinə səssizcə standart istifadə etməkdənsə, web qatı başladıqda parametrin adını göstərərək rədd edilir.

### Şəkillər <!--quire:images-->

Səhifələr şəkilləri `/api/files/{id}/image/{size}` üzərindən dörd sabit ölçüdə istəyir; bu endpoint faylın özünə aid eyni giriş icazəsini yoxlayır, sonra şəkil xidmətinə yönləndirir. Hər təşkilat saatda `QUIRE_IMAGE_SPECS_PER_HOUR` (standart 2000) yeni şəkil-ölçü cütü istəyə bilər; həmin saatda artıq yaradılmış ölçülər sayılmır. Birdən çox web konteyner olduqda limitin hamısında qüvvədə qalması üçün `valkey` və ya `postgres`-u `QUIRE_CACHE_DRIVER` kimi işlədin.

| Parametr | Sürücü | Qeydlər |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Brauzerlərin imgproxy-yə çatdığı ünvan, məsələn, `https://images.example.org`. `images` profili onu `QUIRE_IMAGES_PORT` portunda (8082) dərc edir |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | imgproxy başladılan zaman istifadə edilənlə eyni hexadecimal dəyərlər. Hər birini `openssl rand -hex 32` ilə yaradın. Quire hər şəkil ünvanını imzalayır ki, imgproxy Quire-in istəmədiyi şəkli render edə bilməsin |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | lokal saxlama ilə `imgproxy` | imgproxy orijinalları haradan gətirir. Compose `http://web:3000` təyin edir. `s3` və ya `azure` saxlama ilə imgproxy obyekti bucket-dən gətirir və bu parametr işlədilmir |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | Images redaktə icazəli API tokeni və Images, Developer resources bölməsindəki hesab heşi. Hesab üçün çevik variantları aktiv edin |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | İstəyə bağlıdır. Təyin olunarsa şəkillər məxfi olur, hər ünvan imzalanır və vaxtı bitir. Olmasa, `QUIRE_SECRET_KEY`-dən yaradılan və heç kimin təxmin edə bilməyəcəyi ünvanlarda açıq olur |

Cloudflare Images təqdim etdiyi hər orijinalın öz surətini saxlayır. Fayl silinəndə worker orijinaldan əvvəl bu surəti silir.

### Növbə <!--quire:queue-->

Fon işləri eyni Postgres verilənlər bazasında pg-boss istifadə edir; ayrıca növbə xidməti və konfiqurasiya tələb olunmur. Tapşırıqlar onları yaradan dəyişikliklə eyni tranzaksiyada növbəyə qoyulur, buna görə qəza işi itirə və ya iki dəfə göndərə bilməz. Burada `QUIRE_QUEUE_DRIVER` standart olan `pgboss`-dur; `vercel` və `cloudflare` yalnız yüngül bildiriş və vebhuk çatdırılmalarını platformanın öz növbəsinə köçürür. Vercel və Cloudflare təlimatlarında bunlar və web qatının növbəyə necə göndərməsi izah olunur.

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

Aşağıdakılardan birini təyin edin:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: HTTP provayderi və etimadnamələrini göstərən JSON obyekt, məsələn, `{"provider":"postmark","token":"..."}`. Postmark, Amazon SES, Mailgun, SendGrid və Resend dəstəklənir.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. Yalnız bu hədəf üçündür; serverless hədəflər SMTP-ni bloklayır.

`QUIRE_MAIL_FROM` göndərəni müəyyən edir. Quire-i sınaqdan keçirmək üçün `devmail` profilini başladın, `QUIRE_SMTP_URL=smtp://mailpit:1025` təyin edin və e-poçta `http://localhost:8025` ünvanında baxın.

### İxtiyari xidmətlər <!--quire:optional-services-->

| Parametr | Profil olduqda |
| --- | --- |
| `CLAMAV_URL=tcp://clamav:3310` | `scan` |
| `GOTENBERG_URL=http://gotenberg:3000` | `preview` |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `images` |
| `VALKEY_URL=redis://valkey:6379` | `cache` |
| `QUIRE_OPENSEARCH_URL` və ya `QUIRE_MEILISEARCH_URL` | Xarici axtarış; əks halda Postgres tam mətn axtarışı |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Parol sızması yoxlaması. Standart olaraq `api.pwnedpasswords.com` ünvanında aktivdir (yalnız beş simvolluq heş prefiksi göndərilir); `off` söndürür, URL isə özünüz host etdiyiniz diapazon API-sini göstərir |

### Müşahidəolunma <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` hər prosesin iz və metrik göndərdiyi toplayıcını göstərir; `observability` profili ilə dəyəri `http://otelcol:4318` olur, backend üçün ixracatçını `docker/otel-collector.yaml` faylında əlavə edin. Təyin edildikdə web qatı, worker, scheduler, content və collab prosesləri span-ları OTLP/HTTP ilə (veb sorğuları, tenant verilənlər bazası tranzaksiyaları, worker işləri və çıxan çağırışlar) və hər dəqiqə eyni endpoint-ə metrik göndərir (`OTEL_METRICS_EXPORTER=none` onları söndürür). `OTEL_TRACES_SAMPLER_ARG` saxlanacaq izlərin payını təyin edir. Jurnallar `LOG_LEVEL` səviyyəsində standart çıxışa gedir; Compose onları fırladır. İzlərdə şəxsi məlumat yoxdur.

### Region üzrə çıxış (Aİ məlumat rezidentliyi) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` yığının Avropa İttifaqı təşkilatlarına xidmət etdiyini bildirir. Worker bundan sonra Aİ regionuna bağlanmış təşkilat üçün edilən hər çıxan sorğunu icazə siyahısına uyğun yoxlayır (21-compliance.md bölmə 8.1). Siyahı region üçün konfiqurasiya olunmuş xidmətlərin elan etdiyi hostlardan (saxlama endpoint-i, e-poçt provayderi, hostinq video provayderi, təşkilatın öz saxlama hədəfləri, süni intellekt provayderləri və e-poçt hesabı), aktiv istisna icazəsi olan xidmətlərin hostlarından və `QUIRE_EGRESS_ALLOW_HOSTS` daxilində yazdığınız hostlardan ibarətdir. Başqa açıq hosta sorğu göndərilməzdən əvvəl rədd edilir, rədd `privacy/egress_refused` kimi təşkilatın audit izinə yazılır və Uyğunluq, Məlumat rezidentliyi altında göstərilir.

| Parametr | Dəyərlər | Təsir |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Host adlarının vergüllə ayrılmış siyahısı və ya bütün alt domenlər üçün `*.example.org` | Aİ təşkilatının çata biləcəyi əlavə hostlar. Vebhuk, xAPI və SIEM endpoint-ləri, bloq lentləri və Amazon SES hostları bura daxildir, çünki təşkilat özü seçir və xidmət onları elan etmir. Loopback, şəxsi ünvanlar və `web` və ya `clamav` kimi tək etiketli adlar öz şəbəkənizdir, heç vaxt yoxlanmır |

Böyük Britaniya və ABŞ təşkilatlarına host siyahısı şərti tətbiq edilmir; xidmət regionu yoxlamaları qüvvədə qalır. Siyahını worker-də təyin edin; icazə siyahısını göstərmək üçün admin səhifəsi onu web qatında oxuyur, ona görə bütün xidmətlərin oxuduğu `docker/.env` faylında saxlayın.

Tətbiq yoxlaması aydın xəta və audit qeydi verir, lakin bu təminat deyil: kodda səhv ola bilər. Təminatı şəbəkə verir. Compose bunu sizin əvəzinizə tətbiq etmir. Regiona uyğun yığın üçün `worker` və `web` xidmətlərini yalnız çıxış yolu egress proxy olan `internal: true` şəbəkəsində yerləşdirin (məsələn, Squid və ya kiçik tinyproxy konteyneri); proxy `QUIRE_EGRESS_ALLOW_HOSTS` siyahısındakı eyni hostlara və konfiqurasiya edilmiş xidmət hostlarına icazə verməlidir. Həmin xidmətlər üçün `HTTPS_PROXY` təyin edin. Rezidentlik səhifəsi tətbiqin icazə verdiyi hostları dəqiq sadalayır ki, iki siyahını müqayisə edə biləsiniz.

## Sağlamlıq <!--quire:health-->

| Endpoint | Mənası |
| --- | --- |
| `/healthz` | Canlılıq: proses cavab verir. Compose sağlamlıq yoxlamaları bundan istifadə edir |
| `/readyz` | Hazırlıq: asılılıqlara çatmaq mümkündür və hər əlavə xidmət konfiqurasiya olunub-olunmadığını bildirir. Yük balanslayıcınızı bura yönəldin |

`docker compose -f docker/compose.yaml ps` hər xidmətin sağlamlıq vəziyyətini göstərir.

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

`proxy` xidməti (Caddy, Apache-2.0, `docker/caddy/Caddyfile`) standart yığının hissəsidir. 80 və 443 portlarında sorğuları qəbul edib belə yönləndirir:

| Host və ya yol | Hara gedir |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, hər tenant alt domeni və fərdi domen | `web` |
| Həmin hostlarda `/_collab/` | `collab` (websocket, `QUIRE_COLLAB_URL`) |
| Həmin hostlarda `/_realtime/connection/` | `centrifugo` client websocket-i; server API-si heç vaxt açıq edilmir |
| Həmin hostlarda `/_images/` | `imgproxy`, `images` profili (`IMGPROXY_URL`) ilə |

`init-env.sh` iki origin-dən `QUIRE_PROXY_APP_HOST`, `QUIRE_PROXY_CONTENT_HOST`, `QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` və `IMGPROXY_URL` yaradır, beləliklə onlar bir-birindən yayınmır. Origin-i əl ilə dəyişirsinizsə, bunları birlikdə redaktə edin.

Sertifikatlar `QUIRE_PROXY_TLS` parametrinə tabedir:

- `internal` (standart): `localhost`, `*.localhost` və `lvh.me` üçün Caddy-nin öz sertifikat mərkəzi. Kök sertifikata bir dəfə etibar edib sonra baxın:

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

  `quire-local-ca.crt` faylını sistemin və ya brauzerin etibarlı sertifikat anbarına əlavə edin. `curl` onu `--cacert` ilə qəbul edir.
- E-poçt ünvanı: real host adları üçün avtomatik ACME sertifikatları (Let's Encrypt, sonra ZeroSSL). Hər iki origin və bütün tenant hostları bu hosta yönəlməli; internetdən 80 və 443 portlarına çatmaq mümkün olmalıdır.

Tenant hostları ilk ziyarət zamanı və yalnız web adın bu quraşdırmaya aid olduğunu təsdiqlədikdə verilir (`/tls-allowed`, Compose şəbəkəsində soruşulur). Wildcard sertifikat və DNS provayder plagini lazım deyil; hosta ad yönəldən yad şəxs sertifikat sifariş etdirə bilməz. Sertifikatlar və lokal mərkəz `caddy-data` həcmindədir; `internal` istifadə edirsinizsə, qalanlarla birlikdə ehtiyat nüsxəsini çıxarın.

Web yalnız proxy-dən gələn `X-Forwarded-For` məlumatına inanır: proxy-nin sabit (`QUIRE_PROXY_ADDRESS`, standart `172.29.64.10`) ünvanı sabit alt şəbəkədə (`QUIRE_COMPOSE_SUBNET`) yerləşir və `QUIRE_TRUSTED_PROXY_CIDRS` həmin ünvanı göstərir. Alt şəbəkə hostdakı şəbəkə ilə toqquşursa, hər ikisini dəyişin, `docker compose down` işlədin, sonra `up` başladın.

## Öz əks proxy-nizin arxasında <!--quire:behind-your-own-reverse-proxy-->

Artıq işlətdiyiniz yük balanslayıcı və ya proxy-dən istifadə etmək üçün `proxy`-ni kənarda saxlayın (`docker compose up -d --scale proxy=0`) və TLS-i `web` (8080), `content` (8081), `collab` (1234, websocket) və `centrifugo` (8000, websocket) qarşısında sonlandırın. Açıq ünvanları `QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN` və `QUIRE_COLLAB_URL` (`wss://`), proxy ünvan diapazonunu isə `QUIRE_TRUSTED_PROXY_CIDRS` parametrində təyin edin.

## Problemlərin aradan qaldırılması <!--quire:troubleshooting-->

- `init` “QUIRE_DATABASE_ID is not a UUID” mesajı ilə çıxır: `uuidgen` ilə təyin edin.
- `web` “did not start on compose” ilə yenidən başlayır: jurnal dəstəkləmədiyi parametrləri və istifadə ediləcək dəyərləri sadalayır.
- İlk başlamadan sonra `.env` faylında rol parolunu dəyişmək təsir etmir: init skripti yalnız bir dəfə işləyir. `ALTER ROLE` istifadə edin.
- `CLAMAV_URL` təyin olduğu halda yükləmələr skan xətası verir: ClamAV ilk startda imzalarını endirir, bu bir neçə dəqiqə çəkir.

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