製品のパブリック共有 (パブリック HTTPS リンク)
ログインを必要としない短いリンクとして .md / .html / .xlsx 製品を公開します。 Slack/電子メールはリンクのみを送信し、ファイルは送信しません。 TTL / パスワード / ダウンロード数 / HTML オンライン プレビューをサポートします。
ワークフローでレポート (.md / .html / .xlsx / .pdf) を生成し、それを他の人に送信したい場合、最も直接的な方法は、Slack/mail モジュールに添付ファイルをアップロードさせることです。ただし、ファイルが大きいと速度が遅くなり、メッセージング プラットフォームには通常、1 つのファイルのサイズと添付ファイルの数に制限があります。
製品の公開共有 もう 1 つの経路です。個々の成果物をログイン不要の HTTPS 短縮リンクとして公開し、メッセージにはリンクのみを送り、開くだけで閲覧できます。ファイル自体はサーバーに残るため、トラフィックを節約でき、ブラウザでの直接プレビューにも対応します(.md はオンラインで HTML にレンダリングできます)。一度に複数のファイルを共有したい場合は、成果物ディレクトリ全体を 1 つのリンクとして公開することもできます。下記の「ディレクトリレベルの公開リンク」を参照してください。
いつ使うか
- レポート/ダッシュボードは Slack/Feishu/電子メールに送信する必要がありますが、全員にそれぞれ 3MB の xlsx を保存してほしくありません。
- 外部の協力者(プラットフォームのアカウントなし)に app store のデータスナップショットを見せたい場合
- クライアントに .md のまとめを一時的に共有し、相手にスマホのブラウザで HTML として直接見てほしい場合
- リンクに有効期限・ダウンロード回数上限・パスワード保護を設定したい場合
使い方 —— UI から作成
- 実行済みの execution を開いて「成果物」タブに切り替えると、各成果物の横に 🔗 共有ボタンが表示されます
- 🔗 共有をクリックすると共有ダイアログが開きます
- 必要に応じて設定します:
- アクセス範囲: 公開(デフォルト)/ パスワードアクセス / チーム内 / 指定メンバー。詳細は下記の「アクセス範囲とアクセス申請」を参照してください
- 有効期限: 無期限(デフォルト)/ 1 時間 / 24 時間 / 7 日 / 30 日。前回の選択が記憶されます
- ダウンロード回数上限:0 = 無制限、>0 = 使い切るとリンクは自動的に失効
- アクセスパスワード(パスワードアクセスモード): リンクを開くとブラウザにパスワード入力欄がポップアップします
- オンライン HTML レンダリング(.md 専用):チェックすると、リンクを開いたときに整形済みの HTML が直接表示され、.md ソースファイルのダウンロードにはなりません
- 「リンクを生成」をクリック → https://braidrun.com/p/a/hN2kQ9... のような URL が得られます。「コピー」をクリックして任意の場所に貼り付けます
使い方 —— ワークフロー内で自動公開(推奨)
ワークフローが実行されると、製品は自動的にパブリック リンクになり、そのリンクは自動的に Slack にプッシュされます。プロセス全体で共有するために手動でクリックする必要はありません。
ワークフロー エンジンは、実行 ID、短期アクセス トークン、プラットフォーム アクセス アドレスを各コード ステップに自動的に挿入します。組み込みのアーティファクト公開モジュールはこれらのランタイム パラメーターを読み取るため、「どのステップからアーティファクトを共有するか」 (from_step) を指示するだけで済みます。アクセストークンの有効期限は短く、運用後の手動メンテナンスは不要です。
典型的な 3 ステップ構成
- 成果物を生成するステップは通常どおり書きます。特別なマークは不要です —— 例:
- step: build_report agent: reporter input: | 生成今天的业务报表,写入 /tmp/.../daily.md。 # 这一步完成后,引擎自动注册一个产物(execution 的 artifacts 列表里会出现) - 組み込みの artifact publish モジュールを接続し、前ステップの名前 `from_step: build_report` を渡します。モジュールは execution の成果物リストを自動的に照会し、そのステップが生成したファイルを見つけて公開リンクを作成します:
- 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] - さらに組み込みの Slack 配信モジュールを接続して public_url を渡します → Slack には「テキストメッセージ + リンク」だけが届き、ファイルはアップロードされません:
- 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]
成果物が複数ある場合
build_report ステップが複数のファイルを生成した場合(例えば daily.md と metrics.json を同時に書き出した場合)、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_urlartifact_name を指定しない場合、モジュールは最初にマッチした成果物を取り、未使用のものが何個あるかをログに出力します。
ディレクトリレベルの公開リンク: 1 つの URL で成果物ディレクトリ全体を共有します
単一ファイルのリンクは一度に 1 つの成果物しか共有できません。1 回の実行で一連のファイル(レポート + データ + 画像、さらには完全な複数ページの静的 Web サイト)が生成された場合、成果物ディレクトリ全体を 1 つのリンクとして公開できます。
- UI の入口: 実行詳細の「成果物」タブで「すべての成果物を共有」をクリックすると、この実行のすべての成果物をカバーするディレクトリリンクが生成されます。設定項目(アクセス範囲 / 有効期限 / ダウンロードクォータ / パスワード / オンラインレンダリング)は単一ファイルと同じで、さらに表示名をカスタマイズできます
- API では特定のステップの成果物だけを共有することもできます。実行全体を共有する場合:
POST /api/executions/{id}/directory-public-link;単一のステップだけを共有する場合:POST /api/executions/{id}/steps/{stepName}/directory-public-link - リンクは https://braidrun.com/p/d/hN2kQ9.../ のような形式で、アクセス者はアカウント不要です(公開モードの場合)
アクセス者に見えるもの
- デフォルトはファイル一覧ページです: ファイル名、サイズ、タイプ、およびリンクの有効期限とダウンロードクォータ
- ディレクトリのルートに index.html がある場合、静的サイトとして直接開きます。ワークフローが生成した複数ページの HTML レポートをサイト全体として共有できます。URL に ?listing=1 を付けると、強制的にファイル一覧ビューに戻ります
- オンラインレンダリングにチェックを入れた場合、ディレクトリ内の .md ファイルは体裁の整った HTML として表示されます
- ディレクトリ内のファイルは常にプラットフォームが正しい Content-Type で転送し(オブジェクトストレージの 302 直リンクを経由しません)、HTML / CSS / JS がブラウザで正常にレンダリングされることを保証します
- ダウンロードクォータはディレクトリ全体で累計され、使い切るとリンクは自動的に無効になります
アクセス範囲とアクセス申請
単一ファイルのリンクとディレクトリのリンクは同じアクセス範囲を共有します。
| モード | 誰が開けるか |
|---|---|
PUBLIC 公共の | リンクを入手した人なら誰でも |
PASSWORD パスワードアクセス | リンクを入手しかつパスワードを知っている人。ブラウザではポップアップに入力し、スクリプトクライアントは Authorization: Basic または X-Artifact-Password ヘッダーを使用します |
TEAM チーム内で | Braidrun アカウントへのログインが必要で、かつ指定されたチームに属している必要があります |
USERS 指定会員 | ログインが必要で、かつメンバー名簿に含まれている必要があります。名簿は選択したチームのメンバーからのみ選べます |
チーム内 / 指定メンバーモードでは、リンクは「ログインが必要なディープリンク」になります。未ログインでアクセスするとログインへ誘導されます。ログイン済みでも名簿にない場合は「アクセス権限なし」ページが表示されます。
アクセス申請フロー(チーム内 / 指定メンバーモードで任意に有効化できます):
- リンク作成時に「ログインユーザーがアクセス権限のない場合に申請を送信できるようにする」にチェックを入れます
- アクセス権限のない人がリンクを開き、「アクセス権限なし」ページで申請フォームに記入し、説明を添付できます。重複して送信すると元の申請が更新されます
- 共有者またはリンク管理者が「アカウント → 共有管理」で承認 / 却下します。承認前に、相手が選択したチームに既に属していることを確認する必要があります
- 承認後、相手はアクセス可能な名簿に追加され、元のリンクで直接開けるようになります
ディレクトリリンクの管理
- 「アカウント → 共有管理」では、単一ファイルとディレクトリのリンクをまとめて管理します: アクセス範囲の変更、有効期限の変更、取り消し、およびアクセス回数とアクセスログ(時刻、アカウント情報、IP、User-Agent)の確認
- 対応する管理 API(一覧 / 変更 / 取り消し)は次のとおりです:
GET /api/directory-public-links·PATCH /api/directory-public-links/{token}·DELETE /api/directory-public-links/{token} - 作成者はデフォルトでリンク管理者となり、さらに追加の管理者を指定して、アクセス申請と取り消しを一緒に処理できます
サポートされている共有方法
| デプロイ | サポート状況 | 説明 |
|---|---|---|
| 単一ノード + ローカルディスク | ✅ | プラットフォームはファイルの内容を直接返します |
| 複数ノード + ローカルディスク | ⚠️ 非推奨 | リクエストはファイルを持たないノードにヒットする可能性があります → 410 Gone。オブジェクトストレージを有効にすることをお勧めします。 |
| 任意の数のノード + オブジェクト ストレージ | ✅ Recommended | 302 を一時署名ダウンロード リンク (10 分間の TTL、訪問ごとに新しい署名) に送信すると、プラットフォームはファイル トラフィックを転送しません。 |
上表は単一ファイルのリンクを対象としています。ディレクトリのリンクは常にプラットフォームがファイルストリームを転送するため、どの展開形態でも利用できます。
セキュリティとコンプライアンス
- トークンは列挙不可能 —— 24 バイトの SecureRandom → base62 ≈ 143 ビットのエントロピー。総当たりスキャンは現実的に不可能です
- クローラーインデックス対策 —— レスポンスヘッダー X-Robots-Tag: noindex, nofollow + Referrer-Policy: no-referrer により、Google/Bing はリンクをインデックスしません
- レート制限 —— ゲートウェイ層: 同じ IP に対して 1 秒あたり 10 回、バースト 20 回。サービス層: トークンの maxDownloads に基づくハード制限
- パスワード保護(任意) —— Argon2id ハッシュ。ブラウザでアクセスするとポップアップに入力し、スクリプトクライアントは Authorization: Basic または X-Artifact-Password ヘッダーを使用します。パスワードは URL クエリパラメータに入れず、アクセスログに残ることを回避します
- 監査ログ —— 作成・アクセス・失効のたびに audit_log が 1 件記録され、クライアント IP、User-Agent、タイムスタンプが含まれます
- GDPR 対応 —— アカウント削除時にすべてのリンクが自動的にカスケード削除されます。データエクスポート時には artifact_public_links.jsonl が ZIP に含まれます
- 即時失効 —— 共有管理ページで「失効」をクリックすると即座に反映され、失効したリンクへのアクセスは 410 Gone を返します(404 ではなく、「存在しない」との混同を避けるため)
共有済みリンクの管理
「アカウント → 共有管理」(または直接 GET /api/public-links)で、作成したすべてのリンク、アクセス数、失効状態を確認できます。失効ボタンをクリックするとリンクは即座に無効になります。
FAQ
Q: リンクを開くと 410 Gone が表示されるのはなぜ?
- リンクの有効期限が切れた
- リンクが作成者または管理者によって失効された
- ダウンロード回数が上限に達しました(クォータを使い切ると自動的に無効になります)
- パスワードが間違っています(一度もパスワードを入力していない場合は、410 ではなくまずブラウザのパスワードポップアップが表示されます)
Q: リンクを無期限にできますか?
可能です。ただし UI で再確認ダイアログが表示されます —— 永続リンクは、手動で失効させない限り、リンクを持つ人が永久にアクセスできることを意味するため、慎重に扱ってください。管理者は BRAIDRUN_PUBLIC_LINK_REJECT_PERMANENT=true で永続リンクをグローバルに無効化できます。
Q: リンクは検索エンジンにインデックスされますか?
されません。レスポンスヘッダーで noindex, nofollow を強制し、nginx 層でも重ねて付与しています。ただし、リンクを公開ページに貼ると外部クローラー経由で URL が発見される可能性があります —— そのため GitHub README やブログ記事にリンクを公開するのは絶対に避けてください。
Q: どのくらいのファイルサイズが適切?
オブジェクト ストレージ モード: 理論上は無制限。実際には、ユーザーのブラウザのタイムアウトによって制限されます (通常、数十 MB は問題ありません)。ローカル ディスク モード: プラットフォームのファイル読み取り速度によって制限されるため、100MB を超えることはお勧めできません。
Q: 成果物の元になった execution を削除したら、古いリンクはまだ使えますか?
使えません。execution を削除すると、その execution を指すすべてのリンクがカスケードで失効され、以降のアクセスは 410 Gone になります。
Q: この機能はデフォルトで有効ですか?
管理者が環境変数 BRAIDRUN_PUBLIC_BASE_URL で明示的に有効化する必要があります。無効の場合、UI に共有ボタンは表示されません。運用ドキュメント PRODUCTION_GUIDE §2.4 を参照してください。