---
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/ml/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, അതിന്റെ പശ്ചാത്തല ജോലികൾ, റിയൽടൈമും സഹകരണ എഡിറ്റിംഗ് സേവനങ്ങളും, കൂടാതെ ഒരു പ്രൊഫൈലിനു പിന്നിലുള്ള ഓരോ ഐച്ഛിക സേവനവും. രൂപകൽപ്പന `docs/architecture/23-ops.md`-ലെ 2-ാം വിഭാഗമാണ്.

മറ്റു ലക്ഷ്യസ്ഥാനങ്ങൾ: [Vercel](/ml/ops/vercel/), [Cloudflare Workers](/ml/ops/cloudflare/) വെബ് ടയർ മാത്രമേ പ്രവർത്തിപ്പിക്കൂ. അപ്ഗ്രേഡുകൾ [upgrade.md](/ml/ops/upgrade/)-ലും, ബാക്കപ്പുകളും റീസ്റ്റോർ ഡ്രില്ലും [backup-restore.md](/ml/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-ഉം കണ്ടന്റ് ഓറിജിനിൽ പ്രവർത്തിക്കും, അതിനാൽ അവയ്ക്ക് LMS-ന്റെ കുക്കികൾ ഒരിക്കലും വായിക്കാൻ കഴിയില്ല.
- ലോക്കൽ പരീക്ഷണത്തിന്, `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`; ഓരോ രഹസ്യവും എങ്ങനെ നിർമ്മിക്കണമെന്ന് ഫയൽ പറയും.

രണ്ട് ഓറിജിനുകളും `https` ആയിരിക്കണം: പ്രൊഡക്ഷനിൽ കണ്ടന്റ് സേവനം സാധാരണ http-നെ നിരസിക്കും, കൂടാതെ അവ ഒരേ രജിസ്റ്റർ ചെയ്യാവുന്ന ഡൊമെയിൻ പങ്കിടരുത്. `proxy` സേവനം രണ്ടിന്റെയും TLS അവസാനിപ്പിക്കും ("TLS" കാണുക); `init-env.sh` `http://` ഓറിജിനെ നിരസിക്കും.

സ്റ്റാക്ക് നിശ്ചിത ക്രമത്തിൽ ആരംഭിക്കും, ഓരോ ഘട്ടവും മുൻപത്തേതിനായി കാത്തിരിക്കും:

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 | എപ്പോഴും | ഡാറ്റാബേസ് (pgvector ഉള്ള PostgreSQL 18, `docker/postgres.Dockerfile`-ൽ നിന്ന് ബിൽഡ് ചെയ്തത്), ആദ്യ ബൂട്ട് മുതൽ WAL ആർക്കൈവ് ചെയ്ത് |
| migrate, init | എപ്പോഴും | ഒറ്റത്തവണ: മൈഗ്രേഷനുകൾ, പിന്നെ ആദ്യ പ്രവർത്തനം |
| web | എപ്പോഴും | LMS, `QUIRE_HTTP_PORT` (8080)-ൽ |
| content | എപ്പോഴും | വിശ്വാസ്യമല്ലാത്ത ഉള്ളടക്കത്തിന്റെ ഓറിജിൻ, `QUIRE_CONTENT_PORT` (8081)-ൽ |
| worker | എപ്പോഴും | പശ്ചാത്തല ജോലികൾ: ഇമെയിൽ, റിപ്പോർട്ടുകൾ, ഫയൽ പ്രോസസ്സിംഗ്, വെബ്ഹുക്കുകൾ |
| scheduler | എപ്പോഴും | ആവർത്തന ജോലികൾ: 64 റൺടൈം ഷെഡ്യൂളുകൾ രജിസ്റ്റർ ചെയ്ത് വർക്കറിന് കൈമാറും; ഒരേ സമയം ഒരു ലീഡർ |
| collab | എപ്പോഴും | സഹകരണ എഡിറ്റിംഗ് വെബ്സോക്കറ്റ്, `QUIRE_COLLAB_HTTP_PORT` (1234)-ൽ |
| centrifugo | എപ്പോഴും | റിയൽടൈം ഫാൻ-ഔട്ട്, `QUIRE_REALTIME_PORT` (8000)-ൽ |
| proxy | എപ്പോഴും | Caddy, പോർട്ട് 80, 443-ലെ TLS മുൻവാതിൽ ("TLS" കാണുക) |
| valkey | `cache` | ക്യാഷും നിരക്ക് പരിമിതികളും |
| clamav | `scan` | അപ്‌ലോഡുകളുടെ മാൽവെയർ സ്കാനിംഗ് |
| gotenberg | `preview` | Office-ൽ നിന്ന് PDF മുൻകാഴ്ചകൾ, സർട്ടിഫിക്കറ്റ് റെൻഡറിംഗ് |
| imgproxy | `images` | വലുതാക്കിയതും പരിവർത്തനം ചെയ്തതുമായ ചിത്രങ്ങൾ |
| transcoder | `video` | LGPL മാത്രമുള്ള ffmpeg-ഓടുള്ള വർക്കർ ഇമേജ്, വീഡിയോ റെൻഡിഷനുകൾക്ക് |
| seaweedfs | `storage` | ഈ ഹോസ്റ്റിലെ S3-അനുയോജ്യ ഒബ്ജക്റ്റ് സ്റ്റോറേജ് |
| 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 ടൂൾ ഇമേജ്, `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 സ്റ്റേറ്റ്മെന്റുകൾ അയയ്ക്കില്ല. Moodle ഇംപോർട്ടുകൾ H5P പ്രവർത്തനങ്ങൾക്ക് 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` | കണ്ടന്റ് ഓറിജിൻ, വ്യത്യസ്തമായ ഒരു ഹോസ്റ്റ് |
| `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` | സെഷനുകളും ടോക്കണുകളും ഒപ്പിടും. 64 ഹെക്സ് അക്ഷരങ്ങൾ |
| `QUIRE_MASTER_KEY` | SSO, വെബ്ഹുക്ക് രഹസ്യങ്ങൾ പോലുള്ള സൂക്ഷിച്ച ക്രെഡൻഷ്യലുകൾ റാപ്പ് ചെയ്യും. 32 ബൈറ്റ്, base64. വെബ് ടയറിനും വർക്കറിനും ഒരേ മൂല്യം ആവശ്യമാണ്. റൊട്ടേഷൻ: [key-rotation.md](/ml/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | മാസ്റ്റർ കീയുടെ പതിപ്പ് ലേബൽ, സജ്ജമല്ലെങ്കിൽ `v1`. റൊട്ടേറ്റ് ചെയ്യുമ്പോൾ അത് ഉയർത്തൂ |
| `QUIRE_MASTER_KEY_RETIRED` | അവ സീല് ചെയ്തത് വായിക്കാൻ ഇപ്പോഴും ആവശ്യമുള്ള മുൻപത്തെ മാസ്റ്റർ കീകൾ, `v1=<base64>` രൂപത്തിൽ. ഒന്നും പരിഹരിക്കാതെ റൊട്ടേഷൻ പൂർത്തിയായതിന് ശേഷം നീക്കം ചെയ്യൂ |
| `QUIRE_COLLAB_SIGNING_KEY` | എഡിറ്റിംഗ് ടോക്കണുകൾ ഒപ്പിടാൻ web, collab പങ്കിടുന്നു |
| `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` ക്രമീകരിച്ച ഭൗതിക ഡാറ്റാബേസിന് വേണ്ടിയാണ് ഉപയോഗിക്കുന്നത്. മറ്റേതെങ്കിലും രജിസ്റ്റർ ചെയ്ത ഭൗതിക ഡാറ്റാബേസിന്, web, worker എന്നീ എൻവിരോൺമെന്റുകളിൽ അതിന്റെ സ്വന്തം `quire_report` കണക്ഷൻ URL സജ്ജമാക്കി, പിന്നെ വേരിയബിളിന്റെ പേര് ആ ഡാറ്റാബേസിന്റെ **റിപ്പോർട്ടിംഗ് എൻവിരോൺമെന്റ് വേരിയബിൾ** ഫീൽഡിൽ `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` | ലൈവ് സെഷനുകൾക്കുള്ള പ്ലാറ്റ്ഫോം സ്ഥിരസ്ഥിതി. സജ്ജമല്ലെങ്കിൽ, ഒരു സ്ഥാപനം ഇന്റഗ്രേഷനുകളിൽ സ്വന്തം അക്കൗണ്ട് ബന്ധിപ്പിക്കും വരെ ലൈവ് സെഷനുകൾ ക്രമീകരിച്ചിട്ടില്ലെന്ന് പറയും, ലൈവ് സെഷൻ പ്രൊവൈഡർ. ഒരു സ്ഥാപനത്തിന്റെ സ്വന്തം അക്കൗണ്ട് എപ്പോഴും ഈ മൂല്യത്തേക്കാൾ മുൻഗണന നേടും. ഓരോ പ്രൊവൈഡറിന്റെയും സ്വന്തം ക്രമീകരണങ്ങൾ (`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 ഓരോ ചിത്ര വിലാസവും അവ ഉപയോഗിച്ച് ഒപ്പിടും, അതിനാൽ Quire ആവശ്യപ്പെടാത്തതൊന്നും imgproxy റെൻഡർ ചെയ്യില്ല |
| `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 resources-ൽ നിന്നുള്ള അക്കൗണ്ട് ഹാഷ്. അക്കൗണ്ടിന് flexible variants ഓണാക്കൂ |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | ഐച്ഛികം. സജ്ജമാക്കിയാൽ, ചിത്രങ്ങൾ സ്വകാര്യമാകും, ഓരോ വിലാസവും ഒപ്പിടുകയും കാലാവധി കഴിയുകയും ചെയ്യും. ഇല്ലെങ്കിൽ, ചിത്രങ്ങൾ `QUIRE_SECRET_KEY`-ൽ നിന്ന് ഉത്ഭവിപ്പിച്ച വിലാസങ്ങളിൽ പബ്ലിക് ആണ്, ആർക്കും ഊഹിക്കാൻ കഴിയാത്തത് |

Cloudflare Images അത് സേവ് ചെയ്യുന്ന ഓരോ യഥാർത്ഥത്തിന്റെയും സ്വന്തം പകർപ്പ് സൂക്ഷിക്കും. ഒരു ഫയൽ ഇല്ലാതാക്കുമ്പോൾ, വർക്കർ യഥാർത്ഥത്തിന് മുമ്പ് ആ പകർപ്പ് ഇല്ലാതാക്കും.

### ക്യൂ <!--quire:queue-->

പശ്ചാത്തല ജോലികൾ അതേ Postgres ഡാറ്റാബേസിൽ pg-boss ഉപയോഗിക്കും, അതിനാൽ പ്രവർത്തിപ്പിക്കാൻ ഒരു ക്യൂ സേവനവും ക്രമീകരിക്കാനൊന്നുമില്ല. ജോലികൾ അവ ഉണ്ടാക്കിയ മാറ്റത്തിന്റെ അതേ ട്രാൻസാക്ഷനിലാണ് ക്യൂവിലാക്കുന്നത്, അതിനാൽ ഒരു തകരാറിന് ഒന്ന് നഷ്ടപ്പെടുത്താനോ രണ്ടുതവണ അയയ്ക്കാനോ കഴിയില്ല. `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`-നെതിരെ ഓണാണ് (അഞ്ചക്ഷര ഹാഷ് പ്രീഫക്സ് മാത്രമേ അയയ്ക്കൂ); `off` അത് ഓഫാക്കും, URL നിങ്ങൾ നടത്തുന്ന ഒരു റേഞ്ച് API-യെ ചൂണ്ടും |

### നിരീക്ഷണം <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` എല്ലാ പ്രോസസ്സും ട്രേസുകളും മെട്രിക്കുകളും അയയ്ക്കുന്ന കളക്ടറിന്റെ പേര് പറയും; `observability` പ്രൊഫൈലോടെ അത് `http://otelcol:4318` ആണ്, നിങ്ങളുടെ ബാക്കെന്റിനുള്ള എക്സ്പോർട്ടർ ചേർക്കുന്നത് `docker/otel-collector.yaml`-ൽ ആണ്. അത് സജ്ജമാക്കിയാൽ വെബ് ടയർ, വർക്കർ, ഷെഡ്യൂളർ, കണ്ടന്റ്, കോളബ് പ്രോസസ്സുകൾ OTLP/HTTP വഴി സ്പാനുകൾ എക്സ്പോർട്ട് ചെയ്യും (വെബ് അഭ്യർത്ഥനകൾ, ടെനന്റ് ഡാറ്റാബേസ് ട്രാൻസാക്ഷനുകൾ, വർക്കർ ജോലികൾ, ഔട്ട്ബൗണ്ട് വിളികൾ), കൂടാതെ ഓരോ മിനിറ്റിലും അതേ എൻഡ്പോയിന്റിലേക്ക് മെട്രിക്കുകൾ (`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) നിയന്ത്രിക്കും. അലൗ ലിസ്റ്റ് ക്രമീകരിച്ച സേവനങ്ങൾ ഈ മേഖലയ്ക്കായി പ്രഖ്യാപിക്കുന്ന ഹോസ്റ്റുകളാണ് (സ്റ്റോറേജ് എൻഡ്പോയിന്റ്, ഇമെയിൽ പ്രൊവൈഡർ, ഒരു ഹോസ്റ്റ് ചെയ്ത വീഡിയോ പ്രൊവൈഡർ, സ്ഥാപനത്തിന്റെ സ്വന്തം സ്റ്റോറേജ് ലക്ഷ്യസ്ഥാനങ്ങൾ, AI പ്രൊവൈഡറുകൾ, ഇമെയിൽ അക്കൗണ്ട്), സജീവമായ ഒരു ഒഴിവാക്കലിനു കീഴിലുള്ള ഏതു സേവനത്തിന്റെയും ഹോസ്റ്റുകൾ, കൂടാതെ `QUIRE_EGRESS_ALLOW_HOSTS`-ൽ നിങ്ങൾ പട്ടികപ്പെടുത്തുന്ന ഹോസ്റ്റുകൾ. മറ്റേതെങ്കിലും പബ്ലിക് ഹോസ്റ്റിലേക്കുള്ള ഒരു അഭ്യർത്ഥന അയയ്ക്കും മുമ്പ് നിരസിക്കപ്പെടും, നിരസ്ഥം സ്ഥാപനത്തിന്റെ ഓഡിറ്റ് ട്രെയിലിൽ `privacy/egress_refused` ആയി എഴുതപ്പെടും, അത് Compliance, Data residency-ൽ പട്ടികപ്പെടുത്തും.

| ക്രമീകരണം | മൂല്യങ്ങൾ | ഫലം |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | ഹോസ്റ്റ്നെയിമുകളുടെ കോമ പട്ടിക, അല്ലെങ്കിൽ ഓരോ സബ്ഡൊമെയിനിനും `*.example.org` | EU സ്ഥാപനത്തിന് എത്താവുന്ന അധിക ഹോസ്റ്റുകൾ. വെബ്ഹുക്ക്, xAPI, SIEM എൻഡ്പോയിന്റുകൾ, ബ്ലോഗ് ഫീഡുകൾ, Amazon SES ഹോസ്റ്റുകൾ ഇവിടെ പെടും, കാരണം അവ ഒരു സ്ഥാപനത്തിന്റെ സ്വന്തം തിരഞ്ഞെടുപ്പാണ്, ഒരു സേവനവും അവ പ്രഖ്യാപിക്കില്ല. ലൂപ്പ്ബാക്ക്, സ്വകാര്യ വിലാസങ്ങൾ, `web`, `clamav` പോലുള്ള ഒറ്റ ലേബൽ പേരുകൾ നിങ്ങളുടെ സ്വന്തം നെറ്റ്‌വർക്കാണ്, ഒരിക്കലും പരിശോധിക്കപ്പെടില്ല |

UK, US സ്ഥാപനങ്ങൾ ഒരു ഹോസ്റ്റ് പട്ടികയ്ക്ക് വിധേയമല്ല; അവ സേവന മേഖല പരിശോധനകൾ നിലനിർത്തും. പട്ടിക വർക്കറിൽ സജ്ജമാക്കൂ; അഡ്മിൻ പേജ് അലൗ ലിസ്റ്റ് കാണിക്കാൻ വെബ് ടയറിൽ അത് വായിക്കും, അതിനാൽ അത് `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` (വെബ്സോക്കറ്റ്, `QUIRE_COLLAB_URL`) |
| ആ ഹോസ്റ്റുകളിലെ `/_realtime/connection/` | `centrifugo`-യുടെ ക്ലയന്റ് വെബ്സോക്കറ്റ്; അതിന്റെ സെർവർ 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` (സ്ഥിരസ്ഥിതി): 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). രണ്ട് ഓറിജിനുകൾക്കും ഓരോ ടെനന്റ് ഹോസ്റ്റിനുമുള്ള DNS ഇവിടേക്ക് ചൂണ്ടണം, പോർട്ട് 80, 443 ഇന്റർനെറ്റിൽ നിന്ന് എത്താവുന്നവയായിരിക്കണം.

ടെനന്റ് ഹോസ്റ്റുകൾ ആവശ്യാനുസരണം, ആദ്യത്തെ സന്ദർശനത്തിൽ, web ആ പേര് ഈ ഇൻസ്റ്റലിന്റേതാണെന്ന് സ്ഥിരീകരിക്കുമ്പോൾ മാത്രമേ നൽകൂ (`/tls-allowed`, Compose നെറ്റ്‌വർക്കിൽ ചോദിക്കുന്നു). ഒരു വൈൽഡ്കാർഡ് സർട്ടിഫിക്കറ്റോ DNS പ്രൊവൈഡർ പ്ലഗിനോ ആവശ്യമില്ല, ഹോസ്റ്റിലേക്ക് ഒരു അപരിചിതൻ പേര് ചൂണ്ടിയാലും അതിന് സർട്ടിഫിക്കറ്റുകൾ ആവശ്യപ്പെടാൻ കഴിയില്ല. സർട്ടിഫിക്കറ്റുകളും ലോക്കൽ അതോറിറ്റിയും `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`) `web` (8080), `content` (8081), `collab` (1234, വെബ്സോക്കറ്റ്), `centrifugo` (8000, വെബ്സോക്കറ്റ്)-ന് മുന്നിൽ TLS അവസാനിപ്പിക്കൂ. പബ്ലിക് വിലാസങ്ങൾ `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/ml/ops/install/index.mdx
