---
title: "ການຕິດຕັ້ງ Quire ດ້ວຍ Docker Compose"
description: "ຕິດຕັ້ງ Quire ເທິງ infrastructure ຂອງທ່ານເອງດ້ວຍ Docker Compose."
image: "https://docs.quirelms.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.quirelms.com/lo/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, ງານພື້ນຫຼັງຂອງມັນ,
ບໍລິການແກ້ໄຂຮ່ວມກັນແບບສົດ ແລະ ບໍລິການທາງເລືອກທຸກໆອັນຢູ່
ເບື້ອງຫຼັງ profile ໜຶ່ງ. ດີຊາຍນແມ່ນ `docs/architecture/23-ops.md` ບົດທີ 2.

ເປົ້າໝາຍອື່ນໆ: [Vercel](/lo/ops/vercel/) ແລະ [Cloudflare Workers](/lo/ops/cloudflare/)
ແລ່ນແຕ່ຊັ້ນເວັບ. ການອັບເດດຢູ່ໃນ [upgrade.md](/lo/ops/upgrade/), ແລະ ການ
ສຳຮາງ ແລະ ການຝຶກການກູ້ຄືນຢູ່ໃນ [backup-restore.md](/lo/ops/backup-restore/).

## ສິ່ງທີ່ທ່ານຕ້ອງການ <!--quire:what-you-need-->

- Docker Engine 27 ຫຼື ຖັດໄປພ້ອມ Compose plugin 2.30 ຫຼື ຖັດໄປ.
- 4 ຫົວຊິ່ງ CPU ແລະ 8 GB ຄວາມຈື່ຈຳສຳລັບ stack ຄ່າເລີ່ມຕົ້ນ; 8 ຫົວຊິ່ງ
  ແລະ 16 GB ດ້ວຍ `--profile full` (ClamAV ແຕ່ລະອັນຖືກລາຍເຊັນ
  ປະມານ 1.5 GB).
- ຊື່ DNS ສຳລັບຊັ້ນເວັບ ແລະ ຊື່ທີສອງສຳລັບເນື້ອຫາທີ່ບໍ່ໄວ້ເຊື່ອຖື.
  ພວກມັນຕ້ອງເປັນເຊີບເວີທີ່ແຕກຕ່າງກັນ: ຊຸດ SCORM ແລະ HTML ທີ່ອັບ
  ໂຫຼດແລ່ນຢູ່ຕົ້ນສະບັບຂອງເນື້ອຫາ ເພື່ອໃຫ້ພວກມັນບໍ່ເຄີຍສາມາດ
  ອ່ານ cookie ຂອງ LMS ໄດ້.
- ສຳລັບການທົດສອບທ້ອງຖິ່ນ `lvh.me` ແລະ `*.localhost` ແກ້ໄປ
  127.0.0.1 ເຊິ່ງແມ່ນສິ່ງທີ່ `docker/.env.example` ໃຊ້. ບໍລິການ `proxy`
  ເອງຂອງ stack ບໍລິການທັງສອງຜ່ານ https ດ້ວຍ certificate authority
  ທ້ອງຖິ່ນ ດັ່ງນັ້ນບໍ່ມີຫຍັງອື່ນຖືກຕິດຕັ້ງ (ເບິ່ງ "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`
ພ້ອມຄວາມລັບທຸກໆອັນທີ່ສ້າງແລ້ວ (ລະຫັດຜ່ານຖານຂໍ້ມູນ, ກະແຈ
ລາຍລານື້ ແລະ master, ຄູ່ກະແຈເປີດເລີ່ມເນື້ອຫາ) ແລະ ກະແຈ
ລາຍລານື້ຈຸດກວດສອບການກວດກາຢູ່ `docker/secrets/audit-signing-key.pem`
ເຊິ່ງ Compose mount ມັນເຂົ້າ workers ເປັນຄວາມລັບ. ມັນຕ້ອງການແຕ່
`sh`, `awk` ແລະ `openssl` ເທົ່ານັ້ນ ແລະ ປະຕິເສດການຂຽນທັບ
`docker/.env` ທີ່ມີຢູ່ແລ້ວ. ຄັດລອກໄຟລ໌ທັງສອງອອກຈາກເຊີບເວີ: ໂດຍ
ບໍ່ມີ `QUIRE_MASTER_KEY` ຖານຂໍ້ມູນທີ່ກູ້ຄືນມາບໍ່ສາມາດຖືກຖອກລະຫັດ
ຂໍ້ມູນທີ່ເກັບໄວ້ໄດ້. ເພື່ອເຕີມໄຟລ໌ດ້ວຍມືແທນ `cp docker/.env.example
docker/.env`; ໄຟລ໌ບອກວິທີສ້າງຄວາມລັບແຕ່ລະອັນ.

ຕົ້ນສະບັບທັງສອງຕ້ອງເປັນ `https`: ບໍລິການເນື້ອຫາປະຕິເສດ http
ເລຍໃນການຜະລິດ ແລະ ພວກມັນບໍ່ຄວນແບ່ງ domain ທີ່ສາມາດລົງທະບຽນ
ໄດ້ຮ່ວມກັນ. ບໍລິການ `proxy` ຢຸດ TLS ສຳລັບທັງສອງ (ເບິ່ງ "TLS");
`init-env.sh` ປະຕິເສດເນື້ອຫາຕົ້ນສະບັບ `http://`.

Stack ເລີ່ມໃນລຳດັບທີ່ກຳນົດໄວ້ ແລະ ຂັ້ນຕອນແຕ່ລະອັນລໍຖ້າ
ຂັ້ນຕອນກ່ອນໜ້າ:

1. `postgres` ກາຍເປັນສະບາຍດີ. ໃນການເລີ່ມຄັ້ງທຳອິດແທ້ ສະຄຣິບ
   init ຂອງມັນ (`docker/postgres/init/90-passwords.sh`) ຕັ້ງລະຫັດ
   ຜ່ານບົດບາດທັງສີ່.
2. `migrate` ນຳໃຊ້ການຍ້າຍຂໍ້ມູນທຸກໆຄັ້ງ ແລະ ເລີ່ມຕາຕະລາງງານ
   ໃນຖານຂໍ້ມູນຄວບຄຸມ ແລະ ໃນຖານຂໍ້ມູນ tenant ສະເພາະທຸກໆແຫ່ງ,
   ກວດສອບວ່າພວກມັນລ້ວນຕົກລົງກັນ ຈາກນັ້ນອອກ (docs/ops/upgrade.md).
   ການຍ້າຍຂໍ້ມູນແລ່ນໃນທຸກໆຄັ້ງທີ່ເລີ່ມ ແລະ ເປັນ idempotent
   ດັ່ງນັ້ນການອັບເດດແມ່ນຮູບລະບົບໃໝ່ ແລະ ການເລີ່ມລະບົບໃໝ່.
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.` ຕິດຕາມດ້ວຍ domain ແອັບພິເຄຊັນຂອງທ່ານ (ບັນທຶກ
`init` ພິມທີ່ຢູ່ເຂົ້າສູ່ລະບົບທີ່ແນ່ນອນ) ແລະ ເຂົ້າສູ່ລະບົບ. ໃນ
ການຕິດຕັ້ງທ້ອງຖິ່ນ ເຊື່ອຖື certificate authority ຂອງ proxy ກ່ອນ
(ເບິ່ງ "TLS"). ປ່ຽນລະຫັດຜ່ານທີ່ສ້າງທີ່ `/account/security`.

ຂະບວນການທີ່ເລີ່ມໂດຍບໍ່ມີຄວາມລັບທີ່ຈຳເປັນຈະປະຕິເສດການເລີ່ມ
ແລະ ລະບຸການຕັ້ງຄ່າທີ່ຂາດໃນບັນທຶກຂອງມັນ. ບໍ່ມີຫຍັງເລີ່ມ
ໂດຍຕັ້ງຄ່າຄ້າງ.

## ບໍລິການ ແລະ profiles <!--quire:services-and-profiles-->

| ບໍລິການ | Profile | ສິ່ງທີ່ມັນເຮັດ |
| --- | --- | --- |
| postgres | ສະເໝີ | ຖານຂໍ້ມູນ (PostgreSQL 18 ກັບ pgvector, ສ້າງຈາກ `docker/postgres.Dockerfile`), ພ້ອມ WAL ຈັດເກັບໄວ້ນັບແຕ່ການບູດຄັ້ງທຳອິດ |
| migrate, init | ສະເໝີ | ແຮກດຽວ: ການຍ້າຍຂໍ້ມູນ ຈາກນັ້ນການແລ່ນຄັ້ງທຳອິດ |
| web | ສະເໝີ | LMS, ຢູ່ `QUIRE_HTTP_PORT` (8080) |
| content | ສະເໝີ | ຕົ້ນສະບັບຂອງເນື້ອຫາທີ່ບໍ່ໄວ້ເຊື່ອຖື, ຢູ່ `QUIRE_CONTENT_PORT` (8081) |
| worker | ສະເໝີ | ງານພື້ນຫຼັງ: ອີເມວ, ລາຍງານ, ການປະມວນຜົນໄຟລ໌, webhooks |
| scheduler | ສະເໝີ | ງານຊ້ຳເວລາ: ລົງທະບຽນຕາຕະລາປັບກາງ 64 ແຫ່ງ ແລະ ມອບໃຫ້ worker; ຜູ້ນຳໜຶ່ງຄົນໃນເວລາດຽວ |
| collab | ສະເໝີ | websocket ການແກ້ໄຂຮ່ວມກັນ, ຢູ່ `QUIRE_COLLAB_HTTP_PORT` (1234) |
| centrifugo | ສະເໝີ | ການແຈກຢາຍສົດ, ຢູ່ `QUIRE_REALTIME_PORT` (8000) |
| proxy | ສະເໝີ | Caddy, ຊອນໜ້າ TLS ໃນພອດ 80 ແລະ 443 (ເບິ່ງ "TLS") |
| valkey | `cache` | Cache ແລະ ຂໍ້ຈຳກັດອັດຕາ |
| clamav | `scan` | ການສະແກນ malware ສຳລັບການອັບໂຫຼດ |
| gotenberg | `preview` | Office ເປັນ PDF previews, ການສະແດງໃບຢັ້ງຢືນ |
| imgproxy | `images` | ຮູບທີ່ປັບຂະໜາດ ແລະ ປ່ຽນຮູບແບບ |
| transcoder | `video` | ຮູບລະບົບ worker ກັບ ffmpeg ທີ່ເປັນແຕ່ LGPL, ສຳລັບການປ່ຽນຮູບວິດີໂອ |
| seaweedfs | `storage` | ການເກັບ object ທີ່ເຂົ້າກັບ S3 ຢູ່ເຊີບເວີນີ້ |
| otelcol | `observability` | ຕົວເກັບ OpenTelemetry |
| mailpit | `devmail` | ຈັບທຸກຈົດໝາຍທີ່ອອກໄປ, ສຳລັບລອງໃຊ້ Quire |
| backup | `backup` | base backup ແຮກດຽວ; ເບິ່ງ backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | base 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
ໝາຍຄວາມວ່າໄຟລ໌ສະເໜີການດາວໂຫຼດແທນການເບິ່ງຕົວຢ່າງ; ບໍ່ມີ
transcoder ໝາຍຄວາມວ່າວິດີໂອຫຼີ້ນເປັນໄຟລ໌ຕົ້ນສະບັບ.

ຮູບລະບົບພາສທີສາມທຸກໆອັນ ແລະ ພັນທະກຳລິເບນສຂອງມັນລາຍຊື່
ຢູ່ `docker/third-party-containers.yaml`.

### ການເຊື່ອມຕໍ່ຜູ້ໃຫ້ບໍລິການ H5P <!--quire:connecting-an-h5p-provider-->

Quire ບໍ່ໃສ່ຫຼືສົ່ງ runtime ຫຼື sidecar ຂອງ H5P (ADR 0019). ຖ້າທ່ານ
ໃຊ້ H5P ສະໜອງການຈະລົງທະບຽນທີ່ເປັນເຈົ້າຂອງບໍລິການຂອງທ່ານ
ເອງ ຫຼື ດຳເນີນ instance H5P ຕິດຕັ້ງເອງຂອງທ່ານແຍກຈາກ Quire.
ລົງທະບຽນຜູ້ໃຫ້ບໍລິການນັ້ນເປັນເຄື່ອງມືພາຍນອກ LTI 1.3 ແລະ
ເພີ່ມເນື້ອຫາຂອງມັນເຂົ້າຫຼັກສູດເປັນກິດຈະກຳເຄື່ອງມື. Quire
ແລກປ່ຽນຄະແນນ ແລະ ຄວາມຄືບໜ້າການປະເມີນ/ການກະທຳຜ່ານ LTI
Assignment and Grade Services (AGS). ຖ້າຜູ້ໃຫ້ບໍລິການຍັງສົ່ງຖາ
xAPI ຕັ້ງຄ່າສິ່ງນັ້ນແຍກສຳລັບຮ້ານເກັບຖາ xAPI ຂອງ Quire; ການ
ແລກປ່ຽນຄະແນນ/ຄວາມຄືບໜ້າ AGS ບໍ່ສົ່ງຖາ xAPI. ການນຳເຂົ້າ
Moodle ລາຍງານກິດຈະກຳ H5P ເປັນສິ່ງທີ່ຕ້ອງການການເຊື່ອມຕໍ່
ເຄື່ອງມື LTI. ຜູ້ໃຫ້ບໍລິການຍັງຮັບຜິດຊອບ runtime H5P, ການຂຽນ,
ທະນາຄານເນື້ອຫາ ແລະ ປະຫວັດການລອງຂອງຕົນ.

ເພື່ອແລ່ນ instance ຕິດຕັ້ງເອງຂອງທ່ານເອງເທິງເຊີບເວີນີ້ ຕັ້ງ
`QUIRE_H5P_IMAGE` ເປັນຮູບລະບົບຂອງມັນ ແລະ ເລີ່ມ profile `h5p`.
Compose ເຜີຍແຜ່ມັນຢູ່ `QUIRE_H5P_PORT` (8090) ແລະ ເກັບຂໍ້ມູນ
ຂອງມັນໄວ້ໃນ volume `h5p-data`; ຮູບລະບົບ ແລະ ພັນທະກຳທີ່ມາ
ພ້ອມມັນຍັງເປັນຂອງທ່ານ.

## ການຕັ້ງຄ່າ <!--quire:settings-->

ຂະບວນການທຸກໆອັນອ່ານ `docker/.env`. ເທມເພລດ `docker/.env.example`
ລາຍຊື່ແຕ່ລະການຕັ້ງຄ່າພ້ອມຄ່າເລີ່ມຕົ້ນຂອງມັນ. ກຸ່ມຕ່າງໆ:

### ທີ່ຢູ່ <!--quire:addresses-->

| ການຕັ້ງຄ່າ | ຄວາມໝາຍ |
| --- | --- |
| `QUIRE_APP_ORIGIN` | ທີ່ຢູ່ສາທາລະນະຂອງ LMS, ເຊັ່ນ `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | ຕົ້ນສະບັບຂອງເນື້ອຫາ, ເຊີບເວີໜຶ່ງທີ່ແຕກຕ່າງ |
| `QUIRE_PLATFORM_DOMAINS` | domain ທີ່ອົງການຢູ່ພາຍໃຕ້, ຄັດດ້ວຍເຄັມ |
| `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` | proxy ທີ່ `X-Forwarded-For` ຂອງມັນຖືກເຊື່ອຖື |

### ຄວາມລັບ <!--quire:secrets-->

| ການຕັ້ງຄ່າ | ຄວາມໝາຍ |
| --- | --- |
| `QUIRE_SECRET_KEY` | ລາຍລານື້ເຊັນຊັນ ແລະ token. 64 ຕົວອັກສອນ hex |
| `QUIRE_MASTER_KEY` | ຫຸ້ມຂໍ້ມູນລະຫັດເຂົ້າເຖິງທີ່ເກັບໄວ້ເຊັ່ນ SSO ແລະຄວາມລັບ webhook. 32 ໂບຍ, base64. ຊັ້ນເວັບ ແລະ worker ຕ້ອງການຄ່າດຽວກັນ. ການປ່ຽນ: [key-rotation.md](/lo/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` |ປ້າຍເວີຊັນຂອງ master key, `v1`ເມື່ອບໍ່ໄດ້ຕັ້ງ. ສູງຂຶ້ນເມື່ອທ່ານປ່ຽນມັນ |
| `QUIRE_MASTER_KEY_RETIRED` | master keys ກ່ອນໜ້ານີ້ທີ່ຍັງຕ້ອງການອ່ານສິ່ງທີ່ພວກມັນຜະໜວກ, ເປັນ `v1=<base64>`. ລຶບຫຼັງຈາກການປ່ຽນສຳເລັດໂດຍບໍ່ມີຫຍັງຄ້າງ |
| `QUIRE_COLLAB_SIGNING_KEY` | ແບ່ງປັນໂດຍ web ແລະ collabເພື່ອລາຍລານື້ token ການແກ້ໄຂ |
| `QUIRE_BACKUP_SIGNING_KEY` | ລາຍລານື້ສຳຮາງຫຼັກສູດ (ທາງເລືອກ) |

ເກັບສຳເນົາ `QUIRE_MASTER_KEY` ໃນບ່ອນອື່ນນອກເໜືອເຊີບເວີນີ້.
ຖານຂໍ້ມູນທີ່ກູ້ຄືນໂດຍບໍ່ມີມັນບໍ່ສາມາດຖືກຖອກລະຫັດຂໍ້ມູນ
ລະຫັດເຂົ້າເຖິງທີ່ມັນຖືກໄວ້ໄດ້.

### ຖານຂໍ້ມູນ <!--quire:database-->

| ການຕັ້ງຄ່າ | ຄວາມໝາຍ |
| --- | --- |
| `POSTGRES_PASSWORD` | superuser, ໃຊ້ໂດຍ container ແລະການສຳຮາງ |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | ລະຫັດຜ່ານບົດບາດ, ຕັ້ງໃນການເລີ່ມຄັ້ງທຳອິດ |
| `DATABASE_URL` | ບົດບາດຂອງແອັບ. ການປ້ອງກັນຂັ້ນແຖວນຳໃຊ້ກັບ query ທຸກໆອັນທີ່ມັນເຮັດ |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | ບົດບາດ migrator, ສຳລັບ `migrate` ແລະ `init` |
| `QUIRE_SUPERUSER_URL` | ໃຊ້ແຕ່ໂດຍການແລ່ນຄັ້ງທຳອິດ |
| `QUIRE_REPORT_DATABASE_URL` | ບົດບາດລາຍງານທີ່ອ່ານຢ່າງດຽວ, ສຳລັບລາຍງານ ແລະເຄື່ອງສ້າງລາຍງານ |
| `QUIRE_AUDIT_DATABASE_URL` | ບົດບາດການກວດກາ, ສຳລັບ console ການກວດກາ ແລະການສົ່ງອອກ SIEM |
| `QUIRE_DATABASE_ID` | UUID ໃດກໍ່ໄດ້, ປັກໄວ້ຕະຫຼອດຊີວິດຂອງການຕິດຕັ້ງ |

ລະຫັດຜ່ານບົດບາດຖືກນຳໃຊ້ແຕ່ເມື່ອ volume ຂອງຖານຂໍ້ມູນຖືກສ້າງ
ຄັ້ງທຳອິດ. ເພື່ອປ່ຽນໜຶ່ງອັນຕໍ່ມາ ໃຊ້ `ALTER ROLE` ຈາກນັ້ນອັບເດດ
URL ທີ່ກົງກັນ.

`QUIRE_REPORT_DATABASE_URL` ໃຊ້ສຳລັບຖານຂໍ້ມູນທາງກາຍະພາບທີ່
ຕັ້ງຄ່າໂດຍ `DATABASE_URL`. ສຳລັບຖານຂໍ້ມູນທາງກາຍະພາບທີ່ລົງ
ທະບຽນອື່ນໆ ຕັ້ງ URL ການເຊື່ອມຕໍ່ `quire_report` ຂອງມັນເອງໃນ
ສະພາບແວດລ້ອມ web ແລະ worker ຈາກນັ້ນວາງຊື່ຕົວແປໃນຊ່ອງ
**Reporting environment variable** ຂອງຖານຂໍ້ມູນນັ້ນເປັນ `env:NAME`.
ການອ້າງອີງຕ້ອງຊີ້ໄປທີ່ຖານຂໍ້ມູນດຽວກັນກັບການເຊື່ອມຕໍ່ app
ຂອງມັນ ໂດຍສະເພາະ replica ຂອງມັນ. ພື້ນຜິວລາຍງານທຸກໆອັນ
ຕິດຕາມ tenant ໄປຫາການເຊື່ອມຕໍ່ລາຍງານຂອງຖານຂໍ້ມູນເອງ:
ເຄື່ອງສ້າງລາຍງານ ແລະລາຍງານທີ່ບັນທຶກໄວ້, ການສົ່ງທີ່ນັດໄວ້,
ການສົ່ງອອກລາຍງານ, ການວິເຄາະ, ບັນທຶກການກວດກາ, ຊັບພະຍາກອນ
ການກວດກາຂອງ REST ແລະການຄົ້ນຫາການກວດກາຂອງຜູ້ຊ່ວຍ. ບໍ່ມີ
ອັນໃດຂອງພວກມັນເຄີຍຢຸມຢາມ URL ລາຍງານຂອງຖານຂໍ້ມູນອື່ນ.
ເມື່ອຖານຂໍ້ມູນບໍ່ມີການເຊື່ອມຕໍ່ລາຍງານ ລາຍງານປົກກະຕິແລ່ນ
ເທິງການເຊື່ອມຕໍ່ແອັບພັກຂອງຖານຂໍ້ມູນນັ້ນເອງ ໃນຂະນະທີ່
ການວິເຄາະ ແລະການອ່ານການກວດກາທຸກໆອັນປະຕິເສດ ແລະບອກ
ດັ່ງນັ້ນ ເພາະບົດບາດແອັບພັກບໍ່ສາມາດອ່ານເສັ້ນການກວດກາໄດ້.

### ແຂກຮັບຊົງ <!--quire:drivers-->

| ການຕັ້ງຄ່າ | ສະບັບນີ້ | ໝາຍເຫດ |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (ຄ່າເລີ່ມຕົ້ນ), `s3` ຫຼື `azure` | `local` ເກັບໄຟລ໌ໄວ້ໃນ volume `files`. `s3` ຄຸມຄອງ AWS S3, R2, GCS interoperability ແລະທີ່ເກັບເຂົ້າກັບ S3 ອື່ນໆ ພ້ອມການອັບໂຫຼດ multipart ທີ່ສາມາດສືບຕໍ່ໄດ້ |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (ຄ່າເລີ່ມຕົ້ນ), `sse`, `centrifugo` ຫຼື `durable_objects` | `inprocess` ເໝາະສຳລັບ container ເວັບດຽວ; ໃຊ້ `centrifugo` ຫຼື `sse` ເມື່ອມີຫຼາຍອັນ |
| `QUIRE_CACHE_DRIVER` | `memory` (ຄ່າເລີ່ມຕົ້ນ), `postgres` ຫຼື `valkey` | `memory` ແມ່ນຕາມຂະບວນການ; ໃຊ້ `valkey` ຫຼື `postgres`ເພື່ອໃຫ້ຂໍ້ຈຳກັດອັດຕາຖືກຮັກສາຂ້າມ container |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (ຄ່າເລີ່ມຕົ້ນ) ຫຼື `progressive_mp4` | ຫຼື ຜູ້ໃຫ້ບໍລິການເປັນເຈົ້າຂອງ: Cloudflare Stream, Mux ຫຼື Bunny, ໂດຍກະແຈຂອງພວກເຂົາ |
| `QUIRE_IMAGE_DRIVER` | `noop` (ຄ່າເລີ່ມຕົ້ນ), `imgproxy` ຫຼື `cloudflare` | `noop` ບໍລິການຮູບທຸກໆອັນດ້ວຍຂະໜາດຕົ້ນສະບັບຂອງມັນ. `imgproxy` ຕ້ອງການ profile `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}` ເຊິ່ງກວດສອບການເຂົ້າເຖິງດຽວກັນ
ກັບໄຟລ໌ເອງ ຈາກນັ້ນ redirect ໄປຫາບໍລິການຮູບ. ແຕ່ລະອົງການສາມາດ
ຂໍຮູບໃໝ່ ແລະຄູ່ຂະໜາດ `QUIRE_IMAGE_SPECS_PER_HOUR` (ຄ່າເລີ່ມຕົ້ນ
2000) ຕໍ່ຊົ່ວໂມງ; ຂະໜາດທີ່ຜະລິດແລ້ວໃນຊົ່ວໂມງນັ້ນບໍ່ນັບ.
ໃຊ້ `valkey` ຫຼື `postgres` ສຳລັບ `QUIRE_CACHE_DRIVER` ກັບ container
ເວັບຫຼາຍກວ່າໜຶ່ງ ເພື່ອໃຫ້ຂໍ້ຈຳກັດຖືກຮັກສາຂ້າມພວກມັນ.

| ການຕັ້ງຄ່າ | ແຂກຮັບຊົງ | ໝາຍເຫດ |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | ທີ່ຢູ່ທີ່ເບີເຊີເຂົ້າເຖິງ imgproxy, ຕົວຢ່າງ `https://images.example.org`. Profile `images` ເຜີຍແຜ່ມັນຢູ່ `QUIRE_IMAGES_PORT` (8082) |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | ສະຕຣິງ hex, ຄ່າດຽວກັນທີ່ 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` | API token ກັບສິດແກ້ໄຂ Images ແລະ account hash ຈາກ Images, Developer resources. ເປີດ flexible variants ສຳລັບບັນຊີ |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | ທາງເລືອກ. ເມື່ອຕັ້ງ ຮູບເປັນສ່ວນຕົວ ແລະທຸກໆທີ່ຢູ່ຖືກລາຍລານື້ ແລະໝົດອາຍຸ. ໂດຍບໍ່ມີມັນ ຮູບເປັນສາທາລະນະຢູ່ທີ່ຢູ່ທີ່ສະແດງອອກຈາກ `QUIRE_SECRET_KEY` ທີ່ບໍ່ມີໃຜສາມາດເດົາໄດ້ |

Cloudflare Images ເກັບສຳເນົາຂອງຕົນເອງຂອງຕົ້ນສະບັບແຕ່ລະອັນ
ທີ່ມັນບໍລິການ. ເມື່ອໄຟລ໌ຖືກລຶບ worker ລຶບສຳເນົານັ້ນກ່ອນ
ຕົ້ນສະບັບ.

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

ງານພື້ນຫຼັງໃຊ້ pg-boss ໃນຖານຂໍ້ມູນ Postgres ດຽວກັນ ດັ່ງນັ້ນ
ບໍ່ມີບໍລິການ queue ໃຫ້ແລ່ນ ແລະບໍ່ມີຫຍັງໃຫ້ຕັ້ງຄ່າ. ງານຖືກ
ບັນທຶກເຂົ່າ queue ໃນ transaction ດຽວກັນກັບການປ່ຽນແປງທີ່ເຮັດ
ໃຫ້ພວກມັນເກີດ ດັ່ງນັ້ນການລົ້ມລະບົບບໍ່ສາມາດສູນງານໜຶ່ງ
ຫຼືສົ່ງງານໜຶ່ງສອງຄັ້ງ. `QUIRE_QUEUE_DRIVER` ແມ່ນ `pgboss` ທີ່ນີ້,
ຄ່າເລີ່ມຕົ້ນຂອງມັນ; `vercel` ແລະ `cloudflare` ຍ້າຍແຕ່ການ
ແຈ້ງເຕືອນເບົາໆ ແລະການສົ່ງ webhook ໄປຫາ queue ເອງຂອງເພລຟອມ
ແລະຄູ່ມານຳ Vercel ແລະ Cloudflare ອະທິບາຍພວກມັນ ແລະວິທີ
ທີ່ຊັ້ນເວັບຂອງພວກມັນບັນທຶກເຂົ້າ queue.

### ອີເມວ <!--quire:email-->

ຕັ້ງໜຶ່ງໃນສິ່ງເຫຼົ່ານີ້:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: object JSON ທີ່ລະບຸຜູ້ໃຫ້ບໍລິການ HTTP
  ແລະລະຫັດເຂົ້າເຖິງຂອງມັນ, ເຊັ່ນ
  `{"provider":"postmark","token":"..."}`. Postmark, Amazon SES, Mailgun,
  SendGrid ແລະ Resend ໂດຍສະໜັບສະໜູນ.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. ແຕ່ເປົ້າໝາຍນີ້;
  ເປົ້າໝາຍ serverless ກັກ SMTP.

`QUIRE_MAIL_FROM` ແມ່ນຜູ້ສົ່ງ. ສຳລັບລອງໃຊ້ Quire ເລີ່ມ profile
`devmail`, ຕັ້ງ `QUIRE_SMTP_URL=smtp://mailpit:1025`, ແລະອ່ານ
ຈົດໝາຍທີ່ `http://localhost:8025`.

### ບໍລິການທາງເລືອກ <!--quire:optional-services-->

| ການຕັ້ງຄ່າ | ກັບ profile |
| --- | --- |
| `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 prefix ສີ່ຕົວອັກສອນ); `off` ປິດມັນ, ແລະ URL ຊີ້ໄປຫາ range API ທີ່ທ່ານດຳເນີນເອງ |

### ການສັງເກດເບິ່ງ <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` ຊື່ຕົວເກັບທີ່ຂະບວນການທຸກໆອັນສົ່ງ
trace ແລະ metrics ໄປ; ກັບ profile `observability` ມັນແມ່ນ
`http://otelcol:4318` ແລະ `docker/otel-collector.yaml` ແມ່ນບ່ອນ
ທີ່ທ່ານເພີ່ມ exporter ສຳລັບ backend ຂອງທ່ານ. ຊັ້ນເວັບ, worker,
scheduler, ຂະບວນການ content ແລະ collab export spans ຜ່ານ
OTLP/HTTP (ຄຳຮ້ອງຂໍເວັບ, transaction ຂອງຖານຂໍ້ມູນ tenant, ງານ
worker ແລະການເອີ້ນອອກ) ເມື່ອມັນຖືກຕັ້ງ, ແລະ metrics ໄປຫາ
endpoint ດຽວກັນທຸກໆນາທີ (`OTEL_METRICS_EXPORTER=none` ປິດພວກ
ມັນ). `OTEL_TRACES_SAMPLER_ARG` ຕັ້ງສ່ວນທີ່ຖືກເກັບໄວ້ຂອງ traces.
ບັນທຶກໄປຫາສະຕຣີມສະຕານເອກອັກຄະທີ່ `LOG_LEVEL` ແລະ Compose
ໝຸນພວກມັນ. Traces ບໍ່ເຄີຍພົວພັນຂໍ້ມູນສ່ວນຕົວ.

### ການອອກພື້ນທີ່ຕາມເຂດ (ການຢູ່ຂໍ້ມູນ EU) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` ບອກວ່າ stack ບໍລິການອົງການສະຫະພາບເອີຣົບ.
worker ຈາກນັ້ນຈະກັກຄຳຮ້ອງຂໍອອກທຸກໆອັນທີ່ເຮັດສຳລັບອົງການ
ທີ່ຖືກຜູກກັບ EU ໃຫ້ຢູ່ໃນ allowlist (21-compliance.md ບົດທີ 8.1).
Allowlist ແມ່ນເຊີບເວີທີ່ບໍລິການທີ່ຕັ້ງຄ່າແລ້ວປະກາດສຳລັບເຂດ
ນັ້ນ (endpoint ການເກັບ, ຜູ້ໃຫ້ບໍລິການອີເມວ, ຜູ້ໃຫ້ບໍລິການວິດີໂອ
ເປັນເຈົ້າຂອງ, ເປົ້າໝາຍການເກັບຂອງອົງການເອງ, ຜູ້ໃຫ້ບໍລິການ AI
ແລະບັນຊີອີເມວ), ເຊີບເວີຂອງບໍລິການໃດໆພາຍໃຕ້ການຍົກເວັ້ນ
ທີ່ກຳລັງມີຜົນ, ແລະເຊີບເວີທີ່ທ່ານລາຍຊື່ໃນ
`QUIRE_EGRESS_ALLOW_HOSTS`. ຄຳຮ້ອງຂໍໄປຫາເຊີບເວີສາທາລະນະ
ອື່ນຈະຖືກປະຕິເສດກ່ອນທີ່ຈະສົ່ງ, ການປະຕິເສດຖືກຂຽນລົງ
ເສັ້ນການກວດກາຂອງອົງການເປັນ `privacy/egress_refused` ແລະ
ມັນຖືກລາຍຊື່ພາຍໃຕ້ Compliance, Data residency.

| ການຕັ້ງຄ່າ | ຄ່າ | ຜົນກະທົບ |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | ລາຍຊື່ hostname ທີ່ຄັດ, ຫຼື `*.example.org` ສຳລັບ subdomain ທຸກໆອັນ | ເຊີບເວີເພີ່ມເຕີມທີ່ອົງການ EU ສາມາດເຂົ້າເຖິງໄດ້. Endpoint ຂອງ webhook, xAPI ແລະ SIEM, ກະແສບລັອກ ແລະເຊີບເວີ Amazon SES ຂຶ້ນກັບທີ່ນີ້ ເພາະມັນເປັນການເລືອກຂອງອົງການເອງ ແລະບໍ່ມີບໍລິການໃດປະກາດພວກມັນ. Loopback, ທີ່ຢູ່ເອກະຊົນ ແລະຊື່ label ດຽວເຊັ່ນ `web` ຫຼື `clamav` ແມ່ນເຄືອຂ່າຍຂອງທ່ານເອງ ແລະບໍ່ເຄີຍຖືກກວດສອບ |

ອົງການ UK ແລະ US ບໍ່ຖືກຜູກກັບລາຍຊື່ເຊີບເວີ; ພວກເຂົາຮັກສາ
ການກວດສອບເຂດຂອງບໍລິການ. ຕັ້ງລາຍຊື່ໃສ່ worker; ໜ້າ admin
ອ່ານມັນຈາກຊັ້ນເວັບເພື່ອສະແດງ allowlist ດັ່ງນັ້ນວາງມັນໃນ
`docker/.env` ເຊິ່ງບໍລິການທຸກໆອັນອ່ານ.

ການກວດສອບຂອງແອັບພັກໃຫ້ຂໍ້ຜິດພາດທີ່ຊັດເຈນ ແລະລາຍການ
ການກວດກາ ແລະມັນບໍ່ແມ່ນການຮັບປະກັນ: ລະຫັດສາມາດຜິດໄດ້.
ການຮັບປະກັນແມ່ນເຄືອຂ່າຍ. Compose ບໍ່ບັງຄັບມັນໃຫ້ທ່ານ.
ສຳລັບ stack ຕາມເຂດ ວາງບໍລິການ `worker` ແລະ `web` ເທິງເຄືອ
ຂ່າຍ `internal: true` ທີ່ເສັ້ນທາງອອກດຽວຂອງມັນແມ່ນ egress
proxy (ຕົວຢ່າງ container Squid ຫຼື tinyproxy) ທີ່ອະນຸຍາດເຊີບເວີ
ດຽວກັນກັບ `QUIRE_EGRESS_ALLOW_HOSTS` ບວກເຊີບເວີຂອງບໍລິການ
ທີ່ທ່ານຕັ້ງຄ່າ ແລະຕັ້ງ `HTTPS_PROXY` ສຳລັບບໍລິການເຫຼົ່ານັ້ນ.
ໜ້າການຢູ່ລາຍຊື່ເຊີບເວີທີ່ແນ່ນອນທີ່ແອັບພັກອະນຸຍາດ ດັ່ງນັ້ນ
ລາຍຊື່ທັງສອງສາມາດປຽບທຽບກັນໄດ້.

## ສຸຂະພາບ <!--quire:health-->

| Endpoint | ຄວາມໝາຍ |
| --- | --- |
| `/healthz` | Liveness: ຂະບວນການຕອບ. Compose health checks ໃຊ້ສິ່ງນີ້ |
| `/readyz` | Readiness: dependency ເຂົ້າເຖິງໄດ້ ແລະບໍລິການທາງເລືອກແຕ່ລະອັນລາຍງານວ່າຖືກຕັ້ງຄ່າຫຼືບໍ່. ຊີ້ load balancer ຂອງທ່ານໄປທີ່ນີ້ |

`docker compose -f docker/compose.yaml ps` ສະແດງສຸຂະພາບຂອງແຕ່ລະ
ບໍລິການ.

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

ບໍລິການ `proxy` (Caddy, Apache-2.0, `docker/caddy/Caddyfile`) ເປັນ
ສ່ວນໜຶ່ງຂອງ stack ຄ່າເລີ່ມຕົ້ນ. ມັນຕອບຢູ່ພອດ 80 ແລະ 443 ແລະ
ແຈກກາງ:

| ເຊີບເວີ ຫຼື ເສັ້ນທາງ | ໄປຫາ |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, subdomain ຂອງ tenant ທຸກໆອັນ ແລະ domain ທີ່ກຳນົດເອງ | `web` |
| `/_collab/` ຢູ່ເຊີບເວີເຫຼົ່ານັ້ນ | `collab` (websocket, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` ຢູ່ເຊີບເວີເຫຼົ່ານັ້ນ | websocket ຂອງ client ຂອງ `centrifugo`; server API ຂອງມັນບໍ່ເຄີຍຖືກເປີດເຜີຍ |
| `/_images/` ຢູ່ເຊີບເວີເຫຼົ່ານັ້ນ | `imgproxy`, ກັບ profile `images` (`IMGPROXY_URL`) |

`init-env.sh` ສະແດງ `QUIRE_PROXY_APP_HOST`, `QUIRE_PROXY_CONTENT_HOST`,
`QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` ແລະ `IMGPROXY_URL` ຈາກ
ຕົ້ນສະບັບທັງສອງ ດັ່ງນັ້ນພວກມັນບໍ່ສາມາດຫ່າງອອກຈາກກັນໄດ້.
ແກ້ໄຂພວກມັນຮ່ວມກັນຖ້າທ່ານປ່ຽນຕົ້ນສະບັບໜຶ່ງດ້ວຍມື.

ໃບຢັ້ງຢືນຕິດຕາມ `QUIRE_PROXY_TLS`:

- `internal` (ຄ່າເລີ່ມຕົ້ນ): certificate authority ເອງຂອງ Caddy,
  ສຳລັບ `localhost`, `*.localhost` ແລະ `lvh.me`. ເຊື່ອຖື root ຂອງ
  ມັນໜຶ່ງຄັ້ງ ຈາກນັ້ນກວດສອບ:

  ```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) ສຳລັບ hostname ແທ້. DNS ສຳລັບຕົ້ນສະບັບທັງສອງ ແລະ
  ເຊີບເວີ tenant ທຸກໆອັນຕ້ອງຊີ້ໄປທີ່ນີ້ ແລະພອດ 80 ແລະ 443
  ຕ້ອງເຂົ້າເຖິງໄດ້ຈາກອິນເຕີເນັດ.

ເຊີບເວີຂອງ tenant ຖືກອອກໃບຢັ້ງຢືນຕາມຄວາມຕ້ອງການ, ໃນການ
ເຂົ້າຢ້ຽມຄັ້ງທຳອິດ, ແລະແຕ່ເມື່ອ web ຢືນຢັນວ່າຊື່ຂຶ້ນກັບ
ການຕິດຕັ້ງນີ້ (`/tls-allowed`, ຖາມຢູ່ເຄືອຂ່າຍ Compose). ບໍ່
ຕ້ອງການໃບຢັ້ງຢືນ wildcard ຫຼື plugin ຜູ້ໃຫ້ບໍລິການ DNS ແລະ
ຄົນແປກໜ້າທີ່ຊີ້ຊື່ໄປຫາເຊີບເວີບໍ່ສາມາດເຮັດໃຫ້ມັນຂໍໃບ
ຢັ້ງຢືນໄດ້. ໃບຢັ້ງຢືນ ແລະອົງການທ້ອງຖິ່ນຢູ່ໃນ volume
`caddy-data`; ສຳຮາງມັນພ້ອມສິ່ງອື່ນຖ້າທ່ານໃຊ້ `internal`.

Web ເຊື່ອຖື `X-Forwarded-For` ຈາກ proxy ແຕ່ຢ່າງດຽວ: proxy ມີ
ທີ່ຢູ່ທີ່ກຳນົດ (`QUIRE_PROXY_ADDRESS`, ຄ່າເລີ່ມ `172.29.64.10`)
ຢູ່ subnet ທີ່ກຳນົດ (`QUIRE_COMPOSE_SUBNET`) ແລະ
`QUIRE_TRUSTED_PROXY_CIDRS` ຊື່ທີ່ຢູ່ນັ້ນ. ຖ້າ subnet ຕຳກັບເຄືອ
ຂ່າຍໜຶ່ງຢູ່ເຊີບເວີ ປ່ຽນທັງສອງ ແລະແລ່ນ `docker compose down`
ກ່ອນ `up`.

## ເບື້ອງຫຼັງ reverse proxy ຂອງທ່ານເອງ <!--quire:behind-your-own-reverse-proxy-->

ເພື່ອໃຊ້ load balancer ຫຼື 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://`) ແລະຊ່ວງທີ່ຢູ່ຂອງ proxy ຂອງທ່ານໃນ
`QUIRE_TRUSTED_PROXY_CIDRS`.

## ການແກ້ໄຂບັນຫາ <!--quire:troubleshooting-->

- `init` ອອກດ້ວຍ "QUIRE_DATABASE_ID is not a UUID": ຕັ້ງມັນດ້ວຍ
  `uuidgen`.
- `web` ເລີ່ມຄືນດ້ວຍ "did not start on compose": ບັນທຶກລາຍຊື່
  ແຕ່ລະການຕັ້ງຄ່າທີ່ມັນບໍ່ສາມາດເຄົາລົບ ແລະສິ່ງທີ່ຈະໃຊ້ແທນ.
- ການປ່ຽນລະຫັດຜ່ານບົດບາດໃນ `.env` ຫຼັງການເລີ່ມຄັ້ງທຳອິດ
 ບໍ່ເຮັດຫຍັງ: ສະຄຣິບ init ແລ່ນໜຶ່ງຄັ້ງ. ໃຊ້ `ALTER ROLE`.
- ການອັບໂຫຼດລົ້ມແຫຼວດ້ວຍຂໍ້ຜິດພາດການສະແກນໃນຂະນະທີ່
  `CLAMAV_URL` ຖືກຕັ້ງ: ClamAV ດາວໂຫຼດລາຍເຊັນຂອງມັນໃນການ
  ເລີ່ມຄັ້ງທຳອິດ ເຊິ່ງໃຊ້ເວລາສອງສາມນາທີ.

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