---
title: "Instituere Quire cum Docker Compose"
description: "Institue Quire in tua ipsius machina cum Docker Compose."
image: "https://docs.quirelms.com/og.png"
---

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

# Instituere Quire cum Docker Compose

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

Haec est productio integra in uno hospite: LMS, eius opus post tergum, servitium
temporis realis et emendationis collaborativae, et omne servitium optionale sub
profilo. Consilium est `docs/architecture/23-ops.md` sectio 2.

Aliae metae: [Vercel](/la/ops/vercel/) et [Cloudflare Workers](/la/ops/cloudflare/) solum
stratum textorium currunt. Promotiones in [upgrade.md](/la/ops/upgrade/) sunt, et
custodiae et exercitium restitutionis in [backup-restore.md](/la/ops/backup-restore/).

## Quae desideres <!--quire:what-you-need-->

- Docker Engine 27 aut posterius cum plugino Compose 2.30 aut posteriore.
- 4 nuclei CPU et 8 GB memoriae pro strue pristina; 8 nuclei et 16 GB cum
  `--profile full` (ClamAV solus circiter 1.5 GB signorum tenet).
- Nomen DNS pro strato textorio et secundum pro contento non fideli. Diversi
  hospites esse debent: sarcinae SCORM et HTML emissum in origine contenti
  currit ut numquam cookies LMS legere possint.
- Pro experimento locali, `lvh.me` et `*.localhost` in 127.0.0.1 respondent, quod
  `docker/.env.example` usurpat. Ipsa servitium `proxy` strues utrumque per https
  cum auctoritate certificationis locali praebet, ideo nihil aliud instituitur
  (vide "TLS").
- Portus 80 et 443 liberi in hospite (`QUIRE_PROXY_HTTP_PORT` et
  `QUIRE_PROXY_HTTPS_PORT` eos movent).

## Prima curricula <!--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` scribit `docker/.env` ex `docker/.env.example` cum
omnibus arcanis generatis (signa bases datae, claves signandi et magistralis,
par clavium launch contenti) et clavis signandi checkpoint custodiae in
`docker/secrets/audit-signing-key.pem`, quam Compose in operarios ut arcanum
inserit. Ei solum `sh`, `awk` et `openssl` opus est, et `docker/.env` iam existens
super scribere recusat. Utrasque filetulos ex hospite aufer: sine
`QUIRE_MASTER_KEY` bases datae restitutae arcana servata dechiffrare non possunt.
Ut filetulum manu impleas potius, `cp docker/.env.example docker/.env`; filetulus
dicit quomodo quodque arcanum generetur.

Utraque origo `https` esse debet: servitium contenti http nudum in productione
recusat, et commune domen registrabile habere non debent. Servitium `proxy`
utriusque TLS terminat (vide "TLS"); `init-env.sh` originem `http://` recusat.

Strues certum ordinem incipit, et quisque gradus illum qui praecedit expectat:

1. `postgres` sanus fit. Prima vice cum incipit scriptum eius initiale
   (`docker/postgres/init/90-passwords.sh`) quattuor signa rerum ponit.
2. `migrate` omnem migrationem adplicat et ordinem laborum in bases datae
   imperii et in quaque bases datae inquilino dedicato instruit, inspicit ut
   omnes consentiant, tum exit (docs/ops/upgrade.md).
   Migrationes in omni initio curriunt et idempotentes sunt, ideo promotio est
   nova imago et nova initio.
3. `init` (`apps/web/src/first-run.ts`) bases datae applicationis sub
   `QUIRE_DATABASE_ID` adnotat et, cum `QUIRE_SETUP_ADMIN_EMAIL` positum est,
   primum collegium eiusque administratorem creat. Addressa introitus et signum
   generatum semel in `docker compose logs init` eduntur.
4. `web`, `content`, `worker`, `scheduler`, `collab` et `centrifugo` incipiunt.
5. `proxy` incipit simul ac `web` et `content` sani sunt.

Aperi `https://demo.` sub tuo domino applicationis (scriptum `init` exactam
addressam introitus edit) et consede. In institutione locali, prius
auctoritatem certificationis proxy crede (vide "TLS"). Signum generatum in
`/account/security` muta.

Processus sine arcano necessario inceptus recusat incipere et id quod deest
nominat in libro suo. Nihil semi-dispositum incipit.

## Servitia et profila <!--quire:services-and-profiles-->

| Servitium | Profilum | Quod faciat |
| --- | --- | --- |
| postgres | semper | Bases datae (PostgreSQL 18 cum pgvector, ex `docker/postgres.Dockerfile` aedificata), cum WAL ex prima incursione archivata |
| migrate, init | semper | Semel: migrationes, deinde prima curricula |
| web | semper | LMS, in `QUIRE_HTTP_PORT` (8080) |
| content | semper | Origo contenti non fidelis, in `QUIRE_CONTENT_PORT` (8081) |
| worker | semper | Officia post tergum: epistulae, commentaria, tractatio filetulorum, retia textoria |
| scheduler | semper | Officia recursiva: sexaginta quattuor ordines in cursu rei inscribit eosque operario tradit; unus dux ad tempus |
| collab | semper | Emendatio collaborativa websocket, in `QUIRE_COLLAB_HTTP_PORT` (1234) |
| centrifugo | semper | Dispersio temporis realis, in `QUIRE_REALTIME_PORT` (8000) |
| proxy | semper | Caddy, ianua TLS in portibus 80 et 443 (vide "TLS") |
| valkey | `cache` | thesaurus et limites velocii |
| clamav | `scan` | Examen malverti emissionum |
| gotenberg | `preview` | Praemonstrationes Office in PDF, renderatio testimoniorum |
| imgproxy | `images` | Imagines dimensionibus mutatae et convertitae |
| transcoder | `video` | Imago operarii cum ffmpeg soli LGPL, pro versionibus video |
| seaweedfs | `storage` | Receptio obiectorum S3 compatibilis in hoc hospite |
| otelcol | `observability` | Collectror OpenTelemetry |
| mailpit | `devmail` | Omne epistulam exeuntem capit, ut Quire experiaris |
| backup | `backup` | Custodia base semel; vide backup-restore.md |
| backup-scheduler, backup-offsite | `backup` | Custodia base omne `QUIRE_BACKUP_INTERVAL_HOURS`, et copiae extra hospitum encryptatae cum exercitatione hebdomadali explorationis |
| h5p | `h5p` | Imago instrumenti H5P LTI 1.3 quam tu in `QUIRE_H5P_IMAGE` praebes, in `QUIRE_H5P_PORT` (8090); vide "Praebitorem H5P coniungere" |

`--profile full` omne servitium optionale incipit exceptis `backup` et `h5p`.
Unum incipe cum `docker compose -f docker/compose.yaml --profile scan up -d`.
Sine servitio optionali Quire adhuc operatur et dicit quid desit: sine examinatore
emissiones non examinatae servantur et administrator dicitur; sine Gotenberg
filetuli praemonstrationem potius quam emissionem offerunt; sine transcodice
video ut filetulus originalis luditur.

Quaelibet imago tertiae partis eiusque obligationes licentiae in
`docker/third-party-containers.yaml` enumerantur.

### Praebitorem H5P coniungere <!--quire:connecting-an-h5p-provider-->

Quire cursum rei H5P aut socium (ADR 0019) non inserit nec emit. Si H5P uteris,
subscriptionem tuam hospitatam praebue aut exemplar tuum H5P apud se hospitatum
separatis a Quire administrare. Eum praebitorem ut instrumentum externum LTI 1.3
inscribe et eius contenta in cursus ut instrumenta actuum adde. Quire gradus et
progressum actus/gradus per LTI Assignment and Grade Services (AGS) commutat.
Si praebitor etiam enuntia xAPI mittat, id separatis pro thesaurio enuntiatorum
xAPI Quire dispone; commutatio graduum/progressus AGS enuntia xAPI non mittit.
Importationes Moodle H5P actus ut coniunctionem instrumenti LTI desiderantes
renuntiant. Praebitor de suo cursu rei H5P, compositione, promptuario contentorum
et historia conatuum respondet.

Ut exemplar tuum H5P apud se hospitatum in hoc hospite curreas, `QUIRE_H5P_IMAGE`
in eius imaginem pone et profilum `h5p` incipe. Compose id in `QUIRE_H5P_PORT`
(8090) publicat et eius data in volumine `h5p-data` servat; imago, et obligationes
quae cum ea veniunt, tua manent.

## Constitutiones <!--quire:settings-->

Quisque processus `docker/.env` legit. Template, `docker/.env.example`, quamque
constitutionem cum eius pristino enumerat. Glandes:

### Addressa <!--quire:addresses-->

| Constitutio | Significatio |
| --- | --- |
| `QUIRE_APP_ORIGIN` | Addressa publica LMS, ut `https://learn.example.com` |
| `QUIRE_CONTENT_ORIGIN` | Origo contenti, hospes diversus |
| `QUIRE_PLATFORM_DOMAINS` | Domena sub quibus collegia vivunt, commatibus discreta |
| `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` hic. Vide alia praecepta pro `vercel` et `cloudflare` |
| `QUIRE_TRUSTED_PROXY_CIDRS` | Proxeni quorum `X-Forwarded-For` creditur |

### Arcana <!--quire:secrets-->

| Constitutio | Significatio |
| --- | --- |
| `QUIRE_SECRET_KEY` | Sessiones et signa signat. 64 characteres hexadecimales |
| `QUIRE_MASTER_KEY` | Arcana servata ut SSO et arcana retextoris involvit. 32 byta, base64. Stratum textorium et operarius eundem valorem desiderant. Rotatio: [key-rotation.md](/la/ops/key-rotation/) |
| `QUIRE_MASTER_KEY_VERSION` | Titulus versionis clavis magistralis, `v1` cum non positum. Eum cum rotas extolle |
| `QUIRE_MASTER_KEY_RETIRED` | Antiquiores claves magistrales adhuc necessariae ad id quod sigillaverunt legendum, ut `v1=<base64>`. Remove cum rota absoluta est nihilque inresolverum est |
| `QUIRE_COLLAB_SIGNING_KEY` | A web et collab commune ut signa emendationis signet |
| `QUIRE_BACKUP_SIGNING_KEY` | Custodias cursuum signat (optionaliter) |

Copiam `QUIRE_MASTER_KEY` alibi quam in hoc hospite serva. Bases datae absque eo
restitutae arcana quae tenet dechiffrare non possunt.

### Bases datae <!--quire:database-->

| Constitutio | Significatio |
| --- | --- |
| `POSTGRES_PASSWORD` | Superusor, quem container et custodiae usurpant |
| `QUIRE_DB_APP_PASSWORD`, `QUIRE_DB_MIGRATOR_PASSWORD`, `QUIRE_DB_REPORT_PASSWORD`, `QUIRE_DB_AUDIT_PASSWORD` | Signa rerum, prima incursione posita |
| `DATABASE_URL` | Rola applicationis. Securitas in linea row ad quamlibet petitionem quam facit adplicatur |
| `DATABASE_MIGRATOR_URL`, `QUIRE_MIGRATION_URL` | Rola migratoris, pro `migrate` et `init` |
| `QUIRE_SUPERUSER_URL` | Solum a prima curricula usurpatur |
| `QUIRE_REPORT_DATABASE_URL` | Rola commentariorum soli legenti, pro commentariis et aedificatore commentariorum |
| `QUIRE_AUDIT_DATABASE_URL` | Rola custodiae, pro console custodiae et exportu SIEM |
| `QUIRE_DATABASE_ID` | Quivis UUID, per vitam institutionis fixus |

Signa rerum solum cum volumen bases datae primum creatur adplicantur. Ut unum
postea mutes, `ALTER ROLE` utere et deinde URL congruens renovate.

`QUIRE_REPORT_DATABASE_URL` pro bases datae physica a `DATABASE_URL` disposita
usurpatur. Pro quavis alia bases datae physica registrata, propriam eius
connectionem `quire_report` in ambiente web et worker pone, deinde nomen variabilis
in campo **Reporting environment variable** illarum basium pone ut `env:NAME`.
Referentia ad easdem bases datae ac eius connexio applicationis pertinere debet,
optime eius exemplar lecturae. Quaelibet facies commentariorum inquilinum ad
propriam eius connectionem commentariorum sequitur: aedificator commentariorum
et commentaria servata, traditiones constitutae, exportationes commentariorum,
analytica, liber custodiae, res API custodiae et quaestio custodiae adiutoris.
Nulla eorum umquam URL commentariorum alterarum basium mutuatur. Cum bases
datae nullam habent connectionem commentarium, commentaria vulgaria in ipsius
connectione applicationis curriunt, cum analytica et quaelibet lectura custodiae
recusant et ita dicunt, quia rola applicationis vestigium custodiae legere non
potest.

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

| Constitutio | Haec editio | Notae |
| --- | --- | --- |
| `QUIRE_STORAGE_DRIVER` | `local` (pristinum), `s3` aut `azure` | `local` filetulos in volumine `files` servat. `s3` tegit AWS S3, R2, GCS interoperabilitatem et alias receptores S3 compatibiles, cum emissionibus multipartibus resumendis |
| `QUIRE_REALTIME_DRIVER` | `inprocess` (pristinum), `sse`, `centrifugo` aut `durable_objects` | `inprocess` pro uno container textorio rectum est; utere `centrifugo` aut `sse` cum plures sunt |
| `QUIRE_CACHE_DRIVER` | `memory` (pristinum), `postgres` aut `valkey` | `memory` pro quoque processu est; utere `valkey` aut `postgres` ut limites velocii per containers teneantur |
| `QUIRE_VIDEO_DRIVER` | `ffmpeg` (pristinum) aut `progressive_mp4` | Aut praebitor hospitatus: Cloudflare Stream, Mux aut Bunny, per suas claves |
| `QUIRE_IMAGE_DRIVER` | `noop` (pristinum), `imgproxy` aut `cloudflare` | `noop` quamque imaginem in magnitudine originali praebet. `imgproxy` profilum `images` et constitutiones infra desiderat; `cloudflare` Cloudflare Images usurpat |
| `QUIRE_MEETING_PROVIDER` | `bbb`, `zoom`, `teams`, `meet`, `jitsi` aut `in_process` | Pristinum tabulae pro sessionibus vivis. Non positum, sessiones vivae dicunt se non dispositas, usque ad id cum collegium proprium sub Integrationes, Praebitor sessionis vivae coniungit. Proprius collegii locuplex semper super hunc valorem vincit. Propriae constitutiones cuiusque praebitoris (`BBB_URL` et `BBB_SECRET`, variabiles `ZOOM_*`, `TEAMS_*`, `GOOGLE_MEET_*` et `JITSI_*`) solum pro praebitore hic nominato leguntur |
| `QUIRE_MEETING_REGIONS` | Lista `eu`, `uk`, `us` commatibus discreta | Ubi praebitor pristinus tabulae conventus tractat. Non positum, cum collegio in regione definito non comparatur, ut prius. Proprius collegii locuplex regiones suas in sua pagina dicit |

Valor ducentis quem haec editio non continet cum stratum textorium incipit
refuitur, cum constitutio nominatur, potius quam tacite per pristinum mutetur.

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

Paginae imagines quattuor magnitudinibus fixis petunt per
`/api/files/{id}/image/{size}`, quod eandem aditum qua filetulus ipse inspicit
et deinde ad servitium imaginum redirectit. Quodque collegium petere potest
`QUIRE_IMAGE_SPECS_PER_HOUR` (pristinum 2000) novas copulas imaginis et
magnitudinis per horam; magnitudines iam eo horae factae non numerantur. Utere
`valkey` aut `postgres` pro `QUIRE_CACHE_DRIVER` cum plus quam uno container
textorio, ita ut limitus per eos teneatur.

| Constitutio | Dux | Notae |
| --- | --- | --- |
| `IMGPROXY_URL` | `imgproxy` | Addressa quam navigatrores attingunt, verbi causa `https://images.example.org`. Profilum `images` eam in `QUIRE_IMAGES_PORT` (8082) publicat |
| `IMGPROXY_KEY`, `IMGPROXY_SALT` | `imgproxy` | Stringae hexadecimales, eae quibus imgproxy incipitur. Quamque `openssl rand -hex 32` genera. Quire singulas imaginum addressas iis signat, ideo imgproxy nihil reddit quod Quire non petierit |
| `QUIRE_IMAGE_SOURCE_ORIGIN` | `imgproxy` cum repositione locali | Ubi imgproxy originalia petat. Compose `http://web:3000` ponit. Cum repositio `s3` aut `azure` imgproxy ex bucket petat id non usurpatur |
| `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_IMAGES_TOKEN`, `CLOUDFLARE_IMAGES_ACCOUNT_HASH` | `cloudflare` | Signum API cum potestate emendandi Images, et hash rationis ex Images, rebus programmatoris. Flexibiles variantes pro ratione incipe |
| `CLOUDFLARE_IMAGES_SIGNING_KEY` | `cloudflare` | Optionaliter. Cum positum, imagines privatae sunt et quaelibet firma signatur et expirat. Sine eo imagines publicae sunt in addressis ex `QUIRE_SECRET_KEY` ductis quas nemo devinare potest |

Cloudflare Images propriam copiam cuiusque originalis quod praebet servat. Cum
filetulus deleatur, operarius eam copiam ante originale delet.

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

Officia post tergum pg-boss in iisdem bases datae Postgres usurpant, ideo nullum
servitium ordinis currere nec quicquam disponere opus est. Officia in eadem
transactione quam mutatio quae ea peperit in ordinem ponuntur, ita ut ruinam unum
amittere aut bis mittere non possit. `QUIRE_QUEUE_DRIVER` hic `pgboss` est, eius
pristinum; `vercel` et `cloudflare` solum leves traditiones nuntiorum et retextorum
in ordinem ipsius tabulae movent, et praecepta Vercel et Cloudflare ea describunt
et quomodo eorum strata textoria in ordinem ponant.

### Epistulae <!--quire:email-->

Unum ex his pone:

- `QUIRE_EMAIL_PROVIDER_CONFIG`: obiectum JSON quod praebitorem HTTP nominat
  eiusque credentia, ut `{"provider":"postmark","token":"..."}`. Postmark,
  Amazon SES, Mailgun, SendGrid et Resend sublevatur.
- `QUIRE_SMTP_URL`: `smtp://user:password@host:587`. Hoc solum meta; metae
  sine servitio SMTP prohibent.

`QUIRE_MAIL_FROM` est mittens. Ut Quire experiaris, profilum `devmail` incipe,
`QUIRE_SMTP_URL=smtp://mailpit:1025` pone, et epistulas in
`http://localhost:8025` lege.

### Servitia optionalia <!--quire:optional-services-->

| Constitutio | Cum profilo |
| --- | --- |
| `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` aut `QUIRE_MEILISEARCH_URL` | Quaestio externa; alioquin textus plenus Postgres |
| `QUIRE_BREACH_CHECK_PROVIDER=off`, `QUIRE_BREACH_CHECK_URL` | Exploratio fracturae signi. Per pristinum contra `api.pwnedpasswords.com` aperta (solum haustus quinque characterum mittitur); `off` id inhibet, et URL ad API range quod tu hospitas monstrat |

### Observabilitas <!--quire:observability-->

`OTEL_EXPORTER_OTLP_ENDPOINT` collectorem nominat ad quem quisque processus
vestigia et metra mittit; cum profilo `observability` `http://otelcol:4318` est,
et `docker/otel-collector.yaml` locus est ubi exportatorem pro tuo fundo addas.
Stratum textorium, operarius, dispositio, contentus et processus collaborativi
spansas per OTLP/HTTP exportant (petitiones textoriae, transactiones bases datae
inquilini, officia operarii et vocationes exeuntes) cum positum est, et metra in
eundem terminum omni minuto (`OTEL_METRICS_EXPORTER=none` ea compescit).
`OTEL_TRACES_SAMPLER_ARG` portionem vestigiorum servatorum statuit. Libri in
exitum standard ad `LOG_LEVEL` eunt, et Compose eos versat. Vestigia numquam
data personalia portant.

### Egressus regionalis (residentia datarum UE) <!--quire:regional-egress-eu-data-residency-->

`QUIRE_REGION=eu` dicit struem collegiis Unionis Europaeae servire. Operarius tum
omne petitum exeuntes quod pro collegio in UE definito fit in listam permissionis
continet (21-compliance.md sectio 8.1). Listae permissionis sunt ei hospites quos
dispositi praebitores pro regione declarant (terminus repositionis, praebitor
epistularum, praebitor video hospitatus, propriae meta repositionis collegii,
praebitores AA et ratio epistularum), hospites cuiusvis servitii sub derrogatione
activa, et hospites quos tu in `QUIRE_EGRESS_ALLOW_HOSTS` enumeras. Petitum ad
quemlibet alium hostem publicum ante quam mittatur refuitur, refutatio in vestigium
custodiae collegii ut `privacy/egress_refused` scribitur, et sub Conformitate,
Residentia datarum enumeratur.

| Constitutio | Valores | Effectus |
| --- | --- | --- |
| `QUIRE_EGRESS_ALLOW_HOSTS` | Lista nominum hospitum commatibus discreta, aut `*.example.org` pro omni subdominio | Hospites additionales quos collegium UE attingere potest. Terminales retextorum, xAPI et SIEM, fomenta blogi et hospites Amazon SES huc pertinent, quia electio ipsius collegii sunt et nullum servitium eos declarat. Reditus in circulum, addressae privatae et nomina unius notae ut `web` aut `clamav` tua ipsius rete sunt et numquam inspiciuntur |

Collegia UK et US in lista hospitum non continentur; constitutiones regionis
servitii servant. Listam in operario pone; pagina administratoris eam in strato
textorio legit ut listam permissionis ostendat, ideo eam in `docker/.env` pone,
quod quisque servitium legit.

Census applicationis errorem manifestum et adnotationem custodiae dat, et is non
est sponsio: codex errare potest. Sponsio est rete. Compose id pro te non
exigit. Pro strue regionali, servitia `worker` et `web` in rete `internal: true`
pone cui solus exitus est proxenus egressus (verbi causa container Squid aut
tinyproxy) qui eosdem hospites ac `QUIRE_EGRESS_ALLOW_HOSTS` plus hospites
praebitorum tuorum sitorum permittit, et `HTTPS_PROXY` pro iis servitiis pone.
Pagina residentiae exactos hospites enumerat quos applicatio permittit, ita ut
utraque lista comparari possit.

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

| Terminal | Significatio |
| --- | --- |
| `/healthz` | Vita: processus respondet. Censurae sanitatis Compose hoc utuntur |
| `/readyz` | Aptitudo: dependentes attingibiles, et quodque servitium optionale ut dispositum aut non renuntiatum. Tuum oneratorem hic dirige |

`docker compose -f docker/compose.yaml ps` sanitatem cuiusque servitii monstrat.

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

Servitium `proxy` (Caddy, Apache-2.0, `docker/caddy/Caddyfile`) parti strues
pristinae est. In portibus 80 et 443 respondet et dirigit:

| Hospes aut via | Quo eat |
| --- | --- |
| `QUIRE_PROXY_CONTENT_HOST` | `content` |
| `QUIRE_PROXY_APP_HOST`, quodque subdominium inquilini et domen proprium | `web` |
| `/_collab/` in iis hospitibus | `collab` (websocket, `QUIRE_COLLAB_URL`) |
| `/_realtime/connection/` in iis hospitibus | websocket clientis `centrifugo`; eius API numquam exponitur |
| `/_images/` in iis hospitibus | `imgproxy`, cum profilo `images` (`IMGPROXY_URL`) |

`init-env.sh` deducit `QUIRE_PROXY_APP_HOST`, `QUIRE_PROXY_CONTENT_HOST`,
`QUIRE_PROXY_HTTPS_PORT`, `QUIRE_COLLAB_URL` et `IMGPROXY_URL` ex duabus
originibus, ita ut divertere non possint. Eas una emenda si originem manu
mutaveris.

Certificationes `QUIRE_PROXY_TLS` sequuntur:

- `internal` (pristinum): auctoritas certificationis ipsius Caddy, pro
  `localhost`, `*.localhost` et `lvh.me`. Eius radici semel crede, deinde
  naviga:

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

  `quire-local-ca.crt` in thesaurum fidiae systematis aut navigatro addas. `curl`
  id cum `--cacert` accipit.
- Addressam epistulae: certificationes ACME automatice (Let's Encrypt, deinde
  ZeroSSL) pro nominibus hospitum veris. DNS utriusque originis et cuiusque
  hospitis inquilini huc respicere debet, et portus 80 et 443 ex interrete
  attingibiles esse debent.

Hospites inquilini in petitione, in prima visitatione, et solum cum web confirmat
nomen ad hanc institutionem pertinere (`/tls-allowed`, quod in rete Compose
rogatur) emittuntur. Nulla certificatio wildcard aut pluginum praebitoris DNS
desideratur, et qui nomen adversum in hospitem dirigat id certificationes petere
non potest. Certificationes et auctoritas localis in volumine `caddy-data` vivunt;
cum reliquis eam serva si `internal` uteris.

Web `X-Forwarded-For` solo proxeno credit: proxenus addressam fixam habet
(`QUIRE_PROXY_ADDRESS`, pristinum `172.29.64.10`) in subrete fixo
(`QUIRE_COMPOSE_SUBNET`), et `QUIRE_TRUSTED_PROXY_CIDRS` eam addressam nominat.
Si subrete cum reti in hospite collidat, utrumque muta et `docker compose down`
ante `up` exequere.

## Sub tuo proprio proxeno inverso <!--quire:behind-your-own-reverse-proxy-->

Ut oneratorem aut proxenum quem iam curris uti potius velis, `proxy` omitte
(`docker compose up -d --scale proxy=0`) et TLS ante `web` (8080), `content`
(8081), `collab` (1234, websocket) et `centrifugo` (8000, websocket) termina.
Addressas publicas in `QUIRE_APP_ORIGIN`, `QUIRE_CONTENT_ORIGIN` et
`QUIRE_COLLAB_URL` (`wss://`) pone, et proxeni tui range addressae in
`QUIRE_TRUSTED_PROXY_CIDRS`.

## Explicatio errorum <!--quire:troubleshooting-->

- `init` exit cum "QUIRE_DATABASE_ID is not a UUID": eum `uuidgen` pone.
- `web` incipit cum "did not start on compose": liber quamque constitutionem
  enumerat quam honorare non potest et quid vice eius utaris.
- Mutatio signi rerum in `.env` post primam incursionem nihil facit: scriptum
  initiale semel currit. `ALTER ROLE` utere.
- Emissiones cum errore examinis franguntur dum `CLAMAV_URL` positum est:
  ClamAV signa sua prima incursione downloadat, quod paucos minutos durat.

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