> For the complete documentation index, see [llms.txt](https://cleyrop.gitbook.io/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cleyrop.gitbook.io/docs/gouvernance-de-donnees/sources-de-donnees.md).

# Sources de données

Les sources de données permettent d’ingérer, synchroniser et exposer les données de manière sécurisée, en assurant la traçabilité et la gouvernance des accès.

Deux grandes familles existent :

1. Les **Datasources externes,** qui permettent de connecter directement des systèmes de données (SQL, S3, API, Snowflake, etc.).
2. Les **Dépôts** : serveur SFTP sécurisés, utilisés pour les échanges de fichiers avec des partenaires externes.

***

## Datasources externes

Une Datasource est un objet représentant une source de données externe.

Elle contient toutes les informations nécessaires pour se connecter à cette source et récupérer les données dans un Dataset Cleyrop.

Chaque datasource utilise un connecteur spécifique, adapté au type de source.

### Création d'une datasource

L’ajout d’une datasource suit le même principe quel que soit le connecteur. Depuis le menu Sources données > Datasourcee :

1. Cliquez sur **Créer**
2. Sélectionnez le type de connecteur
3. Renseignez les informations de **connexion demandées** (URL, identifiants, clés, etc.)
4. **Testez** la connexion
5. Renseignez les méta-données : nom, description, **sensibilité**

Une fiche récapitulative est ensuite accessible pour chaque datasource :

* paramètres de connexion,
* liste des datasets importés,
* statut de connectivité.

{% hint style="success" %}
Pour chaque source de données, nous recommandons de créer un compte de service dédié avec les droits minimaux nécessaires.
{% endhint %}

### Paramètres de connexion par type de connecteur

#### 🗄️ Bases de données relationelles

Retrouvez ci-dessous les paramètres à renseigner pour configurer une datasource type Oracle / PostgreSQL / Microsoft SQL / MySQL.

<figure><img src="/files/kKTPEl3os5Xztt2pp7rV" alt=""><figcaption></figcaption></figure>

**Champs obligatoires**

<table><thead><tr><th width="157.328125">Champ</th><th width="264.0703125">Description</th><th>Exemple</th></tr></thead><tbody><tr><td><strong>Host</strong></td><td>Nom de domaine ou adresse IP du serveur de base de données.<br></td><td><code>db.mondomaine.com</code> ou <code>192.168.1.10</code><br>⚠️ <em>Ne pas inclure de protocole (ex: <code>jdbc:</code>) ni de port.</em></td></tr><tr><td><strong>Port</strong></td><td>Port réseau utilisé par la basePré-rempli selon le connecteur.</td><td>Oracle : 1521<br>PostgreSQL : 5432<br>SQL Server : 1433<br>MySQL : 3306</td></tr><tr><td><strong>Database / SID / Service name</strong></td><td>Nom de la base cible (ou SID pour Oracle).</td><td><code>production_db</code></td></tr><tr><td><strong>Nom utilisateur</strong></td><td>Compte ayant accès en lecture (recommandé : compte dédié).</td><td><code>cleyrop_reader</code></td></tr><tr><td><strong>Mot de passe</strong></td><td>Mot de passe associé.</td><td>—</td></tr></tbody></table>

**Bonnes pratiques et points d’attention**

* Vérifier que le serveur autorise les connexions depuis l’IP de Cleyrop (firewall / security group).
* Pour Oracle, le champ **Host** doit inclure le SID ou le Service Name si votre instance l'exige (ex : `monserveur.com/ORCL`).
* SQL Server peut nécessiter le nom d’instance (`host\instance`).
* Si la connexion échoue : vérifier SSL/TLS requis ou non.

#### ❄️ Snowflake

<figure><img src="/files/eBrJwNvyfPtfJI15oK0q" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="166.28125">Champ</th><th width="315.19140625">Description</th><th>Exemple</th></tr></thead><tbody><tr><td><strong>Host</strong></td><td>Adresse de l’instance Snowflake au format (sans https://): <code>[account].snowflakecomputing.com</code></td><td><code>xy12345.snowflakecomputing.com</code></td></tr><tr><td><strong>Warehouse</strong></td><td>Entrepôt de calcul utilisé pour exécuter les requêtes.</td><td><code>COMPUTE_WH</code></td></tr><tr><td><strong>Database</strong></td><td>Base cible.</td><td><code>ANALYTICS_DB</code></td></tr><tr><td><strong>Nom d'utilisateur</strong></td><td>Compte de service.</td><td><code>CLEYROP_USER</code></td></tr><tr><td><strong>Mot de passe</strong></td><td>Mot de passe ou clé privée.</td><td>—</td></tr><tr><td><strong>Rôle (optionnel)</strong></td><td>Rôle Snowflake à utiliser.</td><td><code>ANALYST_ROLE</code></td></tr></tbody></table>

**Bonnes pratiques et points d’attention**

* Utiliser un rôle dédié avec :
  * `USAGE` sur warehouse
  * `USAGE` sur database & schema
  * `SELECT` sur tables
* Si aucun rôle n’est renseigné → rôle par défaut utilisé (souvent source d’erreur d’accès).
* Retrouvez votre host dans les détails de votre compte : Account/Server URL

#### 🔌 **API**

<figure><img src="/files/YCpKbvwsyxEeUiTOkD1C" alt=""><figcaption></figcaption></figure>

**Champs**

| Champ                         | Description                                                                            | Exemple                      |
| ----------------------------- | -------------------------------------------------------------------------------------- | ---------------------------- |
| **Base URL**                  | URL racine de l’API (sans endpoint spécifique).                                        | `https://api.mondomaine.com` |
| **Endpoint (fin d’URL)**      | Chemin utilisé pour tester la connexion.                                               | `/v1/users`                  |
| **Paramètres (Query Params)** | Paramètres ajoutés à l’URL pour filtrer ou préciser la requête.                        | `?limit=100&status=active`   |
| **En-têtes (Headers)**        | Informations techniques envoyées avec chaque requête (authentification, format, etc.). | `Authorization: Bearer xxx`  |

{% hint style="info" %}
Les paramètres et en-têtes sont optionnels mais peuvent être requis si votre API nécessite une authentification ou des filtres spécifiques.
{% endhint %}

**Méthodes HTTP**

Le connecteur API supporte plusieurs méthodes HTTP :

<table><thead><tr><th width="224.92578125">Méthode</th><th>Usage</th></tr></thead><tbody><tr><td><strong>GET</strong></td><td>Récupérer des données (comportement par défaut)</td></tr><tr><td><strong>POST</strong></td><td>Envoyer des données dans le corps de la requête</td></tr><tr><td><strong>PUT</strong></td><td>Mettre à jour une ressource complète</td></tr><tr><td><strong>PATCH</strong></td><td>Mettre à jour partiellement une ressource</td></tr></tbody></table>

Pour les méthodes POST, PUT et PATCH, un **corps de requête (body)** peut être configuré sous forme de paires clé / valeur (format JSON).

{% hint style="info" %}
Les paramètres définis dans la Datasource peuvent être surchargés au niveau du Dataset. La valeur du Dataset est alors prioritaire sur celle de la Datasource.
{% endhint %}

**Authentification par token**

Si votre API requiert une authentification par token, activez l'option **Activer l'authentification par token** dans la section dédiée.

<figure><img src="/files/aseprZmEKuO4rMF2pAeE" alt=""><figcaption></figcaption></figure>

**Requête du token :**

| Champ                                  | Description                                          | Exemple                               |
| -------------------------------------- | ---------------------------------------------------- | ------------------------------------- |
| **URL du token**                       | URL de l'endpoint d'authentification                 | `https://api.example.com/oauth/token` |
| **Méthode HTTP**                       | Méthode utilisée pour récupérer le token             | `POST`                                |
| **Propriété du token dans la réponse** | Nom du champ contenant le token dans la réponse JSON | `access_token`                        |

Vous pouvez également configurer :

* **Paramètres** : paramètres à envoyer dans la requête de token (ex: `grant_type: client_credentials`)
* **En-têtes** : en-têtes à envoyer dans la requête de token (ex: `Content-Type: application/x-www-form-urlencoded`)
* **Corps** : paires clé/valeur JSON à envoyer dans le corps de la requête de token

**Injection du token :**

Une fois récupéré, le token est automatiquement injecté dans les appels à l'API. Configurez :

| Champ                       | Description                          | Exemple                 |
| --------------------------- | ------------------------------------ | ----------------------- |
| **Cible d'injection**       | Où injecter le token dans la requête | `En-tête`               |
| **Nom de la propriété**     | Nom du header ou paramètre cible     | `Authorization`         |
| **Pattern de la propriété** | Format d'injection du token          | `Bearer {ACCESS_TOKEN}` |

{% hint style="info" %}
Le token est récupéré automatiquement avant chaque collecte et injecté dans les appels selon la configuration définie.
{% endhint %}

#### 🔌 **Business central**

**Prérequis :**

* Disposer d'une application enregistrée dans **Microsoft Entra ID** (Azure AD), avec :
  * les permissions **Application** *Dynamics 365 Business Central* (`API.ReadWrite.All`)
  * le consentement administrateur accordé
  * un secret client généré

**Champs**

<table><thead><tr><th width="202.33984375">Champ</th><th>Description</th></tr></thead><tbody><tr><td><strong>Environnement</strong></td><td>Nom de votre environnement Business Central tel que configuré dans le centre d'administration Business Central.</td></tr><tr><td><strong>Identifiant du tenant</strong></td><td>Identifiant de répertoire (tenant) Azure AD, disponible dans Portail Azure > Azure Active Directory > Vue d'ensemble.</td></tr><tr><td><strong>Identifiant client</strong></td><td>Identifiant d'application (client) issu de votre inscription d'application Azure AD. L'application doit disposer des permissions de l'API Dynamics 365 Business Central.</td></tr><tr><td><strong>Mot de passe</strong></td><td>Secret client généré dans Azure</td></tr></tbody></table>

{% hint style="info" %}
Testez la connexion pour pouvoir passer à l'étape suivante.
{% endhint %}

#### **🔌 Salesforce**

**Prérequis :**

* Disposer d'un nom de domaine Salesforce
* Disposer des identifiants de connexion (nom d'utilisateur et mot de passe)

**Champs**

<table><thead><tr><th width="227.2109375">Champ</th><th>Description</th></tr></thead><tbody><tr><td><strong>Version de l'API</strong></td><td>Version de l'API Salesforce à utiliser, parmi la liste des versions supportées par Cleyrop.</td></tr><tr><td><strong>Domaine</strong></td><td>Nom de domaine de votre organisation Salesforce.</td></tr><tr><td><strong>Nom d'utilisateur</strong> </td><td>Consumer Key (identifiant client) de votre Connected App Salesforce</td></tr><tr><td><strong>Mot de passe</strong> </td><td>Consumer Secret associé à votre Connected App Salesforce.</td></tr></tbody></table>

{% hint style="info" %}
Testez la connexion pour pouvoir passer à l'étape suivante.
{% endhint %}

{% hint style="warning" %}
Les filtres appliqués sur les données doivent respecter la syntaxe SOQL de Salesforce (opérateurs `=`, `!=`, etc.).
{% endhint %}

#### ☁️ **S3**

<figure><img src="/files/wRQPl7hdmmhoix48gsYj" alt=""><figcaption></figcaption></figure>

| Champ               | Description              | Exemple                              |
| ------------------- | ------------------------ | ------------------------------------ |
| **URL**             | Endpoint du service S3.  | `https://s3.eu-west-1.amazonaws.com` |
| **Région**          | Région AWS du bucket.    | `eu-west-1`                          |
| **Access Key**      | Clé d’accès IAM.         | `AKIA...`                            |
| **Secret Key**      | Clé secrète associée.    | —                                    |
| **Bucket**          | Nom du bucket cible.     | `data-production`                    |
| **Chemin (prefix)** | Sous-dossier spécifique. | `exports/2025/`                      |

#### Héritage de sensibilité

{% hint style="danger" %}
Le **choix de la sensibilité** est crucial car les enfants de la Datasource en hériteront.
{% endhint %}

Lorsqu’un Dataset est créé à partir d’une datasource, il hérite automatiquement du niveau de sensibilité de sa source. Lorsqu’un Dataset est créé à partir de plusieurs datasources, le maximum de la sensibilité sera pris.

| Sensibilité des datasource     | Sensibilité du dataset créé |
| ------------------------------ | --------------------------- |
| Interne & Interne              | Interne                     |
| Sensible & Interne             | Sensible                    |
| Restreint & Sensible & Interne | Restreint                   |

### Supervision et états de connectivité

Chaque datasource dispose d’un état de connectivité visible dans le panneau d’administration :

<table><thead><tr><th width="172.56640625">État</th><th>Signification</th></tr></thead><tbody><tr><td>✅ Valide</td><td>Les 5 derniers rafraîchissements se sont déroulés sans erreur.</td></tr><tr><td>⚠️ À surveiller</td><td>Un des 5 derniers rafraîchissements a rencontré une erreur.</td></tr><tr><td>❌ Erreur</td><td>Les 5 derniers rafraîchissements ont échoué.</td></tr></tbody></table>

***

## Dépôts SFTP sécurisés

Les dépôts reposent sur un serveur SFTP dont les espaces sont **isolés** et mis à disposition pour **échanger des fichiers de manière sécurisée** entre la plateforme et des **partenaires** externes (prestataires, institutions, clients…).

Chaque dépôt correspond à un espace de stockage indépendant, accessible via :

* authentification par **clé SSH** (recommandée) ou
* authentification par **mot de passe**.

Ils servent de zones tampons sécurisées (“zones de pot”) pour le dépôt ou la récupération de fichiers externes avant intégration dans un dataset.

### Créer un dépôt

La création d’un dépôt est réservée aux **Platform Managers** depuis le panneau Sources de données > Dépôts.

Lors de la création :

* choisissez un **nom** explicite (ex. sftp-partenaire-finance),
* **Clé SSH** : ajoutez une ou plusieurs clés publiques **SSH** autorisées (Ed25519, ECDSA, RSA ou clé FIDO/matérielle) pour sécuriser votre dépot.

{% hint style="info" %}
Suite à la **montée de version 4.6 et par renforcement des mesures de sécurité**, il n'est plus possible de créer un nouveau dépôt avec accès par mot de passe. Les dépôts existants configurés par mot de passe restent accessibles pour le moment mais ne le seront plus d'ici le 31//12/2026. Nous vous recommandons de migrer rapidement ces dépôts vers des dépôts avec accès SSH.
{% endhint %}

{% hint style="warning" %}
Le nom du dépôt est **visible par les utilisateurs** de la plateforme, évitez les informations confidentielles.
{% endhint %}

Par la suite, vous pourrez :

* **explorer les fichiers** : visualiser les liste de dossiers et fichiers depuis Dépôt > Explorateur
* **modifier** le dépôt : ajouter une clé SSH
* **supprimer** le dépôt : suppression des fichiers et accès

### Durée de conservation et nettoyage automatique

Les fichiers déposés dans un dépôt font l’objet d’un **nettoyage automatique** :

* par défaut, la durée de conservation est de **7 jours** après la dernière modification du fichier,
* cette durée est configurable entre 1 et 30 jours,
* à expiration, les fichiers sont supprimés, mais l’arborescence des dossiers est conservée.

Cette politique garantit un **espace de stockage maîtrisé** tout en conservant la **structure logique** du dépôt.

### Connexion et utilisation (ex. FileZilla)

Les utilisateurs autorisés peuvent accéder à un dépôt via tout client SFTP (FileZilla, Cyberduck, WinSCP, etc.).

**Exemple FileZilla :**

1. Ouvrez Fichier > Gestionnaire de sites
2. Cliquez sur Nouveau site
3. Renseignez :
   * Protocole : SFTP – SSH File Transfer Protocol
   * Hôte : (adresse fournie dans la fiche dépôt)
   * Port : 22 (par défaut)
   * Utilisateur : identifiant du dépôt
   * Méthode d’authentification : mot de passe ou clé privée
4. Cliquez sur Connexion rapide

{% hint style="info" %}
Les informations exactes de connexion (hôte, port, utilisateur, clé SSH ou mot de passe) sont accessibles dans Configuration > Dépôts > Gestion > Fiche Dépôt.
{% endhint %}

***

## Bonnes pratiques de gouvernance

* Nommer clairement vos **datasources** (SFTP\_Partenaires\_2025, PostgreSQL\_Prod, etc.).
* Privilégier l’authentification par clé SSH ou token plutôt que par mot de passe.
* **Révoquer** immédiatement les **accès inutilisés**.
* Surveiller les **états de connectivité** pour éviter les échecs d’ingestion récurrents.
