---
title: "Quire-ի տեղադրում Docker Compose-ով"
description: "Տեղադրեք Quire-ը ձեր սեփական ենթակառուցվածքում՝ Docker Compose-ով։"
image: "https://docs.quirelms.com/og.png"
---

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

# Quire-ի տեղադրում Docker Compose-ով

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

Սա ամբողջական արտադրանքն է մեկ հոսթում՝ LMS-ը, դրա ֆոնային աշխատանքը,
իրական ժամանակի ու համատեղ խմբագրման ծառայությունները և պրոֆիլների տակ
գործարկվող բոլոր կամընտիր ծառայությունները։ Դիզայնը նկարագրված է
`docs/architecture/23-ops.md` փաստաթղթի 2-րդ բաժնում։

Այլ թիրախներ․ [Vercel](/hy/ops/vercel/) և [Cloudflare Workers](/hy/ops/cloudflare/)-ը
գործարկում են միայն վեբ շերտը։ Արդիականացումները նկարագրված են
[upgrade.md](/hy/ops/upgrade/)-ում, իսկ պահուստավորումն ու վերականգնման փորձը՝
[backup-restore.md](/hy/ops/backup-restore/)-ում։

## Ինչ է անհրաժեշտ <!--quire:what-you-need-->

- Docker Engine 27 կամ ավելի նոր՝ Compose 2.30 կամ ավելի նոր հավելվածով։
- Լռելյայն կլաստերի համար 4 CPU միջուկ և 8 GB հիշողություն․
  `--profile full`-ի դեպքում՝ 8 միջուկ և 16 GB (միայն ClamAV-ն ունի մոտ
  1.5 GB ստորագրություններ)։
- DNS անուն՝ վեբ շերտի համար, և երկրորդը՝ անվստահելի բովանդակության համար։
  Դրանք պետք է տարբեր հոսթներ լինեն․ SCORM փաթեթներն ու վերբեռնված HTML-ը
  աշխատում են բովանդակության origin-ում, որպեսզի երբեք չկարողանան կարդալ
  LMS-ի cookie-ները։
- Տեղային փորձարկման համար `lvh.me`-ը և `*.localhost`-ը լուծվում են դեպի
  127.0.0.1, ինչպես սահմանված է `docker/.env.example`-ում։ Կլաստերի սեփական
  `proxy` ծառայությունը երկուսն էլ մատուցում է https-ով՝ տեղային
  հավաստագրման կենտրոնով, ուստի ուրիշ բան պետք չէ տեղադրել (տես «TLS» բաժինը)։
- Հոսթում ազատ 80 և 443 պորտեր (`QUIRE_PROXY_HTTP_PORT` և
  `QUIRE_PROXY_HTTPS_PORT`-ը փոխում են դրանց համարները)։

## Առաջին գործարկում <!--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`-ը՝ ստանալով այն
`docker/.env.example`-ից և գեներացնելով բոլոր գաղտնի արժեքները (տվյալների բազայի
գաղտնաբառերը, ստորագրող ու գլխավոր բանալիները, բովանդակության գործարկման
բանալիների զույգը) և աուդիտի կետի ստորագրող բանալին՝
`docker/secrets/audit-signing-key.pem`-ում, որը Compose-ը գաղտնիքի ձևով
կցում է աշխատողներին։ Անհրաժեշտ են միայն `sh`, `awk` և `openssl`, իսկ արդեն
գոյություն ունեցող `docker/.env`-ը վերագրել այն հրաժարվում է։ Երկու ֆայլերի
պատճեններն էլ պահեք հոսթից դուրս․ առանց `QUIRE_MASTER_KEY` վերականգնված
տվյալների բազան չի կարող ապակոդավորել պահված հավատարմագրերը։ Ֆայլը ձեռքով
լրացնելու համար գործարկեք `cp docker/.env.example docker/.env`․ ֆայլում
գրված է, թե ինչպես գեներացնել յուրաքանչյուր գաղտնի արժեք։

Երկու origin-ներն էլ պետք է `https` լինեն․ բովանդակության ծառայությունը
արտադրական միջավայրում մերժում է սովորական http-ը, և դրանք չպետք է ընդհանուր
գրանցվող տիրույթ ունենան։ `proxy` ծառայությունը երկուսի համար ավարտում է
TLS կապը (տես «TLS» բաժինը), իսկ `init-env.sh`-ը մերժում է `http://` origin-ը։

Կլաստերը մեկնարկում է սահմանված հերթով, և յուրաքանչյուր քայլ սպասում է
նախորդի ավարտին․

1. `postgres`-ը դառնում է առողջ։ Առաջին գործարկման ժամանակ դրա սկզբնավորման
   սկրիպտը (`docker/postgres/init/90-passwords.sh`) սահմանում է չորս դերի
   գաղտնաբառերը։
2. `migrate`-ը կիրառում է բոլոր միգրացիաները և աշխատանքների հերթը սկզբնավորում
   կառավարման տվյալների բազայում ու յուրաքանչյուր նվիրված հաճախորդային բազայում,
   ստուգում դրանց համաձայնությունը, ապա ավարտվում է (docs/ops/upgrade.md)։
   Միգրացիաները գործարկվում են ամեն մեկնարկի ժամանակ և իդեմպոտենտ են, ուստի
   արդիականացումը նոր պատկեր և վերագործարկում է։
3. `init`-ը (`apps/web/src/first-run.ts`) հավելվածի տվյալների բազան գրանցում է
   `QUIRE_DATABASE_ID`-ում և, եթե սահմանված է `QUIRE_SETUP_ADMIN_EMAIL`-ը,
   ստեղծում է առաջին կազմակերպությունն ու դրա ադմինիստրատորին։ Մուտքի հասցեն
   ու գեներացված գաղտնաբառը մեկ անգամ տպվում են `docker compose logs init`-ում։
4. Գործարկվում են `web`, `content`, `worker`, `scheduler`, `collab` և
   `centrifugo` ծառայությունները։
5. `proxy`-ն մեկնարկում է, երբ `web`-ն ու `content`-ն առողջ են։

Բացեք հավելվածի տիրույթին հաջորդող `https://demo.` հասցեն (`init` մատյանում
տպվում է մուտքի ճշգրիտ հասցեն) և մուտք գործեք։ Տեղային տեղադրման դեպքում
նախ վստահեք պրոքսիի հավաստագրման կենտրոնին (տես «TLS» բաժինը)։ Փոխեք
գեներացված գաղտնաբառը `/account/security` էջում։

Պարտադիր գաղտնի արժեք չունեցող մեկնարկող գործընթացը հրաժարվում է գործարկել և
մատյանում նշում բացակայող կարգավորումը։ Կիսատ կազմաձևմամբ ոչինչ չի մեկնարկում։

## Ծառայություններ և պրոֆիլներ <!--quire:services-and-profiles-->

| Ծառայություն | Պրոֆիլ | Գործառույթ |
| --- | --- | --- |
| postgres | միշտ | Տվյալների բազա (PostgreSQL 18՝ pgvector-ով, կառուցվում է `docker/postgres.Dockerfile`-ից), WAL-ի արխիվացմամբ՝ առաջին գործարկումից սկսած |
| migrate, init | միշտ | Մեկանգամյա գործարկում․ միգրացիաներ, ապա առաջին մեկնարկ |
| web | միշտ | LMS-ը՝ `QUIRE_HTTP_PORT`-ում (8080) |
| content | միշտ | Անվստահելի բովանդակության origin-ը՝ `QUIRE_CONTENT_PORT`-ում (8081) |
| worker | միշտ | Ֆոնային աշխատանքներ՝ էլ․ նամակներ, հաշվետվություններ, ֆայլերի մշակում, վեբհուքներ |
| scheduler | միշտ | Կրկնվող աշխատանքներ․ գրանցում է գործարկման 64 ժամանակացույցը և փոխանցում աշխատողին․ միաժամանակ միայն մեկ ղեկավար կա |
| collab | միշտ | Համատեղ խմբագրման WebSocket՝ `QUIRE_COLLAB_HTTP_PORT`-ում (1234) |
| centrifugo | միշտ | Իրական ժամանակի տարածում՝ `QUIRE_REALTIME_PORT`-ում (8000) |
| proxy | միշտ | Caddy, TLS մուտքի կետ՝ 80 և 443 պորտերում (տես «TLS» բաժինը) |
| valkey | `cache` | Քեշ և հարցումների հաճախության սահմանափակումներ |
| clamav | `scan` | Վերբեռնումների չարամիտ ծրագրերի ստուգում |
| gotenberg | `preview` | Գրասենյակային ֆայլերի PDF նախադիտումներ և հավաստագրերի ցուցադրում |
| imgproxy | `images` | Պատկերների չափափոխում և փոխակերպում |
| transcoder | `video` | Աշխատողի պատկեր՝ միայն LGPL լիցենզիայով ffmpeg-ով, տեսանյութերի տարբերակների համար |
| seaweedfs | `storage` | Այս հոսթում S3-ի հետ համատեղելի օբյեկտների պահեստ |
| otelcol | `observability` | OpenTelemetry տվյալների հավաքիչ |
| mailpit | `devmail` | Փորձարկման համար կլանում է բոլոր ելքային նամակները |
| backup | `backup` | Մեկանգամյա հիմնական պահուստային պատճեն․ տես backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | Հիմնական պատճեն՝ ամեն `QUIRE_BACKUP_INTERVAL_HOURS` ժամում, և կոդավորված՝ հոսթից դուրս պատճեններ՝ շաբաթական ստուգման փորձով |
| h5p | `h5p` | Ձեր տրամադրած H5P LTI 1.3 գործիքի պատկերն է `QUIRE_H5P_IMAGE`-ում՝ `QUIRE_H5P_PORT` (8090) պորտում․ տես «H5P ծառայության միացում» |

`--profile full`-ը գործարկում է բոլոր կամընտիր ծառայությունները՝ բացի `backup`
և `h5p`-ից։ Մեկն առանձին գործարկեք `docker compose -f docker/compose.yaml --profile scan up -d` հրամանով։
Առանց կամընտիր ծառայության Quire-ը շարունակում է աշխատել և հայտնում է, թե ինչն
է բացակայում․ առանց սկաների վերբեռնումները պահվում են չստուգված, և
ադմինիստրատորը տեղեկացվում է․ առանց Gotenberg-ի ֆայլերն առաջարկվում են
ներբեռնելու, ոչ թե նախադիտելու համար․ առանց փոխարկիչի տեսանյութը նվագարկվում է
որպես սկզբնական ֆայլ։

Երրորդ կողմի բոլոր պատկերներն ու դրանց լիցենզիայի պարտավորությունները նշված են
`docker/third-party-containers.yaml`-ում։

### H5P ծառայության միացում <!--quire:connecting-an-h5p-provider-->

Quire-ը չի ներկառուցում կամ մատակարարում H5P գործարկման միջավայր կամ կողային
ծառայություն (ADR 0019)։ Եթե օգտագործում եք H5P, տրամադրեք սեփական հոսթավորված
բաժանորդագրությունը կամ Quire-ից առանձին շահագործեք սեփական հոսթավորված H5P
օրինակը։ Այդ մատակարարին գրանցեք որպես LTI 1.3 արտաքին գործիք և դրա
բովանդակությունն ավելացրեք դասընթացներին որպես գործիքի գործողություններ։
Quire-ը LTI Assignment and Grade Services (AGS)-ի միջոցով փոխանակում է
գնահատականներն ու գործողության կամ գնահատման առաջընթացը։ Եթե մատակարարն
ուղարկում է նաև xAPI հաղորդագրություններ, առանձին կազմաձևեք դրանք Quire-ի
xAPI հաղորդագրությունների պահոցի համար․ AGS-ի գնահատականի կամ առաջընթացի
փոխանակումը xAPI հաղորդագրություններ չի ուղարկում։ H5P գործողություններով
Moodle ներմուծումները նշվում են որպես LTI գործիքի կապ պահանջող։ Մատակարարը
շարունակում է պատասխանատու լինել իր H5P միջավայրի, հեղինակման գործիքների,
բովանդակության պահոցի և փորձերի պատմության համար։

Այս հոսթում սեփական հոսթավորված օրինակը գործարկելու համար `QUIRE_H5P_IMAGE`-ը
սահմանեք դրա պատկերով և գործարկեք `h5p` պրոֆիլը։ Compose-ը այն հրապարակում է
`QUIRE_H5P_PORT` (8090) պորտում, իսկ տվյալները պահում է `h5p-data` ծավալում․
պատկերն ու դրան առնչվող պարտավորությունները մնում են ձերը։

## Կարգավորումներ <!--quire:settings-->

Յուրաքանչյուր գործընթաց կարդում է `docker/.env` ֆայլը։ `docker/.env.example`
ձևանմուշում նշված են բոլոր կարգավորումները և դրանց լռելյայն արժեքները։
Խմբերն են՝

### Հասցեներ <!--quire:addresses-->

| Կարգավորում | Նշանակություն |
| --- | --- |
| `QUIRE_APP_ORIGIN` | LMS-ի հանրային հասցեն, օրինակ՝ `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Բովանդակության origin-ը՝ այլ հոսթում |
| `QUIRE_PLATFORM_DOMAINS` | Կազմակերպությունների տիրույթները՝ ստորակետերով բաժանված |
| `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`։ Այլ ուղեցույցներում տեսեք `vercel` և `cloudflare` արժեքները |
| `QUIRE_TRUSTED_PROXY_CIDRS` | Պրոքսիներ, որոնց `X-Forwarded-For` վերնագրին վստահում են |

### Գաղտնի արժեքներ <!--quire:secrets-->

| Կարգավորում | Նշանակություն |
| --- | --- |
| `QUIRE_SECRET_KEY` | Ստորագրում է աշխատաշրջաններն ու token-ները։ 64 հեքսադեցիմալ նիշ |
| `QUIRE_MASTER_KEY` | Փաթեթավորում է պահված հավատարմագրերը, օրինակ՝ SSO-ի և վեբհուքների գաղտնի բանալիները։ 32 բայթ՝ base64։ Վեբ շերտն ու աշխատողը պետք է ունենան նույն արժեքը։ Պտտում․ [key-rotation.md](/hy/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Գլխավոր բանալու տարբերակի պիտակն է․ եթե սահմանված չէ, `v1`։ Բանալու պտտման ժամանակ բարձրացրեք այն |
| `QUIRE_MASTER_KEY_RETIRED` | Հին գլխավոր բանալիներ, որոնք դեռ պետք են դրանցով կնքվածը կարդալու համար, օրինակ՝ `v1=<base64>`։ Հեռացրեք, երբ պտտումն ավարտվել է առանց չլուծված արժեքների |
| `QUIRE_COLLAB_SIGNING_KEY` | Համօգտագործվում է web-ի և collab-ի կողմից՝ խմբագրման token-ներ ստորագրելու համար |
| `QUIRE_BACKUP_SIGNING_KEY` | Ստորագրում է դասընթացների պահուստային պատճենները (կամընտիր) |

`QUIRE_MASTER_KEY`-ի պատճեն պահեք այս հոսթից առանձին։ Առանց դրա վերականգնված
տվյալների բազան չի կարող ապակոդավորել իր հավատարմագրերը։

### Տվյալների բազա <!--quire:database-->

| Կարգավորում | Նշանակություն |
| --- | --- |
| `POSTGRES_PASSWORD` | Սուպերօգտատիրոջ գաղտնաբառը, որն օգտագործում են կոնտեյներն ու պահուստավորումը |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | Դերերի գաղտնաբառերը, սահմանվում են առաջին մեկնարկին |
| `DATABASE_URL` | Հավելվածի դեր։ Տողի մակարդակով անվտանգությունը կիրառվում է դրա յուրաքանչյուր հարցման վրա |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | Միգրատորի դեր՝ `migrate`-ի և `init`-ի համար |
| `QUIRE_SUPERUSER_URL` | Օգտագործվում է միայն առաջին մեկնարկին |
| `QUIRE_REPORT_DATABASE_URL` | Հաշվետվությունների՝ միայն կարդալու դեր, հաշվետվությունների և դրանց կառուցման գործիքի համար |
| `QUIRE_AUDIT_DATABASE_URL` | Աուդիտի դեր՝ աուդիտի վահանակի և SIEM արտահանման համար |
| `QUIRE_DATABASE_ID` | Ցանկացած UUID, որը չի փոխվում տեղադրման ողջ կյանքի ընթացքում |

Դերերի գաղտնաբառերը կիրառվում են միայն տվյալների բազայի ծավալն առաջին անգամ
ստեղծելիս։ Հետագայում փոխելու համար օգտագործեք `ALTER ROLE`, ապա թարմացրեք
համապատասխան URL-ը։

`QUIRE_REPORT_DATABASE_URL`-ն օգտագործվում է `DATABASE_URL`-ով կազմաձևված
ֆիզիկական տվյալների բազայի համար։ Մյուս գրանցված ֆիզիկական բազաների համար
սահմանեք այդ բազայի սեփական `quire_report` կապի URL-ը web-ի ու worker-ի
միջավայրերում, ապա տվյալ բազայի **Reporting environment variable** դաշտում
մուտքագրեք փոփոխականի անունը՝ `env:NAME` տեսքով։ Հղումը պետք է ցույց տա նույն
տվյալների բազան, ինչ հավելվածի կապը, ցանկալի է՝ դրա կրկնօրինակը միայն կարդալու
համար։ Հաշվետվությունների յուրաքանչյուր էջ հաճախորդին ուղղորդում է դեպի
սեփական տվյալների բազայի հաշվետվության կապը՝ հաշվետվությունների կառուցման
գործիքը և պահպանված հաշվետվությունները, պլանավորված առաքումները,
հաշվետվությունների արտահանումը, վերլուծությունը, աուդիտի մատյանը, REST
աուդիտի ռեսուրսներն ու օգնականի աուդիտի որոնումը։ Դրանցից ոչ մեկը երբեք չի
օգտագործում մեկ այլ տվյալների բազայի հաշվետվության URL-ը։ Եթե տվյալների բազան
հաշվետվությունների կապ չունի, սովորական հաշվետվություններն օգտագործում են այդ
բազայի սեփական հավելվածի կապը, իսկ վերլուծությունն ու աուդիտի բոլոր
ընթերցումները մերժվում են ու հայտնում պատճառը, քանի որ հավելվածի դերը չի կարող
կարդալ աուդիտի հետքը։

### Վարորդներ <!--quire:drivers-->

| Կարգավորում | Այս թողարկման արժեքները | Նշումներ |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (լռելյայն), `s3` կամ `azure` | `local`-ը ֆայլերը պահում է `files` ծավալում։ `s3`-ն ընդգրկում է AWS S3-ը, R2-ի և GCS-ի փոխգործունակությունը, ինչպես նաև S3-ի հետ համատեղելի այլ պահեստներ՝ վերսկսվող բազմամաս վերբեռնումներով |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (լռելյայն), `sse`, `centrifugo` կամ `durable_objects` | `inprocess`-ը ճիշտ է մեկ վեբ կոնտեյների համար․ մի քանիսի դեպքում օգտագործեք `centrifugo` կամ `sse` |
| `QUIRE_CACHE_DRIVER` | `memory` (լռելյայն), `postgres` կամ `valkey` | `memory`-ը գործում է յուրաքանչյուր գործընթացի համար առանձին․ օգտագործեք `valkey` կամ `postgres`, որպեսզի սահմանաչափերը կիրառվեն կոնտեյներների միջև |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (լռելյայն) կամ `progressive_mp4` | Կամ հոսթավորված ծառայություն՝ Cloudflare Stream, Mux կամ Bunny՝ իրենց բանալիներով |
| `QUIRE_IMAGE_DRIVER` | `noop` (լռելյայն), `imgproxy` կամ `cloudflare` | `noop`-ը յուրաքանչյուր պատկեր մատուցում է սկզբնական չափով։ `imgproxy`-ին պետք է `images` պրոֆիլն ու ստորև տրված կարգավորումները․ `cloudflare`-ն օգտագործում է Cloudflare Images-ը |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` կամ `in_process` | Հարթակի լռելյայն ծառայությունն է ուղիղ հանդիպումների համար։ Եթե սահմանված չէ, ուղիղ հանդիպումները նշվում են չկազմաձևված, մինչև կազմակերպությունը սեփական հաշիվը միացնի Integrations, Live session provider բաժնում։ Կազմակերպության սեփական հաշիվը միշտ գերակայում է այս արժեքին։ Յուրաքանչյուր ծառայության կարգավորումները (`BBB_URL` և `BBB_SECRET`, `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*` և `JITSI_*` փոփոխականները) կարդացվում են միայն այստեղ նշված ծառայության համար |
| `QUIRE_MEETING_REGIONS` | Ստորակետերով բաժանված `eu`, `uk`, `us` արժեքների ցանկ | Հարթակի լռելյայն ծառայությունը որտեղ է մշակում հանդիպումները։ Եթե սահմանված չէ, նախկինի պես չի ստուգվում տարածաշրջանին ամրագրված կազմակերպության համեմատ։ Կազմակերպության սեփական հաշվի էջում նշվում են դրա տարածաշրջանները |

Այս թողարկման մեջ բացակայող վարորդի արժեքը մերժվում է, երբ վեբ շերտը
գործարկվում է․ մատյանում նշվում է կարգավորումը, այլ ոչ թե այն լուռ փոխարինվում
լռելյայնով։

### Պատկերներ <!--quire:images-->

Էջերը պատկերներ են պահանջում չորս ֆիքսված չափով՝
`/api/files/{id}/image/{size}` հասցեով։ Այն ստուգում է նույն հասանելիությունը,
ինչ ֆայլը, ապա վերահասցեագրում դեպի պատկերների ծառայություն։ Յուրաքանչյուր
կազմակերպություն կարող է մեկ ժամում պահանջել
`QUIRE_IMAGE_SPECS_PER_HOUR`-ով սահմանված (լռելյայն՝ 2000) նոր պատկերների և
չափերի զույգեր․ այդ ժամում արդեն ստեղծված չափերը չեն հաշվվում։ Մեկից ավելի
վեբ կոնտեյների դեպքում օգտագործեք `valkey` կամ `postgres`՝
`QUIRE_CACHE_DRIVER`-ի համար, որպեսզի սահմանը գործի բոլորում։

| Կարգավորում | Վարորդ | Նշումներ |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Հասցեն, որով զննարկիչները հասնում են imgproxy-ին, օրինակ՝ `https://images.example.org`։ `images` պրոֆիլը հրապարակում է այն `QUIRE_IMAGES_PORT`-ում (8082) |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | Հեքսադեցիմալ տողեր՝ imgproxy-ի գործարկման ժամանակ օգտագործվող նույն արժեքները։ Յուրաքանչյուրը գեներացրեք `openssl rand -hex 32`-ով։ Quire-ը դրանցով ստորագրում է յուրաքանչյուր պատկերի հասցեն, ուստի imgproxy-ն չի մատուցի Quire-ի չպահանջած ոչինչ |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | `imgproxy`՝ տեղային պահեստով | Որտեղից է imgproxy-ն ստանում սկզբնական պատկերները։ Compose-ը սահմանում է `http://web:3000`։ `s3` կամ `azure` պահեստի դեպքում imgproxy-ն ստանում է դրանք bucket-ից, և սա չի օգտագործվում |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | Images-ը խմբագրելու իրավունք ունեցող API token և Images, Developer resources բաժնում տրվող հաշվի hash-ը։ Հաշվում միացրեք ճկուն տարբերակները |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | Կամընտիր։ Սահմանելիս պատկերները մասնավոր են, և յուրաքանչյուր հասցե ստորագրվում ու ժամկետանց է դառնում։ Առանց դրա պատկերները հրապարակային են՝ `QUIRE_SECRET_KEY`-ից ստացված հասցեներով, որոնք ոչ ոք չի կարող գուշակել |

Cloudflare Images-ը պահում է իր մատուցած յուրաքանչյուր սկզբնական պատկերի
սեփական պատճենը։ Ֆայլ ջնջելիս աշխատողը ջնջում է այդ պատճենը՝ սկզբնականից առաջ։

### Հերթ <!--quire:queue-->

Ֆոնային աշխատանքներն օգտագործում են pg-boss-ը նույն Postgres տվյալների բազայում,
ուստի հերթի առանձին ծառայություն գործարկելու կամ որևէ բան կազմաձևելու կարիք
չկա։ Աշխատանքները հերթ են դրվում դրանք առաջացրած փոփոխության հետ նույն
գործարքում, ուստի խափանումը չի կարող կորցնել աշխատանքը կամ այն երկու անգամ
ուղարկել։ Այստեղ `QUIRE_QUEUE_DRIVER`-ը լռելյայն `pgboss` է․ `vercel` և
`cloudflare` արժեքները միայն թեթև ծանուցումներն ու վեբհուքների առաքումներն են
տեղափոխում հարթակի սեփական հերթ, իսկ Vercel-ի ու Cloudflare-ի ուղեցույցները
նկարագրում են դրանք և այն, թե ինչպես են իրենց վեբ շերտերը աշխատանքները հերթում։

### Էլ․ փոստ <!--quire:email-->

Սահմանեք հետևյալներից մեկը․

- `QUIRE_EMAIL_PROVIDER_CONFIG`․ HTTP ծառայությունն ու դրա հավատարմագրերը
  նշող JSON օբյեկտ, օրինակ՝ `{"provider":"postmark","token":"..."}`։
  Աջակցվում են Postmark, Amazon SES, Mailgun, SendGrid և Resend ծառայությունները։
- `QUIRE_SMTP_URL`․ `smtp://user:password@host:587`։ Միայն այս թիրախն է այն
  աջակցում․ սերվերլես թիրախներն արգելափակում են SMTP-ը։

`QUIRE_MAIL_FROM`-ը ուղարկողի հասցեն է։ Quire-ը փորձելու համար գործարկեք
`devmail` պրոֆիլը, սահմանեք `QUIRE_SMTP_URL=smtp://mailpit:1025` և կարդացեք
նամակները `http://localhost:8025` հասցեում։

### Կամընտիր ծառայություններ <!--quire:optional-services-->

| Կարգավորում | Պրոֆիլով |
| --- | --- |
| `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` կամ `QUIRE_MEILISEARCH_URL` | Արտաքին որոնում, հակառակ դեպքում՝ Postgres-ի ամբողջական տեքստով որոնում |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Գաղտնաբառի արտահոսքի ստուգում։ Լռելյայն միացված է `api.pwnedpasswords.com`-ի միջոցով (ուղարկվում է hash-ի միայն հինգ նիշանոց նախածանցը)․ `off`-ը անջատում է այն, իսկ URL-ը մատնանշում է ձեր հոսթավորած միջակայքի API-ն |

### Դիտարկելիություն <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT`-ը նշում է սերվերը, որին յուրաքանչյուր գործընթաց
ուղարկում է հետագծերն ու չափիչները․ `observability` պրոֆիլով այն
`http://otelcol:4318` է, իսկ `docker/otel-collector.yaml` ֆայլում եք ավելացնում
արտահանիչը ձեր հետնամասի համար։ Սահմանելիս վեբ շերտը, աշխատողը, ժամանակացույցը,
բովանդակության ծառայությունն ու collab գործընթացը OTLP/HTTP-ով արտահանում են
միջակայքերը (վեբ հարցումներ, հաճախորդների տվյալների բազայի գործարքներ,
աշխատողի գործեր և ելքային կանչեր) և ամեն րոպե ուղարկում չափիչները նույն
վերջնակետին (`OTEL_METRICS_EXPORTER=none`-ն անջատում է դրանք)։
`OTEL_TRACES_SAMPLER_ARG`-ը սահմանում է պահվող հետագծերի բաժինը։ Մատյանները
գրվում են ստանդարտ ելքում՝ `LOG_LEVEL` մակարդակով, իսկ Compose-ը պտտում է
դրանք։ Հետագծերը երբեք անձնական տվյալներ չեն պարունակում։

### Տարածաշրջանային ելք (ԵՄ տվյալների ռեզիդենտություն) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` նշանակում է, որ կլաստերը սպասարկում է Եվրոպական միության
կազմակերպություններին։ Աշխատողն այնուհետև ԵՄ-ին ամրագրված կազմակերպության
համար արված յուրաքանչյուր ելքային հարցում սահմանափակում է թույլատրելի
հոսթերի ցանկով (21-compliance.md փաստաթղթի 8.1 բաժին)։ Ցանկը ներառում է այն
հոսթերը, որոնք կազմաձևված ծառայությունները հայտարարում են տարածաշրջանի համար
(պահեստի վերջնակետ, էլ․ փոստի ծառայություն, հոսթավորված տեսանյութի ծառայություն,
կազմակերպության սեփական պահեստի թիրախներ, ԱԲ ծառայություններ և էլ․ փոստի հաշիվ),
ակտիվ բացառությամբ ընդգրկված ծառայությունների հոսթերը և
`QUIRE_EGRESS_ALLOW_HOSTS`-ում ձեր թվարկած հոսթերը։ Այլ հանրային հոսթին ուղղված
հարցումը մերժվում է մինչև ուղարկվելը, մերժումը գրանցվում է կազմակերպության
աուդիտի հետքում որպես `privacy/egress_refused` և թվարկվում է Compliance, Data
residency բաժնում։

| Կարգավորում | Արժեքներ | Ազդեցություն |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Ստորակետերով բաժանված հոսթանունների ցանկ կամ `*.example.org`՝ յուրաքանչյուր ենթատիրույթի համար | Լրացուցիչ հոսթեր, որոնց ԵՄ կազմակերպությունը կարող է հասնել։ Վեբհուքի, xAPI-ի և SIEM-ի վերջնակետերը, բլոգի լրահոսերը և Amazon SES-ի հոսթերը պետք է լինեն այստեղ, քանի որ դրանք կազմակերպության ընտրությունն են, և ոչ մի ծառայություն չի հայտարարում դրանք։ Loopback, մասնավոր հասցեներն ու `web` կամ `clamav` նման մեկ պիտակ ունեցող անունները ձեր սեփական ցանցն են և երբեք չեն ստուգվում |

ՄԹ և ԱՄՆ կազմակերպությունները հոսթերի ցանկով չեն սահմանափակվում․ դրանց համար
շարունակում են գործել ծառայությունների տարածաշրջանային ստուգումները։ Ցանկը
սահմանեք աշխատողի վրա․ ադմինիստրատորի էջը կարդում է այն վեբ շերտում՝ թույլատրելի
հոսթերը ցուցադրելու համար, ուստի տեղադրեք `docker/.env`-ում, որը կարդում են
բոլոր ծառայությունները։

Հավելվածի ստուգումն ապահովում է հստակ սխալ և աուդիտի գրառում, բայց դա երաշխիք
չէ․ կոդը կարող է սխալ լինել։ Երաշխիքը ցանցն է։ Compose-ը դա ձեր փոխարեն չի
ապահովում։ Տարածաշրջանային կլաստերի համար `worker` և `web` ծառայությունները
տեղադրեք `internal: true` ցանցում, որի միակ ելքը ելքային պրոքսին է (օրինակ՝
Squid կամ tinyproxy կոնտեյներ), որն թույլատրում է նույն հոսթերը, ինչ
`QUIRE_EGRESS_ALLOW_HOSTS`-ը, գումարած կազմաձևված ծառայությունների հոսթերը,
և այդ ծառայությունների համար սահմանեք `HTTPS_PROXY`։ Ռեզիդենտության էջում
թվարկված են հավելվածի թույլատրած ճշգրիտ հոսթերը, որպեսզի երկու ցանկերը
հնարավոր լինի համեմատել։

## Առողջություն <!--quire:health-->

| Վերջնակետ | Նշանակություն |
| --- | --- |
| `/healthz` | Կենսունակություն․ գործընթացը պատասխանում է։ Compose-ի առողջության ստուգումներն օգտագործում են սա |
| `/readyz` | Պատրաստություն․ կախվածությունները հասանելի են, և յուրաքանչյուր կամընտիր ծառայության համար նշվում է՝ կազմաձևված է, թե ոչ։ Ուղղեք բեռնաբաշխիչն այստեղ |

`docker compose -f docker/compose.yaml ps`-ը ցույց է տալիս յուրաքանչյուր
ծառայության առողջությունը։

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

`proxy` ծառայությունը (Caddy, Apache-2.0, `docker/caddy/Caddyfile`) լռելյայն
կլաստերի մաս է։ Այն պատասխանում է 80 և 443 պորտերում ու երթուղավորում է՝

| Հոսթ կամ ուղի | Ուղղվում է դեպի |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, հաճախորդների յուրաքանչյուր ենթատիրույթ և անհատական տիրույթ | `web` |
| `/_collab/` այդ հոսթերի վրա | `collab` (WebSocket, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` այդ հոսթերի վրա | `centrifugo`-ի հաճախորդի WebSocket․ սերվերի API-ն երբեք չի բացվում |
| `/_images/` այդ հոսթերի վրա | `imgproxy`՝ `images` պրոֆիլով (`IMGPROXY_URL`) |

`init-env.sh`-ը երկու origin-ներից ստանում է `QUIRE_PROXY_APP_HOST`,
`QUIRE_PROXY_CONTENT_HOST`, `QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` և
`IMGPROXY_URL`, որպեսզի դրանք չտարբերվեն։ Origin-ը ձեռքով փոխելիս խմբագրեք
դրանք միասին։

Հավաստագրերը կախված են `QUIRE_PROXY_TLS`-ից․

- `internal` (լռելյայն)․ Caddy-ի սեփական հավաստագրման կենտրոնը՝ `localhost`,
  `*.localhost` և `lvh.me` անունների համար։ Մեկ անգամ վստահեք արմատային
  հավաստագրին, ապա այցելեք կայք․

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

  Ավելացրեք `quire-local-ca.crt`-ը համակարգի կամ զննարկիչի վստահելի
  հավաստագրերի պահոց։ `curl`-ն այն ստանում է `--cacert`-ով։
- Էլ․ փոստի հասցե․ իրական հոսթանունների համար ACME հավաստագրերն ավտոմատ են
  (նախ՝ Let's Encrypt, ապա՝ ZeroSSL)։ Երկու origin-ների և յուրաքանչյուր
  հաճախորդի հոսթի DNS-ը պետք է մատնանշի այստեղ, իսկ 80 ու 443 պորտերը պետք է
  հասանելի լինեն ինտերնետից։

Հաճախորդի հոսթերի հավաստագրերը տրվում են ըստ պահանջի՝ առաջին այցելության
ժամանակ, և միայն երբ web-ը հաստատում է, որ անունը պատկանում է այս տեղադրմանը
(`/tls-allowed`, հարցումը՝ Compose ցանցից)։ Չի պահանջվում wildcard
հավաստագիր կամ DNS ծառայության plugin, և հոսթին ուղղված անուն ունեցող անծանոթը
չի կարող ստիպել հավաստագիր պահանջել։ Հավաստագրերն ու տեղային կենտրոնը
`caddy-data` ծավալում են․ `internal`-ը օգտագործելիս պահուստավորեք այն մնացածի
հետ։

Web-ը հավատում է միայն պրոքսիի `X-Forwarded-For`-ին․ պրոքսին ունի հաստատուն
հասցե (`QUIRE_PROXY_ADDRESS`, լռելյայն `172.29.64.10`)՝ հաստատուն ենթացանցում
(`QUIRE_COMPOSE_SUBNET`), իսկ `QUIRE_TRUSTED_PROXY_CIDRS`-ը նշում է այդ հասցեն։
Եթե ենթացանցը համընկնում է հոսթի ցանցի հետ, փոխեք երկուսն ու գործարկեք
`docker compose down` նախքան `up` հրամանը։

## Ձեր սեփական հակադարձ պրոքսիի հետևում <!--quire:behind-your-own-reverse-proxy-->

Փոխարենն արդեն գործարկվող բեռնաբաշխիչը կամ պրոքսին օգտագործելու համար
բաց թողեք `proxy` ծառայությունը (`docker compose up -d --scale proxy=0`) և
ավարտեք TLS-ը `web` (8080), `content` (8081), `collab` (1234, WebSocket) և
`centrifugo` (8000, WebSocket) ծառայություններից առաջ։ Սահմանեք հանրային
հասցեները `QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN` և `QUIRE_COLLAB_URL`
(`wss://`)-ում, իսկ պրոքսիի հասցեների միջակայքը՝ `QUIRE_TRUSTED_PROXY_CIDRS`-ում։

## Խնդիրների լուծում <!--quire:troubleshooting-->

- `init`-ը ավարտվում է «QUIRE_DATABASE_ID is not a UUID» սխալով․ սահմանեք այն
  `uuidgen` հրամանով։
- `web`-ը վերագործարկվում է «did not start on compose» հաղորդագրությամբ․
  մատյանում նշվում են չընդունվող կարգավորումները և դրանց փոխարեն օգտագործվողները։
- Առաջին մեկնարկից հետո `.env`-ում դերի գաղտնաբառը փոխելն ազդեցություն չունի․
  սկզբնավորման սկրիպտը գործարկվում է մեկ անգամ։ Օգտագործեք `ALTER ROLE`։
- Վերբեռնումը ձախողվում է սկանավորման սխալով, երբ սահմանված է `CLAMAV_URL`․
  ClamAV-ն առաջին մեկնարկին ներբեռնում է ստորագրությունները, ինչը կարող է մի քանի
  րոպե տևել։

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