Ad contentum transilire

Instituere Quire cum Docker Compose

Institue Quire in tua ipsius machina cum Docker Compose.

Ostendere textu Markdown

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 et Cloudflare Workers solum stratum textorium currunt. Promotiones in upgrade.md sunt, et custodiae et exercitium restitutionis in backup-restore.md.

Quae desideres

  • 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_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

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 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

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

Addressa

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

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
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

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

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

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

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

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

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

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_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

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

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:

    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

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

  • 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.
Navigatio

Scribe ut quaeras…

↑↓ navigare↵ eligereEsc claudere