L'application
Pages de contenu
Les pages légales sous forme de fichiers markdown que tu montes (CONTENT_DIR) : le dossier, le format des fichiers, ce qui est refusé, et les sections nommées des deux pages de boutons légaux
Cette page est traduite automatiquement à partir de la documentation en anglais.
openplate charge les pages légales depuis des fichiers markdown que tu montes dans le conteneur. Le dépôt ne contient aucun texte légal en propre. Tu rédiges les conditions, la politique de confidentialité, les mentions légales, et les pages des deux boutons légaux. Ils décrivent ton instance et te désignent comme exploitant.
L'activer
Définis CONTENT_DIR vers un dossier que l'application peut lire :
CONTENT_DIR=/srv/openplate-contentAvec un conteneur, monte le dossier en lecture seule et fais pointer la variable vers le point de montage :
services:
openplate:
environment:
CONTENT_DIR: /content
volumes:
- ./content:/content:roUne valeur qui ne désigne aucun dossier bloque le démarrage. Un montage échoué se voit immédiatement. L'application ne peut pas démarrer et ressembler à une instance dépourvue de pages légales.
Quand CONTENT_DIR n'est pas défini
C'est la valeur par défaut, et elle convient à une instance familiale qui ne vend rien.
- Chaque route de contenu renvoie une 404 :
/terms,/privacy,/privacy/website,/imprint,/withdrawal,/kuendigung,/kuendigung/bestaetigt,/widerrufenet/widerrufen/bestaetigt. - Le pied de page public affiche seulement Source, Licence et Préférences. Les cinq liens légaux (Confidentialité, Conditions, Mentions légales et les deux boutons légaux) ne s'affichent pas.
- Paramètres, À propos ne comporte pas de groupe Mentions légales. Avec le dossier monté, cette page liste les cinq mêmes liens sous un titre Mentions légales, de sorte qu'une personne connectée, qui ne voit aucun pied de page, accède quand même aux mentions légales.
- La note qu'un visiteur non connecté voit sur une page personnelle renvoie vers l'accueil et la connexion, sans lien vers les mentions légales ni la confidentialité.
- Le formulaire d'infolettre, si tu l'as activé, supprime sa ligne sur la confidentialité.
Les liens réapparaissent dès que le dossier contient un imprint.md, dans la langue du lecteur ou en anglais. Les mentions légales servent de contrôle, car la loi allemande les impose à toute instance qui publie l'une des autres.
Le dossier
<CONTENT_DIR>/
en/
terms.md
privacy.md
imprint.md
...
de/
terms.md
...Un dossier par langue : en, de, fr, it, es ou tr. Un fichier par page, nommé d'après son slug :
| Slug | Chemin dans l'application |
|---|---|
terms | /terms |
privacy | /privacy |
privacy-website | /privacy/website |
imprint | /imprint |
withdrawal | /withdrawal |
kuendigung | /kuendigung |
kuendigung-bestaetigt | /kuendigung/bestaetigt |
widerrufen | /widerrufen |
widerrufen-bestaetigt | /widerrufen/bestaetigt |
Une page manquante dans la langue du lecteur est servie en anglais. Une page absente aussi en anglais renvoie une 404. L'application lit uniquement ces slugs. Elle ne construit jamais un chemin à partir d'une URL.
L'application lit chaque fichier à la demande et garde la page analysée en mémoire. Elle relit le fichier dès que sa date de modification ou sa taille change. Une modification d'un fichier monté s'affiche dès la requête suivante, sans redémarrage.
Le format de fichier
UTF-8, fins de ligne LF, aucun marqueur d'ordre des octets. Chaque fichier commence exactement par ces métadonnées initiales :
---
title: Terms of service
updated: 2026-09-21
---title est le titre de la page. updated est une date calendaire, et l'application l'affiche sous le titre sous la forme « Dernière mise à jour », dans la langue du lecteur. Ne répète ni l'un ni l'autre dans le corps du texte.
Le corps du texte utilise ce sous-ensemble et rien d'autre :
- Titres
##et###.#correspond au titre de la page et ne s'écrit jamais. - Paragraphes, séparés par une ligne vide.
- Listes avec
-ou1., à un seul niveau, sans indentation. **strong**et*emphasis*.- Liens
[text](target). La cible est un chemin dans l'application (/imprint),https://,mailto:outel:. Un chemin dans l'application s'ouvre sans rechargement. - Un saut de ligne forcé : une barre oblique inverse comme dernier caractère d'une ligne, suivie de la ligne suivante du même paragraphe. Utilise-le pour une adresse postale.
- Une liste de définitions : une ligne de terme suivie d'une ou plusieurs lignes
: definition, sans ligne vide entre les entrées. - Un échappement : une barre oblique inverse devant
\,*,[ou]rend le caractère littéral.
Les paragraphes situés avant le premier titre constituent le chapeau de la page et s'affichent en plus grand.
Ce qui est refusé
Tout code HTML brut (un < suivi d'une lettre, /, ! ou ?), les références de caractères HTML comme &, les images, les tableaux, le code, les blocs de citation, les titres # ou ####, les listes imbriquées ou indentées, ainsi que tout espace réservé {{.
Un fichier qui ne respecte pas le format est refusé, non réparé. L'application consigne chaque problème avec son numéro de ligne, une seule fois par version du fichier. La page renvoie un code 503 avec l'écran d'erreur neutre. Une page juridique qui supprimerait silencieusement un tableau, ou qui afficherait une balise sous forme de texte, publierait un document que personne n'a rédigé. Corrige le fichier, et la requête suivante l'affichera.
Sections nommées
Deux pages conservent un formulaire dans le code de l'application : /kuendigung (résilier un contrat) et /widerrufen (se rétracter d'un contrat). Leurs pages de confirmation conservent le reçu dans le code. Les libellés du formulaire, les boutons, les messages de validation et les lignes du reçu font partie intégrante de l'application. Le texte qui les entoure provient du fichier. Une section nommée contient chaque élément que l'application place autour du formulaire :
:::section unavailable
Text of the section, in the same subset.
:::Chacune de ces pages doit contenir exactement les sections ci-dessous, une seule fois chacune. Une section manquante ou en trop est refusée comme n'importe quelle autre erreur.
| Slug | Section | Emplacement où l'application l'affiche |
|---|---|---|
kuendigung | (corps) | Le chapeau, au-dessus du formulaire de résiliation. |
kuendigung | unavailable | À la place du formulaire lorsque CORE_URL n'est pas défini, et sous le bouton d'envoi lorsqu'une soumission ne parvient pas à joindre le service de déclaration. |
kuendigung-bestaetigt | (corps) | Généralement vide. |
kuendigung-bestaetigt | mail-notice | Après les lignes du reçu, avant le bouton d'impression. |
widerrufen | (corps) | Le chapeau, au-dessus du formulaire de rétractation. |
widerrufen | unavailable | Comme pour kuendigung. |
widerrufen-bestaetigt | (corps) | Généralement vide. |
widerrufen-bestaetigt | mail-notice | Comme pour kuendigung-bestaetigt. |
Toutes les autres pages ne comportent aucune section : leur corps entier constitue la page.
Le titre de kuendigung correspond à l'intitulé exigé par la loi allemande pour cette page, et il en va de même pour widerrufen. Le pied de page et les boutons d'envoi de l'application portent eux-mêmes les libellés de bouton prévus par la loi.
Où les instances d'openplate récupèrent leurs fichiers
Les instances hébergées montent des fichiers conservés dans un dépôt privé, à raison d'une arborescence par instance. Ce dépôt valide chaque fichier par rapport à ce format avant son déploiement. Une page refusée est détectée avant même d'atteindre un serveur.