Aller au contenu principal
DocumentCourirPartage public du produit

Partage public du produit (lien HTTPS public)

Publiez les produits .md / .html / .xlsx sous forme de liens courts qui ne nécessitent pas de connexion. Slack/e-mail envoie uniquement des liens mais pas des fichiers ; prend en charge TTL/mot de passe/nombre de téléchargements/aperçu en ligne HTML.

Si votre flux de travail génère un rapport (.md / .html / .xlsx / .pdf) et souhaite l'envoyer à d'autres personnes, le moyen le plus direct est de laisser le module Slack/mail télécharger la pièce jointe. Mais les fichiers volumineux seront lents et les plateformes de messagerie imposent généralement des limites quant à la taille d'un seul fichier et au nombre de pièces jointes.

Partage public du produit est une autre voie : publier un artefact unique sous forme de lien court HTTPS ne nécessitant pas de connexion ; le message ne contient que le lien, qu'il suffit d'ouvrir pour consulter — le fichier lui-même reste sur le serveur, ce qui économise de la bande passante et permet une prévisualisation directe dans le navigateur (les .md peuvent être rendus en ligne au format HTML). Pour partager plusieurs fichiers d'un coup, vous pouvez aussi publier tout un répertoire d'artefacts sous forme d'un lien unique ; voir « Lien public de niveau répertoire » ci-dessous.

Quand l'utiliser

  • Les rapports/tableaux de bord doivent être envoyés à Slack/Feishu/e-mail, et je ne veux pas que tout le monde enregistre un xlsx de 3 Mo chacun.
  • Un collaborateur externe (sans compte sur la plateforme) doit consulter un instantané des données de l'app store
  • Vous partagez temporairement une synthèse .md avec un client qui doit la lire en HTML depuis son navigateur mobile
  • Vous voulez donner au lien une expiration, un plafond de téléchargements ou un mot de passe

Mode d'emploi — depuis l'interface

  1. Ouvrez une execution terminée, passez à l'onglet Artefacts : chaque artefact affiche un bouton 🔗 Partager
  2. Cliquez sur 🔗 Partager pour ouvrir la boîte de dialogue de partage
  3. Configuration à la demande :
    • Portée d'accès : public (par défaut) / accès par mot de passe / au sein de l'équipe / membres désignés ; voir « Portée d'accès et demande d'accès » ci-dessous
    • Durée de validité : n'expire jamais (par défaut) / 1 heure / 24 heures / 7 jours / 30 jours ; votre dernier choix est mémorisé
    • Plafond de téléchargements : 0 = illimité, >0 = le lien expire automatiquement une fois épuisé
    • Mot de passe d'accès (mode d'accès par mot de passe) : à l'ouverture du lien, le navigateur affiche une boîte de saisie du mot de passe
    • Rendu HTML en ligne (.md uniquement) : une fois coché, le lien affiche le HTML mis en forme au lieu de télécharger le fichier .md
  4. Cliquez sur « Générer le lien » → vous obtenez une URL de la forme https://braidrun.com/p/a/hN2kQ9..., puis « Copier » pour la coller où vous voulez

Mode d'emploi — publication automatique dans le workflow (recommandé)

Une fois le flux de travail exécuté, le produit est automatiquement transformé en lien public, puis le lien est automatiquement transmis à Slack - aucun clic manuel pour partager n'est requis dans l'ensemble du processus.

Orchestration type en trois étapes

  1. L'étape qui produit l'artefact s'écrit normalement, sans marqueur spécial — par exemple :
    - step: build_report
      agent: reporter
      input: |
        生成今天的业务报表,写入 /tmp/.../daily.md。
      # 这一步完成后,引擎自动注册一个产物(execution 的 artifacts 列表里会出现)
  2. Branchez le module intégré artifact publish et passez le nom de l'étape précédente `from_step: build_report`. Le module consulte la liste des artefacts de l'execution, trouve le fichier produit par cette étape et crée le lien public :
    - step: share_report
      sub_workflow:
        name: dingyue-module-artifact-publish
        inputs:
          from_step: "build_report"          # ← 唯一必需字段:引用上一步的步骤名
          ttl_minutes: "0"                   # 永不过期;如需限时可改成分钟数
          render_markdown_as_html: "true"    # .md 直接在线 HTML 预览
        # base_url / api_token 不用填 —— 引擎自动注入运行时访问令牌
        outputs:
          share_url: public_url              # 下游可以用 {{var:share_url}} 引用
      depends_on: [build_report]
  3. Branchez ensuite un module intégré de livraison Slack et passez-lui public_url → Slack ne reçoit qu'un message texte avec le lien, sans envoi de fichier :
    - step: notify
      sub_workflow:
        name: dingyue-module-slack-deliver
        inputs:
          slack_webhook_url: "{{var:slack_webhook_url}}"
          message_text: "📊 今日报表已生成"
          public_url: "{{var:share_url}}"   # ← 复用 share_report 的输出
      depends_on: [share_report]

Et S'il y a plusieurs artefacts ?

Si l'étape build_report a produit plusieurs fichiers (par exemple daily.md et metrics.json), filtrez avec artifact_name :

- step: share_report
  sub_workflow:
    name: dingyue-module-artifact-publish
    inputs:
      from_step: "build_report"
      artifact_name: "daily.md"            # ← 精确挑选
      ttl_minutes: "0"
    outputs:
      share_url: public_url

Sans artifact_name, le module prend le premier artefact correspondant et signale dans les journaux combien restent inutilisés.

Lien public de niveau répertoire : une seule URL pour partager tout un répertoire d'artefacts

Un lien de fichier unique ne permet de partager qu'un seul artefact à la fois. Si une exécution produit un ensemble de fichiers (rapport + données + images, voire un site statique multi-pages complet), vous pouvez publier tout le répertoire d'artefacts sous forme d'un lien unique :

  • Accès depuis l'interface : dans l'onglet « Artefacts » des détails d'exécution, cliquez sur « Partager tous les artefacts » pour générer un lien de répertoire couvrant tous les artefacts de cette exécution ; les options de configuration (portée d'accès / durée de validité / quota de téléchargement / mot de passe / rendu en ligne) sont identiques à celles d'un fichier unique, avec en plus un nom affiché personnalisable
  • L'API permet aussi de partager les artefacts d'une seule étape. Pour partager toute l'exécution : POST /api/executions/{id}/directory-public-link ; pour partager une seule étape : POST /api/executions/{id}/steps/{stepName}/directory-public-link
  • Le lien se présente sous la forme https://braidrun.com/p/d/hN2kQ9.../, et le visiteur n'a pas besoin de compte (en mode public)

Ce Que voit le visiteur

  • Par défaut, une page de liste de fichiers : nom, taille, type, ainsi que la durée de validité et le quota de téléchargement du lien
  • Lorsqu'un index.html est présent à la racine du répertoire, il s'ouvre directement comme un site statique — un rapport HTML multi-pages généré par un workflow peut être partagé comme un site entier ; ajouter ?listing=1 à l'URL force le retour à la vue liste de fichiers
  • Lorsque le rendu en ligne est coché, les fichiers .md du répertoire s'affichent en HTML mis en page
  • Les fichiers du répertoire sont toujours transférés par la plateforme avec le bon Content-Type (sans lien direct 302 vers le stockage objet), afin de garantir que le HTML / CSS / JS soit correctement rendu par le navigateur
  • Le quota de téléchargement est cumulé pour l'ensemble du répertoire ; une fois épuisé, le lien devient automatiquement caduc

Portée d'accès et demande d'accès

Les liens de fichier unique et les liens de répertoire partagent le même jeu de portées d'accès :

modeQui peut l'ouvrir
PUBLIC publiqueToute personne disposant du lien
PASSWORD Accès par mot de passeToute personne disposant du lien et connaissant le mot de passe ; saisie via la boîte de dialogue du navigateur, ou via l'en-tête Authorization: Basic ou X-Artifact-Password pour un client scripté
TEAM au sein de l'équipeNécessite une connexion à un compte Braidrun et l'appartenance à l'équipe désignée
USERS Membres désignésNécessite une connexion et la présence sur la liste des membres ; la liste ne peut être constituée que parmi les membres de l'équipe sélectionnée

En mode au sein de l'équipe / membres désignés, le lien devient un « lien profond nécessitant une connexion » : un accès non connecté est redirigé vers la connexion ; un utilisateur connecté mais absent de la liste voit une page « Accès non autorisé ».

Processus de demande d'accès (activable en option en mode au sein de l'équipe / membres désignés) :

  1. Cochez « Autoriser les utilisateurs connectés à soumettre une demande en cas d'accès non autorisé » lors de la création du lien
  2. Un utilisateur non autorisé qui ouvre le lien remplit un formulaire de demande sur la page « Accès non autorisé » et peut y joindre une explication ; une nouvelle soumission met à jour la demande initiale
  3. Le partageur ou l'administrateur du lien approuve / rejette dans « Compte → Gestion des partages » ; avant d'approuver, il faut vérifier que la personne appartient déjà à l'équipe sélectionnée
  4. Après approbation, la personne est ajoutée à la liste des accès autorisés et peut ouvrir directement le lien d'origine

Gérer les liens de répertoire

  • « Compte → Gestion des partages » gère ensemble les liens de fichier unique et de répertoire : modifier la portée d'accès, modifier la durée de validité, révoquer, ainsi que consulter le nombre d'accès et le journal d'accès (date, identité du compte, IP, User-Agent)
  • L'API de gestion correspondante (lister / modifier / révoquer) est : GET /api/directory-public-links · PATCH /api/directory-public-links/{token} · DELETE /api/directory-public-links/{token}
  • Le créateur est par défaut administrateur du lien et peut désigner des administrateurs supplémentaires pour traiter ensemble les demandes d'accès et les révocations

Méthodes de partage prises en charge

DéploiementPris en chargeDescription
Nœud unique + disque localLa plateforme renvoie directement le contenu du fichier
Plusieurs nœuds + disque local⚠️ DéconseilléLa requête peut atteindre un nœud qui ne possède pas le fichier → 410 Gone. Il est recommandé d'activer le stockage d'objets.
N'importe quel nombre de nœuds + stockage d'objets✅ Recommended302 vers le lien de téléchargement de signature temporaire (10 minutes TTL, nouvelle signature à chaque visite), la plateforme ne transmet pas le trafic des fichiers

Le tableau ci-dessus concerne les liens de fichier unique ; les liens de répertoire font toujours transiter le flux de fichiers par la plateforme et sont utilisables quelle que soit la forme de déploiement.

Sécurité et conformité

  • Jetons non énumérables —— SecureRandom de 24 octets → base62 ≈ 143 bits d'entropie ; le balayage par force brute est irréalisable
  • Protection contre l'indexation —— En-têtes X-Robots-Tag: noindex, nofollow + Referrer-Policy: no-referrer ; Google/Bing n'indexeront pas les liens
  • Limitation de débit —— Couche passerelle : 10 fois par seconde pour la même IP, 20 rafales ; couche de service : limite stricte basée sur les téléchargements maximum du jeton
  • Protection par mot de passe (facultatif) —— Hachage Argon2id ; saisie via une boîte de dialogue lors d'un accès par navigateur, ou via l'en-tête Authorization: Basic ou X-Artifact-Password pour un client scripté. Le mot de passe n'est pas placé dans les paramètres de requête de l'URL, afin d'éviter qu'il ne se retrouve dans le journal d'accès
  • Journaux d’audit —— Chaque création / accès / révocation écrit une entrée audit_log avec IP du client, User-Agent et horodatage
  • Conforme RGPD —— La suppression du compte nettoie tous les liens en cascade ; l'export de données inclut artifact_public_links.jsonl dans le ZIP
  • Révocation immédiate —— Cliquer sur Révoquer dans la gestion des partages prend effet immédiatement ; les liens révoqués renvoient 410 Gone (et non 404, pour éviter la confusion avec « n'existe pas »)

Gérer les liens partagés

Dans Compte → Gestion des partages (ou directement GET /api/public-links), vous voyez tous les liens créés, leur compteur d'accès et leur état de révocation. Le bouton Révoquer désactive le lien immédiatement.

FAQ

Q : pourquoi le lien affiche-t-il 410 Gone ?

  • Le lien a expiré (fin de la période de validité)
  • Le lien a été révoqué par son créateur ou un administrateur
  • Le nombre de téléchargements a atteint la limite (le lien devient automatiquement caduc une fois le quota épuisé)
  • Mot de passe incorrect (tant qu'aucun mot de passe n'a été saisi, la boîte de dialogue de mot de passe du navigateur apparaît d'abord, et non une erreur 410)

Q : puis-je créer un lien qui n'expire jamais ?

Oui, mais l'interface demandera une seconde confirmation — un lien permanent signifie que, sauf révocation manuelle, quiconque le détient y accédera pour toujours ; prudence. Les administrateurs peuvent désactiver globalement les liens permanents avec BRAIDRUN_PUBLIC_LINK_REJECT_PERMANENT=true.

Q : LES liens seront-ils indexés par les moteurs de recherche ?

Non. Les en-têtes imposent noindex, nofollow, et la couche nginx en ajoute une seconde. Mais si vous collez le lien sur une page publique, les robots peuvent découvrir l'URL — ne publiez donc jamais ces liens dans un README GitHub ou un article de blog.

Q : quelle taille de fichier convient ?

En mode stockage objet : Théoriquement illimité ; en fait limité par le délai d'expiration du navigateur de l'utilisateur (généralement des dizaines de Mo ne posent aucun problème). En mode disque local : limité par la vitesse de lecture des fichiers de la plateforme, il n'est pas recommandé de dépasser 100Mo.

Q : SI Je supprime l'execution liée à l'artefact, l'ancien lien fonctionne-t-il encore ?

Non. La suppression d'une execution révoque en cascade tous les liens qui pointent vers elle ; les accès ultérieurs reçoivent 410 Gone.

Q : cette fonctionnalité est-elle activée par défaut ?

Un administrateur doit l'activer explicitement via la variable d'environnement BRAIDRUN_PUBLIC_BASE_URL ; sinon le bouton Partager n'apparaît pas dans l'interface. Voir PRODUCTION_GUIDE §2.4 dans la documentation d'exploitation.