Linkr
Accueil Ressources Outils Documentation Blog Démo
EN
  • Qu'est-ce que Linkr ?
  • Modes de déploiement
  • Démarrage rapide
  • Installation locale
  • Avec Docker
  • Installation manuelle
  • Client-only
  • Installer LibreChat
  • Votre premier projet
  • Linkr dans un EDS
  • Espaces de travail et projets
  • Le pipeline de données
  • Entités et partage
  • Versioning et collaboration
  • Vue d'ensemble
  • Projets
  • Wiki
  • Plugins
  • Membres et rôles
  • Paramètres
  • Schémas
  • Obtenir et explorer
  • Mapping
  • Bases de données
  • Sous-bases dérivées
  • Qualité des données
  • Catalogue de données
  • Construire et publier
  • Anonymiser
  • Collections de scripts SQL
  • Pipelines ETL
  • Construire et exécuter
  • Générer les scripts
  • Présentation
  • Projets d'alignement
  • Vue d'ensemble
  • Concepts cibles
  • Éditeur d'alignements
  • Suggestions
  • Agent IA
  • Évaluation
  • Export
  • Vue d'ensemble
  • Bases de données
  • Concepts
  • Cohortes
  • Construire
  • Résultats, SQL et rapport
  • Données individuelles
  • Pipeline
  • Jeux de données
  • IDE
  • Applications web
  • Versioning
  • Vue d'ensemble
  • Onglets et widgets
  • Widgets intégrés
  • Widgets d'analyse
  • Cartes de contrôle (SPC)
  • Questionnaires et eCRF
  • Code R et Python
  • Filtres, paramètres et export
  • Vue d'ensemble
  • Mode présentation
  • Exporter un rapport
  • Agents
  • Serveur MCP
  • Skills
  • Import et export
  • Versioning git
  • Catalogue communautaire
  • Créer son catalogue
  • Publier du contenu
  • Installation en production
  • Configuration
  • Connecteurs de bases de données
  • Authentification et permissions
  • Fichiers sur le serveur
  • Sauvegarde et restauration
  • Contribuer au code
  • Tests automatiques
  • Glossaire
  • Raccourcis clavier
  • Notes de version
Documentation Partage et catalogue Créer son catalogue

Créer son catalogue

Monter le catalogue d'une équipe ou d'un établissement, public ou privé, à partir du modèle : groupes à scanner, jeton de la CI, rescan programmé, ajout dans Linkr.

En résumé

Un catalogue est un dépôt GitLab d’index : une fiche par entité publiée, chacune pointant vers son propre dépôt. On le crée à partir du modèle de catalogue, on lui indique les groupes à surveiller, et un rescan programmé y ajoute tout seul chaque entité publiée dans ces groupes. Il peut être public ou privé — dans ce cas, chacun le lit avec son propre jeton d’accès.

Client Disponible en mode client-only — tout fonctionne dans le navigateur, sans backend. Backend Disponible avec le backend FastAPI.

Un catalogue public se parcourt dans les deux modes. Un catalogue privé demande le mode serveur, qui conserve votre jeton d’accès — voir Modes de déploiement. Installer une entrée demande le mode serveur dans tous les cas.

Cette page s’adresse à la personne qui met en place le catalogue : elle manipule GitLab, ses jetons et sa CI. Pour simplement parcourir un catalogue existant ou y installer une entrée, voir Catalogue communautaire.

Comment fonctionne un catalogue

Un catalogue ne contient pas les entités elles-mêmes, seulement des renvois. Chaque fiche — un petit fichier dans le dossier entries/ — nomme un dépôt git où vit une entité : un projet, un schéma, un alignement de concepts, un pipeline ETL… Linkr télécharge l’index, affiche les fiches, et clone le dépôt d’une entrée quand vous l’installez.

Les fiches arrivent de deux façons, que l’on combine librement :

  • Par scan — le fichier sources.json liste des groupes GitLab (ou des comptes GitHub). Une tâche planifiée les parcourt, sous-groupes compris, et crée une fiche pour chaque dépôt qui contient une entité Linkr — reconnaissable au fichier entity.json que Linkr écrit à la racine quand vous poussez une entité. C’est la voie normale : publier une entité dans un groupe surveillé suffit à la faire apparaître.
  • À la main — pour un dépôt situé hors des groupes surveillés, on écrit sa fiche soi-même. Un scan ne supprime jamais une fiche, il signale seulement celles qu’aucun groupe ne couvre.

À partir des fiches, la CI génère deux fichiers que Linkr lit : catalog.json, toutes les fiches complètes, et catalog-index.json, une simple empreinte de chacune. Linkr consulte ce dernier pour savoir si quelque chose a changé, et ne retélécharge le catalogue qu’à ce moment-là — d’où le bandeau Mises à jour disponibles.

Le catalogue reflète les dépôts, jamais l'inverse

Le nom, la version, l’auteur, l’organisation et la description anglaise d’une fiche sont recopiés depuis l’entité à chaque scan. Les corriger dans la fiche ne sert à rien : le scan suivant les remet. Corrigez-les dans l’entité, dans Linkr, puis poussez-la à nouveau. Ce qu’un responsable du catalogue peut ajouter et qui est conservé : les traductions françaises, les étiquettes (badges), le statut, la licence et la page d’accueil.

Public ou privé

Catalogue publicCatalogue privé
Qui le parcourttoute instance Linkr, y compris en mode navigateurles utilisateurs d’un serveur Linkr ayant un jeton d’accès qui peut le lire
Quand le choisircontenu destiné à d’autres équipesquand les noms et descriptions mêmes des entités ne doivent pas sortir
Dépôts listéspublics de préférence, pour que tous puissent installerprivés ou non : installer demande un accès en lecture au dépôt

Le catalogue lui-même doit être sur une instance GitLab — gitlab.com, framagit.org, ou le GitLab de votre établissement : Linkr le lit par l’API de GitLab. Les dépôts qu’il liste peuvent être sur GitLab ou sur GitHub.

Étape 1 — partir du modèle

Le modèle de catalogue contient tout le nécessaire : les scripts qui scannent et génèrent l’index, le schéma des fiches et la CI. Il ne demande rien à installer.

Créez sur votre GitLab un projet vide (sans README), puis poussez-y le modèle :

git clone https://framagit.org/interhop/linkr/linkr-catalog-template.git mon-catalogue
cd mon-catalogue
git remote set-url origin git@gitlab.com:mon-equipe/mon-catalogue.git
git push -u origin main

Le menu New project → Import project → Repository by URL de GitLab fait la même chose sans ligne de commande. Choisissez à ce moment la visibilité du projet : Public ou Private.

Étape 2 — dire quoi scanner

Le fichier sources.json, à la racine, liste les groupes à surveiller :

{
  "sources": [
    { "url": "https://gitlab.com/mon-equipe/linkr-content", "note": "Nos entités Linkr" }
  ]
}

Chaque groupe est parcouru avec ses sous-groupes. Les dépôts sans entité Linkr — le catalogue lui-même, un site, un dépôt de code — sont ignorés.

Un jeton limité à des sous-groupes

Certains jetons ne se donnent que sur des sous-groupes, pas sur leur parent (voir l’étape suivante). Listez alors chaque sous-groupe comme une source à part — …/linkr-content/projects, …/linkr-content/mappings… —, et pensez à ajouter tout nouveau sous-groupe à la fois ici et au jeton.

Étape 3 — donner un jeton à la CI

La CI du modèle compte trois tâches — des jobs, dans le vocabulaire de GitLab :

JobQuandCe qu’il fait
validateà chaque branche ou merge requestvérifie les fiches et que l’index généré est à jour
buildà chaque push sur mainrégénère l’index et le recommite s’il a changé
rescansur planning, ou lancé à la mainscanne sources.json, ajoute ou met à jour les fiches, et commite sur main

build et rescan écrivent dans le dépôt : ils ont besoin d’un jeton, fourni par une variable de CI nommée CATALOG_BOT_TOKEN. rescan s’en sert aussi pour lire les groupes de sources.json, et ne l’envoie qu’à l’instance GitLab qui héberge le catalogue.

Quel jeton

Vos sources sont…JetonDroits
publiquesjeton d’accès de projet sur le catalogue (Settings → Access tokens)rôle Maintainer, portée write_repository
privées, et votre offre GitLab propose les jetons de groupejeton d’accès de groupe sur le groupe parentrôle Maintainer, portées read_api + write_repository
privées, sans jeton de groupejeton personnel à droits fins — fine-grainedvoir ci-dessous
privées, au plus simplejeton personnel classique — legacyportées read_api + write_repository ; il ouvre tout ce à quoi vous avez accès, préférez le précédent

Le jeton fine-grained se crée depuis votre profil : Edit profile → Access → Personal access tokens → Generate token → Fine-grained token. Deux réglages comptent :

  • Group and project access — les groupes (ou sous-groupes) à scanner, plus celui qui contient le catalogue, pour qu’il puisse y pousser.
  • Add resource permissions, onglet Group and project — trois ressources à cocher dans le panneau de gauche, chacune avec sa permission dans celui de droite :
    • Project → Read — lister les projets d’un groupe ;
    • Repository → Read — lire leur contenu, dont entity.json ;
    • Code → Download et Push — cloner, et pousser l’index sur main.

Laissez les onglets User et Global vides. Si GitLab répond « Add at least one resource with permissions », c’est que ces permissions n’ont pas été cochées : les groupes choisis plus haut ne suffisent pas.

GitLab vérifie aussi les droits du propriétaire

Un jeton personnel n’a jamais plus de droits que la personne qui l’a créé. Celle-ci doit être Maintainer du catalogue — la branche main est protégée — et membre des groupes scannés. Un compte de service est préférable : un jeton personnel cesse de fonctionner le jour où son propriétaire perd ses accès.

Où le déposer

Dans le projet du catalogue : Settings → CI/CD → Variables → Add variable.

ChampValeur
TypeVariable
VisibilityMasked — ou Masked and hidden — : la valeur n’apparaît jamais dans les journaux
Protect variabledécoché
KeyCATALOG_BOT_TOKEN
Valuele jeton

« Protect variable » doit rester décoché

Une variable protégée n’est transmise qu’aux pipelines d’une branche protégée. Selon la façon dont il est lancé, le rescan peut la recevoir vide — et le job annonce alors qu’elle n’existe pas, alors qu’elle est bien là.

Notez la date d’expiration du jeton — le fichier MAINTAINING.md du modèle a une ligne pour cela. Ce jour-là, build et rescan échouent avec un message d’authentification qui ne parle pas d’expiration.

Et GitHub ?

Le catalogue lui-même reste sur GitLab : Linkr le lit par l’API de GitLab, et la CI du modèle est une CI GitLab. En revanche, sources.json peut lister des comptes ou organisations GitHub — https://github.com/mon-organisation — à côté des groupes GitLab.

  • Seuls les dépôts publics d’un compte GitHub sont scannés, même avec un jeton. Un dépôt GitHub privé s’ajoute par une fiche écrite à la main ; pour l’installer, chaque utilisateur aura besoin, dans Linkr, d’un jeton github.com qui y donne accès.
  • Aucun jeton n’est requis, mais GitHub limite les appels anonymes à 60 par heure, vite atteints sur une grosse organisation. Ajoutez alors une seconde variable de CI, GITHUB_TOKEN, créée comme la première (masquée, non protégée). Sur GitHub : Settings → Developer settings → Personal access tokens → Fine-grained tokens → Generate new token, avec Repository access sur Public repositories — en lecture seule, il suffit. Ce jeton n’est envoyé qu’à GitHub.

Étape 4 — programmer le rescan

Dans le projet du catalogue : Build → Pipeline schedules → New schedule.

ChampValeur
DescriptionWeekly rescan of sources.json
Interval patternCustom : 0 4 * * 1, chaque lundi à 4 h
Cron timezonevotre fuseau, Europe/Paris par exemple
Target branchmain

Le bouton ▶ de la ligne lance le rescan tout de suite, sans attendre lundi. Son journal liste chaque fiche ajoutée (A) ou mise à jour (M) ; il les commite lui-même sur main, il n’y a rien à fusionner. Quand tout est déjà à jour, il se termine en vert avec Nothing to do.

Le rescan se lance aussi à la demande, depuis Build → Pipelines → Run pipeline sur main.

Un planning appartient à quelqu'un

Il s’exécute avec les droits de la personne qui l’a créé. Si elle perd l’accès au projet, reprenez-le avec Take ownership.

Étape 5 — l’ajouter dans Linkr

Sur la page Catalogue, l’icône d’engrenage — Gérer les catalogues — ouvre la fenêtre Catalogues. Ajouter un catalogue demande un Nom, l’URL du dépôt du catalogue et sa Branche ; le catalogue se charge dès qu’il est ajouté. Le détail de cette fenêtre est décrit dans Utiliser un catalogue interne.

Pour un catalogue privé, activez Dépôt privé et collez votre Jeton d’accès. Ce jeton est le vôtre, pas celui de la CI :

  • il est enregistré dans votre compte pour cet hôte — gitlab.com, par exemple — et réutilisé pour tous ses dépôts : lire le catalogue, installer ses entrées, synchroniser avec git. Les autres utilisateurs ne le voient jamais ;
  • il doit pouvoir lire le catalogue et les dépôts qu’il liste : un jeton classique avec read_repository suffit — ajoutez write_repository si vous poussez aussi depuis Linkr ;
  • chaque utilisateur du serveur saisit le sien.

Si votre compte a déjà un jeton pour cet hôte, le champ le signale ; laissez-le vide pour le conserver.

Ajouter une fiche à la main

Pour un dépôt hors des groupes surveillés, créez un fichier dans entries/, nommé comme son identifiant :

{
  "id": "mes-requetes-icu",
  "type": "sql-collection",
  "git": { "url": "https://gitlab.com/equipe/mes-requetes-icu", "branch": "main" },
  "name": { "en": "ICU queries", "fr": "Requêtes de réanimation" },
  "description": { "en": "Reusable ICU queries.", "fr": "Requêtes réutilisables en réanimation." },
  "badges": ["icu", "omop"]
}

Sont obligatoires id — identique au nom du fichier —, type, git, name et description, avec au moins l’anglais (en) dans ces deux derniers. Le type vaut project, mapping-project, sql-collection, etl-pipeline, data-catalog, dq-rule-set, schema-preset, database ou workspace. La référence complète est le fichier schema/entry.schema.json du modèle.

Lancez ensuite node scripts/build.mjs pour régénérer l’index, puis commitez et poussez — ou ouvrez une merge request : le job validate vérifie la fiche et dit précisément ce qui ne va pas.

Quand un job échoue

MessageCause probable
CATALOG_BOT_TOKEN is not setvariable absente, ou Protect variable coché
sources.json declares no sources.rien à scanner : remplissez sources.json
No source could be read / Group not foundURL erronée, ou le jeton ne voit pas le groupe : expiré, permission de lecture manquante, groupe absent de ses ressources
Authentication failed au moment du pushjeton expiré, ou sans droit d’écriture (write_repository, ou Code → Push)
pre-receive hook declinedle jeton, ou son propriétaire, n’est pas Maintainer du catalogue
Entries disagree with the repos they point atune fiche a été modifiée à la main sur un champ qui appartient au dépôt — relancez le rescan, ne corrigez pas la fiche
duplicate git.urlune entité a changé d’identifiant et deux fiches pointent vers le même dépôt : supprimez l’ancienne, que le rescan désigne

Le fichier MAINTAINING.md du modèle reprend ce tableau, avec la marche à suivre.

Pour aller plus loin

  • Catalogue communautaire — parcourir un catalogue et installer ses entrées.
  • Publier du contenu — préparer une entité avant qu’un catalogue la référence.
  • Versioning git — pousser une entité vers son dépôt, ce qui crée son entity.json.
PrécédentCatalogue communautaireSuivantPublier du contenu

Produit

  • Accueil
  • Démo

Ressources

  • Documentation
  • Ressources
  • Outils
  • Blog

Communauté

  • Code source Framagit
  • Code source Github

À propos

  • InterHop.org
  • Contact

2021–2026 InterHop — CC BY-NC-SA 4.0 (site) · AGPLv3 (logiciel)