Source docs/configuration.fr.md · 1de96aa

Référence de configuration

Cette page s’adresse aux administrateurs. Elle recense tous les réglages que lit Libris : les variables d’environnement du fichier .env, et les réglages qu’un administrateur peut modifier à chaud depuis Paramètres dans l’interface web. Pour chacun, vous trouverez sa valeur par défaut, son effet et les cas où il convient de le modifier.

Si vous installez Libris pour la première fois, vous n’avez encore besoin de rien de tout cela : scripts/setup.py (lancé par l’installateur) écrit un .env fonctionnel. Commencez par le guide Docker et revenez ici lorsque vous voudrez ouvrir Libris à votre réseau, ajuster des limites ou changer une valeur par défaut.

Fonctionnement de la configuration

  • .env est le seul fichier que vous modifiez. Il se trouve à côté de docker-compose.yml, est créé par python3 scripts/setup.py à partir de .env.example, et est lu par les conteneurs api, worker et migrate. Gardez-le privé (mode 0600) et ne le versionnez jamais.

  • Les noms ne tiennent pas compte de la casse, mais cette page emploie la forme en majuscules de .env.example. Une variable absente de .env prend la valeur par défaut indiquée ici.

  • Appliquez une modification en recréant les conteneurs :

    docker compose up -d --no-build --wait
    

    Chaque conteneur ne lit l’environnement qu’à son démarrage. Lancez la même commande avec --profile codex si vous utilisez le pont Codex.

  • Une valeur invalide empêche l’application de démarrer. Chaque réglage numérique a une plage autorisée (indiquée ci-dessous). Une valeur hors plage, une SECRET_KEY de moins de 32 caractères, ou un METRICS_TOKEN / API_WEBHOOK_SECRET défini mais trop court empêche l’API et le worker de démarrer ; docker compose logs api nomme le réglage en cause.

  • Certains réglages peuvent être remplacés dans l’interface. Le pilote automatique, les budgets, les webhooks, la reprise automatique, la file équitable, l’envoi de courriels SMTP, la mémoire OpenViking et son nettoyage, ainsi que la recherche SearXNG ont une page sous Paramètres. Là, une valeur enregistrée l’emporte sur l’environnement. Voir Réglages modifiés dans l’interface.

Installation et réseau

Ces variables sont lues par Docker Compose et par le serveur web plutôt que par le code de l’application.

VariableValeur par défautEffetQuand la modifier
LIBRIS_IMAGEregistry.libris-translate.com/libris/libris:latest dans le fichier Compose des sources ; un digest immuable dans une installation clienteImage de l’application utilisée par api, worker et migrate. Le bootstrap du registre résout l’étiquette choisie et fige son digest immuable.Relancez normalement le bootstrap avec LIBRIS_TAG ; ne modifiez ceci que pour une construction locale délibérée comme epub-translator:local.
LIBRIS_CODEX_IMAGEregistry.libris-translate.com/libris/libris:codex-latest dans le fichier Compose des sources ; un digest immuable correspondant dans une installation clienteImage du pont Codex facultatif. Le bootstrap vérifie que sa version et sa révision correspondent à l’application avant de la figer.Rarement ; seulement si vous choisissez délibérément vous-même une image de pont correspondante.
LIBRIS_CONTAINER_PREFIXlibrisNoms stables visibles par l’exploitant : libris-database, libris-migrate, libris-api, libris-worker et, avec son profil, libris-codex. Cette variable ne nomme pas les volumes.Seulement pour une pile jetable qui doit cohabiter sur le même hôte Docker ; les scripts de CI et d’audit choisissent eux-mêmes un préfixe unique.
LIBRIS_PROJECTlibris (écrit dans .env par l’installateur)Nom du projet Compose, qui préfixe le réseau et les volumes (<project>_database, <project>_books). Les installations faites par une version antérieure tournaient sous epub-translator ; l’installateur les renomme une fois (Docker).Jamais sur une installation existante : un nouveau nom signifie de nouveaux volumes, vides. Sur un hôte de production, librisctl migrate-project (en anglais) le renomme et copie les données.
LIBRIS_ENV_FILE.envFichier transmis aux conteneurs comme environnement.Pour garder la configuration hors du dépôt, par exemple LIBRIS_ENV_FILE=/etc/libris/libris.env docker compose --env-file /etc/libris/libris.env up -d.
POSTGRES_PASSWORDgénéréMot de passe du rôle PostgreSQL translator. Obligatoire : Compose refuse de démarrer sans lui.Jamais après le premier démarrage. Le modifier dans .env ne change pas le mot de passe déjà enregistré dans le volume de la base.
BIND_ADDRESS127.0.0.1Interface de l’hôte sur laquelle le port web est publié.0.0.0.0 pour joindre Libris depuis d’autres machines d’un réseau privé. Gardez 127.0.0.1 derrière un proxy inverse installé sur le même hôte.
PORT8088Port de l’hôte pour l’interface web et l’API.Quand 8088 est déjà pris. Adaptez ALLOWED_ORIGINS en conséquence.
FORWARDED_ALLOW_IPSnon défini (seul 127.0.0.1 est de confiance)Adresses des proxys inverses dont les en-têtes X-Forwarded-For / X-Forwarded-Proto sont pris en compte, séparées par des virgules. Lu par le serveur web (Uvicorn).Derrière un proxy inverse : indiquez l’adresse du proxy telle que la voit le conteneur (par exemple la passerelle du pont Docker 172.18.0.1) pour que les journaux et le frein aux échecs de connexion et la limite des réinitialisations de mot de passe (10 demandes par client en 15 minutes) voient les vraies adresses des clients (chaque refus de cette limite est journalisé en avertissement avec bucket=<adresse> : l’adresse du proxy lui-même à cet endroit signifie que cette variable manque) ; jamais *, qui laisse n’importe qui falsifier l’adresse.

Compose définit aussi DATABASE_URL, DATA_DIR=/data et TMPDIR=/data/tmp pour les conteneurs de l’application ; ne les mettez pas dans .env pour une installation Docker.

Sécurité et accès

VariableValeur par défautEffetQuand la modifier
SECRET_KEYgénérée (obligatoire, au moins 32 caractères)Chiffre les clés d’API des providers, la clé OpenViking et les secrets de webhook enregistrés dans la base.Jamais. Conservez-la avec vos sauvegardes. Si elle change, les clés enregistrées deviennent illisibles : Libris vous demande de saisir à nouveau la clé de chaque provider et ignore les secrets enregistrés illisibles.
BOOTSTRAP_USERNAMEadminNom du premier compte administrateur.Avant le premier démarrage, si vous voulez un autre nom.
BOOTSTRAP_PASSWORDgénéré (au moins 12 caractères)Mot de passe du premier administrateur. Utilisé uniquement lorsque la base ne contient aucun compte ; sur une base vide, l’API refuse de démarrer sans lui.Avant le premier démarrage. Ensuite, changez les mots de passe dans l’interface : modifier .env ne touche pas aux comptes existants.
ALLOWED_ORIGINShttp://localhost:8088,http://127.0.0.1:8088Origines navigateur (schéma, hôte et port, sans chemin) autorisées à envoyer des modifications. Les requêtes portant toute autre Origin reçoivent un 403. Séparées par des virgules ; les espaces autour de chaque origine sont ignorées.Dès que les utilisateurs joignent Libris par une autre adresse : http://your-server:8088 sur un réseau local, https://books.example.com derrière HTTPS. C’est un contrôle d’origine, pas un pare-feu. La modification prend effet une fois les conteneurs recréés (librisctl up) : un simple redémarrage conserve l’environnement avec lequel ils ont été créés.
COOKIE_SECUREtrueMarque le cookie de session Secure : les navigateurs ne l’envoient qu’en HTTPS, et vers http://localhost / http://127.0.0.1 sur la machine de Libris elle-même, que les navigateurs actuels considèrent comme sûrs.Gardez true derrière HTTPS et pour un usage local. Ne mettez false que si les utilisateurs ouvrent Libris en HTTP simple sur une adresse réseau (http://192.168.1.10:8088, http://your-server:8088) : le navigateur y écarte un cookie Secure et la connexion semble ne rien faire.
SESSION_DURATION_HOURS24 (1–2160)Durée de vie d’une session de connexion.Plus longue pour une instance privée à un seul utilisateur, plus courte sur des machines partagées.
WEBAUTHN_RP_IDvide (l’hôte de la première entrée de ALLOWED_ORIGINS)Le domaine auquel une clé de sécurité est liée. Une clé enregistrée sous un domaine est refusée sous tous les autres : c’est ce qui la rend insensible à l’hameçonnage.Lorsque Libris répond à plusieurs adresses, pour que les clés continuent de fonctionner : fixez celle par laquelle on se connecte.
WEBAUTHN_RP_NAMELibris TranslateLe nom qu’affiche un authentificateur quand on lui demande de créer une clé.Pour nommer l’installation plutôt que le produit.
OPENAPI_ENABLEDtrueSert la description de l’API à /openapi.json, aux seuls utilisateurs connectés.false si vous ne voulez pas du tout exposer le schéma de l’API.
PUBLIC_HEALTH_DETAILSfalse/health donne toujours son état, la version et l’état de la configuration ; la liste des vérifications derrière cet état, et l’état d’OpenViking et de sa file d’envoi, ne vont qu’à un administrateur connecté. true les donne à tous.Pour une sonde de supervision sans session, sur une adresse qu’elle seule atteint.
METRICS_TOKENvide (point d’accès désactivé)Active GET /metrics pour Prometheus. Les collecteurs doivent envoyer Authorization: Bearer <token>. Au moins 24 caractères s’il est défini.Pour superviser Libris ; générez-en un avec openssl rand -hex 32. Voir l’exploitation (en anglais).

L’authentification unique n’a pas non plus de variable d’environnement : un administrateur indique l’émetteur, l’identifiant client et le secret dans Paramètres › Authentification unique, et Libris découvre le reste à partir de {issuer}/.well-known/openid-configuration. Le secret est chiffré avec SECRET_KEY comme tous les autres secrets ; l’adresse à déclarer auprès du fournisseur d’identité est affichée sur le même écran et construite à partir de la première entrée de ALLOWED_ORIGINS. Un compte ouvert par un fournisseur d’identité n’a ni mot de passe Libris ni seconde étape Libris : l’un et l’autre relèvent du fournisseur.

LDAP / Active Directory n’a pas non plus de variable d’environnement : un administrateur le configure dans Paramètres › Authentification unique, carte Annuaire LDAP / Active Directory, et l’écran de connexion propose alors de choisir entre l’annuaire et un compte Libris local. La mise en place pas à pas pour OpenLDAP et Active Directory est décrite dans ldap.fr.md. Les réglages sont :

RéglagePar défautEffet
Type d’annuaireOpenLDAPChoisit les valeurs par défaut des quatre attributs et du filtre utilisateur ci-dessous : uid / mail / entryUUID / memberOf pour OpenLDAP, sAMAccountName / mail / objectGUID / memberOf pour Active Directory.
Adresse de l’annuairevideldaps://hôte:636 (recommandé) ou ldap://hôte:389. Ni chemin ni paramètres. Utilisez un nom d’hôte présent dans le certificat du serveur : une adresse IP est refusée par la vérification du nom d’hôte.
StartTLSdésactivéChiffre une connexion ldap:// avant tout envoi. Refusé avec ldaps://, déjà chiffré.
Autoriser ldap:// en clairdésactivéSans StartTLS, ldap:// envoie chaque mot de passe en clair sur le réseau : c’est refusé sauf si cette case est cochée explicitement. À réserver à un annuaire sur la même machine ou sur un lien privé.
Certificat de l’autoritévide (magasin du système)PEM de l’autorité qui a signé le certificat de l’annuaire, collé dans le formulaire. La vérification du certificat et du nom d’hôte est toujours active ; aucun réglage ne la désactive.
DN et mot de passe du compte de servicevidesLe compte avec lequel Libris cherche dans l’annuaire. Le mot de passe est chiffré avec SECRET_KEY, jamais renvoyé au navigateur ni journalisé ; laissez le champ vide pour conserver celui qui est enregistré. Un DN vide signifie une recherche anonyme, si l’annuaire l’accepte.
Base de recherchevide (obligatoire)Où chercher les personnes, par exemple ou=people,dc=example,dc=com.
Filtre utilisateurselon le typeFiltre LDAP où {username} reçoit l’identifiant saisi, échappé (*, (, ), \, NUL). OpenLDAP : (&(objectClass=inetOrgPerson)(uid={username})). Active Directory : sAMAccountName ou userPrincipalName, comptes désactivés exclus. Exactement une entrée doit correspondre.
Attributs du nom, de l’adresse, de l’identifiant stable et des groupesselon le typeOù lire le nom d’utilisateur Libris, l’adresse et les appartenances aux groupes, et l’attribut qui identifie une entrée durablement. Les comptes sont retrouvés par l’identifiant stable, jamais par un nom ou une adresse.
Groupes autorisésvide (toute personne trouvée par le filtre)DN de groupes, un par ligne : seuls leurs membres (lus dans l’attribut des groupes, comparés sans tenir compte de la casse) peuvent se connecter.
Groupe administrateurvide (rôles réglés dans Libris)S’il est renseigné, ses membres sont administrateurs de Libris et les autres non, à chaque connexion ; le rôle ne se change alors plus dans Libris. Le dernier administrateur actif n’est jamais rétrogradé ainsi. Les membres de ce groupe sont aussi autorisés à entrer.
Créer les comptes à la première connexiondésactivéComme pour le SSO : sans cela, une personne de l’annuaire est refusée tant qu’un administrateur ne lui a pas rattaché un compte (Paramètres › Utilisateurs › Rattacher à l’annuaire) ; avec, chaque nouvelle personne prend un siège de la licence.
Délai10 s (1–60)Délai de connexion, de réponse et de recherche.
Nom affiché sur l’écran de connexionAnnuaire de l’entrepriseLe libellé du choix de l’annuaire.

Un compte d’annuaire n’a pas de mot de passe Libris (changement de mot de passe, Mot de passe oublié, réinitialisation et renommage local sont refusés), mais garde la seconde étape de Libris : un annuaire ne vérifie qu’un mot de passe, donc codes et clés de sécurité sont proposés et exigés comme pour un compte local, et une preuve récente (#102) se donne avec le mot de passe d’annuaire. Les referrals ne sont jamais suivis, et les échecs de connexion par l’annuaire comptent dans la même limite que les connexions locales pour le même nom.

Il n’existe aucun réglage pour la seconde étape de la connexion : chaque compte l’active pour lui-même dans Mon compte › Double authentification : un code à six chiffres fourni par une application d’authentification, une clé de sécurité (WebAuthn), ou les deux, plus dix codes de récupération à usage unique. Une clé exige un contexte sécurisé — HTTPS, ou localhost — : une installation jointe en HTTP simple sur un réseau local ne propose donc que l’application d’authentification. Un administrateur peut la retirer d’un compte qui a perdu son téléphone — Paramètres › Utilisateurs —, ce qui est inscrit au journal d’audit ; personne ne peut l’activer à la place de quelqu’un d’autre. L’API d’automatisation n’est pas concernée : un jeton est un secret à part entière.

Les modifications sensibles d’un compte exigent une preuve datant de moins de cinq minutes, liée à la session de navigateur en cours. Ce délai n’est volontairement pas configurable et ne prolonge pas SESSION_DURATION_HOURS. Une connexion locale complète compte immédiatement ; WebAuthn doit réellement vérifier l’utilisateur (code PIN ou biométrie), et non se contenter d’un simple contact. Les sessions existantes restent utilisables après une mise à jour, mais ne portent aucune preuve récente tant qu’elles n’ont pas été confirmées.

Pour les administrateurs en SSO, vérifiez l’aptitude du fournisseur d’identité avant de compter sur la gestion du compte : il doit accepter une nouvelle autorisation avec prompt=login, max_age=0, et un auth_time signé et récent pour l’émetteur et le sujet d’origine. Une connexion SSO ordinaire ne suffit pas. La confirmation utilise la même URL de rappel enregistrée, un state/nonce neuf et PKCE ; le rappel n’ouvre pas de session et fonctionne sans le cookie SameSite=Strict. La fenêtre d’origine termine la vérification avec son propre cookie. Testez les fenêtres surgissantes et la politique d’isolation de l’ouvreur (opener) du fournisseur dans les navigateurs qu’utilisent les administrateurs. Une preuve manquante est refusée, sans boucle de connexion silencieuse ni repli sur un mot de passe local pour une identité SSO ; le formulaire du compte conserve son brouillon.

Arrêtez l’API avant d’appliquer ou d’annuler cette modification de schéma. Lors d’un retour à une version antérieure, les sessions ordinaires et les connexions SSO ordinaires en attente sont conservées, mais les demandes de confirmation en cours sont supprimées : un binaire plus ancien ne doit jamais traiter une confirmation de compte comme une nouvelle connexion. Remonter de version ne fait pas renaître les horodatages de preuve. Cette protection couvre les modifications du compte et l’adresse électronique personnelle de récupération, pas tous les réglages des providers, du SMTP ou de la licence.

DEMO_MODE

VariablePar défautEffetQuand la modifier
DEMO_MODEfalseRend l’instance accessible en lecture seule pour une démonstration publique. Seuls GET, HEAD, OPTIONS, la connexion/déconnexion, la connexion automatique à la démo et les exports groupés EPUB/texte sont permis ; toute autre écriture renvoie 403 demo_read_only. /mcp, SSO et LDAP sont fermés ; le worker envoie uniquement les battements de licence ; /health répond demo: true.Pour une démo publique, après avoir chargé les livres vitrine.
DEMO_USERNAMEvideNom du compte local dédié auquel les visiteurs accèdent par connexion automatique. Le compte doit être actif, non administrateur, local et sans double authentification.À définir avec DEMO_MODE=true pour une démo publique. Ne publiez jamais son mot de passe.

Stockage et chemins

Les valeurs par défaut correspondent à l’image fournie. Ne les modifiez que si vous exécutez le backend en dehors de Docker.

Dimensionner le pool de connexions. Chaque passage en cours renouvelle le bail de son travail, écrit un point de reprise et lit son contexte : il tient donc une connexion un instant, encore et encore. Le nombre de passages pouvant être en cours est la somme des Livres simultanés (max_concurrency) des providers — et non le plus grand d’entre eux, car les livres traités par des providers différents s’additionnent —, plus les boucles qui ne s’arrêtent jamais : battements de cœur, boîte d’envoi (outbox), courriels, licence. Un pool plus petit que cela n’échoue pas bruyamment : les appelants font la queue, attendent DB_POOL_TIMEOUT, et reçoivent une erreur qui ressemble en tout point à celle d’une base de données hors service.

Les deux processus indiquent au démarrage si le pool couvre les providers : db_pool=ok capacity=… providers=… dans le journal, ou db_pool=undersized avec ce qu’il faut augmenter. Une ligne de journal status=pool_exhausted signale que le pool s’est épuisé ; status=database_unavailable, que la base elle-même n’a pas répondu. Les valeurs par défaut (40 + 40 par processus) couvrent une installation chargée avec de la marge. Les augmenter impose d’augmenter aussi max_connections sur le service de base de données — le fichier Compose fourni le règle à 200 précisément pour cette raison ; sinon, c’est le serveur qui sera le prochain à manquer de connexions.

VariableValeur par défautEffet
DATABASE_URLsqlite:////data/app.db (Compose définit PostgreSQL)Adresse SQLAlchemy de la base de données. Les installations Docker utilisent toujours le PostgreSQL fourni.
DB_POOL_SIZE40 (5–500)Connexions qu’un processus garde ouvertes sur la base.
DB_POOL_MAX_OVERFLOW40 (0–500)Connexions qu’il peut ouvrir en plus lors d’un pic, puis refermer ensuite.
DB_POOL_TIMEOUT5 (1–120)Secondes pendant lesquelles un appelant attend une connexion libre avant d’abandonner. Volontairement court : un travail qui attend une connexion pendant des minutes a déjà perdu son bail.
DATA_DIR/dataRacine du volume des livres : books/, sources/, projects/, exports/, staging/, results/ et tmp/ y sont créés au démarrage.
EPUBCHECK_JARdéfini par l’image vers l’EPUBCheck fourniChemin du jar EPUBCheck. Vide : les exports ne sont vérifiés que par les contrôles internes de Libris, et les rapports indiquent qu’EPUBCheck n’est pas configuré.
FRONTEND_DIR/app/frontend/distInterface web compilée, servie par l’API.
PROMPT_DIR/app/promptsRépertoire des modèles de prompts intégrés. Les prompts modifiés sont enregistrés dans la base, pas ici.

Journal

Chaque service de l’application (API, worker, migrations) écrit ses événements dans un fichier qui lui est propre, dans LOG_DIR, en plus de la sortie habituelle du conteneur ; le script de déploiement de production y écrit aussi deploy.log. librisctl journal, ou python -m app.journal dans un conteneur, les lit comme une seule chronologie — voir l’exploitation. Le fichier Compose monte LOG_DIR depuis le volume logs, ou depuis le répertoire de l’hôte nommé par LIBRIS_LOG_DIR (propriétaire uid 10001, mode 0700) ; les scripts de production utilisent $LIBRIS_PRODUCTION_BASE/logs (ou LIBRIS_PRODUCTION_LOG_DIR).

VariableDéfautRôle
LOG_FILE_ENABLEDtrueÉcrit les fichiers du journal. false : la sortie des conteneurs seulement.
LOG_DIR/logsRépertoire du journal dans les conteneurs.
LOG_LEVELINFODEBUG, INFO, WARNING ou ERROR : l’événement le moins grave écrit, dans le fichier comme sur la sortie du conteneur.
LOG_MAX_MB10 (1–1024)Taille à laquelle un fichier est renouvelé (rotation).
LOG_BACKUPS5 (1–100)Fichiers renouvelés conservés par processus : un service n’occupe jamais plus de LOG_MAX_MB × (LOG_BACKUPS + 1).
LOG_RETENTION_DAYS14 (1–3650)Les fichiers plus anciens sont supprimés, au démarrage et à chaque rotation — jamais celui qu’un processus en cours écrit.
LOG_TIMEZONEUTCFuseau IANA des heures écrites (Europe/Paris). Chaque ligne porte son décalage UTC : des fichiers écrits dans des fuseaux différents se fusionnent quand même dans l’ordre. Un fuseau inconnu revient à UTC, et le signale.

Envois et imports

VariableValeur par défautEffetQuand la modifier
MAX_UPLOAD_MB256 (1–4096)Plus grand corps de requête accepté depuis l’interface web : un EPUB, un fichier texte ou une archive de projet envoyé. Un import garde le fichier et son contenu décompressé en mémoire : comptez environ MAX_UPLOAD_MB + la taille décompressée par envoi en cours.Pour des livres ou des archives plus volumineux encore, ou plus bas sur un hôte à court de mémoire. Votre proxy inverse doit accepter la même taille.
MAX_UNPACKED_MB1024 (1–16384)Plus grande taille totale décompressée d’un EPUB ou d’une archive de projet.Avec MAX_UPLOAD_MB, pour les grands livres illustrés.
MAX_ENTRIES5000 (1–100000)Nombre maximal de fichiers dans un EPUB ou une archive de projet.Rarement ; pour des livres composés de milliers de petits fichiers.
MAX_COMPRESSION_RATIO100 (10–100000)Un EPUB qui se décompresse en plus de 8 Mio avec un taux de compression global supérieur est refusé comme bombe zip potentielle.Seulement si un livre légitime est refusé pour cette raison.
IMPORT_MAX_FILES500 (1–5000)Fichiers dans un import guidé.Pour importer d’un coup une très longue série de fichiers de chapitres.
IMPORT_MAX_SESSION_MB2048Taille totale des fichiers d’un import guidé.Avec IMPORT_MAX_FILES.
IMPORT_SESSION_HOURS24 (1–720)Durée pendant laquelle les fichiers envoyés attendent une confirmation dans DATA_DIR/staging avant d’être supprimés.Si l’on laisse des imports non confirmés plus longtemps.
IMPORT_CONFIRM_LOW_CONFIDENCEfalsefalse : lorsqu’un numéro de volume ou de chapitre est deviné avec une faible confiance, la meilleure hypothèse est conservée et la raison consignée. true : l’assistant d’import demande à une personne de la confirmer.true si vous préférez vérifier à la main chaque numérotation incertaine.
TEXT_CHAPTER_MAX_CHARS2000000 (1000–50000000)Plus long chapitre texte isolé (fichier TXT ou chapitre JSON), en caractères après décodage.Rarement ; pour des livres entiers livrés sous forme d’un seul chapitre.

Une archive de projet qui dépasserait MAX_UPLOAD_MB ou MAX_UNPACKED_MB est refusée dès l’export, avec le réglage à augmenter, car elle ne pourrait pas être importée de nouveau.

Chaîne de traduction

VariableValeur par défautEffetQuand la modifier
PASSAGE_MAX_CHARS3500 (500–20000)Plus long passage, l’unité de texte envoyée en un seul appel au modèle. S’applique aux volumes et chapitres importés ensuite ; les livres existants gardent leur découpage. Un volume peut définir le sien.Des passages plus longs répartissent le contexte fixe de chaque appel sur davantage de texte et réduisent le coût ; consultez la maîtrise des coûts (en anglais) avant de dépasser 8000.
REVIEW_MODEseparateEn qualité haute et maximale : separate relit un passage, puis le révise dans un second appel lorsque la relecture relève quelque chose ; fused relit et corrige en un seul appel. Un volume peut choisir le sien.fused pour économiser des appels, une fois la qualité vérifiée sur vos livres.
FINAL_REVIEW_ENABLEDtrueExécute la relecture finale par IA des traductions de livres entiers et des demandes d’automatisation.false pour sauter cette étape partout (moins cher, moins approfondi). Une requête d’API isolée peut aussi l’omettre.
WORKER_BOOK_PARALLELISM0 (0–16)Passages d’un même livre analysés (mode parallèle), traduits ou relus en même temps. 0 suit la capacité Livres simultanés du provider, partagée entre les livres qui l’utilisent ; 1 traite un passage à la fois. Un volume, un lancement ou une requête d’API peut en demander moins (threads).1 pour les providers qui supportent mal les appels parallèles ; un petit nombre pour laisser de la capacité aux autres livres.
WORKER_PROCESSES1 (1–16)Processus qui exécutent les livres dans le conteneur worker. 1 : le worker lui-même. Au-delà : autant de processus de travaux lancés et surveillés par le worker, qui garde les boucles périodiques ; un livre seul reste sur un cœur, et chaque processus a son propre pool de connexions (exploitation).
ANALYSIS_MODEparallelManière dont un volume est analysé avant la traduction. parallel : chaque passage est analysé isolément, plusieurs à la fois, puis réconcilié avec ce qu’ont établi les passages qui le précèdent ; strict : un passage après l’autre. Un volume (Mode d’analyse dans ses réglages), un lancement ou une requête d’API peut choisir l’autre mode. Voir l’architecture (en anglais).strict seulement pour comparer, ou pour un provider qui n’autorise qu’un appel à la fois (le mode parallèle fait environ 1,8 fois plus d’appels d’analyse).
ANALYSIS_RECONCILIATIONallMode parallèle : all réconcilie chaque passage avec ce qui le précède ; flagged seulement les passages dont l’analyse propre a laissé quelque chose à résoudre (personne de nommé, une référence non résolue, une forme courte ou un nouveau nom proche d’un nom connu).Gardez all : flagged économise des appels, mais a perdu une partie de la résolution des alias lors de l’évaluation.
ANALYSIS_MIN_COVERAGE1 (0–1)Part des passages d’un volume qui doivent disposer d’une analyse en mémoire avant que l’étape de traduction commence, une fois les passages abandonnés redemandés. À 1, chaque section doit aussi être consolidée dans la Book Bible. En dessous, le travail s’arrête en blocked avec stop_reason = analysis_incomplete ; sans aucune analyse, ou avec une Book Bible vide que personne n’a validée, avec analysis_unusable — au lieu de traduire avec une mémoire incomplète du livre (#161).Laissez-la à 1 : un passage traduit sans son analyse rompt la cohérence du glossaire, des personnages et de la mémoire. Ne l’abaissez que pour accepter, en connaissance de cause, de traduire un livre dont certains passages ne seront analysés par aucun provider ; un travail arrêté ainsi reprend dès que le provider répond correctement : ce qui avait été abandonné est redemandé et une Book Bible restée vide est reconstruite.
WORKER_HEARTBEAT_SECONDS2 (1–20)Fréquence à laquelle un travail en cours renouvelle son bail de 60 secondes et vérifie s’il doit se mettre en pause ou s’annuler.Normalement jamais.
PROVIDER_RECOVERY_BASE_SECONDS60 (5–3600)Première attente avant de réessayer un provider indisponible (erreur réseau, délai dépassé, HTTP 429 ou 5xx). Les attentes suivantes doublent.Remplacé par le délai de Reprise automatique tant qu’une valeur est enregistrée dans l’interface.
PROVIDER_RECOVERY_MAX_SECONDS3600 (5–86400)Plus longue attente entre deux tentatives. Le Retry-After d’un provider peut l’allonger, jusqu’à 24 heures.Baissez-la pour réessayer plus souvent lors de longues pannes.
PROVIDER_MEMBER_PRIVATE_NETWORKSvideUn provider qu’un membre a ajouté pour lui-même (Réglages › Providers LLM › Providers des membres) ne joint que des adresses publiques : un nom qui se résout vers une adresse de bouclage, privée, link-local, partagée (CGNAT) ou autrement réservée — IPv4 ou IPv6, formes IPv4 mappée et NAT64/6to4 comprises — est refusé à l’enregistrement du provider et à chaque connexion (test, traduction, nouvelles tentatives, soumission, relève et résultats des lots). Le nom est résolu à chaque requête et la connexion va à l’adresse vérifiée, le certificat restant vérifié contre le nom ; les redirections ne sont pas suivies et les variables de proxy sont ignorées. Ces réseaux (CIDR séparés par des virgules, par exemple 192.168.1.40/32) sont tout de même ouverts aux membres. Les providers de l’installation, configurés par un administrateur, ne sont pas concernés : un vLLM ou un Ollama du réseau local continue de fonctionner.Laissez-la vide sauf si des membres doivent joindre un modèle local ; ouvrez le réseau le plus étroit (un hôte : /32), ou mieux, ajoutez ce modèle comme provider de l’installation partagé avec les membres.
PROVIDER_RESPONSE_MAX_MB8 (1–1024)Taille maximale du corps, une fois décompressé, accepté d’un provider pour un appel ordinaire (complétion, liste des modèles, page d’erreur). Au-delà, la connexion est fermée avant l’analyse du JSON et la requête est enregistrée en échec. Les résultats de batch gardent leurs propres plafonds fixes.Ne l’augmenter que pour un modèle dont les réponses légitimes sont plus grosses ; une complétion pèse normalement bien moins de 1 Mo.

Pilote automatique

Le pilote automatique mène un livre lancé de l’import à l’export sans intervention humaine ; voir le pilote automatique. Ces variables sont des valeurs par défaut qu’un administrateur peut remplacer dans Paramètres › Pilote automatique.

VariableValeur par défautEffet
AUTOPILOT_ENABLEDtrueValeur par défaut des nouveaux lancements de livres entiers, depuis l’interface et l’API. Le réglage de pilote automatique propre à un volume, ou "autopilot": false dans un lancement, l’emporte sur elle.
AUTOPILOT_MAX_ROUNDS3 (1–10)Tours de reprise, de relecture finale et d’arbitrage par IA avant que les points encore ouverts soient tranchés.
AUTOPILOT_FALLBACK_PROVIDERSvideProviders (noms ou identifiants, séparés par des virgules) essayés dans l’ordre lorsque le provider du travail est hors service ou échoue sur un passage, après les providers de secours propres au volume.
AUTOPILOT_ESCALATION_PROVIDERvideLe modèle supérieur (nom ou identifiant), réservé aux cas difficiles : un passage qui revient à l’arbitrage IA parce que ses points ont résisté au premier, un passage qu’aucun échelon de l’échelle de récupération n’a pu traduire, et un passage sur lequel le modèle du livre a échoué cinq fois (deux appels au modèle supérieur, puis retour). Aucune étape du livre ne bascule sur lui. Un livre ou une série peut désigner le sien dans Paramètres › Pilote automatique › Modèle supérieur. Vide : ces passages restent sur le modèle du livre. (AUTOPILOT_ESCALATE_AFTER et AUTOPILOT_ESCALATE_WINDOW n’existent plus et sont ignorées.)
AUTOPILOT_OUTAGE_MAX_RETRIES5 (1–100)Attentes d’un provider indisponible avant de passer au provider de secours suivant. S’il n’en reste aucun, le travail se termine en failed.
AUTOPILOT_OUTAGE_MAX_WAIT_SECONDS3600 (0–604800)Plus longue attente totale d’un provider indisponible avant de changer de provider.
AUTOPILOT_GLOSSARY_MIN_CONFIDENCE0.75 (0–1)Fréquence à laquelle le texte narratif du livre doit employer un terme proposé (en mots entiers, titres et table des matières exclus) pour que la proposition soit acceptée automatiquement : aucune occurrence donne 0, une 0,6, deux 0,8, trois ou plus 1. À 0.75, un terme doit être employé au moins deux fois. Cela mesure la fréquence du terme source, non la qualité de la traduction proposée.
AUTOPILOT_IDENTITY_MIN_CONFIDENCE0.8 (0–1)Confiance requise pour un lien d’identité de série proposé (même personnage d’un volume à l’autre) ; en dessous, la proposition est rejetée.
AUTOPILOT_BIBLE_MIN_COVERAGE0.8 (0–1)Couverture requise pour qu’une mise à jour de la Book Bible remplace l’actuelle ; en dessous, la Book Bible est laissée telle quelle.
AUTOPILOT_STALE_MIN_COVERAGE0.5 (0–1)Couverture requise pour qu’un contexte de chapitre rafraîchi remplace un contexte périmé ; en dessous, l’ancien contexte est conservé.
AUTOPILOT_STYLE_MIN_CONFIDENCE0.8 (0–1)Confiance requise pour qu’une valeur de fiche de style proposée à partir du livre, à la fin de son analyse, soit écrite dans un champ ouvert de la fiche du volume ; en dessous, la proposition attend une personne dans l’écran de la fiche de style. Un champ décidé par une personne ou par la série n’est jamais écrasé. Voir pilote automatique.

Modifiez les seuils lorsque le pilote automatique accepte trop (augmentez-les) ou laisse trop de décisions en suspens (baissez-les).

Courriels

Les administrateurs peuvent configurer le transport dans Paramètres → Courriels SMTP sans accès au shell ni redémarrage de l’API et du worker. Les réglages enregistrés remplacent les valeurs d’environnement SMTP_* ci-dessous. L’interrupteur de désactivation explicite arrête à la fois la mise en file et l’envoi ; les messages déjà en file restent dans la boîte d’envoi. Revenir aux variables SMTP supprime le remplacement et applique de nouveau l’environnement.

Le mot de passe est en écriture seule et chiffré avec la SECRET_KEY existante. Laissez son champ vide pour le conserver, ou cochez l’option d’effacement explicite pour le supprimer. Sauvegardez SECRET_KEY avec la base ; après un changement de clé, saisissez de nouveau le mot de passe SMTP. La vérification des certificats TLS ne peut pas être désactivée.

Mettre un courriel de test en file écrit dans la même boîte d’envoi que celle qu’utilisent les notifications et la récupération de mot de passe. Une réponse 202 signifie « mis en file », pas « remis » : le worker doit être en marche. Actualisez la boîte d’envoi pour voir les messages en attente, en cours d’envoi, envoyés et en échec, les tentatives, l’heure du prochain essai et une explication sans danger. Ni le corps, ni le jeton de réinitialisation, ni le contexte, ni la réponse brute du serveur ne sont renvoyés. Un message en échec, une fois le problème réparé, peut être remis en file. Les messages de réinitialisation de mot de passe ne peuvent pas être réessayés ici : demandez un nouveau lien de réinitialisation plutôt que de renvoyer un lien expiré.

Plusieurs workers réservent chaque message de façon atomique avant de le remettre. Un bail de deux minutes est renouvelé toutes les quarante secondes pendant un envoi lent ; aucune session SQL n’est tenue pendant l’échange SMTP. Un worker qui plante laisse une réservation récupérable, et huit tentatives interrompues deviennent un échec visible. Un nouvel essai administratif remet à zéro le budget de tentatives, mais pas la propriété : un nouveau jeton opaque écarte l’ancien expéditeur. Aucun nouvel essai n’est permis tant que le message est sending. La remise est « au moins une fois », pas « exactement une fois » : une acceptation SMTP suivie d’un plantage avant l’acquittement local peut entraîner une nouvelle remise. Les nouveaux essais conservent leur Message-ID, sans supposer que le destinataire élimine les doublons.

Arrêtez les workers de l’ancienne version avant la mise à jour : ils ne reconnaissent pas sending. Arrêtez tous les workers de courriel avant un retour à une version antérieure. Ce retour remet les messages en cours d’envoi dans la file d’attente (ou en échec si leur budget de tentatives était épuisé) avant de supprimer la propriété des baux ; il ne supprime aucun courriel. Un message déjà accepté par SMTP peut donc être envoyé de nouveau après le retour en arrière.

Les pièces jointes sont de nouveau comparées à DELIVERY_MAX_MB juste avant l’encodage MIME, car un livre peut grossir après sa mise en file. Ce contrôle évite de gonfler en base64 une charge trop volumineuse ; il ne borne pas à lui seul la mémoire utilisée par le constructeur d’EPUB. Les pièces jointes trop volumineuses apparaissent comme des échecs.

Libris signale quatre choses à un lecteur, et seulement quatre : un livre est terminé, un travail s’est arrêté et l’attend, le quota de mots de la licence s’épuise, et la licence n’a pas pu être renouvelée. Tout le reste, il le fait en silence. Un message part lorsque quelque chose s’est terminé ou est sur le point de s’arrêter, jamais lorsque quelque chose a simplement commencé — personne ne veut un courriel par passage, tout le monde en veut un quand le livre est fini.

Le silence est la règle par défaut. Un compte sans adresse ne reçoit rien, et une installation mise à jour vers cette version démarre silencieuse : un lecteur doit indiquer une adresse, dans Mon compte › Notifications, et peut désactiver chaque type de message et choisir le français ou l’anglais. Rien n’est envoyé depuis une requête non plus : un message est écrit dans email_outbox dans la même transaction que ce qu’il annonce, et le worker vide la file en attendant une minute, puis deux, puis quatre, jusqu’à six heures, et abandonne après huit tentatives.

L’envoi est authentifié auprès d’un vrai serveur de courriel. Un relais anonyme est refusé par la moitié du monde, et une notification qui atterrit dans les indésirables est une notification qui n’a pas été envoyée.

VariableValeur par défautEffet
SMTP_HOST(vide)Le serveur de courriel. Vide : rien n’est mis en file et rien n’est envoyé, ce que souhaite un poste de travail.
SMTP_PORT465465 est en TLS implicite ; 587 exige SMTP_STARTTLS=true.
SMTP_STARTTLSfalseChiffrer une connexion en clair au lieu de démarrer chiffré.
SMTP_USERNAME, SMTP_PASSWORD(vide)La boîte aux lettres qui envoie. Sans nom d’utilisateur, aucune authentification n’a lieu, ce que la plupart des serveurs refusent.
SMTP_SENDER(vide)Libris <notifications@example.com>, ou simplement l’adresse. Vide équivaut à aucun courriel configuré.
SMTP_TIMEOUT20 (1–300)Secondes que peut prendre une remise.
PUBLIC_URL(vide)L’adresse vers laquelle les messages renvoient les lecteurs. Vide : ils ne portent aucun lien.
DELIVERY_MAX_MB20 (1–100)Un livre terminé qui dépasse cette taille est annoncé avec son adresse au lieu d’être joint : les serveurs de courriel refusent les grosses pièces jointes, et un refus ne remet rien.
SOURCE_WATCH_HOSTS(vide)Hôtes sur lesquels un volume peut suivre un flux, séparés par des virgules (*.example.org accepté). Vide : aucune source n’est surveillée. Une adresse qui se résout vers un réseau privé est refusée, comme pour un webhook.
DELIVERY_DIR(vide)Dossier de publication par défaut, relatif à DATA_DIR sauf s’il est absolu. Le worker y écrit les livres terminés au moyen d’une file de nouvelles tentatives durable. Les paramètres de l’installation peuvent le remplacer ou le désactiver. Calibre-Web exige une étape d’import distincte, pas une copie à côté de sa base de données.

Les deux modes TLS vérifient le certificat du serveur et son nom d’hôte avant l’authentification ou l’envoi du courriel. Pour une autorité de certification privée, installez sa chaîne de confiance dans le magasin de certificats de confiance du conteneur. Un certificat auto-signé, expiré ou ne correspondant pas est une erreur à corriger sur le serveur de courriel ou dans le magasin de confiance, pas une raison de désactiver la vérification. Un passage à STARTTLS qui échoue ne se replie jamais sur l’envoi des identifiants en clair.

L’endroit où sont envoyés les livres terminés d’un lecteur se règle par compte, dans Mon compte › Notifications : une adresse à part, parce qu’une adresse Kindle n’est pas une boîte aux lettres que quelqu’un lit. La renseigner est le seul consentement qui existe — il n’y a pas de type à désactiver, et une adresse vide n’envoie rien.

Licence

Ce que vend une licence, ce sont des comptes et des machines. Les comptes sont les personnes qui peuvent se connecter à l’installation. La création d’un compte au-delà de ce nombre est refusée — et seulement elle : la connexion, le travail, la lecture et l’export ne sont jamais touchés, car une licence qui se réduit ne doit empêcher personne d’accéder à l’installation dans laquelle il travaille. Paramètres › Utilisateurs indique combien de places sont occupées sur combien. Les machines sont les installations sur lesquelles la clé peut être activée en même temps : 2 pour l’essai, 3 pour Personnel, 5 pour Studio, 10 pour Pro. Quand elles sont toutes prises, activer une machine de plus libère la plus ancienne, à condition qu’elle occupe sa place depuis au moins 7 jours ; sinon l’activation est refusée (move_too_soon). Libérer cette machine dans Paramètres › Licence rend une place aussitôt — c’est ce qu’il faut faire avant un déménagement.

Les mots du cycle de quota — ou du mois civil avec un serveur de licences qui ne connaît pas les cycles — parviennent au serveur de licences avec le battement de cœur toutes les LICENCE_HEARTBEAT_HOURS, et désormais aussi à la fin de chaque travail — un appel par travail, jamais par passage, si bien que le chiffre que lit un éditeur a au pire un livre de retard, et non une heure.

Le quota se renouvelle à la date anniversaire de l’abonnement, pas le premier du mois : une licence vendue le 12 repart le 12 de chaque mois (une licence commencée le 31 repart le dernier jour des mois plus courts). Le serveur de licences nomme le cycle dans le certificat — ses bornes, l’allocation de la formule et ce que le cycle précédent a dépassé, qu’il déduit de celui-ci, une fois. Libris compte ses mots dans ce cycle, rapporte les derniers mots d’un cycle terminé à ce cycle, et affiche la date du nouveau quota dans Paramètres › Licence. Avec un serveur de licences qui ne connaît pas les cycles, rien ne change : mois civil, sans report.

Un livre est compté dès qu’il est ajouté, pas au fil de sa traduction : tous ses mots, au moment de l’import, même s’il est supprimé ensuite sans avoir été traduit. Cela vaut pour tous les chemins (assistant d’import, API d’automatisation, MCP, sources suivies, restauration d’une archive, seconde langue) et pour chaque chapitre ajouté ou remplacé ensuite (seulement ses nouveaux passages). Un livre est accepté tant que ses mots tiennent dans ce qui reste du cycle plus la marge LICENCE_QUOTA_OVERRUN_WORDS ; au-delà, il est refusé en entier (402 licence_quota_insufficient) et rien n’est compté. Le traduire, le relancer ou refaire un passage ne coûte ensuite plus rien, même une fois le quota atteint ; seule la comparaison de providers, qui appelle les modèles en plus, reste comptée à part. Les livres ajoutés avant cette règle (0.16.4 et avant) restent comptés comme avant, passage par passage au fil de leur traduction : rien n’est recompté à la mise à jour, le compteur repart du nombre qu’il avait.

Libris est un logiciel sous licence. Une installation s’active une fois avec la clé achetée par son lecteur, dans Paramètres › Licence, puis fonctionne grâce à un certificat que le serveur de licences signe et renouvelle toutes les LICENCE_HEARTBEAT_HOURS (toutes les heures par défaut). C’est le certificat qui décide — ni un réglage ni la réponse qui l’a apporté — et il vaut trois jours (72 heures, fixées par le serveur de licences) : une panne du serveur de licences n’interrompt donc jamais la lecture de personne ; une révocation arrête l’installation au prochain renouvellement qu’elle parvient à effectuer. Ce qui est refusé sans licence valide, c’est le travail qui coûte des mots — un lancement, et chaque appel au modèle d’un travail déjà en cours, qui se met en pause avec stop_reason = licence et reprend dès que la licence autorise de nouveau le travail. Tout ce qui a déjà été produit reste lisible, exportable et supprimable : un lecteur bloqué ne perd jamais un livre.

Une révocation est le seul type de réponse qui retire le certificat. Quatre refus arrêtent une installation — la licence est révoquée, suspendue, expirée, ou le serveur ne connaît pas la clé — et toute autre réponse du serveur de licences, y compris une requête qu’il n’a pas comprise, compte comme une panne : le certificat détenu garde ses trois jours, la raison est affichée dans Paramètres › Licence, et le renouvellement suivant réessaie. Une version de Libris plus récente que le serveur de licences qu’elle appelle ne doit jamais pouvoir arrêter un lecteur titulaire d’une licence.

Ce que signe cette installation. À sa première activation, Libris tire une paire Ed25519, garde la moitié privée chiffrée avec SECRET_KEY à côté de la clé de licence, et envoie la moitié publique. Chaque rapport ultérieur porte un compteur, l’horloge de cette machine et une signature couvrant l’ensemble du rapport, de sorte que ce qu’enregistre le serveur de licences ne puisse être ni falsifié par un tiers ni rejoué. Rien à configurer : une installation qui ne détient pas encore de paire en enregistre une à sa prochaine activation, et une installation dont le serveur ne connaît pas la clé se réactive d’elle-même plutôt que d’attendre quelqu’un. Un lecteur qui modifie sa propre copie peut évidemment lire cette clé dans sa propre base — cela rend un rapport digne de confiance face à un tiers, pas face à son propriétaire.

L’empreinte envoyée au serveur de licences a deux moitiés : un hachage du machine-id de l’hôte, qui change quand le lecteur change de machine et survit à un redéploiement, et un identifiant que Libris a tiré à son premier démarrage, qui suit une sauvegarde restaurée. Un conteneur doit recevoir le machine-id de l’hôte — /etc/machine-id:/etc/machine-id:ro, comme le fait le fichier Compose — faute de quoi chaque recréation ressemble à un déménagement vers une autre machine et Libris se rabat sur une empreinte à lui, plus faible.

VariableValeur par défautEffet
LICENCE_SERVER_URLhttps://sub.libris-translate.comAdresse où l’installation s’active et se renouvelle. Elle peut être modifiée : un certificat n’est accepté que s’il a été signé par la clé de publication, si bien qu’un autre serveur n’accorde rien.
LICENCE_HEARTBEAT_HOURS1 (1–48)Heures entre deux renouvellements, effectués par le seul worker pour qu’une installation compte pour une, où que tourne son API. Gardez-la bien en dessous des trois jours que dure un certificat. Une heure maintient ce qu’affiche le serveur de licences proche de ce qui se passe réellement ; le délai de grâce que vous laisse une panne est la durée du certificat lui-même, 72 heures fixées par le serveur de licences, et ne varie pas avec elle.
LICENCE_QUOTA_OVERRUN_WORDS20000 (0–1000000)La marge au-delà du quota de la période (le cycle de quota de la licence, ancré sur la date d’abonnement, ou le mois civil avec un serveur de licences plus ancien) : un livre est ajouté tant que ses mots tiennent dans ce qui reste plus cette marge, et ses mots sont comptés aussitôt. Un livre déjà compté se traduit même au-delà du quota ; un livre ajouté avant que les mots soient comptés à l’ajout est terminé dans cette marge plutôt que laissé à moitié. Le dépassement est déduit du quota du cycle suivant par le serveur de licences.

Ce que donne une formule

Le certificat porte ce qu’accorde la formule de la licence, et Libris l’applique tel qu’il figure dans le certificat, jamais d’après un réglage :

Dans le certificatCe qu’en fait Libris
accountsLa création d’un compte actif au-delà de ce nombre est refusée ; les comptes existants continuent de fonctionner.
instances (machines)Appliqué par le serveur de licences à l’activation. Quand toutes les machines de la formule sont prises, activer une machine de plus libère la plus ancienne, à condition qu’elle occupe sa place depuis au moins sept jours ; sinon l’activation est refusée (move_too_soon). Libérer cette machine dans Paramètres › Licence rend une place aussitôt.
automation_apiJetons d’API, /api/v1 et serveur MCP (/mcp). Sans ce droit, ils répondent 402 automation_not_licensed ; les jetons existants sont conservés, suspendus, et refonctionnent dès que la licence accorde le droit.
sharingInviter des membres sur un livre et les liens de relecture. Sans ce droit, un nouveau membre ou un nouveau lien est refusé avec 402 sharing_not_licensed ; les membres déjà invités gardent leur accès, les liens de relecture existants sont suspendus sans être supprimés.
quotaLes mots du cycle (voir plus haut) ; 0 signifie sans limite.

Paramètres › Licence affiche la formule, les mots du cycle et, pour chaque droit, s’il est compris. L’API d’automatisation et le partage sont compris dans les formules Studio et Pro, pas dans l’essai ni dans la formule Personnelle. Le certificat d’un serveur de licences antérieur à ces droits ne les nomme pas et garde ce qu’il a toujours permis. Les mots, machines, comptes et prix de chaque formule, ainsi que l’essai, sont sur libris-translate.com : le serveur de licences les accorde, le site les publie, et cette documentation n’en répète pas les chiffres.

Certificat perpétuel (fin d’activité de l’éditeur)

Si l’éditeur de Libris cesse son activité, le serveur de licences s’arrête. Avant cela, chaque licence valide reçoit par courriel un certificat perpétuel (dev/libris-licence#29) : signé avec la même clé que le certificat horaire, sans date d’échéance, sans machine et sans limite de mots (quota.words = 0). Il est lié à la clé de licence : son key_sha256 est le SHA-256 de la clé telle que l’écrit le serveur de licences (LIB-XXXX-XXXX-XXXX-XXXX) ; le certificat seul ne vaut donc rien, et avec la clé il fonctionne sur toute installation — réinstallation, nouvelle machine ou sauvegarde restaurée comprises.

Installez-le une fois, en administrateur :

  • Paramètres › Licence › Certificat perpétuel : collez le certificat (les retours à la ligne et l’indentation du courriel n’ont pas d’importance) ou choisissez le fichier .libris-certificate, et donnez la clé de licence si l’installation ne la détient pas déjà — dans tous les cas, avec ou sans tirets ;
  • ou en ligne de commande, dans le conteneur de l’API : docker compose exec -T api python -m app.licence.perpetual < licence.libris-certificate (la clé doit déjà être enregistrée, ou exportée dans LIBRIS_LICENCE_KEY et transmise avec docker compose exec -T -e LIBRIS_LICENCE_KEY api … ; code 0 installé, 1 refusé) ;
  • ou par l’API : POST /api/settings/licence/certificate avec {"certificate": "…", "key": "…"} (administrateurs ; 422 avec invalid_certificate, key_required ou key_mismatch).

L’installation est inscrite au journal (licence=perpetual_installed). Dès lors, Libris n’appelle plus jamais le serveur de licences — ni renouvellement, ni rapport, ni libération — et aucune réponse de qui que ce soit à son adresse ne peut retirer le certificat ; Paramètres › Licence affiche « Licence perpétuelle (fin d’activité de l’éditeur) », sans échéance et sans bouton de renouvellement. Les mots de chaque mois restent comptés localement, pour les statistiques, sans aucune limite. Les comptes, l’API d’automatisation et le partage suivent les features du certificat exactement comme avec le certificat horaire ; instances n’est plus vérifiable et reste indicatif. Activer une autre clé reste possible et remplace le certificat perpétuel — conservez le courriel avec la clé.

Une version de Libris publiée avant ce changement refuse ce certificat : mettez à jour tant que le registre est encore ouvert (six mois après l’envoi des certificats, le courriel donne la date). Le certificat horaire (v: 1) ne change pas : sans date d’échéance, il reste un certificat expiré.

Devise

L’installation compte dans une seule devise, choisie dans Paramètres › Budgets : les prix des providers y sont saisis, tous les coûts calculés à partir d’eux y sont exprimés, et chaque montant affiché par l’interface porte son symbole. La changer indique ce que représentent les nombres enregistrés — cela ne les convertit pas.

Une grille tarifaire dans une autre devise peut être saisie telle quelle : les champs de prix portent leur propre devise, et les deux prix sont convertis une fois, à l’enregistrement, aux taux de référence quotidiens de la Banque centrale européenne. Le worker les récupère quelques fois par jour (sans compte, sans clé, sans réglage), les conserve avec la date qu’ils portent, et ne s’en sert pour rien d’autre. Une installation sans accès sortant ne les récupère jamais : sa propre devise est alors la seule proposée, et rien d’autre ne change.

Budgets de coût

Plafonds de dépenses, dans la devise de l’installation ; voir le guide d’utilisation et la référence de l’API. Un livre peut avoir son propre plafond, et un jeton d’API le sien ; ces variables sont les valeurs par défaut qu’un administrateur peut remplacer dans Paramètres › Budgets.

VariableValeur par défautEffet
BUDGET_DEFAULT_BOOK0Plafond d’un livre qui n’en a pas en propre, couvrant tout ce que le livre a coûté. 0 : pas de plafond par défaut.
BUDGET_SWITCH_THRESHOLD0.9 (0.5–1)Part d’un plafond à partir de laquelle un travail en cours passe à un provider de secours moins cher, ou se met en pause (budget_exceeded) s’il n’y en a pas (un travail qui a déjà basculé continue jusqu’au plafond). Au plafond lui-même, seul un provider sans prix peut continuer.
BUDGET_ON_ESTIMATEwarnCe que fait un lancement lorsque son estimation dépasse ce qui reste d’un plafond : warn (le travail démarre, l’avertissement est conservé dans son rapport) ou refuse. Un plafond déjà atteint refuse toujours.

Plage de travail et plafond du jour

Une file équitable sait ordonner le travail ; elle ne savait pas attendre. Les modèles sont moins chers et moins sollicités la nuit, l’électricité souvent aussi, et quelqu’un qui traduit un feuilleton de cinq cents chapitres préfère que cela tourne entre une heure et sept heures plutôt que pendant qu’il utilise la machine. Un budget par livre n’arrête par ailleurs qu’un livre, et rien n’empêchait une installation de dépenser l’équivalent d’un mois en un après-midi parce que quatre volumes avaient été lancés ensemble.

Les deux se trouvent dans Paramètres › Budgets, dans la carte Plage de travail et plafond du jour ; il n’y a pas de variable d’environnement, car ce sont des décisions que l’on change au fil des saisons plutôt qu’à l’installation. Désactivés par défaut.

  • La plage se lit sur l’horloge locale du serveur. Une plage qui franchit minuit est le cas ordinaire : 01:00 à 07:00 désigne la nuit. Une plage dont les deux bornes sont égales, ou illisible, n’arrête jamais rien — un réglage erroné ne doit pas être une raison de refuser du travail.
  • Le plafond est ce que la journée peut coûter, tous livres confondus, dans la devise comptable. 0 : aucun.

Lors d’un changement d’heure, la prochaine ouverture est un instant réel : l’heure répétée de l’automne peut ouvrir la plage une seconde fois ; une ouverture qui tombe dans l’heure sautée au printemps est avancée à la première minute existante à l’intérieur de la plage. Si toute la plage est sautée, le travail attend l’ouverture du lendemain. Le plafond compte la consommation de jetons au prix par million enregistré pour chaque appel, depuis minuit heure locale, et non la somme des libellés de prix du provider. Les prix importés sont déjà exprimés dans la devise comptable unique de l’installation ; aucune conversion au taux de change en temps réel n’a lieu ici.

Ni l’une ni l’autre n’interrompt quoi que ce soit brutalement. En dehors de la plage, ou au-delà du plafond, la file ne prend plus rien de nouveau, et un travail déjà en cours est différé à son prochain appel au modèle : il repasse en waiting avec la prochaine ouverture comme next_attempt, le mécanisme qu’utilisent déjà les nouvelles tentatives, si bien qu’il redémarre de lui-même sans qu’il faille cliquer sur quoi que ce soit. Un travail mis en pause par la garde de licence a besoin d’une personne ; celui-ci non, car rien ne va mal. Sa raison est window, et son message dit quand il reprendra — « en pause » sans heure ressemble à une panne.

API d’automatisation

Limites de l’API d’automatisation (/api/v1), utilisée par les scripts et d’autres applications au moyen de jetons d’API. Voir la référence de l’API.

VariableValeur par défautEffetQuand la modifier
API_MAX_PAYLOAD_MBvide (utilise MAX_UPLOAD_MB)Plus grand corps de requête (JSON, EPUB ou fichiers texte) accepté avec un jeton Bearer.Lorsque les intégrations envoient des livres plus gros que ceux que les personnes envoient elles-mêmes.
API_MAX_CHAPTERS2000 (1–100000)Chapitres dans une requête.Pour de très longs livres envoyés en JSON.
API_RATE_LIMIT_PER_MINUTE120 (0–100000)Appels par jeton et par minute, comptés dans chaque processus d’API. 0 supprime la limite.Pour brider ou libérer une intégration très active.
API_RESULT_MAX_WAIT_SECONDS60 (0–600)Plus long ?wait= qu’un client peut demander lorsqu’il interroge un résultat.Pour autoriser une interrogation longue (long polling) plus longue.
API_REQUEST_STALL_MINUTES360Une demande dont le travail reste en pause, bloqué ou en attente aussi longtemps échoue, avec la raison.Plus long si votre provider a de longues interruptions planifiées.
API_REQUEST_MAX_HOURS168 (1–8760)Une demande toujours inachevée au bout de cette durée échoue. Aucune demande ne reste en cours indéfiniment.Plus long pour de très gros livres sur des providers lents.
DELIVERY_REPAIR_ATTEMPTS3 (1–10)Tours de réparation automatique lorsqu’un EPUB livré échoue à EPUBCheck, avant que la demande échoue.Rarement.

File d’attente équitable

Les travaux ne sont pas démarrés du plus ancien au plus récent : le worker les prend par priorité, puis en commençant par le compte qui a le moins de travaux en cours, à tour de rôle entre les comptes (voir l’architecture (en anglais)). Ces variables sont des valeurs par défaut qu’un administrateur peut remplacer dans Paramètres › File d’attente, où des quotas peuvent aussi être définis par compte.

VariableValeur par défautEffetQuand la modifier
QUEUE_MAX_RUNNING_PER_ACCOUNT0 (0–1000)Travaux d’un même compte (le propriétaire des livres) en cours en même temps. Les suivants attendent leur tour. 0 : aucune limite autre que la capacité des providers.Sur une installation partagée, pour qu’un compte ne puisse pas prendre toutes les places des providers.
QUEUE_MAX_QUEUED_PER_ACCOUNT0 (0–100000)Travaux et demandes d’automatisation d’un même compte en attente de démarrage. Au-delà, un nouveau lancement ou une nouvelle demande est refusé avec HTTP 429 (queue_full). 0 : aucune limite.Pour empêcher une intégration de remplir la file.
QUEUE_MAX_WORDS_PER_ACCOUNT0 (0–1000000000)Mots par mois civil (UTC) qu’un compte peut traduire sur le quota de la licence — le mois civil, pas le cycle de quota de la licence — mots source, comptés à l’ajout du livre et imputés à son propriétaire. Au-delà (marge LICENCE_QUOTA_OVERRUN_WORDS comprise), un nouveau livre est refusé ; un livre déjà compté se traduit toujours. 0 : pas de limite propre.Sur une installation partagée, pour répartir le mois entre les membres.
QUEUE_PRIORITY_AGING_MINUTES60 (0–10080)Un travail en attente monte d’un niveau de priorité chaque fois qu’il a attendu aussi longtemps, si bien qu’un travail de faible priorité n’est jamais affamé. 0 : les priorités ne changent jamais d’elles-mêmes.Baissez-la lorsqu’un travail de faible priorité ne doit pas attendre longtemps derrière un flot de travaux de haute priorité.

Webhooks

Les webhooks préviennent une intégration lorsqu’une demande d’API se termine. Ils sont désactivés tant qu’aucun hôte n’est autorisé. Ces variables sont des valeurs par défaut qu’un administrateur peut remplacer dans Paramètres › API d’automatisation.

VariableValeur par défautEffet
API_WEBHOOK_HOSTSvide (webhooks refusés)Hôtes qu’une callback_url peut désigner, séparés par des virgules. *.example.org autorise tous les sous-domaines de example.org (pas example.org lui-même).
API_WEBHOOK_PRIVATE_NETWORKSvideRéseaux privés (CIDR, par exemple 10.0.0.0/8) que les rappels peuvent tout de même atteindre. Par défaut, un rappel qui se résout vers une adresse privée, de bouclage ou réservée est refusé.
API_WEBHOOK_SECRETvideSecret de signature HMAC global, d’au moins 32 caractères. Le secret de webhook propre à un jeton l’emporte sur lui.
API_WEBHOOK_MAX_ATTEMPTS6 (1–20)Tentatives de remise par demande.
API_WEBHOOK_TIMEOUT_SECONDS10 (1–60)Délai d’expiration de chaque appel.

Connexions Nextcloud / WebDAV

Chaque compte peut enregistrer des connexions vers Nextcloud, ownCloud, un NAS ou tout serveur WebDAV (Mon compte › Connexions Nextcloud / WebDAV), pour y importer des sources et y envoyer les livres terminés. Le connecteur est un client HTTP sortant dirigé vers une adresse que l’on saisit ; il est donc désactivé tant qu’un administrateur n’a pas listé les serveurs qu’il peut joindre — comme avec SOURCE_WATCH_HOSTS, une installation mise à jour vers cette version ne joint rien. Ce sont des réglages de l’installation (environnement uniquement).

VariableValeur par défautEffet
WEBDAV_HOSTSvide (connecteur absent)Serveurs auxquels un compte peut se connecter, séparés par des virgules. *.example.org autorise tous les sous-domaines de example.org (pas example.org lui-même).
WEBDAV_PRIVATE_NETWORKSvideRéseaux privés (CIDR, par exemple 192.168.1.0/24) vers lesquels un serveur listé peut se résoudre — un NAS du réseau local. Ailleurs, un nom qui se résout vers une adresse privée, de bouclage ou réservée est refusé. Le HTTP simple n’est accepté qu’à l’intérieur de ces réseaux ; partout ailleurs, HTTPS est exigé et son certificat vérifié.
WEBDAV_TIMEOUT_SECONDS30 (1–300)Délai d’expiration de chaque appel à un serveur WebDAV.

Quoi que ces réglages autorisent, le client conserve les règles des webhooks et des sources surveillées : le nom est résolu une fois par appel et la connexion va à l’adresse vérifiée (pas de DNS rebinding), les variables de proxy du serveur sont ignorées, une redirection n’est suivie que vers le même schéma, le même hôte et le même port (jamais ailleurs, pour que les identifiants ne quittent jamais le serveur pour lequel ils ont été saisis), et ce qui est lu est borné — MAX_UPLOAD_MB pour un fichier, comme pour un fichier envoyé depuis le navigateur, quelques mégaoctets pour la liste d’un dossier. Les mots de passe sont chiffrés avec SECRET_KEY comme les clés des providers, jamais renvoyés par l’API et jamais journalisés ; après un changement de SECRET_KEY, l’interface les redemande. L’envoi d’un livre est mis en file pour le worker, avec les nouvelles tentatives de la publication en bibliothèque ; un dossier de destination qui n’existe pas est créé (MKCOL), seulement à l’intérieur de l’adresse de la connexion. Une connexion peut aussi recevoir automatiquement chaque livre terminé de son compte (option de la connexion, désactivée par défaut) : rien à régler sur l’installation au-delà de WEBDAV_HOSTS.

Mémoire et recherche web

VariableValeur par défautEffetQuand la modifier
OPENVIKING_URLvideAdresse d’un service de mémoire OpenViking externe. Vide : les livres utilisent la mémoire interne de Libris.Seulement si vous exploitez OpenViking ; voir OpenViking. Peut être défini dans Paramètres › Mémoire · OpenViking à la place.
OPENVIKING_API_KEYvideClé pour OpenViking.Avec OPENVIKING_URL.
OPENVIKING_ROOT_URIviking://resources/epub-translatorRacine sous laquelle Libris publie ses ressources dans OpenViking.Pour partager un même serveur OpenViking entre plusieurs installations de Libris.
OPENVIKING_CLEANUP_ON_DELETEfalsetrue : supprimer un volume ou une série supprime aussi ses documents OpenViking ; le worker s’en charge après la suppression, avec de nouvelles tentatives (voir le nettoyage).Pour récupérer de l’espace sur le serveur OpenViking. Peut être basculé dans Paramètres › Mémoire · OpenViking à la place.
MEMORY_CATALOG_INTERVAL_SECONDS60 (10–86400)Fréquence à laquelle le worker rafraîchit le catalogue des livres publiés dans la mémoire externe.Plus élevée pour réduire la charge sur OpenViking.
SEARXNG_URLvide (recherche désactivée)Instance SearXNG utilisée pour les recherches terminologiques pendant la relecture finale. La définir active la recherche.Pour permettre à la relecture finale de chercher des termes sur le web. Les termes recherchés sont envoyés à votre instance et à ses moteurs en amont.

Pont Codex

Utilisé uniquement par le provider facultatif Codex · compte ChatGPT ; voir Codex.

VariableValeur par défautEffet
CODEX_BRIDGE_TOKENgénéréSecret privé entre l’API et le conteneur du pont (au moins 32 caractères, sinon le pont refuse de démarrer). python3 scripts/enable_codex.py l’ajoute à un .env plus ancien.
CODEX_BRIDGE_URLhttp://codex:8092Adresse du pont sur le réseau Compose.

Juge qualité

Un modèle d’un autre provider qui relit chaque passage terminé et fait corriger ses erreurs ; voir Juge qualité. Paramètres › Pilote automatique et les réglages d’un livre remplacent la variable.

VariableValeur par défautEffet
QUALITY_JUDGE_PROVIDERvideNom ou identifiant du provider qui juge (Codex, API compatible OpenAI ou Anthropic). Vide : pas de juge.
QUALITY_REWORK_SHARE0.25 (0–1)Part maximale des passages d’un travail corrigés après le juge ; 0 : jugés, jamais corrigés.

Ressources du serveur

VariableValeur par défautEffetQuand la modifier
EVENT_STREAMS_PER_USER4 (1–100)Connexions de progression en direct (une par onglet de navigateur ouvert sur un livre) par compte. Au-delà, l’API répond 429 et demande de fermer des onglets.Si des personnes gardent légitimement de nombreux livres ouverts.
EVENT_STREAMS_TOTAL100 (1–10000)Connexions de progression en direct pour l’ensemble du processus d’API.Sur les instances comptant de nombreux utilisateurs simultanés.
PREVIEW_CACHE_MB64 (0–4096)Mémoire réservée aux livres décompressés derrière les aperçus de chapitres récents. 0 désactive le cache.Plus bas sur les petites machines, plus haut si les aperçus de gros livres sont lents.
EPUBCHECK_CONCURRENCY2 (1–16)Validations EPUBCheck exécutées simultanément dans chaque processus (un processus Java chacune).Plus haut sur les machines disposant de cœurs et de mémoire en réserve.
EPUBCHECK_MAX_HEAP_MB1024 (128–16384)Plafond de mémoire de chaque exécution d’EPUBCheck.Plus haut si la validation de très gros livres échoue ; plus bas sur les petites machines.

Conservation des données

Le worker nettoie les données de diagnostic une fois au démarrage, puis toutes les heures. 0 désactive une règle. Ce que conserve chaque règle, et comment le mesurer avant de l’appliquer, est expliqué dans l’exploitation (en anglais).

VariableValeur par défautCe qu’elle supprime
RETENTION_REQUEST_BODIES_DAYS30Prompt, réponse brute et trace de contexte des requêtes au modèle terminées plus anciennes que cela. La ligne de la requête, les jetons, le coût et la réponse en cache restent.
RETENTION_REQUEST_ROWS_DAYS0 (conserver)Lignes de requêtes entières plus anciennes que cela, une fois comptées dans les totaux d’utilisation quotidiens. Les statistiques restent justes ; le cache des réponses et l’inspecteur de requêtes perdent ces lignes. 180 est une valeur raisonnable.
RETENTION_EVENTS_DAYS7Événements de progression plus anciens que cela, en gardant toujours les 500 derniers de chaque livre.
RETENTION_OUTBOX_SENT_DAYS7Mises à jour OpenViking déjà remises.
RETENTION_BIBLE_REVISIONS20Révisions automatiques de la Book Bible au-delà des 20 plus récentes par livre. Les révisions humaines sont toujours conservées.
RETENTION_JOB_STATE_DAYS30État de reprise par passage des travaux terminés, en échec ou annulés depuis plus longtemps. Les résultats de la relecture finale sont conservés.
RETENTION_RESULTS_DAYS30Fichiers de résultat des demandes d’automatisation terminées depuis plus longtemps. La demande et son rapport restent ; redemander le résultat le reconstruit.

Réglages modifiés dans l’interface

Les administrateurs peuvent modifier les réglages suivants sans rien redémarrer, depuis Paramètres dans l’interface web (ou la route d’API correspondante, avec une session administrateur). La nouvelle valeur s’applique à la prochaine décision que prend le worker.

Page des paramètresRoute d’APIRemplace
Pilote automatiqueGET, PUT, DELETE /api/settings/autopilotToutes les variables AUTOPILOT_*, et QUALITY_JUDGE_PROVIDER
API d’automatisation (partie webhooks)GET, PUT, DELETE /api/settings/webhooksToutes les variables API_WEBHOOK_*
BudgetsGET, PUT, DELETE /api/settings/budgetToutes les variables BUDGET_*
Reprise automatiqueGET, PUT, DELETE /api/settings/recoveryPROVIDER_RECOVERY_BASE_SECONDS (5–3600 secondes). PROVIDER_RECOVERY_MAX_SECONDS continue de s’appliquer.
File d’attenteGET, PUT, DELETE /api/settings/queueToutes les variables QUEUE_*, plus des quotas et un plafond de priorité par compte qui n’ont pas de variable
Courriels SMTPGET, PUT, DELETE /api/settings/mail, POST /api/settings/mail/testValeurs par défaut SMTP_* ; une désactivation explicite enregistrée désactive aussi l’envoi. Les routes de l’inspecteur et des nouvelles tentatives sont décrites dans l’administration SMTP.
Mémoire · OpenVikingGET, PUT /api/settings/memory, POST /api/settings/memory/testOPENVIKING_URL, OPENVIKING_API_KEY, OPENVIKING_ROOT_URI, plus des options de recherche, des budgets, un score minimal, un délai d’expiration et un mode d’authentification qui n’ont pas de variable
Mémoire · OpenViking (carte Nettoyage d’OpenViking)GET, PUT, DELETE /api/settings/memory/cleanupOPENVIKING_CLEANUP_ON_DELETE
SearXNGGET, PUT /api/settings/searxng, POST /api/settings/searxng/testSEARXNG_URL, avec un interrupteur marche/arrêt distinct

Les autres pages de Paramètres (Providers LLM, Prompts, Utilisateurs, Jetons d’API) contiennent des données qui n’existent que dans la base ; elles n’ont pas d’équivalent dans l’environnement.

Quelle valeur l’emporte

De la plus forte à la plus faible :

  1. Le lancement ou la demande elle-même, par exemple "autopilot": false, "final_review": false, analysis_mode ou threads dans un lancement ou une requête d’API.
  2. Les réglages propres au volume : son interrupteur de pilote automatique, ses providers de secours, sa taille de passage, son mode de relecture, son mode d’analyse, le nombre de passages traités à la fois et son budget de coût.
  3. Une valeur enregistrée dans Paramètres.
  4. La variable d’environnement dans .env.
  5. La valeur par défaut intégrée indiquée sur cette page.

Détails par page :

  • Pilote automatique, Budgets et webhooks affichent les valeurs effectives à côté des valeurs de l’environnement. Revenir aux valeurs de l’environnement (DELETE) oublie tout ce qui a été enregistré sur cette page. Les providers de secours sont enregistrés sous forme d’identifiants de providers ; un nom inconnu est refusé, et un provider supprimé par la suite est ignoré.
  • Le secret de webhook global saisi dans l’interface est enregistré chiffré avec SECRET_KEY et n’est plus jamais affiché. Il l’emporte sur API_WEBHOOK_SECRET ; Oublier le secret enregistré ici revient à la variable. Si SECRET_KEY a changé et que le secret enregistré ne peut pas être lu, la variable est utilisée.
  • Reprise automatique affiche le délai en vigueur, la valeur de PROVIDER_RECOVERY_BASE_SECONDS et indique si le délai a été enregistré ici (badge Délai enregistré ici ou Délai de l’environnement). Revenir au délai de l’environnement (DELETE) oublie le délai enregistré ; la variable s’applique de nouveau aux tentatives suivantes.
  • File d’attente affiche les valeurs en vigueur à côté des valeurs de l’environnement. Les lignes par compte remplacent les quotas de l’installation pour un compte (vide : la valeur de l’installation ; 0 : aucune limite pour ce compte) et peuvent l’autoriser à demander la priorité Élevée, sinon réservée aux administrateurs. Un jeton d’API peut avoir ses propres limites, plus basses (voir les jetons d’API). Revenir aux valeurs de l’environnement (DELETE) oublie la page, lignes par compte comprises.
  • Mémoire · OpenViking remplace l’environnement champ par champ. Une clé enregistrée là est chiffrée avec SECRET_KEY ; si elle ne peut plus être lue, la recherche OpenViking est désactivée et la traduction continue avec la mémoire interne.
  • Nettoyage d’OpenViking affiche l’interrupteur en vigueur, la valeur de OPENVIKING_CLEANUP_ON_DELETE et indique si l’interrupteur a été enregistré ici. Revenir à la valeur de l’environnement (DELETE) l’oublie. L’interrupteur s’applique aux suppressions suivantes ; les nettoyages déjà en file s’exécutent quand même. Les compteurs de blocages couvrent toute la file ; un administrateur peut retirer un nettoyage en attente après un changement de racine sans supprimer ses documents. L’analyse quotidienne indépendante des orphelins est désactivée par défaut et ne supprime jamais rien. Voir le nettoyage d’OpenViking.
  • SearXNG remplace entièrement l’environnement une fois enregistré : l’URL et l’interrupteur enregistrés sont utilisés, même si SEARXNG_URL est défini.