Il s’agit du produit complet sur un seul hôte : le LMS, ses travaux d’arrière-plan, les services temps réel et d’édition collaborative, et tous les services facultatifs derrière un profil. La conception est décrite à la section 2 de docs/architecture/23-ops.md.
Autres cibles : Vercel et Cloudflare Workers n’exécutent que la couche Web. La mise à niveau est décrite dans upgrade.md, et les sauvegardes et le test de restauration dans backup-restore.md.
Prérequis
- Docker Engine 27 ou ultérieur avec le plug-in Compose 2.30 ou ultérieur.
- 4 cœurs CPU et 8 Go de mémoire pour la pile par défaut ; 8 cœurs et 16 Go avec
--profile full(ClamAV utilise à lui seul environ 1,5 Go pour ses signatures). - Un nom DNS pour la couche Web et un autre pour le contenu non fiable. Il doit s’agir d’hôtes distincts : les paquets SCORM et le HTML téléversé s’exécutent depuis l’origine du contenu afin de ne jamais pouvoir lire les cookies du LMS.
- Pour un test local,
lvh.meet*.localhostse résolvent en 127.0.0.1 ; c’est ce qu’utilisedocker/.env.example. Le serviceproxyde la pile sert les deux en https avec une autorité de certification locale ; rien d’autre n’est donc à installer (voir « TLS »). - Les ports 80 et 443 doivent être disponibles sur l’hôte (les variables
QUIRE_PROXY_HTTP_PORTetQUIRE_PROXY_HTTPS_PORTpermettent de les déplacer).
Premier démarrage
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 crée docker/.env à partir de docker/.env.example, en générant tous les secrets (mots de passe de base de données, clés de signature et clé principale, paire de clés de lancement du contenu) ainsi que la clé de signature des points de contrôle d’audit dans docker/secrets/audit-signing-key.pem, montée comme secret dans les workers par Compose. Le script nécessite uniquement sh, awk et openssl, et refuse d’écraser un fichier docker/.env existant. Copiez ces deux fichiers hors de l’hôte : sans QUIRE_MASTER_KEY, une base restaurée ne peut pas déchiffrer les identifiants enregistrés. Pour remplir le fichier manuellement, exécutez cp docker/.env.example docker/.env ; il décrit la génération de chaque secret.
Les deux origines doivent utiliser https : le service de contenu refuse le http simple en production, et elles ne doivent pas partager un même domaine enregistrable. Le service proxy termine TLS pour les deux (voir « TLS ») ; init-env.sh refuse une origine http://.
La pile démarre selon un ordre fixe ; chaque étape attend la précédente :
postgresdevient sain. Lors du tout premier démarrage, son script d’initialisation (docker/postgres/init/90-passwords.sh) définit les mots de passe des quatre rôles.migrateapplique toutes les migrations et initialise la file de travaux dans la base de contrôle ainsi que dans chaque base dédiée de locataire, vérifie qu’elles sont toutes cohérentes, puis se termine (docs/ops/upgrade.md). Les migrations s’exécutent à chaque démarrage et sont idempotentes ; une mise à niveau consiste donc à déployer une nouvelle image et à redémarrer.init(apps/web/src/first-run.ts) enregistre la base de données de l’application sousQUIRE_DATABASE_IDet, siQUIRE_SETUP_ADMIN_EMAILest défini, crée la première organisation et son administrateur. L’adresse de connexion et le mot de passe généré ne sont affichés qu’une fois, dansdocker compose logs init.web,content,worker,scheduler,collabetcentrifugodémarrent.proxydémarre lorsquewebetcontentsont sains.
Ouvrez https://demo. suivi du domaine de votre application (le journal init affiche l’adresse de connexion exacte), puis connectez-vous. Sur une installation locale, faites d’abord confiance à l’autorité de certification du proxy (voir « TLS »). Changez le mot de passe généré dans /account/security.
Un processus lancé sans un secret requis refuse de démarrer et indique le paramètre manquant dans son journal. Aucun service ne démarre avec une configuration incomplète.
Services et profils
| Service | Profil | Rôle |
|---|---|---|
| postgres | toujours | Base de données (PostgreSQL 18 avec pgvector, construite depuis docker/postgres.Dockerfile), avec archivage du WAL dès le premier démarrage |
| migrate, init | toujours | Exécution ponctuelle : migrations, puis premier démarrage |
| web | toujours | LMS sur le port QUIRE_HTTP_PORT (8080) |
| content | toujours | Origine du contenu non fiable sur le port QUIRE_CONTENT_PORT (8081) |
| worker | toujours | Travaux d’arrière-plan : e-mails, rapports, traitement de fichiers et webhooks |
| scheduler | toujours | Travaux récurrents : enregistre les 64 planifications d’exécution et les transmet au worker ; un seul leader à la fois |
| collab | toujours | WebSocket d’édition collaborative sur le port QUIRE_COLLAB_HTTP_PORT (1234) |
| centrifugo | toujours | Diffusion temps réel sur le port QUIRE_REALTIME_PORT (8000) |
| proxy | toujours | Caddy, porte d’entrée TLS sur les ports 80 et 443 (voir « TLS ») |
| valkey | cache |
Cache et limites de débit |
| clamav | scan |
Analyse antivirus des téléversements |
| gotenberg | preview |
Aperçus PDF des fichiers Office et rendu des certificats |
| imgproxy | images |
Redimensionnement et conversion des images |
| transcoder | video |
Image worker avec ffmpeg sous licence LGPL uniquement, pour les versions vidéo |
| seaweedfs | storage |
Stockage d’objets compatible S3 sur cet hôte |
| otelcol | observability |
Collecteur OpenTelemetry |
| mailpit | devmail |
Intercepte tous les e-mails sortants pour tester Quire |
| backup | backup |
Sauvegarde de base ponctuelle ; voir backup-restore.md |
| backup-scheduler, backup-offsite | backup |
Sauvegarde de base toutes les QUIRE_BACKUP_INTERVAL_HOURS et copies chiffrées hors hôte avec test de vérification hebdomadaire |
| h5p | h5p |
Image d’outil H5P LTI 1.3 fournie par vos soins dans QUIRE_H5P_IMAGE, sur le port QUIRE_H5P_PORT (8090) ; voir « Connecter un fournisseur H5P » |
--profile full démarre tous les services facultatifs sauf backup et h5p. Pour en démarrer un, exécutez docker compose -f docker/compose.yaml --profile scan up -d. Quire fonctionne aussi sans service facultatif et indique ce qui manque : sans antivirus, les fichiers sont stockés sans analyse et l’administrateur en est informé ; sans Gotenberg, les fichiers sont proposés au téléchargement plutôt qu’en aperçu ; sans transcodeur, les vidéos sont lues dans leur format d’origine.
Toutes les images tierces et leurs obligations de licence figurent dans docker/third-party-containers.yaml.
Connecter un fournisseur H5P
Quire n’intègre ni ne fournit d’environnement d’exécution H5P ou de service associé (ADR 0019). Si vous utilisez H5P, souscrivez votre propre offre hébergée ou exploitez une instance H5P auto-hébergée séparément de Quire. Enregistrez ce fournisseur comme outil externe LTI 1.3, puis ajoutez son contenu aux cours sous forme d’activités outil. Quire échange les notes et la progression d’activité ou de correction via LTI Assignment and Grade Services (AGS). Si le fournisseur envoie également des déclarations xAPI, configurez cette fonction séparément pour le magasin de déclarations xAPI de Quire ; l’échange des notes et de la progression via AGS n’envoie pas de déclarations xAPI. Les activités H5P des cours Moodle importés sont signalées comme nécessitant une connexion à un outil LTI. Le fournisseur reste responsable de son environnement H5P, de la création de contenu, de sa banque de contenus et de l’historique des tentatives.
Pour exploiter votre propre instance auto-hébergée sur cet hôte, définissez QUIRE_H5P_IMAGE sur son image et démarrez le profil h5p. Compose la publie sur le port QUIRE_H5P_PORT (8090) et conserve ses données dans le volume h5p-data ; l’image et les obligations qui l’accompagnent restent sous votre responsabilité.
Paramètres
Chaque processus lit docker/.env. Le modèle docker/.env.example répertorie chaque paramètre et sa valeur par défaut. Les groupes :
Adresses
| Paramètre | Signification |
|---|---|
QUIRE_APP_ORIGIN |
Adresse publique du LMS, par exemple https://learn.example.com |
QUIRE_CONTENT_ORIGIN |
Origine du contenu, sur un autre hôte |
QUIRE_PLATFORM_DOMAINS |
Domaines utilisés par les organisations, séparés par des virgules |
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 ici. Consultez les autres guides pour vercel et cloudflare |
QUIRE_TRUSTED_PROXY_CIDRS |
Plages des proxys dont le X-Forwarded-For est considéré comme fiable |
Secrets
| Paramètre | Signification |
|---|---|
QUIRE_SECRET_KEY |
Signe les sessions et les jetons. 64 caractères hexadécimaux |
QUIRE_MASTER_KEY |
Protège les identifiants enregistrés tels que les secrets SSO et webhook. 32 octets en base64. La couche Web et le worker doivent utiliser la même valeur. Rotation : key-rotation.md |
QUIRE_MASTER_KEY_VERSION |
Étiquette de version de la clé principale, v1 si elle n’est pas définie. Incrémentez-la lors d’une rotation |
QUIRE_MASTER_KEY_RETIRED |
Clés principales antérieures encore nécessaires pour lire les données qu’elles ont scellées, au format v1=<base64>. À supprimer une fois la rotation terminée sans élément non résolu |
QUIRE_COLLAB_SIGNING_KEY |
Partagée par web et collab pour signer les jetons d’édition |
QUIRE_BACKUP_SIGNING_KEY |
Signe les sauvegardes de cours (facultatif) |
Conservez une copie de QUIRE_MASTER_KEY ailleurs que sur cet hôte. Sans elle, une base restaurée ne peut pas déchiffrer les identifiants qu’elle contient.
Base de données
| Paramètre | Signification |
|---|---|
POSTGRES_PASSWORD |
Mot de passe du superutilisateur, utilisé par le conteneur et les sauvegardes |
QUIRE_DB_APP_PASSWORD, QUIRE_DB_MIGRATOR_PASSWORD, QUIRE_DB_REPORT_PASSWORD, QUIRE_DB_AUDIT_PASSWORD |
Mots de passe des rôles, définis au premier démarrage |
DATABASE_URL |
Rôle applicatif. La sécurité au niveau des lignes s’applique à toutes ses requêtes |
DATABASE_MIGRATOR_URL, QUIRE_MIGRATION_URL |
Rôle du migrateur pour migrate et init |
QUIRE_SUPERUSER_URL |
Utilisé uniquement au premier démarrage |
QUIRE_REPORT_DATABASE_URL |
Rôle de rapport en lecture seule pour les rapports et leur générateur |
QUIRE_AUDIT_DATABASE_URL |
Rôle d’audit pour la console d’audit et l’export SIEM |
QUIRE_DATABASE_ID |
N’importe quel UUID, fixe pendant toute la durée de l’installation |
Les mots de passe des rôles ne sont appliqués qu’à la création initiale du volume de base de données. Pour en modifier un par la suite, utilisez ALTER ROLE, puis mettez à jour l’URL correspondante.
QUIRE_REPORT_DATABASE_URL concerne la base physique configurée dans DATABASE_URL. Pour toute autre base physique enregistrée, définissez sa propre URL de connexion quire_report dans les environnements Web et worker, puis indiquez le nom de sa variable dans le champ Variable d’environnement de rapport de cette base, sous la forme env:NAME. La référence doit pointer vers la même base que la connexion applicative, idéalement sa réplique en lecture seule. Chaque interface de rapport suit le locataire jusqu’à la connexion de rapport de sa propre base : générateur et rapports enregistrés, envois planifiés, exportations de rapports, analyses, journal d’audit, ressources d’audit REST et recherche d’audit de l’assistant. Aucune n’emprunte l’URL de rapport d’une autre base. Si une base ne dispose pas de connexion de rapport, les rapports ordinaires utilisent sa propre connexion applicative ; les analyses et toutes les lectures d’audit sont refusées avec une explication, car le rôle applicatif ne peut pas lire la piste d’audit.
Pilotes
| Paramètre | Options de cette version | Remarques |
|---|---|---|
QUIRE_STORAGE_DRIVER |
local (par défaut), s3 ou azure |
local conserve les fichiers dans le volume files. s3 couvre AWS S3, R2, l’interopérabilité GCS et d’autres stockages compatibles S3, avec des téléversements multiparties reprenables |
QUIRE_REALTIME_DRIVER |
inprocess (par défaut), sse, centrifugo ou durable_objects |
inprocess convient à un conteneur Web unique ; utilisez centrifugo ou sse s’il y en a plusieurs |
QUIRE_CACHE_DRIVER |
memory (par défaut), postgres ou valkey |
memory est propre à chaque processus ; utilisez valkey ou postgres pour appliquer les limites de débit sur tous les conteneurs |
QUIRE_VIDEO_DRIVER |
ffmpeg (par défaut) ou progressive_mp4 |
Ou un fournisseur hébergé : Cloudflare Stream, Mux ou Bunny, avec leurs clés |
QUIRE_IMAGE_DRIVER |
noop (par défaut), imgproxy ou cloudflare |
noop sert toutes les images à leur taille originale. imgproxy nécessite le profil images et les paramètres ci-dessous ; cloudflare utilise Cloudflare Images |
QUIRE_MEETING_PROVIDER |
bbb, zoom, teams, meet, jitsi ou in_process |
Fournisseur par défaut de la plateforme pour les sessions en direct. Si ce paramètre n’est pas défini, les sessions indiquent qu’elles ne sont pas configurées tant qu’une organisation n’a pas connecté son propre compte dans Intégrations, Fournisseur de sessions en direct. Son compte propre prévaut toujours. Les paramètres propres aux fournisseurs (BBB_URL et BBB_SECRET, variables ZOOM_*, TEAMS_*, GOOGLE_MEET_* et JITSI_*) sont lus uniquement pour le fournisseur nommé ici |
QUIRE_MEETING_REGIONS |
Liste séparée par des virgules : eu, uk, us |
Régions où le fournisseur par défaut de la plateforme traite les réunions. Si ce paramètre n’est pas défini, il n’est pas comparé à la région imposée à une organisation, comme auparavant. La page du compte propre d’une organisation indique ses régions |
Au démarrage, la couche Web refuse un pilote absent de cette version en nommant le paramètre, au lieu de le remplacer silencieusement par la valeur par défaut.
Images
Les pages demandent des images à quatre tailles fixes via /api/files/{id}/image/{size} ; ce point de terminaison vérifie les mêmes droits d’accès que pour le fichier, puis redirige vers le service d’images. Chaque organisation peut demander jusqu’à QUIRE_IMAGE_SPECS_PER_HOUR (2000 par défaut) nouvelles paires image/taille par heure ; les tailles déjà produites pendant cette heure ne sont pas comptées. Si vous utilisez plusieurs conteneurs Web, définissez valkey ou postgres pour QUIRE_CACHE_DRIVER afin que la limite soit commune.
| Paramètre | Pilote | Remarques |
|---|---|---|
IMGPROXY_URL |
imgproxy |
Adresse utilisée par les navigateurs pour joindre imgproxy, par exemple https://images.example.org. Le profil images le publie sur le port QUIRE_IMAGES_PORT (8082) |
IMGPROXY_KEY, IMGPROXY_SALT |
imgproxy |
Chaînes hexadécimales, identiques aux valeurs de démarrage d’imgproxy. Générez chacune avec openssl rand -hex 32. Quire signe chaque adresse d’image avec ces valeurs ; imgproxy ne peut donc rendre que les images demandées par Quire |
QUIRE_IMAGE_SOURCE_ORIGIN |
imgproxy avec stockage local |
Origine depuis laquelle imgproxy récupère les originaux. Compose définit http://web:3000. Avec le stockage s3 ou azure, imgproxy les récupère dans le bucket ; ce paramètre est alors inutilisé |
CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_IMAGES_TOKEN, CLOUDFLARE_IMAGES_ACCOUNT_HASH |
cloudflare |
Jeton API avec autorisation de modification Images et hash du compte dans Images, Developer resources. Activez les variantes flexibles pour le compte |
CLOUDFLARE_IMAGES_SIGNING_KEY |
cloudflare |
Facultatif. Si défini, les images sont privées et chaque adresse est signée et expire. Sans cette clé, les images sont publiques, à des adresses dérivées de QUIRE_SECRET_KEY que personne ne peut deviner |
Cloudflare Images conserve sa propre copie de chaque original qu’il sert. Lorsqu’un fichier est supprimé, le worker supprime cette copie avant l’original.
File de travaux
Les travaux d’arrière-plan utilisent pg-boss dans la même base Postgres ; aucun service de file n’est à exécuter ou à configurer. Les travaux sont ajoutés à la file dans la même transaction que la modification qui les déclenche : un plantage ne peut donc ni en perdre ni en envoyer deux fois. Ici, QUIRE_QUEUE_DRIVER vaut pgboss, sa valeur par défaut ; vercel et cloudflare ne déplacent que les envois légers de notifications et de webhooks vers la file propre à la plateforme. Les guides Vercel et Cloudflare expliquent ces files et la façon dont leurs couches Web y ajoutent les travaux.
Définissez l’un de ces paramètres :
QUIRE_EMAIL_PROVIDER_CONFIG: objet JSON qui indique un fournisseur HTTP et ses identifiants, par exemple{"provider":"postmark","token":"..."}. Postmark, Amazon SES, Mailgun, SendGrid et Resend sont pris en charge.QUIRE_SMTP_URL:smtp://user:password@host:587. Uniquement pour cette cible ; les environnements sans serveur bloquent SMTP.
QUIRE_MAIL_FROM indique l’expéditeur. Pour essayer Quire, démarrez le profil devmail, définissez QUIRE_SMTP_URL=smtp://mailpit:1025 et consultez les e-mails sur http://localhost:8025.
Services facultatifs
| Paramètre | Profil requis |
|---|---|
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 ou QUIRE_MEILISEARCH_URL |
Recherche externe ; sinon, recherche en texte intégral Postgres |
QUIRE_BREACH_CHECK_PROVIDER=off, QUIRE_BREACH_CHECK_URL |
Vérification des fuites de mots de passe. Activée par défaut contre api.pwnedpasswords.com (seul le préfixe de cinq caractères du hash est envoyé) ; off la désactive et l’URL désigne une API de plage que vous hébergez |
Observabilité
OTEL_EXPORTER_OTLP_ENDPOINT désigne le collecteur auquel chaque processus envoie ses traces et ses métriques ; avec le profil observability, sa valeur est http://otelcol:4318, et docker/otel-collector.yaml permet d’ajouter l’exportateur de votre backend. Une fois ce paramètre défini, les processus Web, worker, scheduler, content et collab exportent des spans via OTLP/HTTP (requêtes Web, transactions des bases de locataires, travaux des workers et appels sortants), ainsi que des métriques vers le même point de terminaison chaque minute (OTEL_METRICS_EXPORTER=none les désactive). OTEL_TRACES_SAMPLER_ARG définit la proportion de traces conservées. Les journaux sont envoyés sur la sortie standard au niveau LOG_LEVEL, et Compose les fait tourner. Les traces ne contiennent aucune donnée personnelle.
Sortie réseau régionale (résidence des données dans l’UE)
QUIRE_REGION=eu indique que la pile sert des organisations de l’Union européenne. Le worker limite alors à une liste d’autorisation toute requête sortante effectuée pour une organisation dont la région est l’UE (21-compliance.md, section 8.1). Cette liste comprend les hôtes déclarés pour la région par les services configurés (point de terminaison de stockage, fournisseur de messagerie, fournisseur vidéo hébergé, destinations de stockage propres à l’organisation, fournisseurs d’IA et compte de messagerie), les hôtes des services faisant l’objet d’une dérogation active et ceux indiqués dans QUIRE_EGRESS_ALLOW_HOSTS. Toute requête vers un autre hôte public est refusée avant son envoi ; le refus est inscrit dans la piste d’audit de l’organisation sous privacy/egress_refused, et figure sous Conformité, Résidence des données.
| Paramètre | Valeurs | Effet |
|---|---|---|
QUIRE_EGRESS_ALLOW_HOSTS |
Liste de noms d’hôtes séparés par des virgules ou *.example.org pour inclure tous les sous-domaines |
Hôtes supplémentaires qu’une organisation de l’UE peut joindre. Les points de terminaison webhook, xAPI et SIEM, les flux de blog et les hôtes Amazon SES doivent y figurer, car ils relèvent du choix de l’organisation et ne sont déclarés par aucun service. Les adresses loopback, les adresses privées et les noms à étiquette unique comme web ou clamav appartiennent à votre réseau et ne sont jamais vérifiés |
Les organisations du Royaume-Uni et des États-Unis ne sont pas limitées à une liste d’hôtes ; elles conservent les contrôles de région des services. Définissez la liste sur le worker ; la page d’administration la lit sur la couche Web pour afficher la liste d’autorisation. Placez-la donc dans docker/.env, lu par tous les services.
Le contrôle applicatif fournit une erreur claire et une entrée d’audit, mais ce n’est pas la garantie : le code peut contenir une erreur. La garantie repose sur le réseau. Compose ne l’applique pas à votre place. Pour une pile régionale, placez les services worker et web sur un réseau internal: true dont la seule sortie passe par un proxy egress (par exemple un conteneur Squid ou tinyproxy) autorisant les mêmes hôtes que QUIRE_EGRESS_ALLOW_HOSTS, ainsi que ceux des services configurés, et définissez HTTPS_PROXY pour ces services. La page de résidence répertorie précisément les hôtes autorisés par l’application afin de comparer les deux listes.
Santé
| Point de terminaison | Signification |
|---|---|
/healthz |
Disponibilité : le processus répond. Compose l’utilise pour les contrôles de santé |
/readyz |
État prêt : les dépendances sont accessibles et chaque service facultatif est signalé comme configuré ou non. Pointez votre répartiteur de charge ici |
docker compose -f docker/compose.yaml ps affiche l’état de santé de chaque service.
TLS
Le service proxy (Caddy, Apache-2.0, docker/caddy/Caddyfile) appartient à la pile par défaut. Il répond sur les ports 80 et 443 et redirige :
| Hôte ou chemin | Destination |
|---|---|
QUIRE_PROXY_CONTENT_HOST |
content |
QUIRE_PROXY_APP_HOST, tous les sous-domaines de locataires et domaines personnalisés |
web |
/_collab/ sur ces hôtes |
collab (WebSocket, QUIRE_COLLAB_URL) |
/_realtime/connection/ sur ces hôtes |
WebSocket client de centrifugo ; son API serveur n’est jamais exposée |
/_images/ sur ces hôtes |
imgproxy, avec le profil images (IMGPROXY_URL) |
init-env.sh déduit QUIRE_PROXY_APP_HOST, QUIRE_PROXY_CONTENT_HOST, QUIRE_PROXY_HTTPS_PORT, QUIRE_COLLAB_URL et IMGPROXY_URL des deux origines, afin qu’ils restent cohérents. Si vous modifiez une origine manuellement, modifiez-les ensemble.
Les certificats dépendent de QUIRE_PROXY_TLS :
-
internal(valeur par défaut) : l’autorité de certification propre à Caddy, pourlocalhost,*.localhostetlvh.me. Faites confiance une fois à son certificat racine, puis ouvrez :docker compose -f docker/compose.yaml cp \ proxy:/data/caddy/pki/authorities/local/root.crt ./quire-local-ca.crtAjoutez
quire-local-ca.crtau magasin de confiance du système ou du navigateur. Pourcurl, indiquez-le avec--cacert. -
Une adresse e-mail : certificats ACME automatiques (Let’s Encrypt, puis ZeroSSL) pour les noms d’hôte réels. Le DNS des deux origines et de chaque hôte de locataire doit pointer ici ; les ports 80 et 443 doivent être accessibles depuis Internet.
Les certificats des hôtes de locataires sont émis à la demande, lors de la première visite uniquement, et seulement lorsque Web confirme que le nom appartient à cette installation (/tls-allowed, interrogé sur le réseau Compose). Aucun certificat générique ni plug-in de fournisseur DNS n’est nécessaire ; une personne inconnue qui pointe un nom vers l’hôte ne peut pas provoquer l’émission d’un certificat. Les certificats et l’autorité locale résident dans le volume caddy-data ; sauvegardez-le avec le reste si vous utilisez internal.
Web ne fait confiance à X-Forwarded-For que lorsqu’il provient du proxy : celui-ci a une adresse fixe (QUIRE_PROXY_ADDRESS, 172.29.64.10 par défaut) sur un sous-réseau fixe (QUIRE_COMPOSE_SUBNET), et QUIRE_TRUSTED_PROXY_CIDRS désigne cette adresse. Si le sous-réseau entre en conflit avec un réseau de l’hôte, modifiez les deux paramètres et exécutez docker compose down avant up.
Derrière votre propre proxy inverse
Pour utiliser à la place un répartiteur de charge ou un proxy déjà en service, ne démarrez pas proxy (docker compose up -d --scale proxy=0) et terminez TLS devant web (8080), content (8081), collab (1234, WebSocket) et centrifugo (8000, WebSocket). Définissez les adresses publiques dans QUIRE_APP_ORIGIN, QUIRE_CONTENT_ORIGIN et QUIRE_COLLAB_URL (wss://), et la plage d’adresses de votre proxy dans QUIRE_TRUSTED_PROXY_CIDRS.
Dépannage
initse termine avec « QUIRE_DATABASE_ID is not a UUID » : définissez la valeur avecuuidgen.webredémarre avec « did not start on compose » : le journal répertorie les paramètres qu’il ne peut pas accepter et les valeurs à utiliser à la place.- Modifier un mot de passe de rôle dans
.envaprès le premier démarrage n’a aucun effet : le script d’initialisation ne s’exécute qu’une fois. UtilisezALTER ROLE. - Les téléversements échouent avec une erreur d’analyse alors que
CLAMAV_URLest défini : ClamAV télécharge ses signatures au premier démarrage, ce qui prend quelques minutes.