---
title: "Docker Compose ဖြင့် Quire တပ်ဆင်ခြင်း"
description: "Docker Compose ဖြင့် သင့်ကိုယ်ပိုင်အခြေခံအဆောက်အအုံတွင် Quire တပ်ဆင်ပါ။"
image: "https://docs.quirelms.com/og.png"
---

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

# Docker Compose ဖြင့် Quire တပ်ဆင်ခြင်း

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

ဤက အိမ်ရှင်တစ်ခုတွင် ထုတ်ကုန်အပြည့်အစုံ ဖြစ်သည်– LMS၊ ၎င်း၏နောက်ခံအလုပ်၊ realtime
နှင့် ပူးပေါင်းတည်းဖြတ်မှုဝန်ဆောင်မှုများ၊ ပရိုဖိုင်နောက်ရှိ ရွေးချယ်နိုင်သောဝန်ဆောင်မှုတိုင်း။
ဒီဇိုင်းက `docs/architecture/23-ops.md` အပိုင်း ၂ ဖြစ်သည်။

အခြားပစ်မှတ်များ– [Vercel](/my/ops/vercel/) နှင့် [Cloudflare Workers](/my/ops/cloudflare/) က
ဝဘ်အဆင့်သာ လည်ပတ်သည်။ အဆင့်မြှင့်မှုများ [upgrade.md](/my/ops/upgrade/) တွင်၊ အရန်များနှင့်
ပြန်လည်ဖော်ထုတ်လေ့ကျင့်မှု [backup-restore.md](/my/ops/backup-restore/) တွင်။

## ဘာတွေ လိုအပ်သနည်း <!--quire:what-you-need-->

- Compose ပလပ်အင် 2.30 သို့မဟုတ် နောက်ပိုင်းပါသော Docker Engine 27 သို့မဟုတ်
  နောက်ပိုင်း။
- မူလအစုအတွက် CPU core ၄ ခု မှတ်ဉာဏ် 8 GB။ `--profile full` ဖြင့် core ၈ ခု 16
  GB (ClamAV တည်းတင် လက်မှတ် 1.5 GB ခန့် ကိုင်သည်)။
- ဝဘ်အဆင့်အတွက် DNS အမည်တစ်ခု၊ မယုံကြည်သောအကြောင်းအရာအတွက် နောက်တစ်ခု။
  ၎င်းတို့ မတူသောအိမ်ရှင်များ ဖြစ်ရမည်– SCORM ထုပ်ပိုးမှုများနှင့် အပ်လုဒ်လုပ် HTML
  များ အကြောင်းအရာမူလတွင် လည်ပတ်သောကြောင့်၊ LMS ၏ကွတ်ကီးများ ဘယ်တော့မှ
  ဖတ်၍မရပါ။
- ဒေသခံစမ်းသပ်မှုအတွက် `lvh.me` နှင့် `*.localhost` က 127.0.0.1 သို့ ဖြေရှင်းသည်၊
  `docker/.env.example` အသုံးပြုသည့်အရာ။ အစု၏ကိုယ်ပိုင် `proxy` ဝန်ဆောင်မှုက
  နှစ်ခုစလုံး https မှတစ်ဆင့် ဒေသခံလက်မှတ်အာဏာပိုင်ဖြင့် ဝန်ဆောင်မှုပေးသည်၊
  ထို့ကြောင့် အခြားဘာမှ မတပ်ဆင်ပါ (“TLS” ကို ကြည့်ပါ)။
- အိမ်ရှင်တွင် port 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`။ ဖိုင်က
လျှို့ဝှက်ချက်တစ်ခုစီ မည်သို့ထုတ်လုပ်ရမည်ကို ဆိုသည်။

မူလနှစ်ခုစလုံး `https` ဖြစ်ရမည်– အကြောင်းအရာဝန်ဆောင်မှုက ထုတ်လုပ်ရေးတွင် ရိုးရိုး
http ငြင်းပယ်သည်၊ ၎င်းတို့ မှတ်ပုံတင်နိုင်သောဒိုမိန်း မမျှဝေရပါ။ `proxy`
ဝန်ဆောင်မှုက နှစ်ခုစလုံးအတွက် TLS အဆုံးသတ်သည် (“TLS” ကို ကြည့်ပါ)။ `init-env.sh`
က `http://` မူလ ငြင်းပယ်သည်။

အစုက ပုံသေအစီအစဉ်ဖြင့် စတင်သည်၊ အဆင့်တစ်ခုစီ ၎င်းအလား တစ်ခုကို စောင့်သည်–

1. `postgres` ကျန်းမာလာသည်။ ပထမဆုံးစတင်မှုတွင် ၎င်း၏ init script
   (`docker/postgres/init/90-passwords.sh`) က အခန်းကဏ္ဍစကားဝှက်လေးခု သတ်မှတ်သည်။
2. `migrate` က ရွှေ့ပြောင်းမှုတိုင်း အသုံးချပြီး ထိန်းချုပ်ဒေတာဘေ့စ်နှင့် သီးသန့်
   tenant ဒေတာဘေ့စ်တိုင်းတွင် အလုပ်တန်းစီ အခြေခံတည်ဆောက်သည်၊ ၎င်းတို့အားလုံး
   သဘောတူသည်ကို စစ်ဆေးပြီး ထွက်သည် (docs/ops/upgrade.md)။ ရွှေ့ပြောင်းမှုများ
   စတင်တိုင်း လည်ပတ်ပြီး ထပ်တူညီမှုကင်းသောကြောင့်၊ အဆင့်မြှင့်မှုက image အသစ်နှင့်
   ပြန်လည်စတင်မှု ဖြစ်သည်။
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` မှတ်တမ်း
လက်မှတ်ထိုးဝင်လိပ်စာအတိအကျ ရိုက်နှိပ်သည်)၊ လက်မှတ်ထိုးဝင်ပါ။ ဒေသခံတပ်ဆင်မှုတွင်
proxy ၏လက်မှတ်အာဏာပိုင်ကို အရင်ယုံကြည်ပါ (“TLS” ကို ကြည့်ပါ)။
ထုတ်လုပ်သောစကားဝှက်ကို `/account/security` တွင် ပြောင်းပါ။

လိုအပ်သောလျှို့ဝှက်ချက်မပါဘဲ စတင်သောလုပ်ငန်းစဉ်က စတင်ရန် ငြင်းပယ်ပြီး
၎င်း၏မှတ်တမ်းတွင် ပျောက်နေသောဆက်တင် အမည်ပေးသည်။ ဘာမှ တစ်ဝက်စီစဉ်လျက် မစတင်ပါ။

## ဝန်ဆောင်မှုများနှင့် ပရိုဖိုင်များ <!--quire:services-and-profiles-->

| ဝန်ဆောင်မှု | ပရိုဖိုင် | ဘာလုပ်သနည်း |
| --- | --- | --- |
| postgres | always | ဒေတာဘေ့စ် (pgvector ပါသော PostgreSQL 18၊ `docker/postgres.Dockerfile` မှ တည်ဆောက်သည်)၊ ပထမစတင်မှုကတည်းက WAL မော်ကွန်းတင်လျက် |
| migrate၊ init | always | တစ်ကြိမ်သုံး– ရွှေ့ပြောင်းမှုများ၊ ထို့နောက် ပထမလည်ပတ်မှု |
| web | always | `QUIRE_HTTP_PORT` (8080) ရှိ LMS |
| content | always | `QUIRE_CONTENT_PORT` (8081) ရှိ မယုံကြည်သောအကြောင်းအရာမူလ |
| worker | always | နောက်ခံအလုပ်များ– အီးမေးလ်၊ အစီရင်ခံစာများ၊ ဖိုင်လုပ်ဆောင်မှု၊ webhook များ |
| scheduler | always | ထပ်တလဲလဲအလုပ်များ– runtime အချိန်ဇယား ၆၄ ခု မှတ်ပုံတင်ပြီး အလုပ်သမားထံ လွှဲသည်။ တစ်ကြိမ်တွင် ဦးဆောင်သူတစ်ဦး |
| collab | always | ပူးပေါင်းတည်းဖြတ်မှု websocket၊ `QUIRE_COLLAB_HTTP_PORT` (1234) တွင် |
| centrifugo | always | Realtime ဖြန့်ဝေမှု၊ `QUIRE_REALTIME_PORT` (8000) တွင် |
| proxy | always | Caddy၊ port 80 နှင့် 443 ရှိ TLS တံခါးဝ (“TLS” ကို ကြည့်ပါ) |
| valkey | `cache` | သိမ်းဆည်းမှုနှင့် နှုန်းကန့်သတ်ချက်များ |
| clamav | `scan` | အပ်လုဒ်များ၏ မဲလ်ဝဲလ်စကင်ဖတ်ခြင်း |
| gotenberg | `preview` | Office မှ PDF အစမ်းကြည့်မှုများ၊ လက်မှတ်ဖော်ပြမှု |
| imgproxy | `images` | အရွယ်ပြောင်းပြီး ပြောင်းလဲသောရုပ်ပုံများ |
| transcoder | `video` | ဗီဒီယိုပြန်ဖော်ထုတ်မှုများအတွက် LGPL-သီးသန့် ffmpeg ပါသောအလုပ်သမား image |
| seaweedfs | `storage` | ဤအိမ်ရှင်တွင် S3 နှင့်ကိုက်ညီသော object သိုလှောင်မှု |
| otelcol | `observability` | OpenTelemetry စုဆောင်းသူ |
| mailpit | `devmail` | ထွက်သွားသောမေးလ်အားလုံး ဖမ်းသည်၊ Quire စမ်းသုံးရန် |
| backup | `backup` | တစ်ကြိမ်သုံးအခြေအရန်။ backup-restore.md ကို ကြည့်ပါ |
| backup-scheduler၊ backup-offsite | `backup` | `QUIRE_BACKUP_INTERVAL_HOURS` တိုင်း အခြေအရန်တစ်ခု၊ အပတ်စဉ်စစ်ဆေးလေ့ကျင့်မှုပါသော စာဝှက်ထားသောအိမ်ရှင်ပြင်မိတ္တူများ |
| h5p | `h5p` | `QUIRE_H5P_IMAGE` တွင် သင်ပေးသော H5P LTI 1.3 ကိရိယာ image၊ `QUIRE_H5P_PORT` (8090) တွင်။ “H5P ဝန်ဆောင်မှုပေးသူ ချိတ်ဆက်ခြင်း” ကို ကြည့်ပါ |

`--profile full` က `backup` နှင့် `h5p` မှလွဲ၍ ရွေးချယ်နိုင်သောဝန်ဆောင်မှုတိုင်း
စတင်သည်။ `docker compose -f docker/compose.yaml --profile scan up -d` ဖြင့် တစ်ခု
စတင်ပါ။ ရွေးချယ်နိုင်သောဝန်ဆောင်မှုမရှိဘဲ Quire ဆက်အလုပ်လုပ်ပြီး ဘာပျောက်နေသည်ကို
ဆိုသည်– စကင်နာမရှိပါက အပ်လုဒ်များ စကင်မဖတ်ဘဲ သိမ်းပြီး စီမံခန့်ခွဲသူအား ပြောသည်။
Gotenberg မရှိပါက ဖိုင်များ အစမ်းကြည့်မည့်အစား ဒေါင်းလုဒ် ပေးသည်။ transcoder
မရှိပါက ဗီဒီယို မူရင်းဖိုင်အတိုင်း ဖွင့်သည်။

ပြင်ပအဖွဲ့အစည်း image တိုင်းနှင့် ၎င်း၏လိုင်စင်တာဝန်များ
`docker/third-party-containers.yaml` တွင် စာရင်းပြုစုထားသည်။

### H5P ဝန်ဆောင်မှုပေးသူ ချိတ်ဆက်ခြင်း <!--quire:connecting-an-h5p-provider-->

Quire က H5P runtime သို့မဟုတ် sidecar ထည့်သွင်း သို့မဟုတ် ပို့ဆောင်မထားပါ (ADR
0019)။ H5P အသုံးပြုပါက သင့်ကိုယ်ပိုင်လက်ခံပေးထားသောစာရင်းသွင်းမှု ပေးပါ သို့မဟုတ်
သင့်ကိုယ်ပိုင်ကိုယ်တိုင်လက်ခံသော H5P instance ကို Quire နှင့် သီးခြား လည်ပတ်ပါ။
ထိုဝန်ဆောင်မှုပေးသူကို LTI 1.3 ပြင်ပကိရိယာအဖြစ် မှတ်ပုံတင်ပြီး ၎င်း၏အကြောင်းအရာကို
ကိရိယာလှုပ်ရှားမှုများအဖြစ် သင်တန်းများသို့ ထည့်ပါ။ Quire က အမှတ်များနှင့်
လှုပ်ရှားမှု/အမှတ်ပေးတိုးတက်မှုကို LTI Assignment and Grade Services (AGS)
မှတစ်ဆင့် ဖလှယ်သည်။ ဝန်ဆောင်မှုပေးသူ xAPI ထုတ်ပြန်ချက်များလည်း ပို့ပါက၊ Quire ၏
xAPI ထုတ်ပြန်ချက်သိုလှောင်မှုအတွက် ယင်းကို သီးခြားစီစဉ်ပါ။ AGS အမှတ်/တိုးတက်မှုဖလှယ်မှုက
xAPI ထုတ်ပြန်ချက်များ မပို့ပါ။ Moodle တင်သွင်းမှုများက H5P လှုပ်ရှားမှုများကို LTI
ကိရိယာချိတ်ဆက်မှု လိုအပ်သည်ဟု အစီရင်ခံသည်။ ဝန်ဆောင်မှုပေးသူ ၎င်း၏ H5P runtime၊
ရေးသားမှု၊ အကြောင်းအရာဘဏ်နှင့် ကြိုးပမ်းမှုမှတ်တမ်း တာဝန်ဆက်ယူသည်။

ဤအိမ်ရှင်တွင် သင့်ကိုယ်ပိုင်ကိုယ်တိုင်လက်ခံသော instance လည်ပတ်ရန်
`QUIRE_H5P_IMAGE` ကို ၎င်း၏ image အဖြစ် သတ်မှတ်ပြီး `h5p` ပရိုဖိုင် စတင်ပါ။
Compose က ၎င်းကို `QUIRE_H5P_PORT` (8090) တွင် ထုတ်ဝေပြီး ၎င်း၏ဒေတာကို `h5p-data`
volume တွင် ထားသည်။ image နှင့် ၎င်းနှင့်ပါလာသောတာဝန်များ သင့်အရာဆက်ဖြစ်သည်။

## ဆက်တင်များ <!--quire:settings-->

လုပ်ငန်းစဉ်တိုင်း `docker/.env` ဖတ်သည်။ ပုံစံ `docker/.env.example` က ဆက်တင်တစ်ခုစီ
မူလတန်ဖိုးနှင့်အတူ စာရင်းပြုစုသည်။ အုပ်စုများ–

### လိပ်စာများ <!--quire:addresses-->

| ဆက်တင် | အဓိပ္ပာယ် |
| --- | --- |
| `QUIRE_APP_ORIGIN` | LMS ၏အများပြည်သူလိပ်စာ၊ ဥပမာ `https://learn.example.com` |
| `QUIRE_CONTENT_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` ယုံကြည်ရသော Proxy များ |

### လျှို့ဝှက်ချက်များ <!--quire:secrets-->

| ဆက်တင် | အဓိပ္ပာယ် |
| --- | --- |
| `QUIRE_SECRET_KEY` | session များနှင့် တိုကင်များ လက်မှတ်ထိုးသည်။ hex စာလုံး ၆၄ လုံး |
| `QUIRE_MASTER_KEY` | SSO နှင့် webhook လျှို့ဝှက်ချက်များကဲ့သို့ သိမ်းထားသောအထောက်အထားများ ထုပ်ပိုးသည်။ 32 byte၊ base64။ ဝဘ်အဆင့်နှင့် အလုပ်သမား တူညီသောတန်ဖိုး လိုအပ်သည်။ လှည့်ပြောင်းမှု– [key-rotation.md](/my/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | မာစတာသော့၏ဗားရှင်းတံဆိပ်၊ မသတ်မှတ်ထားလျှင် `v1`။ လှည့်ပြောင်းသည့်အခါ မြှင့်ပါ |
| `QUIRE_MASTER_KEY_RETIRED` | ၎င်းတို့တံဆိပ်ခတ်သည့်အရာ ဖတ်ရန် လိုနေသေးသောအစောမာစတာသော့များ၊ `v1=<base64>` အဖြစ်။ လှည့်ပြောင်းမှု မဖြေရှင်းရသေးဘာမှမရှိဘဲ ပြီးသည်နှင့် ဖယ်ရှားပါ |
| `QUIRE_COLLAB_SIGNING_KEY` | တည်းဖြတ်တိုကင်များ လက်မှတ်ထိုးရန် ဝဘ်နှင့် collab မျှဝေသည် |
| `QUIRE_BACKUP_SIGNING_KEY` | သင်တန်းအရန်များ လက်မှတ်ထိုးသည် (ရွေးချယ်နိုင်) |

`QUIRE_MASTER_KEY` ၏မိတ္တူကို ဤအိမ်ရှင်အပြင် အခြားနေရာ၌ ထားပါ။ ၎င်းမပါဘဲ
ပြန်လည်ဖော်ထုတ်သောဒေတာဘေ့စ် ၎င်းကိုင်သောအထောက်အထားများ စာဝှက်ဖြည်၍မရပါ။

### ဒေတာဘေ့စ် <!--quire:database-->

| ဆက်တင် | အဓိပ္ပာယ် |
| --- | --- |
| `POSTGRES_PASSWORD` | superuser၊ ကွန်တိန်နာနှင့် အရန်များ အသုံးပြုသည် |
| `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 မဆို၊ တပ်ဆင်မှုသက်တမ်းတစ်လျှောက် ပုံသေ |

အခန်းကဏ္ဍစကားဝှက်များကို ဒေတာဘေ့စ် volume ပထမဖန်တီးသည့်အခါသာ အသုံးချသည်။
နောက်ပိုင်း တစ်ခု ပြောင်းရန် `ALTER ROLE` အသုံးပြုပြီး ကိုက်ညီသော URL မွမ်းမံပါ။

`QUIRE_REPORT_DATABASE_URL` ကို `DATABASE_URL` စီစဉ်သောရုပ်ပိုင်းဆိုင်ရာဒေတာဘေ့စ်အတွက်
အသုံးပြုသည်။ အခြားမှတ်ပုံတင်ထားသောရုပ်ပိုင်းဆိုင်ရာဒေတာဘေ့စ်မဆိုအတွက် ၎င်း၏ကိုယ်ပိုင်
`quire_report` ချိတ်ဆက်မှု URL ကို ဝဘ်နှင့် အလုပ်သမားပတ်ဝန်းကျင်များတွင် သတ်မှတ်ပြီး၊
ထို့နောက် ထိုဒေတာဘေ့စ်၏ **အစီရင်ခံပတ်ဝန်းကျင်ကိန်းရှင်** အကွက်တွင် ကိန်းရှင်အမည်ကို
`env:NAME` အဖြစ် ထည့်ပါ။ အကိုးအကားက ၎င်း၏အက်ပ်ချိတ်ဆက်မှုနှင့်
တူညီသောဒေတာဘေ့စ်ကို ညွှန်ရမည်၊ ဖြစ်နိုင်ပါက ၎င်း၏ဖတ်ပုံတူ။ အစီရင်ခံမျက်နှာပြင်တိုင်း
tenant နောက် ၎င်း၏ကိုယ်ပိုင်ဒေတာဘေ့စ်၏အစီရင်ခံချိတ်ဆက်မှုသို့ လိုက်သည်–
အစီရင်ခံတည်ဆောက်သူနှင့် သိမ်းထားသောအစီရင်ခံစာများ၊ အချိန်ဇယားဆွဲပို့ဆောင်မှုများ၊
အစီရင်ခံထုတ်ယူမှုများ၊ ခွဲခြမ်းစိတ်ဖြာမှု၊ စာရင်းစစ်မှတ်တမ်း၊ REST စာရင်းစစ်အရင်းအမြစ်များနှင့်
လက်ထောက်၏စာရင်းစစ်ရှာဖွေမှု။ ၎င်းတို့မဆို အခြားဒေတာဘေ့စ်၏အစီရင်ခံမှု URL ဘယ်တော့မှ
မငှားပါ။ ဒေတာဘေ့စ်တစ်ခုတွင် အစီရင်ခံချိတ်ဆက်မှုမရှိပါက၊ သာမန်အစီရင်ခံစာများ
ထိုဒေတာဘေ့စ်၏ကိုယ်ပိုင်အက်ပလီကေးရှင်းချိတ်ဆက်မှုတွင် လည်ပတ်ပြီး၊ ခွဲခြမ်းစိတ်ဖြာမှုနှင့်
စာရင်းစစ်ဖတ်မှုတိုင်း ငြင်းပယ်ပြီး ထိုအကြောင်း ဆိုသည်၊ အက်ပလီကေးရှင်းအခန်းကဏ္ဍ
စာရင်းစစ်လမ်းကြောင်း ဖတ်၍မရသောကြောင့်။

### မောင်းနှင်သူများ <!--quire:drivers-->

| ဆက်တင် | ဤထုတ်ဝေမှု | မှတ်စုများ |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (မူလ)၊ `s3` သို့မဟုတ် `azure` | `local` က ဖိုင်များကို `files` volume တွင် ထားသည်။ `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၊ တိုက်ရိုက်အစည်းအဝေးဝန်ဆောင်မှုပေးသူအောက်၌ ၎င်း၏ကိုယ်ပိုင်အကောင့် ချိတ်ဆက်သည်အထိ၊ တိုက်ရိုက်အစည်းအဝေးများ စီစဉ်မထားဟု ဆိုသည်။ အဖွဲ့အစည်းတစ်ခု၏ကိုယ်ပိုင်အကောင့် ဤတန်ဖိုးကို အမြဲအနိုင်ရသည်။ ဝန်ဆောင်မှုပေးသူတစ်ခုစီ၏ကိုယ်ပိုင်ဆက်တင်များ (`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` | Hex စာကြောင်းများ၊ imgproxy စတင်သောတူညီသောတန်ဖိုးများ။ တစ်ခုစီကို `openssl rand -hex 32` ဖြင့် ထုတ်လုပ်ပါ။ Quire က ရုပ်ပုံလိပ်စာတိုင်း ၎င်းတို့နှင့် လက်မှတ်ထိုးသောကြောင့်၊ imgproxy က Quire မတောင်းသည့်အရာ ဖော်ပြမည် မဟုတ်ပါ |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | ဒေသခံသိုလှောင်မှုပါသော `imgproxy` | imgproxy မူရင်းများ ယူသည့်နေရာ။ Compose က `http://web:3000` သတ်မှတ်သည်။ `s3` သို့မဟုတ် `azure` သိုလှောင်မှုဖြင့် imgproxy က ပုံးမှ ယူပြီး ယင်းကို မသုံးပါ |
| `CLOUDFLARE_ACCOUNT_ID`၊ `CLOUDFLARE_IMAGES_TOKEN`၊ `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | Images တည်းဖြတ်ခွင့်ပါသော API တိုကင်၊ Images၊ Developer အရင်းအမြစ်များမှ အကောင့် hash။ အကောင့်အတွက် ပြောင်းလွယ်သောမူကွဲများ ဖွင့်ပါ |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | ရွေးချယ်နိုင်။ သတ်မှတ်ထားပါက ရုပ်ပုံများ သီးသန့်ဖြစ်ပြီး လိပ်စာတိုင်း လက်မှတ်ထိုးသက်တမ်းကုန်သည်။ ၎င်းမရှိပါက ရုပ်ပုံများ `QUIRE_SECRET_KEY` မှ ဆင်းသက်သော မည်သူမှ ခန့်မှန်း၍မရသောလိပ်စာများတွင် အများပြည်သူ ဖြစ်သည် |

Cloudflare Images က ၎င်းဝန်ဆောင်မှုပေးသောမူရင်းတစ်ခုစီ၏ကိုယ်ပိုင်မိတ္တူ သိမ်းသည်။
ဖိုင်တစ်ခု ဖျက်ခံရသည့်အခါ အလုပ်သမားက မူရင်းမတိုင်မီ ထိုမိတ္တူ ဖျက်သည်။

### တန်းစီ <!--quire:queue-->

နောက်ခံအလုပ်များ တူညီသော Postgres ဒေတာဘေ့စ်တွင် pg-boss အသုံးပြုသည်၊ ထို့ကြောင့်
လည်ပတ်ရန်တန်းစီဝန်ဆောင်မှု မရှိပါ စီစဉ်ရန်ဘာမှမရှိပါ။ အလုပ်များ ၎င်းတို့ကို
ဖြစ်စေသောပြောင်းလဲမှုနှင့် တူညီသောငွေလွှဲတွင် တန်းစီသည်၊ ထို့ကြောင့် ပျက်ကျမှု
တစ်ခုကို ဆုံးရှုံးစေ သို့မဟုတ် နှစ်ကြိမ်ပို့၍မရပါ။ `QUIRE_QUEUE_DRIVER` က ဤနေရာတွင်
`pgboss` ဖြစ်သည်၊ ၎င်း၏မူလ။ `vercel` နှင့် `cloudflare` က ပေါ့ပါးသောအသိပေးချက်နှင့်
webhook ပို့ဆောင်မှုများသာ ပလက်ဖောင်း၏ကိုယ်ပိုင်တန်းစီသို့ ရွှေ့သည်၊ Vercel နှင့်
Cloudflare လမ်းညွှန်များက ၎င်းတို့နှင့် ၎င်းတို့၏ဝဘ်အဆင့်များ မည်သို့တန်းစီသည်ကို
ဖော်ပြသည်။

### အီးမေးလ် <!--quire:email-->

တစ်ခုခု သတ်မှတ်ပါ–

- `QUIRE_EMAIL_PROVIDER_CONFIG`– HTTP ဝန်ဆောင်မှုပေးသူနှင့် ၎င်း၏အထောက်အထားများ
  အမည်ပေးသော JSON object တစ်ခု၊ ဥပမာ `{"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 က သင်လက်ခံသော range API ကို ညွှန်သည် |

### စောင့်ကြည့်လေ့လာနိုင်မှု <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` က လုပ်ငန်းစဉ်တိုင်း ခြေရာများနှင့် မက်ထရစ်များ
ပို့သောစုဆောင်းသူ အမည်ပေးသည်။ `observability` ပရိုဖိုင်ဖြင့် ၎င်းက
`http://otelcol:4318` ဖြစ်သည်၊ `docker/otel-collector.yaml` က သင့် backend အတွက်
ထုတ်ယူသူ ထည့်သည့်နေရာ ဖြစ်သည်။ ဝဘ်အဆင့်၊ အလုပ်သမား၊ အချိန်ဇယားဆွဲသူ၊
အကြောင်းအရာနှင့် collab လုပ်ငန်းစဉ်များ သတ်မှတ်ထားသည့်အခါ OTLP/HTTP မှတစ်ဆင့်
span များ ထုတ်ယူသည် (ဝဘ်တောင်းဆိုမှုများ၊ tenant ဒေတာဘေ့စ်ငွေလွှဲများ၊
အလုပ်သမားအလုပ်များနှင့် အထွက်ခေါ်ဆိုမှုများ)၊ မိနစ်တိုင်း တူညီသော endpoint သို့
မက်ထရစ်များ (`OTEL_METRICS_EXPORTER=none` က ၎င်းတို့ကို ပိတ်သည်)။
`OTEL_TRACES_SAMPLER_ARG` က သိမ်းသောခြေရာများ၏အစု သတ်မှတ်သည်။ မှတ်တမ်းများ
`LOG_LEVEL` တွင် စံထုတ်ယူမှုသို့ သွားပြီး Compose က ၎င်းတို့ကို လှည့်သည်။ ခြေရာများ
ကိုယ်ရေးကိုယ်တာဒေတာ ဘယ်တော့မှ မသယ်ပါ။

### ဒေသတွင်းထွက်ပေါက် (EU ဒေတာနေထိုင်မှု) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` က အစုက ဥရောပသမဂ္ဂအဖွဲ့အစည်းများ ဝန်ဆောင်မှုပေးသည်ဟု ဆိုသည်။
ထို့နောက် အလုပ်သမားက EU တွင် ချိတ်ထားသောအဖွဲ့အစည်းအတွက် ပြုလုပ်သောအထွက်တောင်းဆိုမှုတိုင်း
ခွင့်ပြုစာရင်းတွင် ကိုင်ထားသည် (21-compliance.md အပိုင်း 8.1)။ ခွင့်ပြုစာရင်းက
ဒေသအတွက် စီစဉ်ထားသောဝန်ဆောင်မှုများ ကြေညာသောအိမ်ရှင်များ (သိုလှောင်မှု endpoint၊
အီးမေးလ်ဝန်ဆောင်မှုပေးသူ၊ လက်ခံပေးထားသောဗီဒီယိုဝန်ဆောင်မှုပေးသူ၊ အဖွဲ့အစည်း၏ကိုယ်ပိုင်သိုလှောင်မှုပစ်မှတ်များ၊
AI ဝန်ဆောင်မှုပေးသူများနှင့် အီးမေးလ်အကောင့်)၊ တက်ကြွခြွင်းချက်အောက်ရှိ
ဝန်ဆောင်မှုမဆို၏အိမ်ရှင်များ၊ `QUIRE_EGRESS_ALLOW_HOSTS` တွင် သင်စာရင်းပြုစုသောအိမ်ရှင်များ
ဖြစ်သည်။ အခြားအများပြည်သူအိမ်ရှင်မဆိုသို့ တောင်းဆိုမှုကို မပို့မီ ငြင်းပယ်သည်၊
ငြင်းပယ်မှုကို အဖွဲ့အစည်း၏စာရင်းစစ်လမ်းကြောင်းတွင် `privacy/egress_refused` အဖြစ်
ရေးသည်၊ Compliance၊ ဒေတာနေထိုင်မှုအောက်၌ စာရင်းပြုစုသည်။

| ဆက်တင် | တန်ဖိုးများ | သက်ရောက်မှု |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | ကော်မာစာရင်းအိမ်ရှင်အမည်များ၊ သို့မဟုတ် subdomain တိုင်းအတွက် `*.example.org` | EU အဖွဲ့အစည်း ရောက်နိုင်သောအပိုအိမ်ရှင်များ။ Webhook၊ xAPI နှင့် SIEM endpoint များ၊ ဘလော့ဂ်အဟာရများနှင့် Amazon SES အိမ်ရှင်များ ဤနေရာတွင် ပါဝင်သည်၊ ၎င်းတို့က အဖွဲ့အစည်း၏ကိုယ်ပိုင်ရွေးချယ်မှု ဖြစ်ပြီး ဝန်ဆောင်မှုမဆို ၎င်းတို့ကို ကြေညာမထားသောကြောင့်။ Loopback၊ သီးသန့်လိပ်စာများနှင့် `web` သို့မဟုတ် `clamav` ကဲ့သို့ တံဆိပ်တစ်ခုတည်းအမည်များ သင့်ကိုယ်ပိုင်ကွန်ရက် ဖြစ်ပြီး ဘယ်တော့မှ မစစ်ဆေးပါ |

UK နှင့် US အဖွဲ့အစည်းများ အိမ်ရှင်စာရင်းတွင် မကိုင်ထားပါ။ ၎င်းတို့
ဝန်ဆောင်မှုဒေသစစ်ဆေးမှုများ ဆက်ထားသည်။ စာရင်းကို အလုပ်သမားတွင် သတ်မှတ်ပါ။
စီမံခန့်ခွဲစာမျက်နှာက ခွင့်ပြုစာရင်း ပြရန် ဝဘ်အဆင့်တွင် ၎င်းကို ဖတ်သည်၊ ထို့ကြောင့်
ဝန်ဆောင်မှုတိုင်း ဖတ်သော `docker/.env` တွင် ထည့်ပါ။

အက်ပလီကေးရှင်းစစ်ဆေးမှုက ရှင်းလင်းသောအမှားနှင့် စာရင်းစစ်ထည့်သွင်းမှုတစ်ခု ပေးသည်၊
အာမခံချက် မဟုတ်ပါ– ကုဒ် မှားနိုင်သည်။ အာမခံချက်က ကွန်ရက် ဖြစ်သည်။ Compose က
သင့်အတွက် ၎င်းကို အကောင်အထည်မဖော်ပါ။ ဒေသတွင်းအစုအတွက် `worker` နှင့် `web`
ဝန်ဆောင်မှုများကို ထွက်လမ်းတစ်ခုတည်းသာ ထွက်ပေါက် proxy (ဥပမာ Squid သို့မဟုတ်
tinyproxy ကွန်တိန်နာ) ဖြစ်သော `internal: true` ကွန်ရက်တွင် ထားပါ၊
`QUIRE_EGRESS_ALLOW_HOSTS` နှင့် တူညီသောအိမ်ရှင်များ
သင့်စီစဉ်ထားသောဝန်ဆောင်မှုများ၏အိမ်ရှင်များနှင့်အတူ ခွင့်ပြုသည့်အရာ၊ ထိုဝန်ဆောင်မှုများအတွက်
`HTTPS_PROXY` သတ်မှတ်ပါ။ နေထိုင်မှုစာမျက်နှာက အက်ပလီကေးရှင်း ခွင့်ပြုသောအိမ်ရှင်အတိအကျ
စာရင်းပြုစုသည်၊ ထို့ကြောင့် စာရင်းနှစ်ခု နှိုင်းယှဉ်၍ရသည်။

## ကျန်းမာရေး <!--quire:health-->

| endpoint | အဓိပ္ပာယ် |
| --- | --- |
| `/healthz` | အသက်ရှင်မှု– လုပ်ငန်းစဉ် ဖြေကြားသည်။ Compose ကျန်းမာရေးစစ်ဆေးမှုများ ယင်းကို အသုံးပြုသည် |
| `/readyz` | အသင့်ဖြစ်မှု– မှီခိုမှုများ ရောက်နိုင်သည်၊ ရွေးချယ်နိုင်သောဝန်ဆောင်မှုတစ်ခုစီ စီစဉ်ထားသည် သို့မဟုတ် မဟုတ် အစီရင်ခံလျက်။ သင့် load balancer ကို ဤနေရာ ညွှန်ပါ |

`docker compose -f docker/compose.yaml ps` က ဝန်ဆောင်မှုတစ်ခုစီ၏ကျန်းမာရေး ပြသသည်။

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

`proxy` ဝန်ဆောင်မှု (Caddy၊ Apache-2.0၊ `docker/caddy/Caddyfile`) က မူလအစု၏အစိတ်အပိုင်း
ဖြစ်သည်။ port 80 နှင့် 443 တွင် ဖြေကြားပြီး လမ်းကြောင်းပေးသည်–

| အိမ်ရှင် သို့မဟုတ် လမ်းကြောင်း | သွားသည့်နေရာ |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`၊ tenant subdomain တိုင်းနှင့် စိတ်ကြိုက်ဒိုမိန်း | `web` |
| ထိုအိမ်ရှင်များတွင် `/_collab/` | `collab` (websocket၊ `QUIRE_COLLAB_URL`) |
| ထိုအိမ်ရှင်များတွင် `/_realtime/connection/` | `centrifugo` ၏ client websocket။ ၎င်း၏ဆာဗာ API ဘယ်တော့မှ မထုတ်ဖော်ပါ |
| ထိုအိမ်ရှင်များတွင် `/_images/` | `imgproxy`၊ `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` (မူလ)– `localhost`၊ `*.localhost` နှင့် `lvh.me` အတွက် Caddy
  ၏ကိုယ်ပိုင်လက်မှတ်အာဏာပိုင်။ ၎င်း၏အမြစ် တစ်ကြိမ်ယုံကြည်ပြီး ရှာဖွေပါ–

  ```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)။ မူလနှစ်ခုနှင့် tenant အိမ်ရှင်တိုင်းအတွက် DNS
  ဤနေရာ ညွှန်ရမည်၊ port 80 နှင့် 443 အင်တာနက်မှ ရောက်နိုင်ရမည်။

Tenant အိမ်ရှင်များ တောင်းဆိုမှုအလိုက်၊ ပထမလာရောက်မှုတွင်၊ ဝဘ်က အမည် ဤတပ်ဆင်မှုမှ
ဟုတ် အတည်ပြုမှသာ ထုတ်ပေးသည် (`/tls-allowed`၊ Compose ကွန်ရက်တွင် မေးသည်)။
wildcard လက်မှတ် သို့မဟုတ် DNS ဝန်ဆောင်မှုပေးသူပလပ်အင် မလိုပါ၊ အမည်တစ်ခု အိမ်ရှင်သို့
ညွှန်သောသူစိမ်း လက်မှတ်များ တောင်းခိုင်း၍မရပါ။ လက်မှတ်များနှင့် ဒေသခံအာဏာပိုင်
`caddy-data` volume တွင် နေသည်။ `internal` အသုံးပြုပါက ကျန်အရာများနှင့် အတူ
အရန်သိမ်းပါ။

ဝဘ်က proxy တည်းတင် `X-Forwarded-For` ကို ယုံကြည်သည်– proxy တွင် ပုံသေလိပ်စာ
(`QUIRE_PROXY_ADDRESS`၊ မူလ `172.29.64.10`) ပုံသေကွန်ရွက်ခွဲ
(`QUIRE_COMPOSE_SUBNET`) တွင် ရှိသည်၊ `QUIRE_TRUSTED_PROXY_CIDRS` က ထိုလိပ်စား
အမည်ပေးသည်။ ကွန်ရွက်ခွဲ အိမ်ရှင်ရှိကွန်ရက်နှင့် တိုက်မိပါက နှစ်ခုစလုံး ပြောင်းပြီး
`docker compose down` ကို `up` မပြုမီ လည်ပတ်ပါ။

## သင့်ကိုယ်ပိုင်ပြောင်းပြန် proxy နောက် <!--quire:behind-your-own-reverse-proxy-->

အစား သင်လည်ပတ်ပြီးသား load balancer သို့မဟုတ် proxy အသုံးပြုရန် `proxy` ချန်ပါ
(`docker compose up -d --scale proxy=0`)၊ `web` (8080)၊ `content` (8081)၊ `collab`
(1234၊ websocket) နှင့် `centrifugo` (8000၊ websocket) ရှေ့တွင် TLS အဆုံးသတ်ပါ။
အများပြည်သူလိပ်စာများ `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
  script တစ်ကြိမ်လည်ပတ်သည်။ `ALTER ROLE` အသုံးပြုပါ။
- `CLAMAV_URL` သတ်မှတ်ထားစဉ် အပ်လုဒ်များ စကင်အမှားဖြင့် မအောင်ပါ– ClamAV က
  ပထမစတင်မှုတွင် ၎င်း၏လက်မှတ်များ ဒေါင်းလုဒ်လုပ်သည်၊ မိနစ်အနည်းငယ် ကြာသည်။

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