Dit is it folsleine produkt op ien host: de LMS, it eftergrûnwurk, de tsjinsten foar realtime
en tegearre bewurkjen en alle opsjonele tsjinsten ûnder in profile. De ûntwerpbesluten steane
yn seksje 2 fan docs/architecture/23-ops.md.
Oare doelen: Vercel en Cloudflare Workers rinne allinnich de web tier. Upgrades steane yn upgrade.md, reservekopyen en de restore drill yn backup-restore.md.
Watsto nedich hast
- Docker Engine 27 of nijer mei Compose-plugin 2.30 of nijer.
- 4 CPU-kearnen en 8 GB ûnthâld foar de standertstack; 8 kearnen en 16 GB
mei
--profile full(ClamAV allinnich brûkt sa’n 1.5 GB oan hantekeningen). - In DNS-namme foar de web tier en in twadde foar net-fertroude ynhâld. Dat moatte ferskillende hosts wêze: SCORM-pakketten en uploade HTML draaie op de content-origin, sadat se de cookies fan de LMS nea lêze kinne.
- Foar in lokale test ferwize
lvh.meen*.localhostnei 127.0.0.1, lykasdocker/.env.examplebrûkt. De eigenproxy-tsjinst fan de stack biedt beide oer https mei in lokale certificate authority oan; der hoecht dus neat oars ynstallearre te wurden (sjoch “TLS”). - De porten 80 en 443 moatte frij wêze op de host (
QUIRE_PROXY_HTTP_PORTenQUIRE_PROXY_HTTPS_PORTkinne dy feroarje).
Earste start
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 initdocker/scripts/init-env.sh makket docker/.env út docker/.env.example, mei alle
geheimen oanmakke (databasewachtwurden, signing- en masterkaaien, it keypair foar content
launch) en de audit checkpoint signing key yn docker/secrets/audit-signing-key.pem,
dy’t Compose as secret yn de workers mount. Allinnich sh, awk en openssl binne
nedich; it skript wegeret in besteande docker/.env te oerskriuwen. Kopiearje beide
bestannen fan dizze host ôf: sûnder QUIRE_MASTER_KEY kin in weromsette database de
bewarre bewiisgegevens net ûntsiferje. Om it bestân mei de hân yn te foljen, brûk
cp docker/.env.example docker/.env; yn it bestân stiet hoe’tst elk geheim meitsje kinst.
Beide origins moatte https wêze: de content service wegeret plain http yn produksje,
en de registrable domain fan beide mei net itselde wêze. De proxy-tsjinst makket TLS
foar beide ôf (sjoch “TLS”); init-env.sh wegeret in http://-origin.
De stack begjint yn in fêste folchoarder; elke stap wachtet op de foargeande:
postgreswurdt sûn. By de earste start stelt it init-skript (docker/postgres/init/90-passwords.sh) de fjouwer rolwachtwurden yn.migratepast alle migrations ta en bootstrapt de job queue yn de control-database en elke tawijde tenant-database, kontrolearret dat se oerienkomme en einiget dan (docs/ops/upgrade.md). Migrations rinne by elke start en binne idempotint, dus in upgrade is in nije image en in trochstart.init(apps/web/src/first-run.ts) registrearret de application database ûnderQUIRE_DATABASE_IDen makket, asQUIRE_SETUP_ADMIN_EMAILynsteld is, de earste organisaasje en behearder oan. It oanmeldadres en in oanmakke wachtwurd wurde ien kear printe yndocker compose logs init.web,content,worker,scheduler,collabencentrifugobegjinne.proxybegjint aswebencontentsûn binne.
Iepenje https://demo. folge troch dyn applikaasjedomein (it init-logboek print it
eksakte oanmeldadres) en meld dy oan. By in lokale ynstallaasje moatst earst de certificate
authority fan de proxy fertrouwe (sjoch “TLS”). Feroarje it oanmakke wachtwurd op
/account/security.
In proses sûnder fereaske geheim wegeret te starten en neamt de ûntbrekkende ynstelling yn it logboek. Der start neat heal ynsteld.
Tsjinsten en profiles
| Tsjinst | Profile | Funksje |
|---|---|---|
| postgres | always | De database (PostgreSQL 18 mei pgvector, boud fan docker/postgres.Dockerfile), mei WAL-argyf fan de earste boot ôf |
| migrate, init | always | Ien kear: migrations en dêrnei de earste start |
| web | always | De LMS op QUIRE_HTTP_PORT (8080) |
| content | always | De net-fertroude content-origin op QUIRE_CONTENT_PORT (8081) |
| worker | always | Eftergrûntaken: e-mail, rapporten, bestânsferwurking, webhooks |
| scheduler | always | Weromkommende taken: registrearret de 64 runtime-skema’s en jout dy troch oan de worker; ien lieder tagelyk |
| collab | always | Websocket foar tegearre bewurkjen op QUIRE_COLLAB_HTTP_PORT (1234) |
| centrifugo | always | Realtime fan-out op QUIRE_REALTIME_PORT (8000) |
| proxy | always | Caddy, de TLS-yngong op porten 80 en 443 (sjoch “TLS”) |
| valkey | cache |
Cache en taryflimiten |
| clamav | scan |
Kontrolearjen fan uploads op malware |
| gotenberg | preview |
Office-nei-PDF-foarbylden en sertifikaten rendere |
| imgproxy | images |
Ofbyldings opnij skaalje en omsette |
| transcoder | video |
Worker-image mei allinnich LGPL-ffmpeg, foar fideorenditions |
| seaweedfs | storage |
S3-kompatibele objektopslach op dizze host |
| otelcol | observability |
OpenTelemetry-collector |
| mailpit | devmail |
Fangt alle útgeande e-mail op om Quire út te probearjen |
| backup | backup |
Ien kear in base backup; sjoch backup-restore.md |
| backup-scheduler, backup-offsite | backup |
Base backup elke QUIRE_BACKUP_INTERVAL_HOURS, plus fersifere kopyen bûten de host mei in wyklikse ferifikaasjedrill |
| h5p | h5p |
H5P LTI 1.3-toolimage dy’tst yn QUIRE_H5P_IMAGE leverest, op QUIRE_H5P_PORT (8090); sjoch “In H5P-provider ferbine” |
--profile full start alle opsjonele tsjinsten útsein backup en h5p.
Start ien mei docker compose -f docker/compose.yaml --profile scan up -d.
Sûnder in opsjonele tsjinst wurket Quire noch en jout oan wat ûntbrekt: sûnder scanner
wurde uploads net-scanne opslein en wurdt de behearder warskôge; sûnder Gotenberg kinne
bestannen wol downloade mar net foarbesjoen wurde; sûnder transcoder spilet fideo ôf as
it orizjinele bestân.
Elke ôfbylding fan in tredde partij en de lisinsjeferplichtingen steane yn
docker/third-party-containers.yaml.
In H5P-provider ferbine
Quire befettet of ferstjoert gjin H5P-runtime of sidecar (ADR 0019). As H5P brûkt wurdt, soargje foar in eigen hosted abonnemint of in selsbehearde H5P-ynstallaasje apart fan Quire. Registrearje de provider as LTI 1.3 external tool en foegje de ynhâld ta oan kursussen as toolaktiviteiten. Quire wikselet sifers en aktiviteit-/beoardielingsfuortgong út fia LTI Assignment and Grade Services (AGS). As de provider ek xAPI-statements stjoert, konfigurearje dat apart foar de xAPI-statement store fan Quire; it útwikseljen fan sifer/foartgong fia AGS stjoert gjin xAPI-statements. Moodle-ymporten melde dat H5P-aktiviteiten in LTI-toolferbining nedich hawwe. De provider bliuwt ferantwurdlik foar de H5P-runtime, it meitsjen fan ynhâld, de ynhâldsbank en skiednis fan besykjen.
Om op dizze host in eigen selsbehearde ynstallaasje te draaien, set QUIRE_H5P_IMAGE op de
image en start it h5p-profile. Compose publisearret it op QUIRE_H5P_PORT (8090) en bewarret
de gegevens yn it h5p-data-volume; de image en byhearrende ferplichtingen bliuwe dyn eigen.
Ynstellingen
Elke proses lêst docker/.env. It sjabloan docker/.env.example list elke ynstelling mei
de standertwearde. De groepen:
Adressen
| Ynstelling | Betsjutting |
|---|---|
QUIRE_APP_ORIGIN |
It iepenbiere adres fan de LMS, bygelyks https://learn.example.com |
QUIRE_CONTENT_ORIGIN |
De content-origin, op in oare host |
QUIRE_PLATFORM_DOMAINS |
Domeinen dêr’t organisaasjes ûnder falle, skieden troch komma’s |
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 |
Hjir compose. Sjoch oare hantliedingen foar vercel en cloudflare |
QUIRE_TRUSTED_PROXY_CIDRS |
Proxy’s waans X-Forwarded-For fertroud wurdt |
Geheimen
| Ynstelling | Betsjutting |
|---|---|
QUIRE_SECRET_KEY |
Undertekenet sesjes en tokens. 64 hextekens |
QUIRE_MASTER_KEY |
Ferpakt bewarre bewiisgegevens lykas SSO- en webhookgeheimen. 32 byte, base64. Web tier en worker moatte deselde wearde hawwe. Rotaasje: key-rotation.md |
QUIRE_MASTER_KEY_VERSION |
Ferzjelabel fan de master key, v1 as it net ynsteld is. Ferheegje by rotaasje |
QUIRE_MASTER_KEY_RETIRED |
Eardere masterkaaien dy’t noch nedich binne om te lêzen wat se ferpakt hawwe, as v1=<base64>. Fuortsmite as de rotaasje foltôge is en neat mear net oplost is |
QUIRE_COLLAB_SIGNING_KEY |
Dield troch web en collab foar ûndertekenjen fan bewurkjetokens |
QUIRE_BACKUP_SIGNING_KEY |
Undertekenet kursusreservekopyen (opsjoneel) |
Hâld in kopy fan QUIRE_MASTER_KEY earne oars as op dizze host. In database dy’t sûnder
dy kaai weromset is, kin de bewarre bewiisgegevens net ûntsiferje.
Database
| Ynstelling | Betsjutting |
|---|---|
POSTGRES_PASSWORD |
De superuser, brûkt troch container en reservekopyen |
QUIRE_DB_APP_PASSWORD, QUIRE_DB_MIGRATOR_PASSWORD, QUIRE_DB_REPORT_PASSWORD, QUIRE_DB_AUDIT_PASSWORD |
Rolwachtwurden, ynsteld by de earste start |
DATABASE_URL |
De applikaasjerol. Row-level security jildt foar elke query dy’t dy docht |
DATABASE_MIGRATOR_URL, QUIRE_MIGRATION_URL |
De migratorrol foar migrate en init |
QUIRE_SUPERUSER_URL |
Allinnich brûkt by de earste start |
QUIRE_REPORT_DATABASE_URL |
De read-only rapportrol foar rapporten en rapportbouwer |
QUIRE_AUDIT_DATABASE_URL |
De auditrol foar auditkonsole en SIEM-eksport |
QUIRE_DATABASE_ID |
Elke UUID, fêst foar de hiele libbensdoer fan de ynstallaasje |
Rolwachtwurden wurde allinnich tapast as it databasevolume foar it earst oanmakke wurdt.
Om ien letter te feroarjen, brûk ALTER ROLE en fernij dêrnei de byhearrende URL.
QUIRE_REPORT_DATABASE_URL wurdt brûkt foar de fysike database dy’t DATABASE_URL ynstelt.
Stel foar oare registrearre fysike databases de eigen quire_report-ferbinings-URL yn de
web- en workeromjouwing yn; set dêrnei de fariabelenamme yn it fjild Reporting environment
variable fan dy database as env:NAME. De ferwizing moat nei deselde database as de appferbining
wize, leafst de lêsreplika. Elk rapportflak folget de tenant nei de rapportferbining fan syn
eigen database: rapportbouwer en bewarre rapporten, plande leveringen, rapporteksporten,
analytics, auditlogboek, REST-auditboarnen en sykjen yn de assistant-audit. Gjin fan dy brûkt
ea de rapport-URL fan in oare database. As in database gjin rapportferbining hat, rinne gewoane
rapporten op de eigen applikaasjeferbining fan dy database, wylst analytics en elke auditlêzing
wegerje en dat meidiele, om’t de applikaasjerol it auditspoar net lêze kin.
Drivers
| Ynstelling | Dizze release | Taljochting |
|---|---|---|
QUIRE_STORAGE_DRIVER |
local (standert), s3 of azure |
local hâldt bestannen yn it files-volume. s3 omfiemet AWS S3, R2, GCS-ynteroperabiliteit en oare S3-kompatibele stores, mei hervatbere multipart-uploads |
QUIRE_REALTIME_DRIVER |
inprocess (standert), sse, centrifugo of durable_objects |
inprocess past by ien webcontainer; brûk centrifugo of sse as der mear binne |
QUIRE_CACHE_DRIVER |
memory (standert), postgres of valkey |
memory is per proses; brûk valkey of postgres sadat taryflimiten jilde oer containers hinne |
QUIRE_VIDEO_DRIVER |
ffmpeg (standert) of progressive_mp4 |
Of in hosted provider: Cloudflare Stream, Mux of Bunny, mei harren kaaien |
QUIRE_IMAGE_DRIVER |
noop (standert), imgproxy of cloudflare |
noop tsjinnet elke ôfbylding yn orizjinele grutte. imgproxy freget it images-profile en de ynstellingen hjirûnder; cloudflare brûkt Cloudflare Images |
QUIRE_MEETING_PROVIDER |
bbb, zoom, teams, meet, jitsi of in_process |
Standertprovider fan it platfoarm foar live sesjes. As dy net ynsteld is, binne live sesjes net konfigurearre oant in organisaasje in eigen akkount ferbynt ûnder Integrations, Live session provider. It eigen akkount fan in organisaasje giet altyd foar dizze wearde. Eigen ynstellingen fan elke provider (BBB_URL en BBB_SECRET, de fariabelen ZOOM_*, TEAMS_*, GOOGLE_MEET_* en JITSI_*) wurde allinnich lêzen foar de hjir neamde provider |
QUIRE_MEETING_REGIONS |
Kommalist mei eu, uk, us |
Regio’s dêr’t de standertprovider fan it platfoarm gearkomsten ferwurket. As dit net ynsteld is, wurdt it lykas earder net kontrolearre tsjin in organisaasje dy’t oan in regio bûn is. De side fan in organisaasje jout de regio’s fan har eigen akkount oan |
In driverwearde dy’t dizze release net befettet, wurdt ôfwiisd as de web tier begjint; de ynstelling wurdt neamd ynstee fan stilwei ferfongen te wurden troch de standertwearde.
Ofbyldings
Siden freegje ôfbyldings yn fjouwer fêste maten fia
/api/files/{id}/image/{size}; dat kontrolearret deselde tagong as it bestân sels en
ferwiist dêrnei troch nei de ôfbyldingstsjinst. Elke organisaasje kin yn in oere
QUIRE_IMAGE_SPECS_PER_HOUR (standert 2000) nije kombinaasjes fan ôfbylding en grutte
oanfreegje; maten dy’t dat oere al makke binne telle net mei. Brûk valkey of postgres
foar QUIRE_CACHE_DRIVER as der mear as ien webcontainer is, sadat de limyt foar alle
containers jildt.
| Ynstelling | Driver | Taljochting |
|---|---|---|
IMGPROXY_URL |
imgproxy |
Adres dêr’t browsers imgproxy berikke, bygelyks https://images.example.org. It images-profile publisearret it op QUIRE_IMAGES_PORT (8082) |
IMGPROXY_KEY, IMGPROXY_SALT |
imgproxy |
Hextekenrige, deselde wearden dêr’t imgproxy mei begjint. Meitsje elke wearde mei openssl rand -hex 32. Quire ûndertekenet elk ôfbyldingsadres dêrmei, sadat imgproxy neat rendert dêr’t Quire net om frege hat |
QUIRE_IMAGE_SOURCE_ORIGIN |
imgproxy mei lokale opslach |
Wêr’t imgproxy de orizjinelen ophellet. Compose set http://web:3000 yn. By s3- of azure-opslach hellet imgproxy se út de bucket en wurdt dit net brûkt |
CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_IMAGES_TOKEN, CLOUDFLARE_IMAGES_ACCOUNT_HASH |
cloudflare |
API-token mei bewurkingsrjochten foar Images en de account-hash út Images, Developer resources. Skeakelje fleksibele farianten foar it akkount yn |
CLOUDFLARE_IMAGES_SIGNING_KEY |
cloudflare |
Opsjoneel. As dy ynsteld is, binne ôfbyldings privee en is elk adres ûndertekene en ferrint it. Sûnder dizze kaai binne ôfbyldings iepenbier op adressen ôflaat fan QUIRE_SECRET_KEY dy’t net te rieden binne |
Cloudflare Images hâldt in eigen kopy fan elk orizjineel dat it tsjinnet. As in bestân fuorthelle wurdt, wisket de worker dy kopy foardat it orizjineel fuortgiet.
Wachtrige
Eftergrûntaken brûke pg-boss yn deselde Postgres-database, dus der hoecht gjin wachtrigetsjinst
draaid of ynsteld te wurden. Taken wurde yn deselde transaksje op de wachtrige set as de
feroaring dy’t se feroarsake, sadat in crash gjin taak kwytreitsje of dûbel ferstjoere kin.
QUIRE_QUEUE_DRIVER is hjir standert pgboss; vercel en cloudflare ferpleatse allinnich
lichte meidielingen en webhookleveringen nei de eigen wachtrige fan it platfoarm. De Vercel-
en Cloudflare-hantliedingen beskriuwe dy en hoe’t harren web tiers taken op de wachtrige sette.
Stel ien fan dizze yn:
QUIRE_EMAIL_PROVIDER_CONFIG: in JSON-objekt mei de namme fan in HTTP-provider en syn bewiis, lykas{"provider":"postmark","token":"..."}. Postmark, Amazon SES, Mailgun, SendGrid en Resend wurde stipe.QUIRE_SMTP_URL:smtp://user:password@host:587. Allinnich foar dizze target; de serverless-targets blokkearje SMTP.
QUIRE_MAIL_FROM is de ôfstjoerder. Om Quire út te probearjen, start it devmail-profile,
set QUIRE_SMTP_URL=smtp://mailpit:1025 yn en lês de e-mail op http://localhost:8025.
Opsjonele tsjinsten
| Ynstelling | Mei profile |
|---|---|
CLAMAV_URL=tcp://clamav:3310 |
scan |
GOTENBERG_URL=http://gotenberg:3000 |
preview |
IMGPROXY_KEY, IMGPROXY_SALT |
images |
VALKEY_URL=redis://valkey:6379 |
cache |
QUIRE_OPENSEARCH_URL of QUIRE_MEILISEARCH_URL |
Eksterne syktsjinst; oars folsleine tekstsykjen yn Postgres |
QUIRE_BREACH_CHECK_PROVIDER=off, QUIRE_BREACH_CHECK_URL |
Kontrolearje oft in wachtwurd by in datalek belutsen is. Standert oan tsjin api.pwnedpasswords.com (allinnich in hashprefix fan fiif tekens wurdt ferstjoerd); off set de kontrôle út en de URL ferwiist nei in range-API dy’tsto sels hostest |
Observability
OTEL_EXPORTER_OTLP_ENDPOINT neamt de collector dêr’t elk proses traces en metrics
hinne stjoert; mei it observability-profile is dat http://otelcol:4318, en yn
docker/otel-collector.yaml foegest de exporter foar dyn backend ta. As dit ynsteld is,
eksportearje de web tier, worker, scheduler, content- en collabprosessen spans fia OTLP/HTTP
(webfersiken, tenant-databasetransaksjes, workertaken en útgeande oproppen) en elke minút
metrics nei itselde einpunt (OTEL_METRICS_EXPORTER=none skeakelet dy út).
OTEL_TRACES_SAMPLER_ARG set it oanpart fan traces dat bewarre wurdt. Logs geane nei
standard output op LOG_LEVEL en Compose draait se troch. Traces befetsje gjin persoansgegevens.
Regionale egress (dataferbliuw yn de EU)
QUIRE_REGION=eu jout oan dat de stack organisaasjes yn de Europeeske Uny betsjinnet.
De worker beheint dan elk útgeand fersyk foar in organisaasje dy’t oan de EU ferbûn is ta in
allowlist (21-compliance.md seksje 8.1). Dêr steane hosts op dy’t ynstelde tsjinsten foar de
regio oanjouwe (opslach-einpunt, e-mailprovider, hosted fideoprovider, eigen opslachdoelen
fan de organisaasje, AI-providers en e-mailakkount), hosts fan tsjinsten ûnder in aktive
ôfwiking en hosts dy’tst yn QUIRE_EGRESS_ALLOW_HOSTS neamst. In fersyk nei in oare iepenbiere
host wurdt wegere foardat it ferstjoerd wurdt; de wegere poging komt as privacy/egress_refused
yn it auditspoar fan de organisaasje en wurdt neamd ûnder Neilibjen, Data residency.
| Ynstelling | Wearden | Effekt |
|---|---|---|
QUIRE_EGRESS_ALLOW_HOSTS |
Kommalist mei hostnammen, of *.example.org foar elk subdomein |
Oanfoljende hosts dy’t in EU-organisaasje berikke mei. Webhook-, xAPI- en SIEM-einpunten, blogfeeds en Amazon SES-hosts hearre hjirby, om’t de organisaasje dy sels kiest en gjin tsjinst se oanjout. Loopback, priveeadressen en nammen mei ien label lykas web of clamav binne dyn eigen netwurk en wurde nea kontrolearre |
Organisaasjes yn it Feriene Keninkryk en de FS binne net bûn oan in hostlist; de regio-
kontrôles fan de tsjinst bliuwe jilde. Stel de list yn by de worker; de behearderside lêst
him yn de web tier om de allowlist sjen te litten, dus set him yn docker/.env dat elke
tsjinst lêst.
De kontrôle yn de applikaasje jout in dúdlike flater en audit-yngong, mar is net de garânsje:
koade kin ferkeard wêze. It netwurk is de garânsje. Compose hanthavenet it net foar dy.
Foar in regionale stack, set de tsjinsten worker en web op in netwurk internal: true
dat allinnich fia in egress-proxy nei bûten kin (bygelyks Squid of in tinyproxy-container).
Lit dy deselde hosts tastean as QUIRE_EGRESS_ALLOW_HOSTS plus de hosts fan dyn ynstelde
tsjinsten en set HTTPS_PROXY foar dy tsjinsten yn. De side oer dataferbliuw list de eksakte
hosts dy’t de applikaasje tastiet, sadatst beide listen ferlykje kinst.
Sûnens
| Einpunt | Betsjutting |
|---|---|
/healthz |
Liveness: it proses antwurdet. Compose-healthchecks brûke dit |
/readyz |
Readiness: ôfhinklikheden binne berikber en elke opsjonele tsjinst is al of net as ynsteld rapportearre. Lit dyn load balancer hjirhinne wize |
docker compose -f docker/compose.yaml ps lit de sûnens fan elke tsjinst sjen.
TLS
De proxy-tsjinst (Caddy, Apache-2.0, docker/caddy/Caddyfile) heart by de standertstack.
Hy antwurdet op porten 80 en 443 en stjoert troch:
| Host of paad | Giet nei |
|---|---|
QUIRE_PROXY_CONTENT_HOST |
content |
QUIRE_PROXY_APP_HOST, elk tenantsubdomein en oanpast domein |
web |
/_collab/ op dy hosts |
collab (websocket, QUIRE_COLLAB_URL) |
/_realtime/connection/ op dy hosts |
client-websocket fan centrifugo; syn server-API wurdt nea bleatsteld |
/_images/ op dy hosts |
imgproxy, mei it images-profile (IMGPROXY_URL) |
init-env.sh liedt QUIRE_PROXY_APP_HOST, QUIRE_PROXY_CONTENT_HOST,
QUIRE_PROXY_HTTPS_PORT, QUIRE_COLLAB_URL en IMGPROXY_URL ôf fan de twa origins,
sadat se net útinoar rinne kinne. Bewurkje se mei-inoar as in origin mei de hân feroare wurdt.
Sertifikaten folgje QUIRE_PROXY_TLS:
-
internal(standert): de eigen certificate authority fan Caddy, foarlocalhost,*.localhostenlvh.me. Fertrou ien kear de root en blêdzje dan:docker compose -f docker/compose.yaml cp \ proxy:/data/caddy/pki/authorities/local/root.crt ./quire-local-ca.crtFoegje
quire-local-ca.crtta oan it fertrouwe-sertifikatenopslach fan it systeem of de browser.curlbrûkt it mei--cacert. -
In e-mailadres: automatyske ACME-sertifikaten (Let’s Encrypt, dêrnei ZeroSSL) foar echte hostnammen. DNS fan beide origins en elke tenanthost moat hjirhinne wize; porten 80 en 443 moatte fan it ynternet ôf berikber wêze.
Tenanthosts krije op oanfraach in sertifikaat by it earste besyk en allinnich as web befêstiget
dat de namme by dizze ynstallaasje heart (/tls-allowed, oanroppen oer it Compose-netwurk).
In wildcard-sertifikaat of DNS-providerplugin is net nedich; in frjemde namme dy’t nei de host
wize lit, kin gjin sertifikaatoanfraach útlokje. Sertifikaten en de lokale authority steane yn
it caddy-data-volume; meitsje dêr tegearre mei de rest in reservekopy fan as internal brûkt wurdt.
Web fertrout allinnich de X-Forwarded-For fan de proxy: dy hat in fêst adres
(QUIRE_PROXY_ADDRESS, standert 172.29.64.10) op in fêst subnet (QUIRE_COMPOSE_SUBNET),
en QUIRE_TRUSTED_PROXY_CIDRS neamt dat adres. As it subnet botst mei in netwurk op de host,
feroarje beide en fier docker compose down út foar up.
Efter dyn eigen reverse proxy
Om ynstee in load balancer of proxy te brûken dy’tst al draait, lit proxy fuort
(docker compose up -d --scale proxy=0) en beëinigje TLS foar web (8080), content (8081),
collab (1234, websocket) en centrifugo (8000, websocket). Stel de iepenbiere adressen
yn QUIRE_APP_ORIGIN, QUIRE_CONTENT_ORIGIN en QUIRE_COLLAB_URL (wss://) yn, en it
adresberik fan de proxy yn QUIRE_TRUSTED_PROXY_CIDRS.
Problemen oplosse
initeiniget mei “QUIRE_DATABASE_ID is not a UUID”: set it meiuuidgenyn.webstart hieltyd opnij mei “did not start on compose”: it logboek list elke ynstelling dy’t net útfierd wurde kin en watst ynstee brûke moatst.- In rolwachtwurd feroarje yn
.envnei de earste start docht neat: it init-skript rint mar ien kear. BrûkALTER ROLE. - Uploads mislearje mei in scanflater wylst
CLAMAV_URLynsteld is: ClamAV downloadt de hantekeningen by de earste start en dat duorret in pear minuten.