04. Spécification des Dépôts et Distribution Légère (Buckets)
Navigation : Documentation > 04. Dépôts et Distribution Légère
Sommaire
- Architecture de Distribution Client / Serveur
- Spécification des Composants de Distribution
- Index Centralisé (index.nuon)
- Téléchargement des Manifestes à la Demande (Sparse Fetch)
- Immunité contre le Rate-Limiting des Plateformes (Anti-403)
- Organisation des Dépôts et Gouvernance de Sécurité
- 4.1 Segmentation Macro des Buckets
- 4.2 Partitionnement par Sharding Alphabétique
- 4.3 Templates d'Issues et Planification Horaire
- Déploiement en Réseaux Complètement Isolés (Air-Gapped) et Miroirs Privés
- Réécriture Dynamique d'URLs
- Préservation de l'Intégrité Cryptographique
1. Architecture de Distribution Client / Serveur
erable repose sur une architecture de distribution découplée : Index Centralisé Compilé + Téléchargement des Manifestes à la Demande.
Le client ne télécharge aucun historique Git local sur la machine utilisateur.
flowchart LR
subgraph RemoteBucket ["1. Dépôt Distant (Bucket Git)"]
CI["GitHub Action (Compilation sur push)"]
IDX["index.nuon.sig (~500 Ko)"]
PKGS["packages/r/ripgrep/parts/*.toml"]
CI -->|Compile & Signe| IDX
end
subgraph ClientHost ["2. Poste Client (~/.erable)"]
CACHE["indices/core.nuon (Cache TTL 24h)"]
INST["installed/ripgrep/parts/*.toml"]
BINS["packages/ripgrep/14.1.0/"]
end
IDX -->|"1. erable update (HTTP CDN direct, < 1 sec)"| CACHE
CACHE -->|"2. erable search (Lecture directe en RAM O(1))"| ClientHost
PKGS -->|"3. erable install (Téléchargement à la demande)"| INST
INST -->|"4. Déploiement des binaires"| BINS
2. Spécification des Composants de Distribution
2.1 Index Centralisé (index.nuon)
- Chaque bucket publie à sa racine un fichier d'index compilé automatiquement par intégration continue (
index.nuon), accompagné de sa signature cryptographique Ed25519 (index.nuon.sig). - Protection anti-rejeu et anti-gel (Spécification TUF) : L'en-tête de
index.nuoncontient un compteur strictement croissant (sequence_id) et une date d'expiration signée (valid_until, max 7 jours). Tout index expiré ou dont lesequence_idest inférieur à l'index local est rejeté par le moteur client. - Il contient le résumé structuré de l'ensemble des paquets du bucket : nom, version courante, description, tags, licence, catégories et architectures cibles supportées.
- Taille : Moins de 600 Ko pour un dépôt de 5 000 paquets.
- Mise en cache locale : Le client conserve cet index avec un TTL de 24 heures par défaut. La recherche s'exécute en mémoire vive en quelques millisecondes.
2.2 Téléchargement des Manifestes à la Demande (Sparse Fetch)
- Le client
erablene télécharge jamais l'arborescence complète du dépôt. - Lors de l'installation d'un outil (
erable install <pkg>), le moteur télécharge uniquement les fichiers modulaires du paquet (parts/*.tomlet scripts.nu) depuis l'endpoint CDN Raw statique. - Le manifeste actif est enregistré localement dans
~/.erable/installed/<pkg>/.
3. Immunité contre le Rate-Limiting des Plateformes (Anti-403)
- Client Utilisateur (Zéro Appel REST GitHub) :
- Le client n'interroge jamais les endpoints REST
api.github.com. - Toutes les requêtes transitent par les CDN de fichiers bruts statiques (
raw.githubusercontent.comou miroir CDN Cloudflare/Fastly), éliminant toute restriction de quota (60 req/h). - Bot d'Autoupdate CI :
- Le bot s'exécute avec le jeton officiel
GITHUB_TOKEN(5 000 req/h). - La surveillance des nouvelles versions amont s'effectue prioritairement via les flux RSS/Atom de releases (
https://github.com/{owner}/{repo}/releases.atom), qui ne consomment aucun quota d'API REST.
4. Organisation des Dépôts et Gouvernance de Sécurité
4.1 Segmentation Macro des Buckets
| Bucket | Vocation | Niveau d'Audit | Critères de Publication & Sécurité |
|---|---|---|---|
main |
Utilitaires CLI / TUI majeurs et essentiels | 100% Automatisée (CI stricte, zéro humain requis) | Binaire stable, multiplateforme, $\ge 500$ étoiles GitHub/GitLab, tests de validation obligatoires (check_version, check_help), linter AST, provenance SLSA Level 3 / Sigstore. |
gui |
Applications fenêtrées graphiques | Élevée (CI + tests raccourcis) | Déclaration de parts/shortcuts.toml, sous-système Windows GUI. |
community |
Outils émergents ou de niche | Automatisée (CI stricte) | Audit obligatoire par le linter AST anti-exfiltration, SHA-256 certifiés. |
commercial |
Logiciels propriétaires ou sous licence commerciale | Légale & Stricte | Téléchargement direct chez l'éditeur, consentement obligatoire --accept-license. |
4.2 Partitionnement par Sharding Alphabétique
Pour optimiser les accès et éviter l'engorgement des systèmes de fichiers, l'arborescence des paquets est partitionnée par initiale :
bucket-main/
├── index.nuon # Index compilé
├── index.nuon.sig # Signature Ed25519
├── README.md
└── packages/
├── a/
│ └── aria2/
├── b/
│ └── bat/
├── r/
│ └── ripgrep/
│ ├── manifest.toml
│ ├── pre_install.nu
│ ├── post_install.nu
│ ├── pre_uninstall.nu
│ ├── post_uninstall.nu
│ └── parts/
│ ├── package.toml
│ ├── targets.toml
│ └── verification.toml
└── z/
└── zoxide/
4.3 Templates d'Issues et Planification Horaire
Chaque bucket officiel (main, gui, community, commercial, fonts) expose trois templates dans .gitlab/issue_templates/ traités par les pipelines centralisés du dépôt core selon une chaîne horaire ordonnée :
package_add.md(package-add) : ajout d'un paquet inexistant — détecté en amont à:00(hourly_00,--action-filter create) et traité à:15(hourly_15).package_update.md(package-update) : mise à jour de version d'un paquet existant — détectée à:15(hourly_15) et traitée à:30(hourly_30).platform_add.md(platform-add) : extension multiplateforme d'un paquet existant — détectée à:30(hourly_30,--action-filter enrich_targets) et fusionnée danstargets.tomlà:45(hourly_45).
5. Déploiement en Réseaux Complètement Isolés (Air-Gapped) et Miroirs Privés
Dans les infrastructures critiques sans connectivité Internet directe, les requêtes vers les CDN publics et GitHub Releases sont inaccessibles.
5.1 Réécriture Dynamique d'URLs
Le fichier de configuration global ~/.erable/config.nu permet de définir des règles de réécriture transparentes vers un gestionnaire d'artefacts d'entreprise (JFrog Artifactory, Sonatype Nexus ou bucket S3 interne) :
$env.erable_MIRROR_REWRITE = {
enabled: true,
prefix_match: "https://github.com/",
replace_with: "https://artifactory.corp.internal/artifactory/github-cache/"
}
5.2 Préservation de l'Intégrité Cryptographique
Le module lib/network.nu intercepte et réécrit les URLs de téléchargement à la volée. L'intégrité reste garantie par le calcul de l'empreinte SHA-256 et la validation de provenance SLSA 3 / Sigstore sur l'artefact obtenu depuis le miroir.