Vue d’ensemble — ce que fait cet écran
Projets est un registre qui rassemble les métadonnées de tous les projets exploités par votre équipe en un seul endroit partagé. Pour chaque projet, vous enregistrez son dépôt de code (GitHub, etc.), sa chaîne de CI/CD (Jenkins), les services web et les bases de données qu’il utilise, ses cibles de sauvegarde et — surtout — l’emplacement de ses secrets. N’importe quel membre de l’équipe peut alors répondre d’un coup d’œil : « de quoi est fait ce projet, où est-il déployé, et quel secret se trouve où ? »
Cet écran n’est pas un outil de déploiement. Les compilations et les déploiements réels ont lieu dans Jenkins. InfraGuard ne déclenche aucune chaîne depuis cet écran ; les données enregistrées constituent une documentation partagée. Les URL, les noms de Job et les branches que vous y stockez ne sont que des liens et des étiquettes de référence — rien n’est exécuté.
Principes de conception fondamentaux :
- Les valeurs des secrets ne sont jamais stockées en clair. Les valeurs réelles des mots de passe, jetons et clés ne sont pas conservées ici. À la place, vous (1) référencez une clé détenue dans le coffre de l’inventaire (
infr_vault_key), ou (2) notez uniquement « quel secret se trouve où » dans une liste de contrôle masquée. - Tout se modifie dans une seule fenêtre modale à onglets (Vue d’ensemble · Code source · CI/CD · Liens · Sauvegarde · Secrets).
- Les créations, modifications, suppressions et les affichages de valeurs du coffre sont tous inscrits dans le journal d’audit (
infr_audit_log).
Quand l’utiliser
- Lors de l’intégration d’un collègue qui doit apprendre rapidement « quel est le dépôt, l’URL de déploiement et la base de données de ce projet ? »
- Pour poser à plat les dépendances web/db de chaque projet afin d’évaluer instantanément le rayon d’impact pendant un incident.
- Pour documenter une carte des secrets dont dépend un projet (quelle clé se trouve où, quelle entrée du coffre appartient à ce projet).
- Pour consigner les cibles et la fréquence de sauvegarde en tant que métadonnées de projet, en lien avec votre politique de sauvegarde.
Disposition
Bandeau de KPI
| Cellule | Signification |
|---|---|
| Projets | Nombre total de projets enregistrés |
| Externes | Projets avec accessible=1 (une URL externe) |
| Internes | Projets avec accessible=0 (internes uniquement, non exposés) |
| Archivés | Projets avec status=archived |
Cartes de projet
Chaque carte affiche :
- Icône et nom — les projets accessibles de l’extérieur utilisent
mdi-web; ceux réservés à l’interne utilisentmdi-folder-lock-outline. - Lien URL — si
accessibleet qu’une URL existe, un lien ouvrant un nouvel onglet ; sinon, un badgeinternal. - Badge de statut — active / paused / archived.
- Résumé d’une ligne.
- Puces de composition — seuls les éléments enregistrés apparaissent : Code source · Jenkins · Environnements N · Web N · BD N · Sauvegardes N · Secrets N.
- Étiquette de groupe (catégorie) et boutons modifier/supprimer (lorsque vous disposez du droit d’écriture).
Fenêtre d’édition (6 onglets)
Une fenêtre modale large (.infr-modal__panel--wide) qui répartit la saisie par onglet.
| Onglet | Champs |
|---|---|
| Vue d’ensemble | Nom (obligatoire) · Clé (slug) · Statut · Groupe · Bascule d’accès externe · URL · Résumé · Étiquettes |
| Code source | Fournisseur du dépôt (GitHub/GitLab/Gitea/Bitbucket/Autre) · URL du dépôt · Branche par défaut · Visibilité (public/private/internal) |
| CI/CD | URL de Jenkins et répéteur d’environnements (par dev/staging/prod : URL de déploiement · branche · Job Jenkins · note) |
| Liens | Cases à cocher des services web (infr_web_service enregistrés) et cases à cocher BD (collecteur) (collecteurs avec access=database) |
| Sauvegarde | Répéteur de cibles de sauvegarde (type · cible · planification · note) |
| Secrets | Références aux clés du coffre (cocher et afficher la valeur) et répéteur de la liste de contrôle des secrets (élément · emplacement · référence · note) |
Mode d’emploi
Enregistrer un projet
- Cliquez sur [Ajouter un projet] en haut à droite (droit d’écriture requis).
- Dans l’onglet Vue d’ensemble, saisissez le nom (obligatoire). La clé (slug) est facultative et doit correspondre à
^[a-z0-9_-]+$(par exemplecoin-market). - Si le service est joignable de l’extérieur, activez la bascule Accessible de l’extérieur et saisissez son URL. Pour un usage strictement interne, laissez-la désactivée : le champ URL est alors grisé.
- Renseignez les onglets restants (Code source, CI/CD, Liens, Sauvegarde, Secrets) selon vos besoins — ils sont tous facultatifs.
- [Enregistrer] — le serveur valide, effectue un upsert dans
infr_projectet rafraîchit la carte.
Enregistrer des environnements de CI/CD
Dans l’onglet CI/CD, saisissez l’URL de Jenkins, puis utilisez [Ajouter un environnement] pour ajouter les cibles de déploiement ligne par ligne :
{
"env": "prod",
"url": "https://coin.example.com",
"branch": "main",
"jenkins_job": "coin_market-deploy-prod",
"note": "blue/green"
}
envn’accepte que la liste blanchedev/staging/prod(toute autre valeur est forcée àdevpar le serveur).- Chaque champ texte est tronqué selon sa longueur (URL 255 · branche 120 · Job 191 · note 255).
- Jusqu’à 20 environnements.
Lier web/db
Dans l’onglet Liens, cochez les ressources utilisées par ce projet.
- Services web — choisissez dans la liste des
infr_web_service(nom · domaine) enregistrés dans Service ▸ Web. Stocké sous forme de tableau d’id web_service. - BD (collecteur) — le tableau de clés des collecteurs enregistrés avec access=database (Administration ▸ Collecteurs / Service ▸ Base de données).
Chaque liaison accepte jusqu’à 50 entrées.
Déclarer les cibles de sauvegarde
Utilisez le répéteur de l’onglet Sauvegarde pour documenter la politique de sauvegarde de ce projet (type · cible · planification · note). Il s’agit de métadonnées de référence qui ne sont pas exécutées — les travaux de sauvegarde réels se gèrent dans le Tableau de planification.
Gérer les informations confidentielles (la fonction clé)
Les secrets reposent sur deux mécanismes utilisés conjointement. Aucun des deux ne stocke la valeur réelle du secret dans infr_project.
1) Références aux clés du coffre (vault_key_ids)
- Dans l’onglet Secrets, cochez des clés du coffre de l’inventaire (Actifs ▸ Inventaire ▸ Coffre à clés,
infr_vault_key) pour les lier. - La liste est transmise masquée (id · catégorie · titre · nom d’utilisateur uniquement — sans la valeur).
- Un appui sur [Afficher] pour une clé liée appelle
POST /service/projects/vault-reveal, qui déchiffre la valeur à ce seul instant et la renvoie.
Les affichages de valeurs du coffre sont audités. Chaque affichage inscrit
vault_key.reveal(target=vault_key, via=project) dansinfr_audit_log. La valeur apparaît brièvement et se copie dans le presse-papiers au clic — ne l’affichez que lorsque vous en avez besoin. L’enregistrement de projet stocké ne conserve que la référence à l’id de la clé.
2) Liste de contrôle des secrets (secrets, masquée)
Pour les secrets absents du coffre (ou détenus à l’extérieur), consignez uniquement l’emplacement. La valeur n’est jamais stockée.
| Champ | Exemple |
|---|---|
label |
STRIPE_SECRET_KEY |
location |
.env (prod server /var/www) |
ref |
1Password › Coin › prod |
note |
rotate quarterly |
La fonction cleanList() du serveur ne conserve que les clés autorisées (label/location/ref/note) et tronque chacune à 255 caractères. Si les quatre champs sont vides, la ligne est abandonnée.
Supprimer
Supprimez depuis le coin inférieur gauche de la fenêtre d’édition ou via [Supprimer] sur la carte. Après confirmation, POST /service/projects/delete supprime la ligne infr_project et consigne project.delete.
Sources de données
| Donnée | Source |
|---|---|
| Enregistrements de projet | infr_project (migration 000715) |
| Groupes (catégories) | infr_asset_group (via group_id) |
| Options de service web | infr_web_service (nom · domaine) |
| Options de BD (collecteur) | infr_collector avec access=database (key · title · host_alias) |
| Options de clé du coffre | infr_vault_key — masquées (id · catégorie · titre · nom d’utilisateur, sans la valeur) |
| Affichage de la valeur du coffre | infr_vault_key.revealSecret() (déchiffrement, uniquement à l’affichage) |
| Journal d’audit | infr_audit_log (project.create/update/delete, vault_key.reveal) |
Schéma de stockage (infr_project, extrait)
key varchar(60) unique nullable # slug
group_id int -> infr_asset_group
name varchar(160) # obligatoire
status enum(active,paused,archived)
accessible boolean default 1
url varchar(255) # exposée lorsque accessible=1
summary text
repo_provider enum(github,gitlab,gitea,bitbucket,other)
repo_url / default_branch / visibility(public,private,internal)
jenkins_url varchar(255)
environments json [{env,url,branch,jenkins_job,note}]
web_refs json -> infr_web_service id array
db_refs json -> infr_collector(database) key array
backup_targets json [{kind,target,schedule,note}]
vault_key_ids json -> infr_vault_key id array (values stay in the vault)
secrets json [{label,location,ref,note}] # liste de contrôle, aucune valeur stockée
tags / meta json
Cet écran n’interroge pas en continu. Il ne recharge la liste qu’à l’enregistrement, à la suppression ou via le bouton d’actualisation (
GET /service/projects/list). L’état en temps réel est pris en charge par Service ▸ Catalogue et Service ▸ Web.
Accès
| Action | Route | Niveau minimal |
|---|---|---|
| Lecture (index/list) | GET /service/projects, /list |
1 (demo, infr.auth) |
| Afficher une valeur du coffre | POST /service/projects/vault-reveal |
1 (+ audit) |
| Enregistrer (créer/modifier) | POST /service/projects/save |
2 (staff) |
| Supprimer | POST /service/projects/delete |
2 (staff) |
- Le contrôle d’écriture vérifie
infr_user_level >= 2en session (canWrite()). En cas d’échec, il renvoie403etproject.err.forbidden. - À l’enregistrement,
vault_key_idsest filtré pour ne garder que les id de clés de coffre réels (vérification d’existence parInfrVaultKey::whereIn(...)). Les id falsifiés sont écartés silencieusement. - Les niveaux sont demo=1 · staff=5 · admin=10 ; certaines zones sont contrôlées séparément par le middleware
infr.level:N.
Dépannage et FAQ
Q. J’appuie sur Enregistrer et j’obtiens une 403. L’écriture exige le niveau 2 ou plus. Un compte en lecture seule (niveau 1) peut uniquement consulter et afficher les valeurs du coffre. Demandez à un administrateur de relever votre niveau.
Q. [Afficher] renvoie une valeur vide.
Soit cette entrée du coffre ne contient aucun secret (hasSecret=false), soit le déchiffrement a échoué (par exemple parce qu’APP_KEY a changé). Redéfinissez la valeur dans Inventaire ▸ Coffre à clés. revealSecret() renvoie null en cas d’échec.
Q. Rien n’apparaît dans les listes de liaison web/BD. Les services web doivent d’abord exister dans Service ▸ Web, et les options de BD nécessitent des collecteurs avec access=database. Enregistrez-les, puis rouvrez la fenêtre du projet : les options seront remplies.
Q. L’enregistrement de la clé (slug) déclenche une erreur de format.
La clé n’accepte que des lettres minuscules, des chiffres, des tirets et des tirets bas (^[a-z0-9_-]+$, 60 caractères au maximum). Retirez les espaces, les majuscules et les autres symboles. La clé étant facultative, vous pouvez aussi la laisser vide.
Q. Puis-je déclencher un déploiement ici ? Non. Les déploiements s’exécutent dans Jenkins. Cet écran conserve l’URL de Jenkins et les noms de Job à titre de documentation uniquement.
Q. Puis-je simplement saisir la valeur du secret dans une note de secrets ?
Jamais. secrets est une carte d’emplacements qui ne stocke aucune valeur. Placez la valeur réelle dans le coffre chiffré Inventaire ▸ Coffre à clés et référencez-la via vault_key_ids.
Voir aussi
- Service ▸ Web — les services web liés via
web_refs. - Service ▸ Base de données — les collecteurs de BD liés via
db_refs. - Service ▸ Catalogue — vitalité des démons par instance (l’état en direct se trouve là).
- Tableau de planification — définition et exécution des travaux de sauvegarde réels.
- Actifs ▸ Inventaire — l’écran d’origine des clés du coffre (
infr_vault_key). - Journal d’audit — vérifiez les enregistrements project.create/update/delete et vault_key.reveal.
