# 🧠 ModĂšle de configuration Un Pingclairfile est compilĂ© une fois, au chargement, en l'Ă©tat d'exĂ©cution que le serveur exĂ©cute. Deux consĂ©quences en dĂ©coulent, et elles expliquent l'essentiel du comportement du projet : le travail que la configuration peut dĂ©cider a lieu avant la premiĂšre requĂȘte, et une configuration qui ne peut pas ĂȘtre honorĂ©e arrĂȘte le serveur au lieu de se dĂ©grader au moment des requĂȘtes. ## đŸ—‚ïž Structure du fichier Un fichier contient un bloc d'options globales facultatif, suivi d'un ou plusieurs blocs de site. ```caddyfile { email admin@example.com } example.com { encode zstd gzip reverse_proxy 10.0.0.10:8080 10.0.0.11:8080 } :8080 { file_server ./public } ``` - **Les options globales** s'Ă©crivent dans un bloc sans nom, placĂ© en premier. Elles configurent un Ă©tat qui n'appartient pas Ă  un site : l'adresse e-mail du compte ACME, l'Admin API, le comportement de HTTPS automatique, les proxys de confiance et la rĂ©solution DNS des amonts dĂ©signĂ©s par un nom d'hĂŽte. Les options disponibles sont listĂ©es dans la [rĂ©fĂ©rence des directives](/fr/reference/directives/#global-options). - **Les blocs de site** sont nommĂ©s par une adresse : un hĂŽte, un port, ou les deux. Le port fait partie de l'adresse plutĂŽt que d'une directive sĂ©parĂ©e : il n'existe donc qu'un seul endroit oĂč l'adresse et l'Ă©couteur doivent s'accorder. - **Les directives** sont les instructions Ă  l'intĂ©rieur d'un bloc de site. Certaines prennent une liste d'arguments, d'autres un bloc imbriquĂ©, d'autres les deux. - **Les commentaires** commencent par `#` et vont jusqu'Ă  la fin de la ligne. - **Les valeurs contenant des espaces sont mises entre guillemets.** Les durĂ©es portent une unitĂ© : `30s` vaut trente secondes, alors qu'un `30` nu est refusĂ© lĂ  oĂč une durĂ©e est attendue. ## 🧭 Matchers Un matcher sĂ©lectionne les requĂȘtes auxquelles une directive s'applique. Les matchers nommĂ©s sont dĂ©clarĂ©s avec `@nom` et rĂ©fĂ©rencĂ©s par ce nom : ```caddyfile example.com { @api path /api/* header @api Cache-Control "no-store" @assets path /assets/* header @assets Cache-Control "public, max-age=31536000, immutable" } ``` Les blocs `handle` regroupent le comportement par route et acceptent un repli sans matcher : ```caddyfile example.com { handle /assets/* { file_server ./assets } handle { respond "Page Not Found" 404 } } ``` ## đŸ§© Fragments et imports Un fragment est un morceau rĂ©utilisable dĂ©clarĂ© sous la forme `(nom) { ... }` et inclus avec `import nom`. Un fragment peut recevoir un bloc de son appelant, qui est insĂ©rĂ© lĂ  oĂč le fragment Ă©crit `{block}` : ```caddyfile (site) { https://{args[0]} { {block} } } import site example.com { reverse_proxy 127.0.0.1:3000 } ``` Les dĂ©finitions de fragments prĂ©sentes dans un fichier importĂ© sont visibles par les imports qui suivent. Les placeholders Ă  l'intĂ©rieur d'une liste d'arguments sont refusĂ©s, car l'arbre de directives ne peut pas rĂ©analyser une ligne aprĂšs l'insertion comme le fait la couche de tokens. ## đŸ›Ąïž Validation `pingclair validate` compile le fichier et applique des contrĂŽles sĂ©mantiques : arguments des directives, syntaxe des matchers, chemins de certificats et de clĂ©s, et contraintes de politique telles que les pairs autorisĂ©s Ă  affirmer des en-tĂȘtes d'identitĂ© client. Les Ă©checs sont fermĂ©s et explicites : - **Les noms non implĂ©mentĂ©s sont refusĂ©s par leur nom.** Chaque nom dĂ©fini par le format est reconnu, et un nom que le serveur n'implĂ©mente pas produit un message indiquant que la fonctionnalitĂ© manque. Il n'est jamais pris pour une faute de frappe et jamais ignorĂ© : une configuration qui en contient un ne dĂ©marre pas. - **Les options qui ne peuvent pas ĂȘtre honorĂ©es sont refusĂ©es, pas dĂ©gradĂ©es.** Demander Brotli dans `encode` est une erreur de compilation, car le proxy n'a pas d'encodeur Brotli en flux ; le serveur ne sert pas silencieusement du gzip Ă  la place. - **Un fichier valide qui rĂ©fĂ©rence du matĂ©riel absent est tout de mĂȘme rejetĂ©.** Le fichier `examples/full_featured.pingclair` du dĂ©pĂŽt est une syntaxe Caddyfile valide et il est pourtant rejetĂ©, Ă  juste titre, parce que les chemins de certificats qu'il nomme n'existent pas sur la machine qui exĂ©cute le contrĂŽle. Les mĂȘmes contrĂŽles s'exĂ©cutent au chargement : une configuration qui Ă©choue pendant un rechargement laisse l'Ă©tat prĂ©cĂ©dent en place. ## 🔁 Rechargements Un rechargement relit la configuration sans redĂ©marrer le processus. Le signal est `SIGUSR1` : ```bash sudo kill -USR1 "$(systemctl show -p MainPID --value pingclair)" ``` `pingclair reload` atteint le mĂȘme code par l'Admin API et rapporte ce que le serveur a pensĂ© du fichier, ce qui exige l'option `admin` du bloc des options globales. `pc service reload` envoie ce signal par l'unitĂ© installĂ©e : la commande Ă©vidente est celle qui fonctionne. Sa rĂ©ponse n'est pas dans le code de sortie — `systemctl reload` peut seulement signaler que le signal a Ă©tĂ© dĂ©livrĂ© — mais sur la ligne d'Ă©tat de l'unitĂ© et dans le journal, et un rechargement refusĂ© laisse l'ancienne configuration en service ([issue #66](https://github.com/dorianverlaine/pingclair/issues/66) dĂ©crit la version dont l'unitĂ© annonçait un succĂšs malgrĂ© tout). La politique valable pour tout le processus, Ă©tablie au dĂ©marrage — par exemple `trusted_proxies` — ne prend effet qu'aprĂšs un redĂ©marrage, et une configuration qui change d'Ă©couteurs en exige un aussi.