---
title: "Enstale Quire avèk Docker Compose"
description: "Enstale Quire sou pwòp enfrastrikti w avèk Docker Compose."
image: "https://docs.quirelms.com/og.png"
---

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

# Enstale Quire avèk Docker Compose

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

Sa a se pwodwi konplè a sou yon sèl host: LMS la, travay an aryè-plan li yo, sèvis reyalite-a-kounye a ak koreksyon an kolaborasyon, ansanm ak tout sèvis opsyonèl ki dèyè yon pwofil. Konsepsyon an nan `docs/architecture/23-ops.md`, seksyon 2.

Lòt sib: [Vercel](/ht/ops/vercel/) ak [Cloudflare Workers](/ht/ops/cloudflare/) kouri web tier la sèlman. Enfòmasyon sou mizajou nan [upgrade.md](/ht/ops/upgrade/), epi sou backup ak egzèsis restorasyon nan [backup-restore.md](/ht/ops/backup-restore/).

## Sa ou bezwen <!--quire:what-you-need-->

- Docker Engine 27 oswa pi resan, avèk Compose plugin 2.30 oswa pi resan.
- 4 nwayo CPU ak 8 GB memwa pou stack default la; 8 nwayo ak 16 GB avèk `--profile full` (ClamAV poukont li kenbe apeprè 1.5 GB siyati).
- Yon non DNS pou web tier la ak yon lòt pou kontni ki pa fyab. Yo dwe sou host diferan: pakè SCORM ak HTML telechaje yo kouri nan content origin lan, konsa yo pa kapab li cookies LMS la.
- Pou yon tès lokal, `lvh.me` ak `*.localhost` mennen nan 127.0.0.1, menm jan `docker/.env.example` konfigire l. Sèvis `proxy` stack la sèvi toude sou https ak pwòp otorite sètifika lokal li; konsa, pa bezwen enstale lòt bagay (gade "TLS").
- Pò 80 ak 443 yo dwe lib sou host la (`QUIRE_PROXY_HTTP_PORT` ak `QUIRE_PROXY_HTTPS_PORT` kapab deplase yo).

## Premye demaraj <!--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` ekri `docker/.env` apati `docker/.env.example`; li jenere tout sekrè yo (modpas bazdone, kle siyati ak kle prensipal, pè kle lansman kontni) ansanm ak kle siyati pwen verifikasyon odit la nan `docker/secrets/audit-signing-key.pem`. Compose monte dènye a nan worker yo kòm sekrè. Script la bezwen sèlman `sh`, `awk` ak `openssl`; li refize ranplase yon `docker/.env` ki deja egziste. Kopye toude fichye yo deyò host sa a: san `QUIRE_MASTER_KEY`, yon bazdone retabli pa kapab dechifre kalifikatif li estoke. Pou ranpli fichye a alamen pito, kouri `cp docker/.env.example docker/.env`; fichye a esplike fason pou jenere chak sekrè.

Toude origin yo dwe `https`: sèvis kontni an refize http senp nan pwodiksyon, epi yo pa dwe pataje yon domèn registrab. Sèvis `proxy` a fini TLS pou toude (gade "TLS"); `init-env.sh` refize yon origin `http://`.

Stack la kòmanse nan yon lòd fiks, epi chak etap tann etap anvan an:

1. `postgres` vin an sante. Nan premye demaraj la sèlman, init script li a (`docker/postgres/init/90-passwords.sh`) mete modpas kat wòl yo.
2. `migrate` aplike chak migration epi inisyalize ke travay yo nan bazdone kontwòl la ansanm ak chak bazdone tenant dedye; li verifye yo tout dakò, apre sa li sòti (docs/ops/upgrade.md). Migration yo kouri nan chak demaraj epi yo idempotent; donk, yon mizajou mande yon nouvo image epi yon rekòmansman.
3. `init` (`apps/web/src/first-run.ts`) anrejistre bazdone aplikasyon an anba `QUIRE_DATABASE_ID`; lè `QUIRE_SETUP_ADMIN_EMAIL` fikse, li kreye premye òganizasyon an ak administratè li. Yo montre adrès koneksyon ak modpas jenere a yon sèl fwa nan `docker compose logs init`.
4. `web`, `content`, `worker`, `scheduler`, `collab` ak `centrifugo` kòmanse.
5. `proxy` kòmanse lè `web` ak `content` vin an sante.

Louvri `https://demo.` ansanm ak domèn aplikasyon w lan (log `init` bay adrès koneksyon egzak la), epi konekte. Sou enstalasyon lokal, fè òdinatè w oswa navigatè w fè konfyans otorite sètifika proxy a anvan (gade "TLS"). Chanje modpas jenere a nan `/account/security`.

Yon pwosesis ki kòmanse san sekrè obligatwa a refize demare epi bay non paramèt ki manke a nan log li. Anyen pa kòmanse avèk konfigirasyon enkonplè.

## Sèvis ak pwofil <!--quire:services-and-profiles-->

| Sèvis | Pwofil | Sa li fè |
| --- | --- | --- |
| postgres | toujou | Bazdone a (PostgreSQL 18 ak pgvector, konstwi apati `docker/postgres.Dockerfile`), WAL achive depi premye demaraj |
| migrate, init | toujou | Yon sèl ekzekisyon: migration, apre sa premye demaraj |
| web | toujou | LMS la, sou `QUIRE_HTTP_PORT` (8080) |
| content | toujou | Content origin ki pa fyab, sou `QUIRE_CONTENT_PORT` (8081) |
| worker | toujou | Travay an aryè-plan: imèl, rapò, tretman fichye, webhook |
| scheduler | toujou | Travay peryodik: anrejistre 64 runtime schedule epi remèt yo bay worker; yon sèl lidè alafwa |
| collab | toujou | Websocket koreksyon an kolaborasyon, sou `QUIRE_COLLAB_HTTP_PORT` (1234) |
| centrifugo | toujou | Distribisyon reyalite-a-kounye a, sou `QUIRE_REALTIME_PORT` (8000) |
| proxy | toujou | Caddy, antre TLS la sou pò 80 ak 443 (gade "TLS") |
| valkey | `cache` | Kach ak limit demann |
| clamav | `scan` | Analiz malveyan nan fichye telechaje |
| gotenberg | `preview` | Aperçu Office an PDF, rann sètifika |
| imgproxy | `images` | Redimansyon ak konvèsyon imaj |
| transcoder | `video` | Image worker ki gen ffmpeg LGPL sèlman, pou rann vèsyon videyo |
| seaweedfs | `storage` | Depo objè konpatib S3 sou host sa a |
| otelcol | `observability` | Collector OpenTelemetry |
| mailpit | `devmail` | Ranmase tout imèl k ap soti, pou eseye Quire |
| backup | `backup` | Sovgad baz ki kouri yon sèl fwa; gade backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | Sovgad baz chak `QUIRE_BACKUP_INTERVAL_HOURS`, epi kopi chiffres deyò host avèk egzèsis verifikasyon chak semèn |
| h5p | `h5p` | Image zouti H5P LTI 1.3 ou bay la nan `QUIRE_H5P_IMAGE`, sou `QUIRE_H5P_PORT` (8090); gade "Konekte ak yon founisè H5P" |

`--profile full` kòmanse tout sèvis opsyonèl sof `backup` ak `h5p`. Pou kòmanse youn, kouri `docker compose -f docker/compose.yaml --profile scan up -d`. Quire toujou mache san sèvis opsyonèl epi li di sa ki manke: san analiz, yo estoke upload yo san tès epi yo avèti administratè a; san Gotenberg, yo ofri fichye yo pou telechajman olye aperçu; san transcoder, videyo a jwe kòm fichye orijinal la.

Yo bay lis chak image twazyèm pati ak obligasyon lisans li nan `docker/third-party-containers.yaml`.

### Konekte ak yon founisè H5P <!--quire:connecting-an-h5p-provider-->

Quire pa entegre ni distribye yon runtime oswa sidecar H5P (ADR 0019). Si w sèvi ak H5P, pran pwòp abònman akomode w oswa opere yon enstans H5P oto-akomode apa ak Quire. Anrejistre founisè sa a kòm zouti ekstèn LTI 1.3 epi ajoute kontni li nan kou kòm aktivite zouti. Quire echanje nòt ak pwogrè aktivite/koreksyon atravè LTI Assignment and Grade Services (AGS). Si founisè a voye xAPI statement tou, konfigire sa separeman pou statement store xAPI Quire a; echanj nòt/pwogrè AGS pa voye xAPI statement. Enpòtasyon Moodle rapòte aktivite H5P kòm aktivite ki bezwen koneksyon zouti LTI. Founisè a rete responsab runtime H5P li, zouti kreyasyon, bank kontni ak istwa tantativ.

Pou kouri pwòp enstans oto-akomode pa w sou host sa a, mete `QUIRE_H5P_IMAGE` sou image li a epi kòmanse pwofil `h5p` la. Compose pibliye li sou `QUIRE_H5P_PORT` (8090) epi konsève done li nan volume `h5p-data`; image la ak tout obligasyon ki mache avè l rete pou ou.

## Paramèt <!--quire:settings-->

Chak pwosesis li `docker/.env`. Modèl la, `docker/.env.example`, bay lis chak paramèt ak valè default li. Men gwoup yo:

### Adrès <!--quire:addresses-->

| Paramèt | Siyifikasyon |
| --- | --- |
| `QUIRE_APP_ORIGIN` | Adrès piblik LMS la, tankou `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Content origin lan, sou yon lòt host |
| `QUIRE_PLATFORM_DOMAINS` | Domèn òganizasyon yo anba, separe ak vigil |
| `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` isit la. Gade lòt gid yo pou `vercel` ak `cloudflare` |
| `QUIRE_TRUSTED_PROXY_CIDRS` | Proxy yo fè konfyans sou `X-Forwarded-For` yo voye a |

### Sekrè <!--quire:secrets-->

| Paramèt | Siyifikasyon |
| --- | --- |
| `QUIRE_SECRET_KEY` | Siyen sesyon ak token. 64 karaktè hexadesimal |
| `QUIRE_MASTER_KEY` | Vlope kalifikatif estoke tankou sekrè SSO ak webhook. 32 bytes, base64. Web tier ak worker dwe gen menm valè a. Wotasyon: [key-rotation.md](/ht/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Etikèt vèsyon kle prensipal la; `v1` si pa gen valè. Ogmante li lè w chanje kle a |
| `QUIRE_MASTER_KEY_RETIRED` | Ansyen kle prensipal ki toujou nesesè pou li sa yo te sele avèk li, sou fòm `v1=<base64>`. Retire li lè wotasyon an fini san anyen poko rezoud |
| `QUIRE_COLLAB_SIGNING_KEY` | Web ak collab pataje li pou siyen token koreksyon |
| `QUIRE_BACKUP_SIGNING_KEY` | Siyen backup kou yo (opsyonèl) |

Kenbe yon kopi `QUIRE_MASTER_KEY` yon lòt kote pase sou host sa a. Yon bazdone retabli san li pa ka dechifre kalifikatif li genyen yo.

### Bazdone <!--quire:database-->

| Paramèt | Siyifikasyon |
| --- | --- |
| `POSTGRES_PASSWORD` | Modpas superuser; container ak sovgad yo itilize li |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | Modpas wòl yo, yo mete nan premye demaraj |
| `DATABASE_URL` | Wòl aplikasyon an. Sekirite nivo liy aplike nan chak demann li fè |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | Wòl migrator a, pou `migrate` ak `init` |
| `QUIRE_SUPERUSER_URL` | Yo sèvi avè l sèlman nan premye demaraj |
| `QUIRE_REPORT_DATABASE_URL` | Wòl lekti-sèlman pou rapò ak zouti kreyasyon rapò a |
| `QUIRE_AUDIT_DATABASE_URL` | Wòl odit la, pou konsòl odit ak ekspòtasyon SIEM |
| `QUIRE_DATABASE_ID` | Nenpòt UUID, li pa chanje pandan tout dire enstalasyon an |

Yo aplike modpas wòl yo sèlman premye fwa yo kreye volume bazdone a. Pou chanje youn apre sa, sèvi ak `ALTER ROLE` epi mete URL ki koresponn lan ajou.

Yo sèvi ak `QUIRE_REPORT_DATABASE_URL` pou bazdone fizik `DATABASE_URL` konfigire a. Pou nenpòt lòt bazdone fizik ki anrejistre, mete pwòp URL koneksyon `quire_report` pa li nan anviwònman web ak worker yo, epi mete non varyab la nan chan **Reporting environment variable** bazdone sa a kòm `env:NAME`. Referans lan dwe montre menm bazdone ak koneksyon app li a, de preferans yon kopi lekti. Chak ekran rapò swiv tenant la pou rive nan koneksyon rapò pwòp bazdone pa li: zouti kreyasyon ak rapò sove yo, livrezon pwograme, ekspòtasyon rapò, analytics, jounal odit, resous odit REST ak rechèch odit asistan an. Okenn ladan yo pa janm prete URL rapò yon lòt bazdone. Lè yon bazdone pa gen koneksyon rapò, rapò òdinè yo sèvi ak pwòp koneksyon aplikasyon bazdone sa a; analytics ak tout lekti odit yo refize epi di rezon an, paske wòl aplikasyon an pa kapab li rejis odit la.

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

| Paramèt | Nan vèsyon sa a | Nòt |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (default), `s3` oswa `azure` | `local` konsève fichye yo nan volume `files`. `s3` kouvri AWS S3, R2, entèoperabilite GCS ak lòt depo konpatib S3, avèk upload multipart ki reprann apre entèripsyon |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (default), `sse`, `centrifugo` oswa `durable_objects` | `inprocess` apwopriye pou yon web container; sèvi ak `centrifugo` oswa `sse` lè gen plizyè |
| `QUIRE_CACHE_DRIVER` | `memory` (default), `postgres` oswa `valkey` | `memory` separe pou chak pwosesis; sèvi ak `valkey` oswa `postgres` pou limit demann yo mache atravè plizyè container |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (default) oswa `progressive_mp4` | Oswa founisè akomode: Cloudflare Stream, Mux oswa Bunny, ak kle pa yo |
| `QUIRE_IMAGE_DRIVER` | `noop` (default), `imgproxy` oswa `cloudflare` | `noop` sèvi chak imaj nan gwosè orijinal li. `imgproxy` bezwen pwofil `images` la ak paramèt ki pi ba yo; `cloudflare` sèvi ak Cloudflare Images |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` oswa `in_process` | Founisè default platfòm la pou sesyon an dirèk. Si pa fikse, sesyon yo parèt pa konfigire jiskaske yon òganizasyon konekte pwòp kont li anba Integrations, Live session provider. Kont òganizasyon an toujou pase anvan valè sa a. Yo li paramèt chak founisè (`BBB_URL` ak `BBB_SECRET`, varyab `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*` ak `JITSI_*`) sèlman pou founisè yo nonmen isit la |
| `QUIRE_MEETING_REGIONS` | Lis `eu`, `uk`, `us` separe ak vigil | Rejyon kote founisè default platfòm la trete reyinyon yo. Si pa fikse, tankou anvan, yo pa konpare li ak rejyon yon òganizasyon fikse. Kont pa òganizasyon an bay rejyon li yo sou pwòp paj li |

Lè web tier la kòmanse, li refize yon valè driver vèsyon sa a pa genyen epi li nonmen paramèt la, olye li ranplase li an silans ak default la.

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

Paj yo mande imaj nan kat gwosè fiks atravè `/api/files/{id}/image/{size}`. Endpoint sa a verifye menm dwa aksè ak fichye a, epi li redirije sou sèvis imaj la. Chak òganizasyon kapab mande jiska `QUIRE_IMAGE_SPECS_PER_HOUR` (default 2000) nouvo pè imaj-ak-gwosè pa èdtan; gwosè ki te deja pwodui nan menm èdtan an pa konte. Lè gen plis pase yon web container, sèvi ak `valkey` oswa `postgres` pou `QUIRE_CACHE_DRIVER` pou limit la aplike sou tout yo.

| Paramèt | Driver | Nòt |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Adrès browser yo itilize pou rive nan imgproxy, pa egzanp `https://images.example.org`. Pwofil `images` la pibliye li sou `QUIRE_IMAGES_PORT` (8082) |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | Chèn hexadesimal, menm valè yo sèvi lè yo demare imgproxy. Jenere yo chak avèk `openssl rand -hex 32`. Quire siyen chak adrès imaj ak valè sa yo, konsa imgproxy pa rann imaj Quire pa t mande |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | `imgproxy` ak depo lokal | Kote imgproxy pran imaj orijinal yo. Compose mete `http://web:3000`. Avèk depo `s3` oswa `azure`, imgproxy pran yo nan bucket la epi li pa itilize paramèt sa a |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | Token API ki gen dwa modifye Images, ak account hash ki nan Images, Developer resources. Aktive flexible variants pou kont lan |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | Opsyonèl. Lè li fikse, imaj yo prive epi chak adrès siyen epi ekspire. San li, imaj yo piblik nan adrès ki derive apati `QUIRE_SECRET_KEY` epi pèsonn pa ka devine yo |

Cloudflare Images kenbe pwòp kopi chak imaj orijinal li sèvi. Lè yo efase yon fichye, worker la efase kopi sa a anvan orijinal la.

### Ke travay <!--quire:queue-->

Travay an aryè-plan yo sèvi ak pg-boss nan menm bazdone Postgres la, donk pa gen sèvis ke pou kouri ni anyen pou konfigire. Yo mete travay nan ke nan menm transaction ak chanjman ki te kreye yo, konsa yon aksidan pa pèdi ni voye menm travay la de fwa. Isit la `QUIRE_QUEUE_DRIVER` default la se `pgboss`; `vercel` ak `cloudflare` voye sèlman livrezon notifikasyon lejè ak webhook nan ke platfòm yo. Gid Vercel ak Cloudflare yo dekri yo ak fason web tier pa yo mete travay nan ke.

### Imèl <!--quire:email-->

Mete youn nan paramèt sa yo:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: yon objè JSON ki nonmen yon founisè HTTP ak kalifikatif li, tankou `{"provider":"postmark","token":"..."}`. Postmark, Amazon SES, Mailgun, SendGrid ak Resend disponib.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. Se sib sa a sèlman ki pèmèt li; sib serverless yo bloke SMTP.

Moun k ap voye a se `QUIRE_MAIL_FROM`. Pou eseye Quire, kòmanse pwofil `devmail` la, mete `QUIRE_SMTP_URL=smtp://mailpit:1025` epi li imèl yo nan `http://localhost:8025`.

### Sèvis opsyonèl <!--quire:optional-services-->

| Paramèt | Avèk pwofil |
| --- | --- |
| `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` oswa `QUIRE_MEILISEARCH_URL` | Rechèch ekstèn; sinon rechèch tèks konplè Postgres |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Verifikasyon modpas ki te deja konpwomèt. Aktive pa default sou `api.pwnedpasswords.com` (yo voye sèlman senk premye karaktè yon hash); `off` dezaktive li, epi URL la ka montre sou yon range API ou òganize |

### Obsèvabilite <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` bay non collector chak pwosesis voye tras ak mezi yo. Avèk pwofil `observability`, li se `http://otelcol:4318`; ajoute exporter backend pa w la nan `docker/otel-collector.yaml`. Lè paramèt la fikse, pwosesis web tier, worker, scheduler, content ak collab voye span sou OTLP/HTTP (demann web, transaction bazdone tenant, travay worker ak apèl sortan) ak mezi sou menm endpoint chak minit (`OTEL_METRICS_EXPORTER=none` fèmen mezi yo). `OTEL_TRACES_SAMPLER_ARG` fikse pwopòsyon tras yo konsève. Log yo ale sou standard output nan nivo `LOG_LEVEL`, epi Compose vire yo. Tras pa pote done pèsonèl.

### Trafik sortan rejyonal (rezidans done EU) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` di stack la sèvi òganizasyon nan Inyon Ewopeyen. Worker la kenbe chak demann sortan yon òganizasyon ki fikse nan EU nan limit yon allowlist (21-compliance.md seksyon 8.1). Allowlist la se host sèvis konfigire yo deklare pou rejyon an (endpoint depo a, founisè imèl la, founisè videyo akomode a, sib depo òganizasyon an, founisè IA ak kont imèl), host sèvis ki anba derogasyon aktyèl yo ak host ou mete nan `QUIRE_EGRESS_ALLOW_HOSTS`. Yo refize yon demann pou nenpòt lòt host piblik anvan li soti; yo ekri refi a nan tras odit òganizasyon an kòm `privacy/egress_refused` epi li parèt anba Compliance, Data residency.

| Paramèt | Valè | Efè |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Lis hostname separe ak vigil, oswa `*.example.org` pou tout sou-domèn | Host anplis yon òganizasyon EU kapab kontakte. Endpoint webhook, xAPI ak SIEM, flux blog ak host Amazon SES dwe la paske òganizasyon an chwazi yo, okenn sèvis pa deklare yo. Bouk lokal, adrès prive ak non ki gen yon sèl etikèt tankou `web` oswa `clamav` se rezo pa w; yo pa janm verifye |

Yo pa kenbe òganizasyon UK ak US nan yon lis host; yo kontinye sibi verifikasyon rejyon sèvis yo. Mete lis la sou worker la; paj admin nan web tier la li li pou montre allowlist la. Se poutèt sa mete li nan `docker/.env`, ki tout sèvis li.

Verifikasyon aplikasyon an bay yon erè klè ak antre odit, men se pa garanti a: kòd kapab gen erè. Rezo a bay garanti a; Compose pa aplike li pou ou. Pou yon stack rejyonal, mete sèvis `worker` ak `web` sou yon rezo `internal: true` kote sèl chemen pou soti pase nan yon proxy trafik sortan (pa egzanp container Squid oswa tinyproxy) ki pèmèt menm host ak `QUIRE_EGRESS_ALLOW_HOSTS` ansanm ak host sèvis konfigire yo. Mete `HTTPS_PROXY` pou sèvis sa yo. Paj rezidans lan bay host egzak aplikasyon an pèmèt, konsa ou kapab konpare de lis yo.

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

| Endpoint | Siyifikasyon |
| --- | --- |
| `/healthz` | Viv: pwosesis la reponn. Health check Compose yo sèvi ak sa |
| `/readyz` | Pare: depandans yo aksesib epi chak sèvis opsyonèl rapòte si li konfigire oswa non. Montre load balancer ou endpoint sa a |

`docker compose -f docker/compose.yaml ps` montre sante chak sèvis.

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

Sèvis `proxy` a (Caddy, Apache-2.0, `docker/caddy/Caddyfile`) se yon pati nan stack default la. Li reponn sou pò 80 ak 443 epi dirije trafik:

| Host oswa chemen | Ale nan |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, chak sou-domèn tenant ak domèn pèsonalize | `web` |
| `/_collab/` sou host sa yo | `collab` (websocket, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` sou host sa yo | websocket client `centrifugo` a; API sèvè a pa janm ekspoze |
| `/_images/` sou host sa yo | `imgproxy`, avèk pwofil `images` la (`IMGPROXY_URL`) |

`init-env.sh` derive `QUIRE_PROXY_APP_HOST`, `QUIRE_PROXY_CONTENT_HOST`, `QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` ak `IMGPROXY_URL` apati de origin yo, konsa yo rete ann amoni. Si w chanje yon origin alamen, chanje paramèt sa yo ansanm avè l.

Sètifika yo suiv paramèt `QUIRE_PROXY_TLS` la:

- `internal` (default la): pwòp otorite sètifika Caddy pou `localhost`, `*.localhost` ak `lvh.me`. Fè sistèm oswa navigatè a fè root li konfyans yon sèl fwa, apre sa jwenn li:

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

  Ajoute `quire-local-ca.crt` nan magazen konfyans sistèm oswa navigatè a. Pou `curl`, bay li ak `--cacert`.
- Yon adrès imèl: sètifika ACME otomatik (Let's Encrypt, apre sa ZeroSSL) pou hostname reyèl. DNS de origin yo ak chak host tenant dwe mennen isit la, epi entènèt la dwe kapab rive nan pò 80 ak 443.

Yo bay tenant host sètifika sou demann, nan premye vizit la, epi sèlman lè web konfime non an pou enstalasyon sa a (`/tls-allowed`, yo mande sa sou rezo Compose la). Pa bezwen sètifika wildcard oswa plugin founisè DNS; yon etranje pa kapab fè host la mande yon sètifika lè li voye yon non nan host sa a. Sètifika ak otorite lokal yo nan volume `caddy-data`; si w sèvi ak `internal`, mete li nan sovgad ak rès la.

Web fè konfyans `X-Forwarded-For` ki soti nan proxy sèlman: adrès proxy a fiks (`QUIRE_PROXY_ADDRESS`, default `172.29.64.10`) sou yon sous-rezo fiks (`QUIRE_COMPOSE_SUBNET`), epi `QUIRE_TRUSTED_PROXY_CIDRS` bay adrès sa a. Si sous-rezo a antre an konfli ak yon rezo host la, chanje yo toude epi kouri `docker compose down` anvan `up`.

## Dèyè pwòp reverse proxy pa w <!--quire:behind-your-own-reverse-proxy-->

Pou pito sèvi ak load balancer oswa proxy w ap kouri deja, pa kòmanse `proxy` a (`docker compose up -d --scale proxy=0`), epi fini TLS devan `web` (8080), `content` (8081), `collab` (1234, websocket) ak `centrifugo` (8000, websocket). Mete adrès piblik yo nan `QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN` ak `QUIRE_COLLAB_URL` (`wss://`), epi seri adrès proxy a nan `QUIRE_TRUSTED_PROXY_CIDRS`.

## Rezoud pwoblèm <!--quire:troubleshooting-->

- `init` sòti ak "QUIRE_DATABASE_ID is not a UUID": mete li avèk `uuidgen`.
- `web` rekòmanse ak "did not start on compose": log la bay chak paramèt li pa ka respekte ak sa pou itilize pito.
- Chanje modpas wòl nan `.env` apre premye demaraj pa fè anyen: init script la kouri yon sèl fwa. Sèvi ak `ALTER ROLE`.
- Upload echwe ak erè analiz lè `CLAMAV_URL` fikse: nan premye demaraj, ClamAV telechaje siyati li yo, sa pran kèk minit.

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